but shielded.
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.
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-20 | SBRC-20 | |
|---|---|---|
| Runs on | Bitcoin L1 inscriptions | Bitcoin L1 inscriptions |
| Mint | Public fair mint | Public fair mint |
| Balances | Public per address | Hidden once shielded |
| Transfer amounts | Public | Hidden |
| Sender and recipient | Public | Hidden |
| Which token moved | Public | Hidden in the shared pool |
| Validity | Indexer checks balances | Indexer 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.
| Op | What it does | What's visible |
|---|---|---|
| deploy | Creates a new token | Ticker, max supply, mint limit |
| mint | Fair-mints tokens to a public balance | Ticker, amount, minter |
| transfer | Public transfer, same as BRC-20 | Everything |
| shield | Moves public tokens into the pool | Ticker and amount going in, never the new owner |
| xfer | Private transfer inside the pool | Only nullifiers, commitments and a proof |
| unshield | Moves tokens out of the pool to a public address | Ticker, 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
- Check the
rootis a known recent root of the commitment tree. - Check none of the nullifiers are already in the nullifier set.
- Verify the zk proof against the root, nullifiers and new commitments.
- 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
| Key | What it does |
|---|---|
| Spending key | Spends your notes. Never share it. |
| Viewing key | Lets you, or anyone you give it to, see your incoming notes and balance, but not spend them. |
| Shielded address | What 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
- Spec. Publish the full SBRC-20 specification for review.
- Testnet. Indexer and circuit running on Bitcoin signet and testnet.
- Wallet. Shield, send, receive and unshield from a browser wallet.
- Relayers. A public relayer network for private fee payment.
- Audit. Independent audit of the circuit and indexer.
- 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.
but shielded.
X banner, 1500×500
but
shielded.
but shielded.
but shielded.
Tagline: "BRC-20, but shielded." Subline: "Private token transfers on Bitcoin."