Robinhood Chain · zero-knowledge state anchoring
Prove the chain.
Reveal nothing.
Zero knowledge anchoring for Robinhood Chain
Runs entirely in your browser. No wallet, no account, no server.
- Blocks anchored
- 2,048blocks
- Sum of on-chain anchored windows.
- Proofs verified
- 7
- Proofs generated in the lab and re-verified server-side.
- Window size
- 2,048blocks max
- Protocol constant, enforced on-chain.
The gap
Robinhood Chain publishes its state to Ethereum. Almost nobody is allowed to argue with it.
Every so often, Robinhood Chain posts a state root to Ethereum — a single hash standing in for the entire state of the chain at that moment. Ethereum stores the hash. It does not check it. Checking is delegated to a challenge window, during which someone is supposed to notice if the root is wrong and say so.
The catch is who someone is. Only a small permissioned set of validators can raise a challenge. If all of them are offline, uninterested, or agreeable, a bad state root is accepted by default and becomes the chain’s history. Nothing about that is unusual — it is how most chains of this design work — but it means the guarantee you actually get is not “this state is correct”, it is “these particular parties did not object”.
That is a trust assumption wearing a verification costume. Oracleum replaces it with something you can check yourself: a commitment to every contiguous window of blocks, and a proof that the commitment is what it claims to be. You do not need permission to check a proof, and a proof does not care whether anyone was paying attention.
Anchoring
History is cut into windows of at most 2,048 blocks. Each window commits to the state root it began from and the one it ended on.
A window is a block range and two state roots: the root before the first block, and the root after the last. That pair is what makes a window meaningful — it says “starting here, applying these blocks, you end up there”. A commitment to one root alone would be a snapshot; a commitment to both is a claim about a transition.
Windows must be strictly contiguous. Window n has to begin at the block immediately after window n−1 ended, and its before-root has to equal that window’s after-root. The verifier contract enforces both. This is the part that matters: you cannot anchor the convenient stretches of history and quietly skip the rest, because a skipped stretch leaves a gap the next anchor cannot cross.
Window size
≤ 2,048 blocks
Capped so a single anchor stays cheap to produce and store.
Sequence
Strictly contiguous
start = lastAnchoredEnd + 1, enforced in the contract.
Committed to
Both state roots
Before and after, bound together with the block range.
Zero knowledge
The commitment is a locked box. The proof is a demonstration that you locked it correctly — performed without opening it.
A Pedersen commitment takes the thing you want to hide and a random number, and produces a single point on a curve. The random number is the important half. Because it is fresh every time, the same state roots committed twice produce two completely unrelated-looking commitments, and the commitment on its own tells an observer exactly nothing — not the roots, not their size, not whether two windows are related.
You also cannot lie later. The commitment is built from two curve points whose relationship nobody knows, because the second one is derived by hashing a fixed string onto the curve rather than being chosen. Without that relationship there is no way to find a second pair of values that opens to the same commitment. The box is sealed in both directions: you cannot see in, and the person who sealed it cannot swap the contents.
The proof is the other half. It convinces anyone that you know what is inside and that you built the commitment from the exact block range you claimed — by answering a challenge that only someone holding the real values could answer. The challenge is derived from the statement itself, so there is no verifier to collude with and no interaction to replay. One bit changes anywhere, and the answer stops fitting.
What is published, and what is not
- Commitment CPublic
- A point on secp256k1. Reveals nothing.
- Proof (T, e, s₁, s₂)Public
- Checkable by anyone, forever.
- Block rangePublic
- Bound into the proof’s challenge.
- State rootsHidden
- Never leave the prover.
- Blinding factor rHidden
- What makes C reveal nothing.
A hidden value looks like this on the wire: a hidden value — present, committed to, never shown.
On chain
One contract holds the anchor set. It refuses gaps, refuses oversized windows, and emits an event for every anchor it accepts.
ProofAnchor stores, for each accepted window, the block range, the commitment, a hash of the proof, and the address that submitted it. Before it stores anything it checks two things: that the window begins exactly where the last one ended, and that it spans no more than 2,048 blocks. Anything else reverts. The result is that the anchor set is a chain, not a pile — you can walk it end to end and know you have not skipped anything.
Verifying does not require trusting us, running our software, or asking anyone’s permission. Read the Anchored events from the contract, fetch the proof they reference, and check it. If you also hold the state roots — because you run a node, or because you read them from Ethereum — you can recompute the commitment and confirm the anchor describes the history you observed.
ProofAnchor
LiveStores anchors, enforces contiguity, emits Anchored.
0xe3459a…54a18b0xe3459a8da895f24115b26c59393a87bc0454a18b$Oracleum
Deploying — mainnetProver fees and treasury funding.
Address published here the moment it is deployed.
Addresses appear here automatically once NEXT_PUBLIC_ANCHOR_ADDRESS and NEXT_PUBLIC_TOKEN_ADDRESS are set. Until then this page shows no address at all rather than a placeholder. See the feed for what is live right now.
$Oracleum
Two jobs: it prices the cost of anchoring, and it pays for the windows nobody would otherwise cover.
Prover fees
Submitting an anchor to the verifier contract costs Oracleum. The fee scales with the window size, so anchoring 2,048 blocks costs more than anchoring 64. This prices the on-chain storage an anchor consumes and makes spamming the anchor set expensive.
Treasury funding
Every transfer carries a 3% tax routed to the prover treasury. The treasury reimburses gas for provers who anchor windows nobody else has claimed, so coverage of the chain’s history does not depend on any single operator staying online.
Parameters
| Parameter | Value | Note |
|---|---|---|
| Total supply | 1,000,000,000 Oracleum | Fixed. No mint function after deployment. |
| Decimals | 18 | Standard ERC-20. |
| Transfer tax | 3% | 300 bps on every transfer. |
| Tax destination | Prover treasury | Reimburses prover gas. Address published at launch. |
| Max window | 2,048 blocks | Enforced by the verifier contract, not by policy. |
1B supply, 3% transfer tax. These are launch parameters, not measurements: every one of them lives in config/token.ts and none is on-chain yet.
Roadmap
Tagged honestly. Live means you can use it today; planned means it does not exist.
Scheme
- Pedersen commitments on secp256k1Live
- Okamoto NIZK proof of opening, Fiat–ShamirLive
- Browser proof lab with tamper checkLive
- Window binding and contiguity rulesLive
Anchor
- ProofAnchor.sol written and unit-testedLive
- Verifier deployed to Robinhood Chain mainnetLive
- First live window anchored from real state rootsLive
- Public feed of on-chain anchorsLive
- Contract source verified publiclyLive
Coverage
- Continuous prover covering every windowIn progress
- Treasury reimbursement for unclaimed windowsPlanned
- Independent re-verification clientsPlanned
- External review of the schemePlanned
Succinctness
- Recursive aggregation across windowsPlanned
- Constant-size proof for the whole historyPlanned
- On-chain proof verification, not just storagePlanned
FAQ
Questions worth asking
Does Oracleum need permission from Robinhood Chain to do this?
No. Anchoring reads public block data and writes to a contract that anyone can call. Oracleum is not a Robinhood Chain product and is not affiliated with, endorsed by, or operated in coordination with Robinhood. It is an independent verification layer built on top of a public chain.
If the roots are hidden, what exactly is being proved?
That a commitment was formed correctly from a specific block range and a specific pair of state roots, by someone who knew those roots. The proof binds the block numbers and the roots into its challenge, so a proof made for blocks 0–2,047 cannot be replayed for any other range. What it does not prove on its own is that the roots match what Robinhood Chain published — that comparison is the verifier’s job, and it needs only the roots they already have.
Why hide the roots at all, if they are public?
Because the same construction has to work for data that is not public — pre-publication state, sequencer-internal roots, and the intermediate roots inside a window. Building the public case on a scheme that also handles the private case means there is one mechanism to audit rather than two.
Why a 3% transfer tax?
Anchoring costs gas, and a window nobody profits from anchoring is a window that stays unanchored. The tax funds a treasury that reimburses provers for covering unclaimed windows, so history gets covered even when no individual has a reason to cover it. The rate is a launch parameter, set in config/token.ts.
Has any of this been audited?
No. The commitment scheme and the proof system are standard constructions — Pedersen commitments and Okamoto’s protocol on secp256k1, both decades old — but this specific implementation has not been audited, and no verifier contract is deployed to mainnet. Treat everything here as experimental.
What can I actually check right now?
The proof lab. It runs the real scheme in your browser with no server involved: commit to a value, produce a proof, verify it, then flip a single bit and watch verification fail. The same 2048-block window logic that would run on-chain runs there too, and every proof you generate appears in the live feed.
Something missing? Oracleum has no support desk yet — the code is the documentation.