{S}sbrc-20
Contents
Draft spec v0.1

BRC-20, but shielded.

SBRC-20 is a token standard for private tokens on Bitcoin. It runs natively onchain as inscriptions, and a zk-proof private indexer keeps balances, amounts and recipients hidden.

Tokens mint publicly and fairly, just like BRC-20. Once you shield them, every transfer is a zero-knowledge proof: the indexer can confirm the transfer is valid without learning who sent what to whom.

// a shielded transfer, as the world sees it
{
"p": "sbrc-20",
"op": "xfer",
"tick": "ghst",
"to": "bc1p9x…4kq",
"amt": "25000",
"proof": "0x8f3a…c1"
}

Ticker, recipient and amount never appear onchain. Only the proof does.

Why SBRC-20

BRC-20 proved people want tokens on Bitcoin. But every BRC-20 balance and transfer is public. Anyone can look up an address and see exactly what it holds, what it bought, and who it paid.

That makes BRC-20 wallets easy to track, front-run and target. SBRC-20 keeps what works about BRC-20 (simple inscriptions, fair mints, Bitcoin security) and removes the public ledger of who owns what.

BRC-20SBRC-20
Runs onBitcoin L1 inscriptionsBitcoin L1 inscriptions
MintPublic fair mintPublic fair mint
BalancesPublic per addressHidden once shielded
Transfer amountsPublicHidden
Sender and recipientPublicHidden
Which token movedPublicHidden in the shared pool
ValidityIndexer checks balancesIndexer checks a zk proof

How it works

SBRC-20 has two sides: a public side that works like BRC-20, and a shielded pool where tokens are private. You move tokens between them with shield and unshield.

Notes

Inside the pool, tokens exist as notes. A note says "this key owns this amount of this token", but it's only ever published as a commitment: a hash that reveals nothing about what's inside.

Commitments

The indexer adds every new commitment to a Merkle tree. The tree's root is a fingerprint of every note that has ever existed in the pool.

Nullifiers

When you spend a note, you publish its nullifier, a unique tag only the owner can compute. The indexer records every nullifier, so a note can never be spent twice. Nobody can tell which note a nullifier belongs to.

Proofs

Each private transfer carries a zk proof showing that the notes being spent exist in the tree, that the sender owns them, that they haven't been spent before, and that inputs equal outputs, so no tokens are created from nothing.

In one sentence: the chain records commitments, nullifiers and proofs. It never records balances, amounts or owners.

Operations

Every SBRC-20 operation is a JSON inscription with "p": "sbrc-20". Public operations mirror BRC-20. Shielded operations carry proofs instead of amounts. Field names below are the draft format and may change before mainnet.

OpWhat it doesWhat's visible
deployCreates a new tokenTicker, max supply, mint limit
mintFair-mints tokens to a public balanceTicker, amount, minter
transferPublic transfer, same as BRC-20Everything
shieldMoves public tokens into the poolTicker and amount going in, never the new owner
xferPrivate transfer inside the poolOnly nullifiers, commitments and a proof
unshieldMoves tokens out of the pool to a public addressTicker, amount and recipient coming out

deploy

{
  "p": "sbrc-20",
  "op": "deploy",
  "tick": "ghst",
  "max": "21000000",
  "lim": "1000"
}

mint

{
  "p": "sbrc-20",
  "op": "mint",
  "tick": "ghst",
  "amt": "1000"
}

shield

Burns a public balance and creates a note of the same value. The amount going in is public; who owns the note is not.

{
  "p": "sbrc-20",
  "op": "shield",
  "tick": "ghst",
  "amt": "1000",
  "cm": "0x1c9e…a07f",
  "enc": "base64:…"
}

xfer (private transfer)

Spends notes and creates new ones. No ticker, no amount, no address. The encrypted payloads let the recipient's wallet find and open their new note.

{
  "p": "sbrc-20",
  "op": "xfer",
  "root": "0x5b21…e9d0",
  "nf": ["0x77ac…31", "0x0e4f…b8"],
  "cm": ["0xa3d1…9c", "0x62f0…17"],
  "enc": ["base64:…", "base64:…"],
  "proof": "0x8f3a…c1"
}

unshield

Spends a note and credits a public balance. What leaves the pool becomes visible again.

{
  "p": "sbrc-20",
  "op": "unshield",
  "tick": "ghst",
  "amt": "250",
  "to": "bc1p…",
  "root": "0x5b21…e9d0",
  "nf": ["0x19bb…4e"],
  "cm": ["0xd07c…a2"],
  "proof": "0x2e61…77"
}

Private indexer

Bitcoin doesn't validate SBRC-20 rules itself, and it can't verify zk proofs. Like every BRC-20 indexer, the SBRC-20 indexer reads inscriptions in block order and applies the rules. What makes it private is what it tracks: it holds commitments and nullifiers, not balances. It can verify every private transfer while knowing nothing about it.

What it tracks

  • Public balances per address, exactly like BRC-20.
  • The commitment Merkle tree and its recent roots.
  • The nullifier set: every note that's already been spent.
  • Token deployments and total shielded supply per ticker.

How it validates a private transfer

  1. Check the root is a known recent root of the commitment tree.
  2. Check none of the nullifiers are already in the nullifier set.
  3. Verify the zk proof against the root, nullifiers and new commitments.
  4. If everything passes, add the nullifiers to the set and the commitments to the tree. If anything fails, the inscription is ignored.

Because every rule is deterministic, anyone running the indexer software on the same Bitcoin history arrives at the same state.

ZK proofs

A single circuit covers xfer and unshield. It proves, without revealing anything else:

  • Each spent note is in the commitment tree under the given root.
  • The sender knows the spending key for each spent note.
  • Each nullifier is correctly derived from its note.
  • Every note in the transfer is the same token, and total input equals total output.
  • New commitments are well-formed.

The draft design uses the Poseidon hash for commitments and the Merkle tree. The proof system is still being chosen between Halo2 and PLONK-family systems, which avoid a trusted setup, and Groth16, which gives smaller proofs but needs a setup ceremony. Proofs are generated in your wallet, so your keys never leave your device.

All tokens share one pool, so an observer can't even tell which token moved. The more people use any SBRC-20 token, the more private every SBRC-20 token becomes.

Keys and wallets

KeyWhat it does
Spending keySpends your notes. Never share it.
Viewing keyLets you, or anyone you give it to, see your incoming notes and balance, but not spend them.
Shielded addressWhat you give people so they can send you private tokens.

Your wallet scans new SBRC-20 inscriptions and tries to open each encrypted note with your viewing key. Notes that open are yours. This is how you receive tokens without your address ever appearing onchain.

Viewing keys also make selective disclosure possible. You can show an auditor, exchange or accountant your history without making it public.

Fees and relayers

Inscriptions need BTC for miner fees. If you paid fees for private transfers from your own wallet, the fee input would link your transfers together and weaken your privacy.

Relayers solve this. You hand a finished proof to a relayer, the relayer inscribes it and pays the BTC fee, and you pay the relayer back with a small shielded note inside the same transfer. Anyone can run a relayer, and relayers can't steal or change your transfer, because the proof fixes every output.

Security model

SBRC-20 is a metaprotocol, like BRC-20. Here is what you're trusting and what you're not.

Bitcoin

Bitcoin orders and stores every operation. SBRC-20 needs no bridge, sidechain or new chain.

The indexer

Indexers must all apply the same rules. A buggy indexer could show a wrong state, so the indexer and circuit will be open to review, and exchanges and wallets should cross-check more than one instance.

The circuit

A flaw in the circuit could let someone create tokens from nothing. The circuit will be audited before mainnet, and the indexer publishes total shielded supply per token so anyone can check that the pool never holds more than went in.

Privacy limits

Shielding and unshielding are public, so moving the same amount in and out quickly can be matched. Privacy grows with the number of people in the pool and the time your tokens stay shielded.

Roadmap

  1. Spec. Publish the full SBRC-20 specification for review.
  2. Testnet. Indexer and circuit running on Bitcoin signet and testnet.
  3. Wallet. Shield, send, receive and unshield from a browser wallet.
  4. Relayers. A public relayer network for private fee payment.
  5. Audit. Independent audit of the circuit and indexer.
  6. Mainnet. Launch on Bitcoin mainnet.

FAQ

Is SBRC-20 a new blockchain?

No. Every operation is an inscription on Bitcoin mainnet. There's no bridge, sidechain or separate token.

Can existing BRC-20 tokens use SBRC-20?

The first version focuses on tokens deployed as SBRC-20. Support for shielding existing BRC-20 tickers is being evaluated.

Are mints private?

No. Mints are public so everyone can verify supply and fairness. Privacy begins when you shield.

What if I lose my spending key?

Your shielded tokens can't be recovered. Back up your wallet's seed phrase like any Bitcoin wallet.

Can I prove my balance to an exchange?

Yes. Share your viewing key, or unshield the tokens you want to deposit.

Is SBRC-20 live?

Not yet. The spec is in draft. Follow the roadmap above for testnet and mainnet.

Media kit

Official SBRC-20 brand assets. The mark is {S} set in JetBrains Mono ExtraBold, always pure black on white or white on black.

X banner, 1500×500

Square post, 1080×1080
Inscription post, 1080×1080
Story, 1080×1920

Tagline: "BRC-20, but shielded." Subline: "Private token transfers on Bitcoin."