← Back to all insights

Send bitcoin to a name, not to 62 random characters. Spaces lets you own that name on Bitcoin itself.

The problem

A Bitcoin address looks like the line below. Nobody can say it out loud, print it on a card, or check it by eye. One wrong character and the money is gone.

Today
bc1pknhdaw3jyhvcalyrkulw2hwmqvc5q65ch9gkpnvvhrfajyedjgvqmn3w0c
With Spaces
rob@bitsaga

Names already exist on the internet. You know them from email and websites. But those names are rented. A company called a registrar keeps the record, and a chain of companies and governments sits above it. If one of them changes the record, your name points somewhere else, or nowhere.

Spaces asks a simple question. What if the name lived on Bitcoin, held like a coin, where only your key can move it?

What Spaces is

How a payment finds you

Step 1

You win a name

@bitsaga becomes a small coin on Bitcoin. Only my key can move it. No company can take it from me.

Step 2

You create handles

rob@bitsaga, hello@bitsaga, anything under my name. I make them myself. A single short note on Bitcoin covers all of them.

Step 3

You say where to pay

I attach my payment address to the name. It is signed, so nobody can swap it.

Step 4

A friend types the name

Their wallet asks a relay for the proof that rob@bitsaga belongs to me.

Step 5

The wallet checks, then pays

It checks the proof against Bitcoin itself. It does not have to trust the relay, or me.

The parts, in more detail

Winning a name

You open an auction with one Bitcoin transaction and place a bid. Names open for bidding at a fixed pace, about ten a day, so nobody can grab thousands at once. The highest bid wins. The bid is not paid to anyone: it is burned. Nobody else bid on @bitsaga, so my bid burned just 1,000 sats. One more transaction then registers the name to me.

Keeping a name

A space is a lease of about a year (52,560 blocks). Every transaction that updates it renews it, and I will renew it before it ends. If you forget, the name expires. That is the price of having no registrar: nobody sends you a reminder.

Handing out handles

Your handles live in a list, and the list stays off Bitcoin. What goes on Bitcoin is one 32-byte fingerprint of the list, called a Merkle root, in a small transaction. Each handle you add gets a certificate that says: this name belongs to this key, for good. Every new fingerprint builds on the earlier ones, so nobody can later slip in a second owner for a handle you already issued. That is also why a handle cannot be moved to another address afterwards.

Saying where to pay

Records say where a name pays. On a space, they sit inside a Bitcoin transaction. On a handle, they are signed with the handle's key and shared off Bitcoin. I wrote three records: a silent payment address (sp), a plain Bitcoin address as the fallback (btc), and my website. Spaces has no standard yet for the names of payment records, so sp and btc are my own choice. A wallet has to agree on them.

How a wallet trusts the answer

A wallet receives a proof: the certificate, the signed records, and the path from the handle up to Bitcoin. It is about 3 KB. Mine is 3,003 bytes, and checking one takes about a tenth of a millisecond. To finish the check, the wallet needs one more thing: an anchor. That is a fingerprint of all of Spaces at one moment. Anyone who runs a Spaces node can compute it from Bitcoin, about every six hours. I computed mine on my own node.

What a relay does

A relay is a small server that keeps the proofs for names and hands them to wallets. It is only a messenger. It can be slow, or offline. It cannot lie, because the wallet checks every proof against Bitcoin. Relays also copy from each other, so one relay can answer for names it has never met.

Your friend's wallet

Wants to pay rob@bitsaga.

asks, gets a proof

A relay

Stores and serves proofs. Anyone can run one.

the wallet then checks the proof itself

Bitcoin

The only thing the wallet has to trust. Everything else is checked against it.

Spaces, BIP 353 and silent payments

These three are not rivals. They answer different questions.

Silent payments

BIP 352 · an address type

What it is
A reusable address. Every payer's wallet derives a fresh, private address from it.
Where the name lives
It is not a name. It is 116 characters.
Strength
Payments cannot be linked to each other or to you, and nobody has to be online.
Weakness
Far too long to share by hand.

BIP 353

A name through the domain system

What it is
rob@bitsaga.be is a lookup in DNS that returns a payment instruction.
Where the name lives
In a domain you rent.
Who can take it
The registrar, the registry, a court.
A wallet must trust
A chain of DNS keys up to ICANN.
You need
A domain, a DNS record, DNSSEC.

Spaces

A name on Bitcoin

What it is
rob@bitsaga lives in a Bitcoin coin you hold.
Where the name lives
On Bitcoin.
Who can take it
Nobody, as long as you renew it each year.
A wallet must trust
Bitcoin.
You need
An auction, a few transactions, a relay to carry proofs.

The two kinds of name can point at the same silent payment address. Mine do:

rob@bitsaga.be  and  rob@bitsaga

sp1qqg94rylj0uklf6lkyc5n92jp3p392g0rpvh0f74qphufxcx9zya97qh8w4z290qym8ve33a02ejfc3lanvw9aljfz6upuc2gfnulepd75ccrhdql

One address, two names. The first is found through DNS (BIP 353). The second is found through Bitcoin (Spaces).

There are practical differences too:

What I did

I bought @bitsaga on Bitcoin. Nobody else bid. All the network fees together came to 6,882 sats. I wrote my payment address into the name, so the name itself already says where to pay. Then I created the handle rob@bitsaga, and signed its records: a silent payment address as the main record, and a plain Bitcoin address as the fallback.

I also run my own relay, at spacesrelay.bitsaga.be. It follows my own Bitcoin node. I put the proof for rob@bitsaga on it. Then I asked my public relay for the name from a clean client, and checked the answer against my own node. It returned both addresses, and showed the handle as final. That way I did not have to trust anyone, including myself.

@bitsaga registered rob@bitsaga created and final Records signed Relay live at spacesrelay.bitsaga.be Resolved and checked against my own node

Check it yourself

You need your own Bitcoin node and the Spaces node spaced. To look at the space itself:

space-cli getspace @bitsaga
space-cli getfallback @bitsaga

To resolve rob@bitsaga through my relay and verify the answer against your own node:

pip install libveritas
curl -O https://bitsaga.be/files/resolve-via-relay.py
python3 resolve-via-relay.py rob@bitsaga https://spacesrelay.bitsaga.be

The script asks the relay for the proof. Then it checks the proof against the anchors of your own spaced node, and prints the addresses it finds. The relay is only the messenger.

Run your own relay

Anyone can run a relay. It is one program. This is what I ran:

cargo install --git https://github.com/spacesprotocol/certrelay.git \
  relay --bin certrelay --locked

I pointed mine at my own Spaces node, so the proofs it serves rest on my own Bitcoin node. A relay can also start its own light client, so you do not need a full node to try it. The more relays there are, the less any one of them matters.

What does not work yet

The Spaces protocol and its tools come from spacesprotocol.org.