Rand Protocol
Documentation
Ecosystem

Validators, aggregators and provers

How the roles on Rand fit together - which machine proves a transfer and with what key, what an RPC node checks before it gossips one, how validators order, verify and finalise blocks without proving anything, and where an aggregator would seal a window of proofs once aggregation is switched on.

Use this page to see who does what when a transfer moves through Rand. Proving is expensive and verifying is cheap, so the work is split along that line. The sender’s side makes the proofs. Validators only check them, order them and vote. An aggregator, once switched on, would fold many proofs into one. The figure follows one transfer from the wallet to a final block; the sections after it take each role in turn.

How a transfer moves through Rand A wallet makes the authorisation proof itself and gets the bundle proof from this device, a prover of its own, or the validators' prover pool, which is sent the viewing key only. The transaction goes to an RPC node, which verifies both proofs and gossips it to the validators. The validators order it in a block, re-verify every proof, vote, and commit the block. Finalised blocks are kept by observers and archive nodes. An aggregator, built but switched off on chain 21 as on chain 20, would prove one recursive proof over a window of bundle proofs and submit it for a sealing block. 1 · ON THE SENDER'S SIDE Wallet holds the spend key; it never leaves builds the transfer, seals the envelopes authorisation proof · tier 10 · seconds always made here, over the spend key Bundle prover tier 14 · about 6 GB of memory · 1–2 min this device (desktop app, 8 GB phone) a rand-prover you run the validators' pool prover.randprotocol.org viewing key + salt bundle proof checked locally transaction: two proofs, nullifiers, commitments, sealed envelopes, fee 2 · ANY RPC NODE checks the binding, both proofs and the fee on four verify workers behind a 64-deep queue, then gossips the transaction on, only once it has verified gossip 3 · VALIDATORS · 26 ON CHAIN 20, 18 NEEDED TO COMMIT Mempool still-valid, best fee per KiB Leader proposes round robin · about one block a second HotStuff votes final after three chained QCs every validator re-verifies every proof in a block before it votes; no validator proves anything Aggregate → a sealing block 4 · FINALISED BLOCKS served by every RPC node and the explorer archive nodes keep every raw proof wallets scan them with their own keys window AGGREGATOR · BUILT, OFF ON CHAIN 20 one recursive proof over a window of bundle proofs; GPU-class, bonded paid a proving share and a subsidy
On a phone, swipe the figure sideways. One transfer, top to bottom. Solid arrows are what chain 21 does today; the dashed box and arrow are block aggregation, which is built and merged but not in chain 21's genesis.

The path of one transfer

  1. The wallet builds the transfer. It picks its input notes, fetches their Merkle witnesses, builds four outputs and seals each in an ML-KEM-768 envelope. It then computes the transaction’s binding, a hash over everything but the proofs (Transactions).
  2. The wallet proves the authorisation itself. This is a tier-10 proof over the spend key and a fresh salt, a matter of seconds. It is the only proof that touches the spend key, and it is always made on the wallet’s own machine.
  3. The bundle proof is made where there is memory for it. This tier-14 proof shows ownership, membership, the nullifiers and the balance, and peaks at about 6 GB. The desktop app and a phone with about 8 GB make it themselves. Anything smaller hands the job to a prover it is paired with: one you run, or the validators’ pool at prover.randprotocol.org. Either is sent the viewing key and the salt, never the spend key (Proofs).
  4. An RPC node checks it. Whatever node the wallet submits to recomputes the bundle digest, verifies both proofs against the binding, checks the fee, and only then gossips the transaction to its peers (Proofs, Mempool).
  5. Validators order and finalise it. The leader of the view takes the transactions that still apply, best fee per KiB first, and proposes a block. Every validator re-verifies every proof in it and votes. The block commits once three quorum certificates chain on it in consecutive views, which needs 18 of chain 21’s 26 validators online (Consensus).
  6. The block is final, and everyone can check it. A transaction is final when rand_getTransaction returns a block. A node that syncs later re-verifies every certificate and every proof rather than trusting the signatures.

The roles

rolewhat it doesproves?what it seesruns
walletbuilds, authorises and submits transfers and calls; scans the chain with its own keysthe authorisation proof always; the bundle proof when the device has the memoryeverything about its own notesthe apps on the Clients page, or rand; on chain 21, Rand Wallet or rand v0.8.0 (on chain 20 it was v0.6.8 or later)
delegated provermakes the bundle proof for a wallet paired with it; every reply is checked by the wallet before anything is submittedbundle proofs onlythe paired wallet’s viewing key: its whole history, past and future; it cannot spendrand-prover run, or rand-node run --prover
validators’ prover poola delegated prover run by four hosts, two validators and two machines that only prove, behind one name and one key, for wallets with no prover of their own; no feebundle proofs onlythe same as any delegated prover, for every wallet that pairs itprover.randprotocol.org, fingerprint RGTF-7HKJ-XZFV-GQ1J
RPC node (observer)syncs, re-verifies every proof, serves JSON-RPC, gossips verified transactions; no votenopublic fields only: commitments, nullifiers, sealed envelopes, proofsrand-node run
validatoreverything an observer does, plus proposing in its views and voting in HotStuffnopublic fields onlyrand-node run --validator
aggregatorproves one recursive proof over a window of finalised bundle proofs and submits it for a sealing blockyes, the largest proofs on the networkpublic fields and proofs onlyrand-node aggregate --watch, on a chain with an aggregation section

Proving and validating are separate jobs, and a validator does not need prover hardware. Two of the pool’s four members are validators that also run a prover, as a service; the other two are dedicated prover machines that hold no validator key. Running the pool is not part of validating. Sizes for each role, and the measured proving memory per tier, are on Validator and aggregator hardware.

What each role can learn

The privacy of a transfer depends on who holds which key, not on trusting the network:

  • Validators, RPC nodes and the explorer see what every node sees: commitments, nullifiers, sealed envelopes, the fee and the proofs. Not the amount, the asset, the sender or the recipient.
  • A delegated prover, including the pool, is sent the viewing key. With it, it can read the paired wallet’s entire history. It can never spend, because the authorisation proof over the spend key is made on the wallet’s machine. Pairing the pool means choosing to show its operators that history. If you want it private, prove on your own device or run your own prover.
  • A delegated prover cannot cheat the wallet. The wallet reads the digest off every proof it is given, checks the size and verifies it locally, so a wrong proof never reaches a node.

Aggregation: built, not on

Today every block carries every raw proof, about 2.85 MB for a transfer, so a 20 MiB block holds about seven transfers. Block aggregation is the fullnode’s answer. An aggregator takes the bundle proofs of a window of finalised blocks (rand_getUnsealed), proves one recursive proof that verifies them all, and submits it. The block that includes it seals the window. Validators then verify one aggregate instead of N proofs, and nodes can drop the covered raw proofs. Aggregators are bonded and permissionless, run on GPU-class machines, and are paid the covered bundles’ proving share plus a block subsidy in new RAND.

It is built and merged, but it is not active. It needs an aggregation section in the genesis, and chain 21 has none, as chain 20 had none, so rand_status reports every aggregation counter as zero. Before it can be switched on, its bundle shape must be re-measured under the current constraint set, and a forged-aggregate exercise must be run against the recursion verifier. On a split-authorisation chain it would also seal only the bundle proofs, not the authorisation proofs (Proofs).

Last verified against fullnode commit c0878c3f (chain 21) on 2026-10-12, and fullnode `c0878c3f` (v0.8.0): `deploy/genesis-chain21.json` (26 validators, no `aggregation` section), `crates/randprotocol-prover/src/wire.rs` (the wallet hands the prover the binding), fullnode main `cb0a32ea`: `deploy/prover/README.md` (status 2026-10-01 06:00 UTC: four members), randprotocol.org `rand_status` on chain 20, 2026-10-01, and on chain 21, 2026-10-12: `aggregation` all zero, 26 peers, this tree's Proofs, Consensus, Mempool and Validator and aggregator hardware pages. Where the code and this page disagree, the code is right; tell us.