Soul of Satoshi (SOS)A Fully Post-Quantum Layer-1 with Opt-In Shielded Transactions and a Proof-Based, Non-Custodial Ethereum BridgeWhitepaper v2
Abstract
Every widely deployed blockchain stakes its security on elliptic-curve cryptography: ECDSA and Schnorr signatures authorize transactions, BLS signatures aggregate consensus votes, pairing-based SNARKs compress proofs, and Pedersen commitments hide amounts. All of these are broken by Shor’s algorithm on a cryptographically relevant quantum computer, and the “harvest-now, decrypt-later” adversary makes the break retroactive for any secret recorded on a public ledger today. Soul of Satoshi (SOS) is a Layer-1 protocol designed from first principles so that every security-bearing primitive on its own side of every trust boundary is post-quantum: all signatures (transactions, consensus votes, spend authorization) are ML-DSA-65 (NIST FIPS 204); shielded-note encryption is ML-KEM-1024 (FIPS 203) with a SHAKE-256-derived AEAD; every hash, commitment, nullifier, and Merkle node is SHA3-256/SHAKE-256 (FIPS 202); and every zero-knowledge proof that the SOS network itself verifies is a transparent, hash-based STARK with no trusted setup and no pairings. Non-post-quantum cryptography is confined to two enumerated external-chain compatibility modules at the Ethereum boundary, where the counterparty chain’s verifier dictates the curve.
On this substrate SOS builds three systems that, to our knowledge, have not previously been composed in one protocol: (i) a two-phase Tendermint-style BFT proof-of-stake consensus whose quorum certificates are ML-DSA-65 signatures over a 58-byte domain-separated vote preimage, and whose signed block hash binds the chain identity, epoch, and validator-set hash, making finality verifiable inside a zkVM; (ii) PQ-MWEB, an opt-in shielded extension-block ledger with hash-only note commitments, position-bound nullifiers, ML-KEM-1024-sealed notes with view tags, and per-action client-side STARK proofs that the node only verifies, all bound into the consensus application state root; and (iii) a proof-based, non-custodial bidirectional SOS–Ethereum bridge. SOSEthereum uses a recursive STARK that verifies a real FIPS-204 stake-weighted quorum certificate inside the proof, composes it with transaction-inclusion proofs, and commits a journal that an Ethereum contract reconstructs byte-for-byte against a pinned program identity; EthereumSOS uses a finality-aware light-client STARK that verifies sync-committee signatures and extracts the burn from proven execution storage — no multisig, bridge committee, or oracle. We further present Proof-Carrying Finality, a scalability program that reuses the consensus STARK as a portable epoch-checkpoint finality certificate, together with measured results from a native ML-DSA verification AIR prototype. We report the protocol in full byte-level detail, give security arguments under explicit assumptions, describe a multi-node adversarial evaluation, and state precisely which components are implemented, which are in progress, and which are research.
1 Introduction
1.1 The post-quantum threat to deployed ledgers
Public blockchains are an unusually exposed cryptographic target: the entire transcript of every signature, public key, ciphertext, and commitment is published, replicated, and immutable by design. Against a classical adversary this is the point. Against a quantum-capable adversary it is a liability, because the ledger cannot be re-encrypted after the fact.
Shor’s algorithm [3] solves integer factorization and discrete logarithms (including elliptic-curve discrete logarithms) in polynomial time on a sufficiently large fault-tolerant quantum computer. Its consequences for the current blockchain stack are direct and structural, not incremental:
-
•
Transaction authorization. ECDSA over secp256k1 (Bitcoin, Ethereum accounts) and Schnorr/Taproot signatures derive their security from the elliptic-curve discrete-logarithm problem. Any address whose public key is visible on chain — every spent Bitcoin output, every Ethereum EOA that has ever transacted — yields its private key to Shor’s algorithm. The attacker does not need to intercept anything; the ledger is the interception.
-
•
Consensus. BLS signatures on pairing-friendly curves [43] underpin Ethereum’s beacon-chain attestations and most proof-of-stake aggregation designs. A discrete-log break forges arbitrary validator aggregates, and therefore arbitrary finality.
-
•
Proof systems. Pairing-based SNARKs (Groth16 [24] and its successors) rest on knowledge assumptions in pairing groups; a discrete-log adversary can forge proofs. Rollups, zk-bridges, and shielded pools built on them inherit the break.
-
•
Privacy. Pedersen commitments, Bulletproof range proofs, and Diffie–Hellman note encryption (Monero, Mimblewimble [34, 35], Zcash Sapling/Orchard [38]) are elliptic-curve constructions. A quantum adversary de-anonymizes and, in homomorphic-commitment designs, can counterfeit value by opening commitments to different amounts.
Grover’s algorithm [4] is the second, milder effect: a quadratic speedup for unstructured search reduces an ideal -bit preimage problem to quantum work and (by the BHT collision algorithm) collisions to . Hash functions and symmetric ciphers therefore survive with doubled parameters: a 256-bit hash retains roughly a quantum security margin. This asymmetry — public-key cryptanalysis breaks, symmetric/hash cryptography degrades gracefully — is the foundation of the SOS design: the protocol is built, wherever possible, from hashes alone.
The threat is not hypothetical timing speculation. The relevant decision variable, as Mosca framed it [5], is the sum of the data’s required secrecy lifetime and the system’s migration time against the adversary’s arrival time. For a base-layer monetary ledger the secrecy lifetime of a private note and the integrity lifetime of a signature are both measured in decades; the migration time of a live chain with entrenched consensus rules is measured in years to decades; and a recording adversary is already active by assumption, because recording a public chain is free (“harvest now, decrypt later” — and for signatures, “harvest now, forge later”). NIST’s standardization of ML-KEM, ML-DSA, and SLH-DSA [8, 9, 10, 6] closed the primitive-availability gap in 2024. What remains open — and what this paper addresses — is the systems gap: composing the standardized primitives into a complete ledger whose consensus, privacy, proof, and interoperability layers are all post-quantum simultaneously.
1.2 Why a signature swap is insufficient
A common proposal is to retrofit an existing chain with post-quantum signatures. This addresses only the first of the four break classes above. The harder problems are systemic:
-
1.
Privacy does not retrofit. Confidential-transaction algebra (Pedersen blinding, kernel offsets, homomorphic balance checks) has no known post-quantum drop-in with comparable properties; a private pool must be re-designed around hash commitments and explicit zero-knowledge validity proofs, and those proofs must themselves be post-quantum (transparent, hash-based), not pairing SNARKs.
-
2.
Aggregation does not retrofit. Lattice signatures do not natively aggregate the way BLS does. Every consensus, light-client, and bridge design that silently assumes “ signatures compress to one” must be re-architected. Section 8 treats this as a first-class protocol problem with measured engineering answers rather than an afterthought.
-
3.
Bridges are the weakest boundary. A bridge inherits the weaker of its two endpoint assumptions plus everything in between (multisig custodians, committee oracles, pairing-based light clients). A post-quantum chain bridged by a pre-quantum multisig is not post-quantum in any meaningful end-to-end sense. SOS therefore makes the bridge a proof system (Section 7) and confines residual pre-quantum verification to the counterparty chain’s own side of the boundary.
-
4.
Verification economics change. Post-quantum signatures are an order of magnitude larger than ECDSA (an ML-DSA-65 signature is 3309 bytes; a public key is 1952 bytes). Block formats, quorum certificates, light clients, and gossip budgets must be designed for these sizes from the start (Sections 4, 8).
SOS’s thesis is that post-quantum security is a whole-system invariant, established by construction and policed at every boundary, rather than a property of any single primitive.
1.3 The design discipline
The entire protocol follows one rule, stated here informally and made precise in Definition 2.3:
Every security-bearing primitive on the SOS side of every trust boundary is post-quantum. Non-post-quantum cryptography is confined to enumerated external-chain compatibility modules at the Ethereum boundary, where the counterparty chain’s verifier dictates the primitive.
Concretely, the permitted non-PQ modules are exactly two: (i) the pairing-based (Groth16/BN254) seal into which the SOSEthereum bridge STARK is wrapped, because an Ethereum contract can verify a pairing check in a few hundred thousand gas but not a multi-megabyte FRI transcript; and (ii) the BLS12-381 signature verification inside the EthereumSOS light client, because Ethereum’s own sync-committee protocol [44] signs with BLS. Both verify statements about or for Ethereum; neither is load-bearing for the SOS ledger, consensus, or shielded pool. A corollary enforced in the implementation is that SOS-internal verifiers must accept only bare hash-based STARK receipts and never a pairing-wrapped receipt (Section 10.3 discusses the enforcement status).
1.4 Contributions
This paper makes the following contributions. Each is developed in a dedicated section with definitions, exact constructions, and security arguments; the status tags are defined in Section 1.5.
-
1.
A coherent, fully post-quantum L1 protocol stack [IMPLEMENTED, TESTNET-VALIDATED] (Sections 2–4): ML-DSA-65 for every signature including consensus votes; SHAKE-256/SHA3-256 for every hash, commitment, nullifier, and Merkle node with a global domain-separation registry (Appendix B); ML-KEM-1024 plus a SHAKE-256-KDF AEAD for note encryption; and bare hash-based STARKs for all succinct proofs the SOS network verifies.
-
2.
A zkVM-verifiable two-phase BFT proof-of-stake consensus [IMPLEMENTED, TESTNET-VALIDATED] (Section 4): Tendermint-lineage two-phase locking (lockedValue/lockedRound, polka-gated unlock), strictly stake-weighted quorum certificates of raw ML-DSA-65 signatures over a fixed 58-byte vote preimage, round synchronization, QC-gated catch-up, and a v4 block-hash preimage that binds chain_id, epoch, and the validator-set hash into the very hash the quorum signs — the property the bridge and light clients rely on.
-
3.
PQ-MWEB [IMPLEMENTED] (Section 6): an opt-in shielded extension-block ledger re-derived from MWEB’s deployment model [36] and Zerocash-style accounting [37] with no elliptic-curve algebra: hash-only ownership-welded commitments (commit_v3 binding ), position-bound nullifiers, a depth-32 SHAKE-256 commitment tree with a 256-root anchor window, ML-KEM-1024-sealed notes with one-byte view tags, per-action client-side STARKs with journal-as-truth verification, and binding of the entire pool state into the consensus application state root.
-
4.
A proof-based, non-custodial bidirectional SOS–Ethereum bridge (Section 7): for SOSEthereum, an in-zkVM verification of a real FIPS-204 stake-weighted quorum certificate (5.87M zkVM cycles per signature, measured), composed with Merkle transaction-inclusion proofs in a batch guest whose committed journal is the exact ABI encoding that the on-chain SOSBridge contract reconstructs and verifies against a pinned, immutable program identity; for EthereumSOS, a finality and execution-storage proof that extracts the wSOS burn under verified sync-committee roots. Both directions, the unattended relayer, and a public validator-set rotation from to have been demonstrated end-to-end against live Ethereum Sepolia with real proofs [IMPLEMENTED]; sustained cross-chain load/chaos exercise and external review remain [IN PROGRESS].
-
5.
Proof-Carrying Finality and a measured acceleration program (Section 8): a quantified analysis of the post-quantum quorum-certificate size problem, with negative results (committee sampling diverges as the Byzantine fraction approaches ; algebraic batch verification of distinct-signer ML-DSA is structurally unavailable; current lattice multi-signatures are not adoptable), a bounded-validator launch posture, an epoch-checkpoint finality certificate reusing the consensus STARK [IMPLEMENTED], measured zkVM acceleration levers (keccak accelerator, key-decode caching, multi-GPU shard composition) [MEASURED PROTOTYPE], and a native ML-DSA verification AIR prototype whose two feasibility kill-criteria both passed with measured data [MEASURED PROTOTYPE].
-
6.
A native, bit-exact FIPS-204 verification AIR with a measured in-zkVM re-verification crossover [MEASURED PROTOTYPE] (Section 9): to our knowledge the first AIR family that arithmetizes measured cores of unmodified FIPS-204 verification — a fully range-checked mod- multiplication gadget and the complete 8-layer forward NTT, bit-exact against the reference implementation — in a transparent, hash-based FRI STARK, together with a wrap-not-replace integration in which a thin zkVM guest verifies the native proof in software and journal-commits the result, leaving the recursion pipeline and the on-chain verifier untouched. Both pre-registered feasibility kill-criteria were retired with measurements: one NTT proves at of a full in-zkVM ML-DSA-65 verification budget, and the in-guest verification of the native proof costs M cycles (), clearing the realistic 67–128-signature quorum size. This is a measured research prototype with an explicit remaining program, not a deployed consensus primitive.
-
7.
An explicit threat model and TCB inventory (Section 10): security claims with reductions to the stated assumptions, an enumeration of every trust boundary including the proof system’s circuit TCB, and a list of known limitations stated against the actual code rather than the intended design.
1.5 Implementation status and honesty conventions
A whitepaper for an unlaunched system has an obligation not to blur design intent with deployed fact. Throughout this paper every load-bearing component carries one of four tags:
-
•
[IMPLEMENTED, TESTNET-VALIDATED] — implemented in the codebase and exercised on a multi-node testnet under load and adversarial (chaos) conditions.
-
•
[IMPLEMENTED] — implemented in the codebase with passing unit and integration tests, not yet exercised by the full multi-node harness.
-
•
[IN PROGRESS] — partially implemented; the remaining work is plumbing or integration, not open cryptography. The text states exactly what exists and what is missing.
-
•
[RESEARCH] / [MEASURED PROTOTYPE] — a research track; [MEASURED PROTOTYPE] indicates the prototype exists and the numbers quoted are measurements, not estimates.
Three global caveats apply. First, the system is pre-mainnet and has not had an external security audit; an internal adversarial audit program exists and its findings (several of which materially changed the design, e.g. the ownership-welding of Section 6.3) are folded into this paper. Second, all performance figures are from the stated lab hardware and are reproducible measurements, but they are not mainnet-scale benchmarks. Third, where the live deployment or operating model lags the implemented cryptography (notably independent operators and mainnet bridge migration, Section 7.8), the paper says so explicitly.
1.6 Organization
Section 2 fixes notation, defines the primitives, and states the assumptions. Section 3 gives the system architecture. Section 4 specifies consensus and proves its safety. Section 5 specifies monetary policy, the genesis distribution, and staking. Section 6 specifies PQ-MWEB. Section 7 specifies the Ethereum bridge in both directions. Section 8 presents the scalability analysis, PCF, and the measured acceleration stack. Section 9 develops the native FIPS-204 verification AIR — architecture, gadget-level soundness arguments, the in-guest verifier, and the measured crossover — as a dedicated contribution. Section 10 gives the threat model and security analysis. Section 11 surveys related work. Appendices A–C collect the canonical byte layouts with RFC-style wire-format diagrams, the domain-tag registry, and the parameter tables.
2 Preliminaries, Primitives, and Assumptions
2.1 Notation
All byte strings are finite sequences over ; denotes concatenation. denotes the -byte little-endian encoding of the unsigned integer ; the implementation uses little-endian encodings in all SOS-native preimages and big-endian 32-byte words only inside the Ethereum-ABI journal (Section 7.2.4), matching Solidity’s abi.encode.
For a fixed ASCII domain tag we write
Visual explanationDomain-separated hashes31 sec
Accessible transcript
One primitive. SHA3 and SHAKE provide the common hash substrate.
Separate meanings. A fixed ASCII domain is prepended before any protocol payload.
Versioned law. Changing a purpose requires a new versioned tag and activation height.
No cross-purpose replay. Identical payload bytes in different domains produce unrelated commitments.
Security property. A valid digest for one protocol purpose cannot be replayed as a valid digest for another purpose.
where denotes bytes of SHAKE-256 output. Domain tags are versioned constants (e.g. sos:note-commit:v3, bqp:block:v4); the registry in Appendix B lists every tag in the protocol, and the implementation rule is that a tag is never reused across purposes and never changed without a version bump and an activation height. Two tag namespaces coexist for historical reasons: bqp: (the project’s original codename) and sos:; both are consensus-frozen byte constants and the namespace carries no semantic distinction.
Validator voting power is denominated in stake (Section 5.7); a quorum is any validator set whose summed effective stake is strictly greater than of the total active effective stake. Amounts are integers in sats, SOS.
2.2 ML-DSA-65 (FIPS 204)
ML-DSA-65 is the module-lattice digital signature standard [9] derived from CRYSTALS-Dilithium [11], instantiated at NIST security category 3. Its EUF-CMA security reduces to the Module-LWE and Module-SIS problems over power-of-two cyclotomic rings; no polynomial-time quantum algorithm is known for either, and the parameter set targets a classical/quantum security level comparable to AES-192. The concrete sizes that shape the SOS protocol are:
| bytes | role in SOS | |
|---|---|---|
| public key | 1952 | validator consensus_pk; account keys |
| signature | 3309 | votes, QCs, transactions, spend authorization |
SOS uses ML-DSA-65 in its pure (non-pre-hash) mode with the empty context string: the signed message is the raw preimage defined by the protocol (e.g. the 58-byte vote preimage of Construction 4.3). This choice is consensus-critical — the zkVM consensus guest (Section 7.2.1) re-verifies the same bytes with the same FIPS-204 Verify algorithm, and any host/guest divergence in message formatting is a soundness break, so a single shared library defines every preimage on both sides. One ML-DSA-65 verification costs approximately million RISC-V cycles inside the zkVM used (measured; Section 8.5).
Assumption 1 (ML-DSA unforgeability).
ML-DSA-65 is existentially unforgeable under adaptive chosen-message attack (EUF-CMA) against quantum polynomial-time adversaries, per the Module-LWE and Module-SIS assumptions at FIPS-204 category-3 parameters.
2.3 ML-KEM-1024 (FIPS 203)
ML-KEM-1024 is the module-lattice key-encapsulation standard [8] derived from CRYSTALS-Kyber [12], instantiated at category 5 (the most conservative parameter set; ciphertext 1568 bytes, encapsulation key 1568 bytes, 32-byte shared secret). SOS uses it solely for note encryption in the shielded pool: each note is sealed under a fresh encapsulation against the recipient’s registered KEM key (Section 6.4), so note confidentiality is protected against a harvest-now-decrypt-later adversary for the lifetime of the Module-LWE assumption rather than the lifetime of an elliptic curve.
Assumption 2 (ML-KEM CCA security).
ML-KEM-1024 is IND-CCA2 secure against quantum polynomial-time adversaries at FIPS-203 category-5 parameters.
2.4 SHA-3, SHAKE-256, and the hash margin
SHA3-256 and SHAKE-256 are the FIPS-202 [7] sponge constructions over Keccak-. SOS uses SHA3-256 (fixed 32-byte output) for block hashes, transaction hashes, validator identities, and the bridge journal digest’s inner components, and SHAKE-256 (XOF, squeezed to 32 bytes unless stated) for the entire note scheme and key-derivation paths. Against a quantum adversary, Grover’s algorithm bounds preimage search at work for 32-byte outputs and the BHT algorithm bounds collisions at query complexity (with classical collision search at ); both are regarded as out of reach, and the sponge’s indifferentiability supports the domain-separation methodology of Section 2.1.
Assumption 3 (Hash security).
SHA3-256 and SHAKE-256 (32-byte outputs) are collision-resistant, preimage- resistant, and second-preimage-resistant against quantum polynomial-time adversaries, and may be modelled as random oracles for the domain-separated uses in this paper.
2.5 ChaCha20-Poly1305
Note plaintexts are encrypted under ChaCha20-Poly1305 [13] with a key and nonce derived by SHAKE-256 from the ML-KEM-1024 shared secret (Section 6.4). Symmetric AEAD security degrades only by Grover’s quadratic factor (effective for the 256-bit key); ChaCha20 is chosen over AES-GCM for constant-time software performance in no_std and WASM wallet environments, with no reliance on hardware AES.
2.6 Hash-based commitments and nullifiers
Definition 2.1 (Domain-separated hash commitment).
For domain tag , message tuple of fixed widths, and trapdoor , the commitment is . Binding holds unconditionally up to collisions of SHAKE-256 (Assumption 3): opening a commitment to two distinct tuples exhibits a collision. Hiding holds computationally in the random-oracle model when has 256 bits of min-entropy: the adversary must query the oracle on the correct to distinguish openings.
This is deliberately the weakest, most conservative commitment in the design space. Compared with algebraic (Pedersen-style) commitments it sacrifices additive homomorphism — so balance checks must be performed inside a zero-knowledge proof by explicit checked arithmetic (Section 6.5) — and gains two properties SOS considers decisive: post-quantum security, and the absence of any algebraic structure that an under-constrained circuit could exploit to counterfeit value, the bug class that has repeatedly affected algebraic shielded-pool designs.
Definition 2.2 (Nullifier).
A nullifier scheme for a note commitment is a deterministic function of a secret nullifier key , a per-note value committed inside , and the note’s leaf position , such that (i) computing without is infeasible; (ii) reveals nothing about which commitment it nullifies; and (iii) distinct notes yield distinct nullifiers except with negligible probability. SOS instantiates .
2.7 Transparent STARKs, FRI, and the RISC Zero zkVM
A STARK [15] is a succinct, transparent argument of computational integrity compiled from an interactive oracle proof [17] whose low-degree testing uses FRI [16] and whose only cryptographic ingredient is a collision-resistant hash (for Merkle commitments and the Fiat–Shamir transform). Transparency means there is no trusted setup and no structured reference string; soundness rests on Assumption 3 plus the proximity soundness of FRI. In the quantum random-oracle model, hash-based IOP compilations of this family admit security proofs [19]; accordingly STARKs are regarded as plausibly post-quantum, in contrast to pairing-based SNARKs. We state the working assumption explicitly:
Assumption 4 (Proof-system soundness).
The STARK system used (the RISC Zero zkVM [21] proof system, and for Section 9 the Plonky3 [22] uni-STARK — over Goldilocks in the measured prototype, over BabyBear in the production plan) is computationally sound against quantum polynomial-time provers at its documented conjectured soundness parameters: a prover cannot, except with negligible probability, produce an accepting receipt for an execution that does not correspond to running the committed program on some witness.
The RISC Zero zkVM proves correct execution of an arbitrary RISC-V (rv32im) program, called a guest. Three of its interfaces are load-bearing for SOS:
-
•
Receipts and journals. The prover emits a receipt containing a seal (the STARK) and a journal (the public outputs the guest committed via env::commit). A verifier checks the receipt against an image id — a 32-byte digest of the guest program binary — and then trusts the journal as the program’s authentic output. The image id is therefore part of consensus: SOS pins every guest’s image id as a compile-time constant, with CI tests that fail on any drift (Sections 7.2.3 and 10.3).
-
•
Recursive composition. A guest may call env::verify(image_id, journal) to assert that a valid receipt exists for another program with exactly that journal; the host supplies the inner receipt as an assumption and the recursion circuit discharges it. This is how the bridge folds a consensus proof and inclusion proofs into one receipt (Section 7.2.3).
-
•
Receipt kinds. The same proof can be emitted as a bare hash-based STARK receipt (composite or succinct) or wrapped into a Groth16 proof over BN254 for cheap on-chain verification. SOS’s discipline maps onto this directly: every SOS-internal verifier consumes the bare STARK; only the Ethereum-facing relayer produces the Groth16 wrap, and only the Ethereum contract verifies it (Sections 7.4, 10.3).
2.8 Consensus and network assumptions
Assumption 5 (Byzantine stake bound).
At every height, validators controlling strictly less than of the total active effective stake are Byzantine (arbitrarily malicious, including quantum-capable); the remainder follow the protocol.
Assumption 6 (Partial synchrony).
The network is partially synchronous in the sense of Dwork–Lynch–Stockmeyer [26]: after an unknown global stabilization time, message delays between honest nodes are bounded by an unknown constant. Safety must hold without any timing assumption; liveness may rely on eventual synchrony.
2.9 The post-quantum boundary, precisely
Definition 2.3 (SOS-internal vs. external-chain compatibility).
A primitive use is SOS-internal if its failure would allow forging SOS state: a signature accepted by SOS consensus, a proof accepted by an SOS node, a commitment or nullifier interpreted by the SOS ledger, or an encryption protecting SOS secrets. A primitive use is an external-chain compatibility module if it is verified by, or verifies statements signed by, a foreign chain, and its failure affects only assets or state on that foreign chain. The SOS design rule is: every SOS-internal use is drawn from ; external-chain compatibility modules are enumerated, currently exactly the Groth16/BN254 bridge seal (Section 7.4) and the BLS12-381 verification of the EthereumSOS light client (Section 7.5).
3 System Overview
3.1 Node architecture
SOS is implemented in Rust as a single node binary exposing a JSON-RPC interface to wallets, explorers, and tooling. One binary serves every role; roles are configuration, not separate software (the “model C” decision: every node validates; proving and relaying are opt-in modules, and a GPU is never required to validate). The node’s event loop drives four cooperating subsystems:
-
•
the consensus reactor: the two-phase BFT state machine of Section 4 — proposal handling, vote tallies, locking, round synchronization, QC construction and verification, and the catch-up buffer;
-
•
the chain state machine: applies finalized blocks; maintains the transparent UTXO set, the shielded pool (commitment tree, nullifier set, anchor window), the validator and staking state, and the supply tracker; computes the chained application state root app_hash (Section 3.3);
-
•
the extension-block builder: constructs and applies the private actions (shield, unshield, private transfer) of Section 6, enforcing journal-as-truth verification;
-
•
the mempool: admission, fee policy, and content-key deduplication (a canonical key over the action type, sender, amount, and burn identifier prevents duplicate logical actions from racing into blocks).
3.2 Participants and roles
-
•
Validators hold bonded stake and an ML-DSA-65 consensus key, run the full state machine, and vote. Validation is CPU-only by design.
-
•
Full/RPC nodes follow consensus (verifying every block’s QC), maintain full state, and serve wallets; they do not vote.
-
•
Light clients verify finality without state: given a block header and its embedded QC, a light client checks the stake-weighted ML-DSA-65 quorum against the known validator set (verify_qc), with no ledger replay. Mobile wallets are light clients; a phone is never a validator (availability and slashing, not compute, are the binding constraints). The PCF certificate of Section 8.4 is designed to replace per-block QC downloads with one constant-size STARK check per epoch.
-
•
Privacy provers are the users themselves: every private action is proved client-side, because the spend witness contains the secret nullifier key whose disclosure delegates spend authority (Section 6.7). The wallet talks to the user’s own GPU-equipped prover (a hardened TLS service is provided) or proves locally. A prover that receives must be treated as part of the user’s trust boundary. Private transfer (privateprivate) submission is now implemented with an ML-DSA-65 spend authorization inside the privacy STARK: the signed digest binds the chain id, expiry height, anchor, nullifiers, output commitments, output-ciphertext hashes, and fee. This prevents a node or prover from substituting different public effects for an accepted transfer, but it does not make third-party spend proving witness-private: delegated proving by an untrusted service remains outside the security claim.
-
•
Bridge provers and relayers are opt-in, permissionless, fee-compensated roles: the prover produces the recursive bridge STARK, the relayer wraps and submits it to Ethereum. Neither is trusted: a bad proof is rejected by the contract; liveness of these roles is an availability assumption, never a safety one.
3.3 Transaction classes and the state root
A transaction is transparent by default — a UTXO transfer authorized by an ML-DSA-65 signature — or private, routed through the extension block (shield, private transfer, unshield). Every finalized block commits to the post-state via the chained app_hash: a SHA3-256 digest over canonical encodings of (i) the UTXO set root, (ii) the contents of the shielded pool — note commitments, the commitment-tree root, the nullifier set, and the rolling anchor window (domain bqp:private-pool:v4) — (iii) the supply tracker including the bridge-locked bucket, and (iv) the validator and staking state including jailing flags. Two nodes with equal app_hash at equal height have byte-identical application state. The block hash that validators sign binds prev_app_hash (Section 4.2), so a proposer that built on divergent state is rejected at apply time, and — after the audit finding discussed in Section 6.6 — every shielded-pool change is inside the quorum-signed perimeter.
3.4 Zero-configuration networking and sync
A node ships with no required network configuration. On first start it bootstraps from baked-in DNS seeds, discovers peers over the public internet, and backfills the chain via a peer-to-peer block-sync protocol whose every received block is admitted only through the same verified apply path as live consensus (block-hash and QC verification, application against the prior app_hash), so a syncing node cannot be fed an invalid history. This has been verified on the live public testnet: a fresh, unconfigured node joined from the DNS seed, synced the chain from height zero, and its block hashes matched the live chain bit-for-bit. The July 2026 fresh public testnet also exposes its public P2P ingress on TCP 30303 through seed, seed1, seed2, seed3, and dnsseed.soulofsatoshi.com; all five records resolve to the same current seed while the names remain independently rotatable. An external smoke test that pinned the expected seed peer id (and therefore ignored unrelated mDNS peers) completed the DNS-resolved libp2p handshake. DNS publication is an operations property, not part of the consensus safety argument. Local peer discovery (mDNS) and explicit --boot-nodes remain available for private or lab deployments. [IMPLEMENTED, TESTNET-VALIDATED]
4 Consensus
SOS finalizes blocks with a deterministic, two-phase, stake-weighted Byzantine-fault-tolerant proof-of-stake protocol in the Tendermint lineage [28, 29, 25]. Three goals shaped it: (a) classical BFT safety under Assumption 5 and liveness under Assumption 6; (b) post-quantum authentication of every protocol message that bears on safety; and (c) — unusual for a consensus layer — finality that is cheap and unambiguous to re-verify inside a zkVM, because the bridge (Section 7) and the PCF certificate (Section 8.4) re-check it in a proof. Goal (c) drives concrete choices that a conventional design would not make: fixed-width raw-byte vote preimages instead of protobuf envelopes, a block hash that binds the validator set itself, and quorum certificates embedded in blocks as first-class data.
This section is written to be implementable from the text alone; every byte layout is the one in the code. [IMPLEMENTED, TESTNET-VALIDATED]
4.1 Validators, stake, and the active set
A validator is registered through a staking transaction carrying its 1952-byte ML-DSA-65 consensus_pk. Its identity is , and its voting power is its effective stake
the sum of the operator’s own bond and all delegations (Section 5.7). The active pool at a height is the set of registered validators that are neither jailed nor pending, ordered canonically by (effective stake descending, id ascending); this canonical order is consensus-critical because the validator-set hash (Construction 4.2) is order-sensitive. Dynamic join is supported: a new validator’s bond enters a pending state and activates at a scheduled activation height, at which point membership flips deterministically across all nodes within the same block (and is bound into that block’s app_hash), so the active set and the quorum denominator change simultaneously everywhere. Voluntary exit is implemented as a consensus-key-authorized transaction. The removal height is derived as the carrying block height plus ten blocks; until that boundary the validator continues to vote and count in the denominator, then every node removes it simultaneously and binds the change into app_hash. Self-bond and third-party delegations enter the 21-day unbonding queue of Section 5.7. An exit is rejected if it would leave fewer than four active validators. The protocol supports a registered pool of up to validators and bounds proposer eligibility to the top by effective stake; these limits sit within the bounded-active-set posture of Section 8.3 ( active consensus participants).
4.2 The canonical block hash (v4)
Construction 4.1 (Block hash bqp:block:v4).
For a block at height in slot , with transparent transaction root tx_root, post-state UTXO root utxo_root, extension-block root ext_root, parent application state root prev_app_hash, chain identity chain_id (a 4-byte constant; the current network uses 0x534F53), epoch number , and validator-set hash (Construction 4.2):
Visual explanationThe canonical block hash23 sec
Accessible transcript
Statement. A block hash is the single digest over which the validator quorum signs.
Consensus context. The chain id, epoch, validator-set hash, height, and slot prevent cross-chain, cross-epoch, and positional replay.
Committed state. The transaction, UTXO, shielded extension, and parent application roots make divergent state produce a different digest.
Signed boundary. A valid quorum certificate therefore attests to both finality and the precise state transition.
Security property. Finality is inseparable from chain identity, validator membership, and application-state continuity.
Construction 4.2 (Validator-set hash).
For the active pool in canonical order,
Visual explanationValidator power and set commitment29 sec
Accessible transcript
Effective stake. Self-bond and delegated stake determine each validator's voting power.
Canonical order. The active set is ordered by power descending and validator id ascending.
Full commitment. Every ML-DSA public key and little-endian stake value enters the digest.
Block binding. The resulting set hash is included in the value validators sign.
Security property. A quorum certificate is cryptographically bound to the exact validator keys and stake weights under which it was formed.
i.e. a SHA3-256 digest over each validator’s full 1952-byte key and 8-byte little-endian effective stake, in active-pool order. is order- and stake-sensitive by construction (a reordered set or a restaked validator yields a different ; this is pinned by tests). The hash input is rendered in Figure 8.
The v4 binding deserves emphasis because it is the hinge of the bridge’s security argument. Because the quorum certificate consists of signatures over block_hash, folding chain_id, , and into the hash makes the quorum cryptographically attest three statements that a verifier holding only the QC (a light client, or the zkVM guest) could otherwise not establish: that the block belongs to this chain and not a testnet or fork (anti-replay across chains); that it belongs to the claimed epoch (anti-replay across validator-set generations); and which validator set is canonical at this height — so a prover cannot present a quorum of signatures checked against a substitute validator set of its own choosing (Section 7.3). Binding prev_app_hash chains the application state: a proposer that built on divergent state produces a hash no honest validator will sign, and a syncing node rejects a block whose claimed parent root disagrees with its own.
4.3 Votes and the 58-byte preimage
Construction 4.3 (Vote preimage).
A consensus vote is an ML-DSA-65 signature (empty context, raw message) over the 58-byte preimage
where is the round, for prevote and for precommit, and iff block_hash is the all-zero hash (a nil vote), else .
Every field exists to kill a replay class, and each was motivated by a concrete defect found in an earlier iteration of the live path: the domain tag separates vote signatures from block-proposer signatures made with the same key (previously a proposer’s block signature was byte-identical to a vote); the chain-id field makes even nil votes non-replayable across forks or testnets; the height and round bind the vote to its position (previously a nil vote signed the same 32 zero bytes at every height — free equivocation material); the phase byte makes a prevote signature unusable as a precommit, so a quorum certificate (which is a precommit-domain object) cannot be assembled from prevotes; and the nil byte separates “no value” from a vote for a value. A single shared function constructs this preimage at every signing site, at the node’s verification site, and in the zkVM guests; its layout is pinned by byte-offset tests on both sides and rendered in Figure 6.
4.4 The two-phase protocol
Each height proceeds in rounds ; each round has three steps: propose, prevote, precommit. The round- proposer is selected deterministically and proportionally to effective stake from the eligible active set by the construction of Section 4.9, so all honest nodes agree on it without communication. Each node maintains the Tendermint lock state: and , plus , all reset only at a new height (a new height starts unlocked; a new round preserves locks and all vote tallies).
- propose.
-
The round’s proposer broadcasts a block (or re-proposes its locked value, attaching the round at which that value last obtained a prevote quorum). Non-proposers wait for the proposal or a timeout.
- prevote.
-
On a proposal for value (hash ) with valid-round , a node prevotes iff
Visual explanationVote replay protection and lock safety31 sec
Accessible transcript
Signed bytes. Every vote signs one fixed-width, domain-separated 58-byte preimage.
Replay barriers. Chain, height, round, phase, nil flag, and block digest are all authenticated.
Local lock. A validator only changes value when its own tally proves a sufficiently recent polka.
Intersection. Strict two-thirds stake quorums intersect in honest voting power.
Security property. Honest validators cannot finalize two conflicting blocks at the same height under the stated Byzantine-stake assumption.
where means the node has locally observed, in its own tally, prevotes for at round from validators holding strictly more than of total stake. The polka check is local by design: no quorum certificate attached to a proposal is trusted on the wire; the proposer’s is only a pointer telling the node where in its own tallies to look. Note (with equality unlocking) is required for liveness, and must not unlock for safety. Otherwise the node prevotes nil.
- precommit.
-
On observing a polka for at the current round, the node sets , , records as its valid value, and precommits . Otherwise, on timeout, it precommits nil.
- commit.
-
A block commits at a node when the node observes precommits for one non-nil at any single round from validators holding strictly more than of total stake. The committing node materializes the quorum certificate (Section 4.5), applies the block, and advances to height unlocked.
All thresholds are stake-weighted with strict inequalities: a set of distinct validators meets the threshold iff where is total active stake, and the threshold iff . Duplicate voters count once; per-round anti-equivocation tracking refuses to tally two different-hash votes of the same type from one validator at one and retains both signatures as slashing evidence (Section 4.8). (For bootstrap configurations whose validators have placeholder keys, the implementation falls back to head-count thresholds; any set containing a real key uses stake weighting. This is a development convenience, not a protocol mode.)
Phase timeouts escalate linearly with the round number (), the standard partial-synchrony device for eventually exceeding the unknown network delay.
Commit skew creates one additional delivery case: a node still applying height can receive the proposal and votes for , and gossipsub need not send those messages a second time. The reactor therefore keeps a bounded, liveness-only one-height look-ahead buffer. A future proposal is not acted on early; after entering it is removed and replayed through the full proposal-validation path against the committed parent state and the epoch-frozen active set. Future votes are retained only after their ML-DSA-65 signatures verify, with a cap of entries, and are replayed in prevote-before-precommit order through the normal signature, equivocation, quorum, and round-synchronization checks. No buffered message bypasses a safety predicate, and messages more than one height ahead are dropped. [IMPLEMENTED, TESTNET-VALIDATED]
4.5 Quorum certificates
Construction 4.4 (Quorum certificate).
When a block commits at round , the committing proposer attaches to the block a QC: the pair where each is validator ’s raw 3309-byte ML-DSA-65 precommit signature over the preimage of Construction 4.3 with . Verification (verify_qc) recomputes the preimage from , verifies each signature against the registered consensus_pk, sums the effective stake of distinct, valid signers, and accepts iff . Verification is fail-closed: unknown voters, duplicate voters, malformed fields, or a zero-stake set contribute nothing or reject outright.
The QC is deliberately not folded into the block hash (the votes are over the hash; including them would be circular), so attaching it never perturbs app_hash. Its role is to make finality portable: a node syncing from block data alone, a light client, and the zkVM consensus guest all run the same check against the same bytes, with no trust in the serving peer. The QC is also the protocol’s main scalability liability — one full ML-DSA-65 signature per signer — quantified and addressed in Section 8.
4.6 Safety
Lemma 4.5 (Quorum intersection).
Under Assumption 5, any two sets of validators each holding strictly more than of total stake share at least one honest validator.
Proof.
Let the sets hold stake and with and . Their union holds at most , so their intersection holds at least . Since Byzantine validators hold strictly less than , the intersection’s stake strictly exceeds the total Byzantine stake, so it contains an honest validator. ∎
Theorem 4.6 (Safety).
Proof sketch.
Suppose honest nodes commit distinct values at height , at rounds . Each commit requires a precommit quorum (Construction 4.4); by Assumption 1 every counted precommit was produced by the keyed validator, so the quorums are real sets of validators.
Case : the two precommit quorums intersect in an honest validator (Lemma 4.5) that precommitted both and at the same round, which the protocol forbids (one precommit per round, enforced by per-round anti-equivocation; an honest node precommits only on a polka for a single value, and at most one value can obtain a polka per round because two polka quorums would themselves intersect in an honest prevoter who prevoted twice).
Case : consider the precommit quorum for at . Every honest member of (more than stake worth, by the argument of Lemma 4.5 applied against the Byzantine bound) set , upon precommitting. Take the smallest round at which any polka for a value occurs. A polka at requires prevotes from a -stake quorum, which intersects in an honest validator (Lemma 4.5). At round , is still locked on with (locks persist across rounds and only move forward), and the prevote rule allows to prevote only upon locally observing a polka for at some with — contradicting the minimality of . Hence no polka, no precommit quorum, and no commit for any at any round in . ∎
The cross-round case is precisely the scenario that was reproduced as a fork on an earlier, single-phase iteration of the implementation and is now closed by the lock rule; the reproduction is retained as a regression test, and an independent re-audit of the live code (June 2026) confirmed the two-phase logic and that the guest-verified preimage matches the live 58-byte precommit. [IMPLEMENTED, TESTNET-VALIDATED]
4.7 Liveness under partial synchrony
A faithful two-phase protocol is safe unconditionally, but three further mechanisms proved necessary on a real lossy network to obtain liveness; all three were added in response to observed stalls in load/chaos testing, and all three preserve the safety argument because none touches the lock rule.
-
•
round synchronization. If a node observes votes (either phase) at a round greater than its own from validators holding strictly more than of total stake, then at least one honest validator is at (Byzantine stake cannot reach ), so the node fast-forwards to , preserving its lock and all tallies and re-entering propose. Without this rule, nodes whose timeouts fire at slightly different moments drift into different rounds and no proposal ever gathers a quorum — a livelock observed empirically under load.
-
•
QC-gated catch-up. A node that falls behind buffers out-of-order blocks and applies a buffered block only if it carries a QC that verifies under Construction 4.4; a bare gossiped proposal is never applied. Two subtle wedges in this path were found and fixed by the chaos suite: a buffered QC-less copy of a height must not suppress re-fetching a QC-bearing copy, and the buffer eviction policy must evict far-future heights rather than the next-needed one (the naive evict-lowest policy permanently wedged any node that fell more than the buffer size behind).
-
•
Consensus-envelope block budgeting. The proposer’s transaction budget is the apply-time block-size ceiling (4 MiB) minus the consensus envelope it will add: the proposer key and signature and the QC, which carries one 3309-byte signature per potential signer. A builder that counts only transaction bytes emits a block that every node rejects at apply time and then re-proposes forever — a deterministic halt observed in testing and eliminated by reserving the envelope.
Proposition 4.7 (Liveness, informal).
Under Assumptions 5 and 6, after the global stabilization time every height terminates: timeout escalation eventually exceeds the message delay; the without-replacement proposer cycle selects an online proposer within at most rounds from round zero (and in fewer than rounds from an arbitrary point across a cycle boundary), and the rule brings all honest validators into that common round; and the prevote rule’s clause (with equality unlocking) guarantees that a value locked by some honest node in an earlier round can be re-proposed and adopted by all honest nodes, so no permanent lock-split persists.
4.8 Equivocation, slashing, and accountability
Because every vote is a position-bound ML-DSA-65 signature, misbehaviour is self-evidencing: two verified precommits from the same validator at the same with different block hashes constitute complete, transferable evidence of double-signing, with no additional context needed. Evidence is applied deterministically in a later block. As implemented today, the slashable on-chain evidence path is consensus double-signing, with a bps () burn from the offender’s effective stake; downtime is enforced as jailing. Additional penalty constants for committee equivocation, invalid bridge batches, and downtime burns are reserved in code but are not yet wired as launch-grade evidence types. The mainnet release gate is to either wire and test those evidence paths end-to-end or keep the public economics limited to double-sign slashing plus downtime jail. [IN PROGRESS]
4.9 Proposer selection
The round- proposer at height is selected deterministically from the top 64 validators of the canonical active pool by a stake-weighted permutation without replacement. Let be the eligible count, , and . For draw , the implementation hashes u64le(h) || u32le(c) || u32le(k) under sos:weighted-proposer:v2, reduces the first 128 digest bits modulo the remaining effective stake, walks the canonical cumulative-weight intervals, selects that validator, and removes it before the next draw. If all remaining weights are zero, the same digest selects an index among them. The first draw is therefore exactly stake-proportional and splitting one stake interval does not increase its aggregate primary-proposer probability; without-replacement fallback also guarantees that no validator occupies two slots in one cycle. Consequently, if any eligible validator is online, an online proposer appears within at most rounds from the start of a height. From an arbitrary point inside a cycle the conservative bound is fewer than rounds, because the remaining online slots may already have passed and the next independently permuted cycle may place them late. This closes the unbounded repeated-offline-proposer streak observed under the v1 independent-round lottery. Selection remains communication-free. [IMPLEMENTED]
4.10 Empirical validation
The consensus and value path were exercised on a four-node local testnet driven by a load/chaos harness, with a 200 ms consensus tick. Headline results (all [IMPLEMENTED, TESTNET-VALIDATED]): hundreds of concurrent transparent transfers commit with zero supply drift and byte-identical app_hash across nodes; a double-spend race (the same funds raced to two recipients via two nodes) settles exactly one output, never both; killing more than of stake halts the chain without forking and restoring quorum resumes it; floods of invalid and overspending transactions are rejected without a node panic; a reproduced cross-round fork scenario is closed by the lock rule (regression-tested); a – sub-quorum vote split that livelocks a single-phase design converges; and the happy path commits in approximately ms per block. On the July 2026 fresh public testnet, a three-validator deployment finalizes with precommits and a measured interval still around the sub-second range; because this is a small co-located deployment, it is not directly comparable to the four-node chaos latency above. The validators first completed a one-at-a-time rollout of a pure --no-default-features --features verify-only binary. Activating the consensus-visible proposer-v2 schedule then used a coordinated stop/install/start on all three validators, without replacing or copying a data directory. The nodes had stopped at height 35642 with a v1 vote already persisted for 35643; the vote WAL refused a conflicting re-sign after restart, synchronized that already-finalized block, and made height 35644 the first full proposer-v2 height. The active binary has SHA-256 9f58f038…8789b; all three independently reported height 35732, block hash a04c61bb…b2d2c0, and application hash 2529c923…ead8a. Expected and actual supply both remained sats. Stopping node 0 caused the public HTTPS RPC to serve the finalized chain through a backup validator in 321 ms; node 0 then restarted and all three reconverged at height 35823. Separately, a clean deterministic proposer-v2 four-validator-plus-observer chaos run lasted 723.5 s, made 720 invariant checks, injected 22 kill/restart/partition/delay/flood events, accepted 1,489 mixed transfer/stake/undelegate operations, and ended at height 113 with no fork, state divergence, supply drift, or liveness violation. The genesis slot_time_secs of is a nominal parameter that the current reactor does not enforce as a block interval: block production is tick-driven at ms and paced by quorum formation, while the s timeouts in the reactor are round/view-change timeouts that bound a round before a view change, not the inter-block time. These are functional and adversarial results on small networks, not throughput claims.
5 Tokenomics: Monetary Policy, Distribution, and Staking
This section gives the complete tokenomics of Soul of Satoshi. Every quantity is read from the authoritative genesis.json for genesis-v2 ( sats) and is reconciled to the supply invariant (Invariant 5.2): genesis SOS liquid bonded vesting-locked , and genesis emission pool SOS. Genesis-frozen figures are [IMPLEMENTED, TESTNET-VALIDATED]; monetary-policy mechanics are [IMPLEMENTED]; the staking yields of Section 5.7 are illustrative, not measured, and are labelled as such.
5.1 Tokenomics at a glance
| parameter | value |
|---|---|
| unit / smallest denomination | SOS; sats |
| chain id | 0x534F53 |
| supply cap | SOS (hard, invariant-enforced) |
| genesis supply | SOS ( of cap) |
| emission pool | SOS ( of cap) |
| liquid at genesis | SOS |
| bonded at genesis | SOS (initial-validator self-bond) |
| vesting-locked at genesis | SOS |
| emission rate | SOS/yr flat; cap-truncated ( year ) |
| epoch length | days ( epochs/yr) |
| reward split | stakers / operators / treasury |
| fee policy | of each fee burned, distributed |
| unbonding period | days |
5.2 Units and supply cap
5.3 Genesis distribution
The launch genesis (genesis-v2, chain id 0x534F53) mints a fixed genesis supply of SOS — exactly of the cap — and leaves the remaining SOS () in an emission pool issued over time by the bounded emission of Section 5.5. The genesis supply is partitioned into six categories, each with an explicit on-chain vesting schedule in epochs of days; every figure below is taken directly from the authoritative genesis file and is reconciled against the supply invariant (Invariant 5.2) from block zero. [IMPLEMENTED, TESTNET-VALIDATED]
| supply component | sats | SOS | % of cap |
|---|---|---|---|
| supply cap | |||
| genesis supply (minted at block 0) | |||
| emission pool (issued as rewards) | |||
| liquid at genesis | — | ||
| bonded at genesis | — | ||
| vesting-locked at genesis | — |
| category | total | liquid @ gen. | cliff | linear | on sched. |
|---|---|---|---|---|---|
| (SOS) | (SOS) | (ep.) | (ep.) | (SOS) | |
| team | |||||
| treasury | |||||
| community | |||||
| airdrop | |||||
| marketing | |||||
| liquidity | — | — | |||
| total |
Vesting is linear per epoch after an optional cliff and is tracked on-chain, so an account’s spendable balance at epoch is its genesis-liquid amount plus the matured fraction of its scheduled total. Two categories carry liquid supply at block zero — the liquidity allocation (fully liquid) and part of the airdrop allocation — totalling SOS; a further SOS is bonded at genesis as the self-bond of the initial validators, and the remaining SOS is vesting-locked.111For the team and treasury categories the total exceeds the vesting-schedule total by SOS each; that SOS is the genesis validators’ self-bond (each of the four initial validators self-bonds SOS, two funded from team and two from treasury), which is staked rather than placed on the linear release. The July 2026 fresh public testnet used for the privacy round-trip rehearsal runs three active validators; the published genesis-v2 allocation defines four.
The project also implements the tooling for a post-quantum Merkle-drop used by the beta-testing campaign [IN PROGRESS]: contribution-weighted allocations are computed off-chain and committed as a single Merkle root with domain-separated SHA3-256 hashing (leaf , node , leaves sorted by address, odd nodes promoted), and a claim binds an ML-DSA-65 signature over . The campaign computation, root construction, and proof serving are implemented in the campaign application; the on-chain verification of airdrop Merkle paths in the node is in progress. The authoritative genesis allocation for genesis-v2 is the table above; the Merkle-drop is an optional distribution mechanism whose activation is a launch parameter of any future genesis.
5.4 Vesting and circulating-supply projection
Each category’s genesis allocation unlocks on the schedule of the allocation table: a cliff of epochs delays the start of a linear release over the following epochs, so the matured fraction of a scheduled total at epoch is (liquidity is fully liquid at genesis; the airdrop carries SOS liquid at genesis plus a scheduled SOS). The circulating, non-vesting-locked supply at time is the genesis-liquid SOS, plus the SOS initial validator self-bond (active stake), plus matured vesting, plus emission issued to date — equivalently, total issued minus the still-locked vesting balance, so the projection reconciles to Invariant 5.2 exactly. Table 2 samples it at year boundaries ( epochs/yr). [IMPLEMENTED, TESTNET-VALIDATED]
| time | liquid+bonded | matured vesting | emission issued | circulating | % of cap |
|---|---|---|---|---|---|
| (SOS) | (SOS) | (SOS) | (SOS) | ||
| genesis | |||||
| 1 yr | |||||
| 2 yr | |||||
| 3 yr | |||||
| 5 yr | (full) | ||||
| 10 yr | (full) |
5.5 Emission and rewards
Validator and delegator incentives are funded by transaction fees plus a bounded, cap-respecting emission [IMPLEMENTED]:
-
•
Emission proceeds at SOS per year, divided into -day epochs ( per year; sats, approximately SOS, per epoch).
-
•
Emission continues only while ; the final epoch’s emission is truncated to land exactly on the cap, after which emission ceases permanently. With the SOS emission pool released at the fixed annual rate, the emission horizon is approximately years.
-
•
Each epoch’s emission is split : to stakers pro rata by effective stake, to operators pro rata by blocks proposed in the epoch, and to the treasury. Fee revenue collected during the epoch is distributed alongside emission through the same channels.
-
•
A fixed of every transaction fee is burned (fee_burn_bps ) rather than distributed, so fee pressure is deflationary against the cap; the burn flows through the burned term of Invariant 5.2.
Fee model.
Transaction fees are split at the protocol level: of every fee is burned (fee_burn_bps ), permanently reducing supply through the burned term of Invariant 5.2, and the remaining is distributed alongside emission by the same staker/operator/treasury rule. Fee burn is the only deflationary force in the model; it offsets — and after the emission horizon can exceed — new issuance whenever fee volume is high.
Table 3 traces the emission schedule. Because genesis mints of the cap and each year adds SOS ( of the cap), total issued reaches of the cap in year until the emission pool is exhausted and issuance stops.
| year | annual emission | cumulative emission | total issued | % of cap |
|---|---|---|---|---|
| (SOS) | (SOS) | (SOS) | ||
| (final, truncated) |
Remark 5.1.
The v1 whitepaper described an all-at-genesis issuance with no protocol emission, funded from a time-released reserve. The implemented mechanism is the bounded emission above; the two designs coincide in the only property this paper treats as fixed — the hard 21M cap enforced by the invariant — and differ in the funding path for rewards. This paper documents the implemented mechanism.
5.6 The supply invariant
Invariant 5.2 (Supply).
At every block, letting the tracked buckets be circulating (transparent UTXOs), reserve (backing the shielded pool), bonded, unbonding, and bridge_locked (backing wrapped SOS on Ethereum):
Visual explanationThe supply invariant25 sec
Accessible transcript
Ledger equation. The left side accounts for where supply is now; the right side accounts for how it came into existence.
Internal movement. Shielding, bonding, unbonding, and bridge locking move value between buckets without changing total supply.
Issuance and burns. Only tracked issuance can increase the right side, while tracked burns reduce it.
Fail closed. If the equality fails, finalize_block aborts before the invalid state is persisted or propagated.
Security property. No accepted state transition can create unaccounted SOS or lose track of existing SOS.
Every boundary crossing (shield, unshield, bond, unbond, bridge lock, bridge release, slash-burn, fee flow) is routed through tracker transitions that preserve the equation, and finalize_block re-verifies it before computing app_hash. On violation, a release-build node logs the divergence and aborts the process before persisting or propagating state (the abort is unconditional — not a catchable panic), so a node whose accounting has diverged can never silently extend a corrupt chain; because app_hash binds the supply tracker, such a node is by definition already off-consensus and restarts from its last flushed good state. [IMPLEMENTED, TESTNET-VALIDATED]
Scope of Invariant 5.2.
The supply invariant polices the five tracked buckets and ensures that no SOS is created or destroyed except through enumerated transitions (shield/unshield, bonding/unbonding, bridge lock/release, fees, slashing). What it explicitly covers: all transitions between buckets, the total supply ceiling, and supply authenticity for the base ledger state. What it does NOT cover: (i) correctness of shielded-pool internal transfers — whether a private transfer correctly updates note commitments and nullifiers is validated by per-action zero-knowledge proofs (the journal-as-truth model of Section 6), not by the supply invariant; (ii) correctness of the privacy circuit (a bug in the STARK verifier or guest could silently counterfeit notes); and (iii) privacy-pool anonymity or metadata leakage. The supply invariant is a hard-halt gate: if any tracker transition violates it, the node aborts before committing (line 1491), making the invariant a safety check, not a completeness check. A counterfeit within a single bucket (e.g., a circuit bug minting reserve supply) is caught; an attack that forks the ledger and then carefully rebalances the tracked buckets across the fork could evade it, making consensus safety (Theorem 4.6) the deeper security boundary.
5.7 Staking and delegation
Stake is bonded to a validator either as the operator’s self-bond or as a delegation; effective stake is their sum and is the unit of voting power, reward weighting, and slashing exposure. Unbonding enters a queue with a -day maturity; entries in the queue remain slashable for offences committed while bonded (Section 4.8) and count in the unbonding bucket of Invariant 5.2. Validator membership changes (join with pending activation, jailing, unjailing) are deterministic state transitions bound into app_hash, so the quorum denominator can never differ between honest nodes at the same height. Delegation records, reward accrual, and the unbonding queue are persisted and snapshotted with the rest of the chain state. [IMPLEMENTED]
Staking yield (illustrative).
Of each year’s SOS emission, — SOS — is paid to stakers pro rata by effective stake (the operator and treasury shares are separate), plus of fee revenue. The emission-only nominal yield is therefore approximately
Visual explanationMonetary cap and staking yield32 sec
Accessible transcript
Hard cap. Consensus limits total SOS to 21 million units, represented as integer sats.
Bounded emission. Scheduled issuance draws from the finite monetary policy.
Staker share. The illustrative numerator is the annual emission allocated to stakers.
Diluting yield. More bonded SOS increases the denominator and lowers nominal APR.
Security property. Protocol issuance is bounded and its published yield model cannot imply supply beyond the consensus cap.
falling as more stake bonds. Table 4 tabulates it against the bonded fraction of a representative mature circulating supply of SOS (the year- figure of Table 2). These are illustrative figures, not measured returns: realized yield also includes fee revenue and is reduced by operator commission, downtime, and any slashing, and the denominator grows as circulating supply grows.
| bonded fraction | bonded stake (SOS) | emission-only APR |
|---|---|---|
5.8 Treasury governance and spending
A fixed of annual emission (line 1514) is allocated to the treasury, accumulating in a separately tracked SOS account. The governance mechanism for treasury spending is currently under definition and is a pre-mainnet decision point. Two candidate architectures are being evaluated: (i) ML-DSA-65 voting, in which treasury spending is authorized by a fixed set of multisig keyholders (e.g., protocol developers, ecosystem participants) whose ML-DSA-65 signatures are verified by the blockchain itself, achieving full post-quantum consistency with the protocol layer; (ii) Soft-governance via fork-choice, in which spending is proposed as a transaction and the validator community signals acceptance by their block-proposal choices, with rejection triggering a hard-fork. The former is simpler to audit but requires managing a multisig key set; the latter avoids key custody but distributes governance implicitly. In the interim, the treasury account exists on-chain with no spending authorization implemented, so accumulated SOS remains locked. This is a known limitation (Section 10.5) and must be resolved before mainnet; the choice will be disclosed in the genesis release notes.
6 PQ-MWEB: Opt-In Shielded Transactions
Privacy in SOS is opt-in: balances and transfers are transparent unless a user moves value into the shielded pool, and the user can move it back out at will. The pool is an extension block pegged to the base ledger — MWEB’s deployment model [36] — with Zerocash-style commitment/nullifier accounting [37]. The name PQ-MWEB should be read as MWEB-inspired: the design keeps the extension-block peg-in/peg-out structure and discards every piece of Mimblewimble’s confidential-transaction algebra (Pedersen blinding, kernel offsets, cut-through) — precisely the pre-quantum components. What replaces them is a hash-only note scheme (note-core) plus per-action transparent STARK validity proofs. [IMPLEMENTED] Shield (transparentprivate), unshield (privatetransparent), and private transfer (privateprivate) are implemented privacy actions. Private transfer now includes explicit ML-DSA-65 spend authorizations inside the proven statement; the authorization digest binds the exact nullifiers, output commitments, ciphertext hashes, anchor, fee, chain id, and expiry height. The privacy receipts verify against the source-pinned canonical guest image id, and the spend logic (nullifier derivation, Merkle inclusion, value conservation, duplicate-nullifier rejection, and journal-as-truth application) is covered by unit and chaos tests. July 2026 public-testnet rehearsals completed the full private flow with real receipts — shield to register the recipient key, shield a spendable note, private transfer, and unshield of the received note — against a three-validator seed cluster and a GPU prover service. The final clean run also covered operator-faucet funding and a client-signed transparent transfer whose byte-identical replay was rejected. On the active fresh testnet this left four consensus-backed encrypted commitments and two nullifiers, with tree root 1957b286…17e3; every validator reported the same application state. The privacy RPC identifies the active mode as ClientSTARK and counts encrypted notes rather than the unrelated legacy Beaver-triple telemetry. Remaining release gates are browser/mobile proving UX hardening, sustained privacy/prover load under faults, external circuit review, scalable note discovery, and witness-private delegated spend proving for users who do not control their own prover hardware.
6.1 Design rationale: hash-only by construction
Two failure classes drove the scheme’s central decision. The first is the quantum break of Section 1.1: elliptic-curve commitments and DH note encryption are retroactively de-anonymizable, and homomorphic value commitments are retroactively counterfeitable. The second is classical: algebraic shielded-pool designs have repeatedly suffered under-constrained-circuit bugs in which a missing constraint on algebraic structure allowed counterfeiting. A scheme in which every binding is a domain-separated SHAKE-256 hash of fixed-width fields has no algebraic structure to under-constrain: every attack on the note scheme reduces to a preimage, second-preimage, or collision attack on SHAKE-256 (Assumption 3). The cost is the loss of homomorphism — conservation of value must be proven by explicit checked integer arithmetic inside the proof — which the per-action STARK absorbs (Section 6.5).
The scheme is implemented as a single no_std library (btp-note-core) compiled identically into three execution environments — the node (x86-64), the zkVM guest (rv32im), and the wallet (WASM) — so host, circuit, and client compute byte-identical commitments by construction, and golden-vector tests pin the bytes as consensus law.
6.2 The note scheme
Construction 6.1 (Keys and addresses).
All values are 32 bytes unless noted; is an 11-byte diversifier.
| spend-authority binding (from the ML-DSA-65 public key) | ||||
| nullifier key (SECRET; from the wallet spend seed) | ||||
| diversified transmission key. |
Visual explanationShielded key hierarchy35 sec
Accessible transcript
Spend binding. The ML-DSA public key is committed into the spend-authority identifier.
Secret nullifier key. A separate wallet seed derives the secret used to recognize spends.
Public commitment. The nullifier public key binds that secret to the spend authority without revealing it.
Diversification. An 11-byte diversifier produces many unlinkable payment addresses.
Security property. Public diversified addresses do not reveal the wallet's secret nullifier key or collapse distinct protocol roles into one key.
A shielded payment address is the tuple (encoded Bech32m, HRP soss1), together with the recipient’s registered ML-KEM-1024 encapsulation key. One spend authority diversifies into unlinkable addresses by varying .
Construction 6.2 (Note, commitment, nullifier).
A note is with sats, the nullifier pre-seed and the hiding trapdoor, both derived from a per-note CSPRNG seed. Its on-chain commitment is
and its nullifier, for a note inserted at leaf position of the commitment tree, is
Visual explanationNote commitment and nullifier24 sec
Accessible transcript
Private note. Value, authority bindings, diversifier, rho, and hiding randomness form the private note witness.
Commitment. The public commitment fixes every note field without revealing the amount or owner.
Nullifier. The wallet derives a spend marker from its secret nullifier key, rho, and the note's tree position.
Double-spend defense. Consensus rejects a repeated nullifier while observers cannot connect it to the original commitment without the secret witness.
Security property. The ledger can reject double spends without learning which commitment was spent or who owned it.
Commitments are appended to an incremental Merkle tree of depth with node hash and empty leaf ; the tree root after each block is the block’s anchor. The commitment and nullifier preimages are rendered in Figure 11.
The position binding in makes nullifiers unique per leaf even if two notes were ever created with identical ; the inclusion of (committed inside ) fixes a note’s nullifier at creation time; and the inclusion of makes computing — hence spending — impossible without the secret key (Definition 2.2).
6.3 Ownership welding and recipient authority
Two counterfeiting vectors, found by the project’s internal adversarial review of an earlier design, dictate the exact shape of Construction 6.2; we state them because they generalize to any hash-based shielded pool.
Vector 1: spend-authority decoupling. If the commitment binds only public data (say ) and the nullifier binds the secret , with nothing tying the two together, then a proof system that checks “ is in the tree” and “ is correctly formed from some ” accepts a spend by anyone who knows the note’s plaintext — ownership reduces to data possession, not key possession. The fix is the weld: commits to , and the spend circuit takes (never ) as witness, re-derives in-circuit, rebuilds , and proves Merkle inclusion of that rebuilt . A valid spend therefore forces knowledge of the very that also (in the same circuit) produces the nullifier. Binding inside additionally prevents mixing a victim’s with an attacker’s .
Vector 2: recipient-authority gap. The sender authors the recipient’s output note and could choose freely — e.g. set , encrypt the note to the recipient, and retain spend power over a note the recipient believes is theirs. The fix is to make part of the recipient’s address (Construction 6.1) and to require the scanning wallet to accept a note as received only after (i) re-deriving and (ii) recomputing the full from the decrypted plaintext and matching it against the on-chain commitment. A note whose is not the recipient’s is provably not theirs and is ignored.
Claim 6.3 (Spend soundness of the welded scheme).
Under Assumptions 3 and 4, producing an accepted spend of a note committed as in Construction 6.2 without knowledge of its requires either a SHAKE-256 preimage/second-preimage (forging , , or a Merkle path) or a STARK soundness break. Argument. The verifier accepts only journals of receipts valid under the pinned privacy image id; the circuit (verified code, Section 6.5) re-derives from the witnessed and recomputes and the root. An accepting spend with a different requires (a second preimage), a different note tuple hashing to an in-tree (a collision), a fabricated path to a recent anchor (a collision), or a receipt for an execution that never ran (Assumption 4).
6.4 Note encryption: ML-KEM + SHAKE-KDF AEAD with view tags
Construction 6.4 (Sealed note).
The note plaintext is the fixed 83-byte encoding (Figure 10) — the recipient already holds and re-derives . Sealing for a recipient with ML-KEM-1024 key :
Visual explanationPost-quantum sealed notes34 sec
Accessible transcript
Encapsulation. The recipient's ML-KEM public key yields a ciphertext and shared secret.
Key schedule. SHAKE derives an AEAD key, nonce, and one-byte view tag.
Authenticated encryption. The fixed note plaintext is encrypted with the commitment as associated data.
Selective scanning. Wallets use the view tag to discard most non-matching notes before full decryption.
Security property. Harvested shielded-note ciphertexts remain protected against a future quantum adversary under the stated ML-KEM and symmetric assumptions.
and the on-chain blob is together with the one-byte view tag (Figure 12).
Binding the AEAD’s associated data to ensures a ciphertext cannot be re-attached to a different note. Scanning (scanMyNotes) decapsulates each candidate blob with the wallet’s KEM secret, derives the key material, and compares the one-byte view tag before attempting the AEAD decryption and commitment recomputation: the tag rejects of foreign notes after the (unavoidable) decapsulation but before the more expensive steps. Acceptance requires the AEAD tag to verify and the recomputed commit_v3 to equal the on-chain commitment and the recipient-authority check of Section 6.3. Fresh encapsulation per note provides forward unlinkability across notes; KEM keys are registered on-chain via a consensus-visible registration transaction. Confidentiality of every note recorded today rests on Assumption 2 — this is the harvest-now-decrypt-later guarantee.
6.5 Per-action STARK circuits
Each private action carries a STARK receipt from a single pinned guest program; the action is selected by the witness type and echoed in the journal. The journal type (fixed across host, guest, and verifier) is
Let . The three proven relations are:
Construction 6.5 (Shield, ).
Public: , . Witness: the output note. The circuit checks and , and commits . The node additionally checks, outside the proof, that the transparent debit equals , that the on-chain commitment equals the journal’s , and that the shielding transaction carries a valid ML-DSA-65 authorization over the shield (domain bqp:shield-auth:v1); the supply moves circulating reserve.
Construction 6.6 (Private transfer, ).
Public: , nullifiers, new commitments, . Witness: – spend witnesses (note fields, , position, 32-level Merkle path) and – output notes. For each input the circuit re-derives from , rebuilds , checks , and derives from the same ; for each output it range-checks the value and computes the commitment; and it enforces conservation with checked (overflow-trapping) integer arithmetic:
Visual explanationShielded journal and conservation33 sec
Accessible transcript
Private witness. Owned notes, positions, Merkle paths, and output values remain inside the proof.
Public journal. The receipt reveals the action, anchor, nullifiers, new commitments, boundary amounts, destination, and fee.
Conservation. Checked arithmetic proves hidden inputs equal hidden outputs plus the fee.
Consensus checks. The node verifies the receipt, anchor freshness, nullifier uniqueness, and exact journal bytes.
Security property. A valid private transfer cannot create value, reuse a spent note, or redirect an unshield without changing the verified journal.
Amounts, identities, and linkage are not revealed; only the anchor, nullifiers, new commitments, and fee are public.
Construction 6.7 (Unshield, ).
Public: , one nullifier, , , . Witness: one spend witness. Ownership and inclusion as in the transfer; conservation ; and the journal binds the transparent destination as , which the node recomputes from the transaction’s recipient before crediting — so a valid unshield receipt intercepted in the mempool cannot be redirected to a different address, and the amount cannot be altered after proving. The supply moves reserve circulating.
Journal-as-truth verification.
The node-side verifier is deliberately minimal and fail-closed: deserialize the receipt, verify it against the pinned privacy image id, decode the journal, and act on journal values only. No consensus-relevant value (nullifier, commitment, amount, anchor, recipient, fee) is ever read from attacker-supplied transaction JSON; the receipt’s journal is the single source of truth, and a build of the node without the proof-system feature refuses all privacy actions rather than degrading to weaker checks. The apply path additionally enforces: the action tag matches the transaction type; the anchor is recent (next paragraph); no journal nullifier is already in the nullifier set (double-spend rejection across the whole history, checked against a dedicated persisted set); and encrypted-note blobs are paired to journal commitments by index.
Anchor recency.
Spend proofs are built against a tree root that may be several blocks old by the time the transaction is mined. The chain therefore maintains a rolling window of the last distinct note-tree roots, snapshotted in finalize_block after commitments land; the consensus rule is that a spend’s anchor must be in this window. Only past finalized roots enter the window — a proof can never be validated against a root that consensus has not produced — which closes anchor-grinding: a prover cannot fabricate a private tree containing a self-authored commitment and prove inclusion against it, because its fabricated root is not in the window. The window itself is bound into app_hash (domain bqp:private-pool:v4), so all nodes agree on exactly which anchors are acceptable.
6.6 Consensus binding of the pool
A shielded pool is only as sound as its binding to consensus. An internal audit of an earlier iteration found the decisive gap: the then-current voted block hash bound nothing about the pool, so validators could finalize blocks while disagreeing about (or ignoring) the private state. The remedy is structural and now part of the definition of finality: the extension block’s contents are committed by ext_root, which is inside the v4 block hash (Construction 4.1) that every vote signs; and the pool’s full contents — commitments, tree root, nullifier set, anchor window, and the reserve bucket — are folded into app_hash, which the next block’s signed hash chains via prev_app_hash. Finality of a block therefore certifies the private state transition, not merely the transparent ledger. The supply turnstile (Invariant 5.2) closes the loop in value terms: the reserve bucket must always equal the value absorbed by the pool, so even a hypothetical circuit defect cannot silently inflate transparent supply without tripping the per-block invariant.
6.7 Client-side proving and the delegation model
The wallet proves; the node only verifies. This is not merely an engineering preference — it is forced by ownership: the spend witness contains , whose holder can spend every note of that authority, so handing the witness to a shared proving service is equivalent to custody. The deployment model is therefore:
-
•
Shield witnesses contain only the new note’s randomness (no spend authority); delegating a shield proof leaks at most that note’s amount.
-
•
Spends are proved on hardware the user controls. Unshield binds the recipient, amount, and fee by an ML-DSA-65 authorization checked by the node. Private transfer binds its public effects by an ML-DSA-65 spend authorization verified inside the STARK: nullifiers, outputs, ciphertext hashes, anchor, fee, chain id, and expiry height are all signed. The implementation ships a hardened prover service (TLS 1.3 only, bearer authentication, witness never logged, core dumps disabled, loopback-only unless explicitly configured otherwise) that a browser or mobile wallet calls over the user’s own machine; the wallet computes all commitments and encryption in WASM and sends only the proving witness.
-
•
Trustless delegated spend-proving for phone-only users (witness-private delegation) is an open problem [RESEARCH]; SOS does not claim it.
Measured proving costs for the smallest action (shield; one commit_v3 and range checks): s on a single consumer GPU (RTX 5090 laptop, CUDA, GiB VRAM), s on CPU (release build). Spend proofs add the 32-level Merkle path and are correspondingly heavier but remain in the interactive range on consumer GPUs. Verification on the node is tens of milliseconds and is the only privacy cost on the consensus hot path; block time is therefore decoupled from proving time. [MEASURED PROTOTYPE]
6.8 What is and is not claimed
The scheme provides object-level confidentiality — amounts, identities, and linkage inside the pool are hidden behind Assumptions 3–4 and 2 — and integrity for enabled actions (no inflation, no double-spend, no foreign unshield spend, and no accepted private transfer whose public effects are not covered by the spend authorization) per Claim 6.3 and the conservation circuits. The scheme does not by itself provide strong anonymity: as in every opt-in shielded pool, practical unlinkability depends on the anonymity-set size and on metadata the cryptography does not hide — shield/unshield timing and amounts at the transparent boundary, fee fingerprints, bridge-flow correlation, and network-layer data. Operational mitigations (denomination uniformity, batching, timing jitter, sufficient pool flow) sit above the protocol; we state plainly that cryptographic note privacy is necessary but not sufficient for behavioral privacy.
7 The Proof-Based Ethereum Bridge
The bridge moves value between SOS and Ethereum with no custodian, no multisig, and no committee: in each direction, the destination chain accepts an action iff it verifies a proof about the source chain’s state. This section specifies the SOSEthereum direction in full (the full recursion — consensus, inclusion, and batch guests — plus the relayer has been demonstrated end-to-end on live Ethereum Sepolia with real proofs [IMPLEMENTED], Section 7.8), then the EthereumSOS direction (a finality-aware Ethereum light-client STARK with real sync-committee signature verification, likewise demonstrated end-to-end on Sepolia [IMPLEMENTED], Section 7.5). Both directions have been exercised on a live public testnet against Sepolia but not yet under the multi-node load/chaos harness, so both are tagged [IMPLEMENTED] rather than [IMPLEMENTED, TESTNET-VALIDATED].
7.1 Problem statement
To mint wrapped SOS (wSOS, an ERC-20) on Ethereum [2], an Ethereum contract must be convinced that a specific lock transaction was included in a finalized SOS block — under a few hundred thousand gas. Existing bridge designs answer this with trusted parties (multisigs, MPC committees, oracles), with optimistic challenge games, or with on-chain light clients; for a post-quantum chain the light-client route has a unique obstacle: SOS finality is ML-DSA-65 signatures of 3309 bytes each, far beyond plausible calldata and gas budgets, and lattice signatures do not aggregate. The SOS answer is to verify the entire quorum certificate inside a STARK and hand Ethereum a single succinct object whose public outputs the contract can reconstruct.
7.2 Architecture: three guests, one receipt
7.2.1 The consensus guest
Input: the v4 block-hash components (Construction 4.1), the signed block_hash, the QC round, the QC as (validator index, raw signature) pairs, the validator set as (1952-byte key, effective stake) pairs in canonical order, the claimed validator-set hash, epoch, and chain id. The guest, in order:
-
1.
recomputes block_hash block_hash_v4 from the components and asserts equality with the signed hash — binding tx_root, chain_id, the epoch, and the validator-set hash to the hash the quorum actually signed;
-
2.
recomputes the validator-set hash from the supplied set (Construction 4.2) and asserts it equals the bound value — anchoring the very keys used in step 4 to the signed block, so a malicious prover cannot substitute its own set;
-
3.
reconstructs the 58-byte precommit preimage (Construction 4.3);
-
4.
verifies each QC signature with FIPS-204 ML-DSA-65 (the same pure-Rust verifier as the node, compiled to rv32im), summing the effective stake of distinct valid signers, skipping (never trusting) malformed entries;
-
5.
asserts the strict stake quorum ;
-
6.
commits as its journal (field layout in Figure 13).
Each in-guest ML-DSA-65 verification costs M cycles unaccelerated (M with the Keccak accelerator of Section 8.5); the guest’s verification semantics are bit-compatible with the node’s by construction (same library, same preimage builder), which is itself pinned by cross tests.
7.2.2 The transaction-inclusion guest
Proves that a bridge-lock transaction is a leaf of the block’s tx_root: it computes , folds the supplied Merkle path with the sorted-pair node hash , asserts the result equals the expected tx_root, parses the lock’s fixed-offset fields (32-byte lock_id, 20-byte Ethereum recipient, 8-byte amount, 8-byte relay fee), and commits them with the root. One receipt per lock; a batch carries many.
7.2.3 The batch guest and pinned recursion
The batch guest recursively verifies one consensus receipt and inclusion receipts via env::verify, then binds them: each inclusion journal’s tx_root must equal the consensus journal’s tx_root, and the consensus journal’s validator-set hash must equal the value the Ethereum contract is known to track. Crucially, the image ids of the two sub-programs are compile-time constants inside the batch guest, not host inputs: a host-chosen sub-id would let an untrusted prover substitute an arbitrary program for the audited consensus checker. Because the constants are baked into the batch guest’s binary, the batch guest’s own image id — and therefore the immutable batchGuestImageId the contract was deployed with — transitively commits to exactly these sub-programs; CI tests assert the pinned constants equal the freshly built sub-guest ids, so any drift fails the build rather than silently changing the statement being proven.
7.2.4 The ABI journal
The batch guest commits, as raw journal bytes, exactly
Visual explanationByte-exact Ethereum bridge journal34 sec
Accessible transcript
Proven finality. The batch proof recursively verifies the SOS consensus and inclusion receipts.
Static head. Five fixed values and one array offset occupy the ABI head.
Operation body. Each lock id, Ethereum recipient, amount, and relay fee occupies four 32-byte words.
Contract equality. The Ethereum contract reconstructs the same bytes before accepting the receipt.
Security property. Ethereum can mint wrapped SOS only for operations included in the exact finalized SOS block proven by the pinned guest programs.
where each operation is the static tuple . The encoder is a dependency-free Rust function whose output is asserted byte-identical to Solidity’s abi.encode by a cross-language test (against a Foundry-generated reference vector); the layout is 6 head words (with the dynamic-array offset in the sixth), then the array length, then bytes per operation (Appendix A, Figure 9).
7.2.5 The on-chain verifier
SOSBridge.processDeposits receives the seal and the journal’s fields (never a digest): it re-encodes from its own calldata, derives on-chain, and calls the RISC Zero verifier contract with (seal, pinned batchGuestImageId, derived digest). Because the digest is derived rather than supplied, the calldata fields are bound to the verified proof: any tampering changes the digest and the verification reverts. The contract then enforces, in order: the batch is non-empty; the proven chainId equals the immutable expected chain id; the proven validator-set hash equals the tracked one; the block height does not regress (same-height batches are allowed for multiple locks in one SOS block); per-lockId replay protection; and . It mints wSOS to the recipient and the fee to the submitting relayer — which is what makes relaying permissionless: a relayer can neither forge nor alter a withdrawal, only carry a valid one. The burn-for-withdrawal path records burns in contract storage for the reverse direction.
7.3 Soundness
Theorem 7.1 (Bridge soundness, SOSEthereum).
Under Assumptions 1, 3, 4, and the soundness of the Groth16 wrap at the Ethereum boundary, any processDeposits call that mints wSOS corresponds to bridge-lock transactions included in an SOS block that obtained a strictly -stake ML-DSA-65 precommit quorum from the validator set whose hash the contract tracks, on the expected chain, in the claimed epoch.
Proof sketch.
Minting requires the verifier contract to accept (seal, batchGuestImageId, digest) with the digest derived on-chain from the calldata. Acceptance under the wrap’s soundness implies a valid receipt for the batch program with journal bytes equal to the calldata encoding — fields cannot be detached from the proof. The batch program (fixed by the immutable image id) accepts only if env::verify discharged receipts for the pinned consensus and inclusion programs (Assumption 4 makes fabricating either infeasible) with matching tx_roots and the tracked validator-set hash. The consensus program accepts only if the recomputed v4 hash equals the signed hash (so tx_root, chainId, epoch, and the set hash are the signed ones, Assumption 3 for collisions) and only if distinct validators of the bound set, holding strictly more than of its stake, produced valid ML-DSA-65 signatures over the 58-byte precommit preimage (Assumption 1). The inclusion program accepts only leaves of the bound tx_root (Assumption 3). Composing: a mint reduces to a real finalized SOS block and real included locks, or to a break of one of the stated assumptions. The residual trust is therefore exactly SOS’s own honest-stake assumption (Assumption 5) plus the enumerated Ethereum-side verifier — no bridge-specific committee exists to compromise. ∎
Replay is excluded at three layers: chain_id inside the signed hash (cross-chain), the epoch inside the signed hash (cross-validator-set generations), and lockId/height monotonicity in the contract (cross-batch).
7.4 The non-PQ boundary at Ethereum
Everything on the SOS side of Figure 4 is hash-based STARK verification of ML-DSA-65 signatures over SHA3-256 preimages — post-quantum throughout. Ethereum, however, cannot affordably verify a FRI transcript on-chain, so the relayer wraps the final STARK receipt into a Groth16 proof over BN254 [24] — the standard RISC Zero on-chain pattern — and that pairing-based seal is what the contract checks. This is the first of the two enumerated external-chain compatibility modules of Definition 2.3. Its failure domain is precisely scoped: a quantum (or classical) break of the wrap forges wSOS on Ethereum; it cannot touch the SOS ledger, whose own verifiers never accept wrapped receipts. Symmetrically, SOS-internal verifiers are required to reject non-STARK receipt kinds; hardening this rejection explicitly everywhere is tracked as an open item in Section 10.3.
7.5 Ethereum SOS
The reverse direction mints native SOS against a proven burn of wSOS. The construction is an Ethereum light client inside a guest [44]: a proof that (i) the Ethereum sync committee’s BLS12-381 aggregate signature (the second enumerated non-PQ module) covers a recent beacon-chain header with a supermajority; (ii) the header whose execution state holds the burn is the finalized checkpoint under that signed header — reorg safety, so a head that later reorganizes cannot have released — proven by a finality Merkle branch; and (iii) the burn record exists in the bridge contract’s storage, via Merkle–Patricia trie account and storage proofs (keccak256) against the execution state root, with the burn’s amount and SOS recipient hash extracted from the proven storage words (never trusted from an input). The burn’s parameters are committed in the journal; the SOS node verifies the receipt and credits the recipient, debiting bridge_locked.
Status [IMPLEMENTED]: the guest performs real BLS12-381 aggregate signature verification of the sync committee over the signed header — a -of- supermajority, not a participation-count or length check — together with the finalized-header, execution-payload, and MPT account/storage proofs that extract the released amount and recipient. This has been demonstrated end-to-end against live Ethereum Sepolia: a wSOS burn on Sepolia was proven by a GPU-generated STARK and verified on-node, after which the node minted the released amount from bridge_locked, with the locked-backing accounting conserved (a release debits exactly what it mints). The eth-burn verifier and the release mint are enabled by default (the default privacy-stark feature); a node built without that feature — and without the opt-in insecure-bridge feature — fail-closes and refuses to mint, so no unproven path can create SOS. Each proof is anchored to a per-node-deterministic trusted set of sync-committee roots (seeded at genesis from a pinned constant and extended by proven Altair committee rotations applied identically on every node, and persisted) and to the pinned bridge address. The trusted committee-root set is folded into app_hash, so nodes that disagree on the reverse-bridge trust anchor cannot continue with the same application hash. The remaining gap to [IMPLEMENTED, TESTNET-VALIDATED] is exercising this path under the multi-node load/chaos harness.
Deposit-lock lifecycle.
A SOS-side deposit lock, which backs minted wSOS, is final: the locked value returns to its owner only through the reverse burn-and-release path above — burning the wSOS on Ethereum and proving it — never through an automatic on-chain timeout. A time-bounded owner-reclaim was analyzed and deferred: a fixed block-count reclaim threshold cannot be made reliably exclusive with the Ethereum-side claim on a sub-second-block chain unless the chain enforces a block-time floor or the deposit proof commits the chain-tip height; both are noted as future enhancements. The paper therefore describes no auto-refund, because none ships today.
7.6 Validator-set evolution
The contract tracks one validator-set hash; following its evolution is the classical weak-subjectivity problem of proof-of-stake light clients [47]. Rotating it requires an epoch-transition proof — a guest proving that set is the legitimate successor of under SOS’s staking rules — with the same journal-reconstruction discipline as deposits. The valset-transition guest and updateValidatorSet entrypoint are implemented and image-id pinned, so the on-chain path is no longer intentionally fail-closed. [IMPLEMENTED] The public rehearsal completed this lifecycle: a V0 deposit was processed, a canonical receipt proved the transition from epoch 7 hash 2d0c961c…c1b1e to epoch 226 hash 59024532…4de2, and Sepolia transaction 1ee99775…b93ff rotated the contract. A new V1 deposit was then processed in transaction 491ddd6e…5f2c; transition replay, V1 lock replay, and a stale-V0 deposit all reverted. Wrong-overlap inputs remain covered by the guest/host negative suite. The PCF epoch chain of Section 8.4 (whose checkpoints already bind validator_set_hash per epoch and chain contiguously) is the intended long-term substrate for this proof. Mainnet still needs automated churn campaigns and a deployment-domain migration protocol; these are catalogued in Section 10.3.
7.7 Weak subjectivity on the SOS side
Light clients verifying finality without full state face a complementary weak-subjectivity problem on the SOS side: an exited validator, slashed or naturally unbonded, is no longer in the active set and therefore not part of the quorum denominator, but may sign forks of the chain’s history at heights where they were still bonded. A light client must therefore commit to a sufficiently recent checkpoint (a finalized block header and its QC) to ensure that the validator set cannot have been substituted without the client’s knowledge. The protocol’s active-set epoch is only 100 blocks and is an implementation cadence, not by itself a defensible maximum-offline or weak-subjectivity period. The public testnet therefore requires mobile wallets and explorers to re-sync the validator set and quorum denominator against live peers; it does not claim that one epoch supplies an hours-long trust window. For the longer-term PCF certificate of Section 8.4, the epoch-chain proof embeds validator-set transitions contiguously, allowing a client to verify them with one STARK artifact per segment. Before mainnet, an operational policy must fix independently distributed checkpoint sources, publication cadence, maximum offline time derived from unbonding and evidence windows, restart behavior, and user-visible bootstrap rules. Until that policy and consumption path are live, clients rely on explicit recent-checkpoint discipline.
7.8 Implementation status
What exists and is tested [IMPLEMENTED]: all three guests (consensus with FIPS-204 verification, inclusion, batch) build reproducibly and are embedded with pinned image ids and drift tests; the recursive composition round-trips end-to-end in host tests (a real -stake ML-DSA-65 quorum proven inside the consensus guest; sub-quorum, tampered-tx_root, and wrong-set inputs rejected); the ABI encoder is cross-checked against Solidity; and the hardened SOSBridge contract passes its Foundry suite including digest-binding, tamper, replay, and fee-bound tests.
What has been demonstrated on a live network [IMPLEMENTED]: the full relayer pipeline fetches real (block, QC, validator set, Merkle path) data from a node, composes the three proofs, wraps the result to a Groth16 seal, and submits it against a SOSBridge deployment pinned to the batch image id on Ethereum Sepolia. The active TVL-limited contract is 0x862Bc5c5…79e93, deployed at Sepolia block 11244918 with a 10,000-SOS global outstanding cap and 1,000-SOS per-deposit cap, mirrored by SOS consensus. A 1,000,000-sat V0 lock at SOS height 1640 was processed in transaction 581b1105…a22fc; the reverse direction then burned 500,000 sats in transaction db13a1d8…4c4be, and a 224,442-byte real succinct STARK receipt proved Ethereum finality before every SOS validator persisted the release. The public V0-to-V1 rehearsal subsequently rotated the contract and processed a 200,000-sat V1 lock at SOS height 26257. At the end of the rehearsal the contract reported 1,200,000 sats minted, 500,000 burned, and 700,000 outstanding. Deposit and transition replays were rejected, stale-V0 proofs failed after rotation, burn replay was idempotent, restart rebuilt the bridge RPC view, and a relayer with empty local state reconciled all operations from chain truth without duplicate submission. An unattended relayer, sync-committee-root maintainer, and fail-closed monitor remain live; the monitor compares the finalized SOS validator-set hash with the contract on every run. The repository’s dated E2E record preserves the full image ids and transaction identifiers.
What remains [IN PROGRESS]: the full cross-chain pipeline has not yet been run as a sustained bridge/privacy workload inside the multi-node fault harness; the tested fresh-cutover image policy still needs a consensus-defined bridgeDomain and activation/drain protocol for mainnet; the beta caps need an externally reviewed economic relation to slashable stake before they can be raised; and validators, relayers, provers, monitoring, and alert ownership need independent operators and failure domains. The SOS-side timeout refund path remains disabled until claim/refund exclusivity is proven under the chain’s timing and finality assumptions (Section 7.6). The current Foundry and live negative checks still need promotion to reproducible release CI and independent review. Theorem 7.1 applies to this implemented and demonstrated construction under those launch gates.
8 Scalability: Proof-Carrying Finality and the Native ML-DSA AIR
This section treats the central scalability constraint of a post-quantum BFT chain quantitatively, reports the negative results that pruned the design space, and presents the chosen program: a bounded-validator launch, an epoch-checkpoint finality certificate that reuses the consensus STARK (Proof-Carrying Finality, PCF), a measured zkVM acceleration stack, and a native ML-DSA verification AIR as the research path to an unbounded validator set. All numbers marked measured were produced on the project’s prover lab (4RTX 3090, real proving mode) or its WSL executor (cycle counts), and are reproducible from the repository.
8.1 The problem, quantified
A quorum certificate carries one 3309-byte ML-DSA-65 signature per signer, and the bridge’s consensus guest re-verifies each in-zkVM at M cycles. Both grow linearly in the signer count (Table 5):
| signers | QC signature bytes | in-zkVM verify cycles |
|---|---|---|
| 67 | MB | |
| 128 | MB | |
| 256 | MB | |
| 1000 | MB |
Pre-quantum chains hide this with BLS aggregation: hundreds of signatures over one message compress to 96 bytes and one pairing check — which is exactly the primitive the post-quantum setting removes. The problem is to recover an aggregation-like property without leaving the PQ regime, under the project’s non-negotiables: full PQ internally, privacy untouched, the bridge non-custodial and proof-authorized, the staking set unbounded economically, and BFT safety under Assumption 5.
8.2 Negative results
Three candidate routes were investigated to a decision and rejected; we record them because the reasons are load-bearing for the chosen design.
(a) Stake-weighted committee sampling does not preserve the margin with un-aggregated signatures.
Sampling a committee of expected size by public hash-sortition over the on-chain beacon is attractive (no new cryptography; the QC becomes ). But sizing so that — the probability a committee over-represents Byzantine stake to the safety threshold — gives, by exact binomial computation: ; ; ; ; ; and as . With KB per signer, only the row fits a 1 MiB block budget — i.e. sampling with plain ML-DSA-65 forces a choice between gutting the Byzantine margin (operating assumption “ honest stake”) and committees that do not fit a block. Honest-offline validators inflate the effective further. Committee sampling is therefore not a substitute for the full-set QC at SOS’s stated margin.
(b) Lattice synchronized multi-signatures are not adoptable today.
Squirrel [48], Chipmunk [49], and Lemur [50] aggregate many same-slot lattice signatures sub-linearly (150–200 KB for thousands of signers) and would restore the full margin with one aggregate verification. The blockers are maturity, not feasibility: re-evaluation of Chipmunk’s shipped parameters places its concrete security far below the claimed level; Lemur is weeks old, rests on a new assumption (Dual-Hint-MLWE), and requires gigabytes of key-evolving signer state; all are non-FIPS with research-grade implementations; and their NTT-heavy verification is the worst cost profile for in-zkVM re-verification (the zkVM accelerates hashes, not lattice arithmetic). Verdict: track for 2027+; do not place unaudited 2026 lattice aggregation on the consensus critical path of a chain whose premise is conservative cryptography.
(c) Algebraic batch verification of distinct-signer ML-DSA is structurally unavailable.
ML-DSA’s verification is commitment-recoverable Fiat–Shamir ending in a per-signer hash equality with a key-prefixed challenge, with non-linear Decompose/UseHint rounding and non-algebraic -norm checks; a random-linear-combination batch across distinct keys has no sound formulation (published batching results are same-signer only). Total verification work is ; all available gains are per-verification cost and per-key amortization — which is what the acceleration stack below pursues.
8.3 Launch posture: bounded active set
Given (a)–(c), SOS launches with a bounded active validator set (), the full raw QC in every block, plain FIPS-204 ML-DSA-65, and the complete Byzantine margin — zero new cryptographic assumptions, QC within the block budget, and the validator-set binding of Construction 4.1 already in place. Delegation keeps economic participation unbounded while the signing set is bounded; the linear-QC constraint binds above roughly 150–200 validators and is thus a scaling road-map item rather than a launch blocker. The two tracks below are the road map.
8.4 Proof-Carrying Finality (PCF)
The consensus guest of Section 7.2.1 already verifies a full stake-weighted ML-DSA-65 quorum inside a hash-based STARK. PCF’s observation is that this proof, built for the bridge, is the portable finality object the rest of the system wants: one succinct receipt can replace raw signatures for every consumer that is not the real-time consensus path itself.
Construction 8.1 (Epoch-checkpoint certificate).
[IMPLEMENTED] The epoch-checkpoint guest takes a contiguous, height-ordered run of blocks under one fixed validator set and proves, for every block in the run, exactly the per-block statement of Section 7.2.1 (v4 hash recomputation, per-signature FIPS-204 verification, strict stake quorum), with two structural additions: heights must be strictly consecutive, and the journal commits
Visual explanationEpoch checkpoint certificate33 sec
Accessible transcript
Contiguous run. Every block is height ordered and verified under one fixed epoch and validator set.
Per-block finality. The guest repeats v4 hash recomputation and strict stake-weighted ML-DSA quorum checks.
Compact journal. The receipt commits interval endpoints, count, and a hash chain over every block.
Interior inclusion. A consumer authenticates any interior block and transaction root against the single certificate.
Security property. A checkpoint receipt cannot authenticate a block outside the proven contiguous interval or under a different chain, epoch, or validator set.
where is a domain-separated SHA3-256 hash chain over each block’s (tags sos:epoch-blocks:v1 / sos:epoch-blocks:step; journal field layout in Figure 13). A consumer authenticates any interior block — and its tx_root, for a transaction-inclusion proof — against the single receipt, and chains consecutive checkpoints by . A companion compose guest recursively verifies shard receipts (pinned to the canonical epoch image id) and stitches contiguous ranges into one certificate, enabling parallel proving across GPUs.
Consumers: mobile light clients check one constant-size STARK per epoch instead of ML-DSA-65 signatures per block; syncing full nodes replace verifications per block during catch-up; and the bridge shares the same artifact, aligning bridge security with consensus security. The chain-segment property — at most one quorum block per height, each building on the previous — holds because consensus safety (Theorem 4.6) guarantees it for quorum-certified blocks.
Honest scoping, per the project’s own review: PCF is finality compression, not validator scaling — the block still carries the raw QC, which remains authoritative for real-time finalization (the certificate trails by proving latency and ships as an epoch checkpoint, in the spirit of Algorand’s state proofs [32], never as a gate: a missing certificate withholds a reward, never halts the chain). The 150–200-validator ceiling stands until the per-verification cost falls (Section 8.5 and the native-AIR program of Section 9). Before the certificate can become consensus-law for any consumer, identified gaps must close: an image-id rotation protocol (the on-chain id is immutable today), the epoch-transition guest of Section 7.6, explicit rejection of wrapped (non-STARK) receipts by internal verifiers, and a differential-check/disable switch so a hypothetical guest soundness bug is a recoverable liveness event rather than a forgeable finality certificate. Measured: a 4-block, 4-validator checkpoint proves in s on one lab GPU; sharded composition across 2 GPUs achieves (near-ideal) scaling on the verify-dominated portion.
8.5 Measured acceleration of in-zkVM ML-DSA verification
The lever that shortens PCF epochs — and eventually unbinds — is the per-verification zkVM cost. Table 6 summarizes the stack with measured results (4RTX 3090 lab, real proving mode unless noted).
| Lever | Mechanism | Measured effect | Status |
|---|---|---|---|
| S1 Keccak accelerator | route Keccak- to the | 1 verify: s wall | [MEASURED PROTOTYPE] |
| dedicated zkVM circuit | (); cycles M | ||
| S2 key-decode cache | decode each validator key once | wall at blocks/epoch | [MEASURED PROTOTYPE] |
| per epoch (PCF guest) | ( s); of | ||
| per-verify work eliminable as | |||
| S3 modular-product precompile | NTT as a checked big-integer | — | [RESEARCH] |
| identity in a native circuit | |||
| S4 lean FIPS-204 decode path | replace the generic library tail | — | [RESEARCH] |
| S5 native ML-DSA AIR | prove verification in a dedicated | Section 9 | [MEASURED PROTOTYPE] |
| circuit, not RISC-V emulation | |||
| S6 shard composition | prove epoch shards in parallel, | on 2 GPUs (near-ideal) | [MEASURED PROTOTYPE] |
| recursively compose |
Two methodological points from these measurements are worth recording. First, cycle counts overstate wall-clock gains for levers that move work into a dedicated circuit rather than eliminating it: S1’s rv32im cycles delivered wall-clock, because the accelerated permutations still cost proving time in their own circuit. Levers that eliminate work track cycles faithfully or better: S2’s wall-clock reduction () exceeded its cycle reduction () in the S1-stacked configuration, and matched it within percentage points in the software-Keccak configuration. Second, the headline S2 percentages are asymptotes (); the delivered per-block saving at the measured is . S2 amortizes per-key work across an epoch and does not touch the per-message verification, so it shortens epochs but does not raise the validator ceiling.
8.6 The native ML-DSA AIR (S5): summary of the measured verdict
[MEASURED PROTOTYPE] The research endgame of the acceleration stack is to stop paying RISC-V emulation overhead for the algebra entirely: express FIPS-204 verification as a dedicated AIR, prove a batch of verifications in one transparent FRI STARK, and have a thin zkVM guest verify that one batched proof in software — preserving env::verify, the recursion pipeline, and the on-chain interface unchanged (wrap, not replace). The project gated this track on two pre-registered kill-criteria; both are now retired with measured data: (1) the full 8-layer forward NTT proves natively in s, about of the s post-S1 zkVM verification budget (kill threshold: one NTT above 10% of a full zkVM verify); and (2) the in-guest software verification of the native proof costs M cycles after two measured accelerations, a crossover of direct verifications — clearing the realistic 67–128 signatures per quorum certificate (kill threshold: failing to clear that range). Because this result is one of the paper’s central contributions — and because its soundness caveats deserve the same level of detail as its wins — the architecture, the gadget-level soundness arguments, the in-guest verifier, the measured data, and the remaining engineering program are developed in the dedicated Section 9.
9 A Native FIPS-204 Verification AIR: Wrap, Not Replace
[MEASURED PROTOTYPE] This section develops the S5 track of Table 6 in full: a native AIR (algebraic intermediate representation) that proves ML-DSA-65 verification arithmetic in a dedicated transparent-FRI STARK outside the zkVM, and a thin zkVM guest that verifies that native proof inside the zkVM and journal-commits the result — so that every existing consumer of finality proofs (the PCF epoch certificate, the bridge batch recursion, the on-chain verifier) is untouched. One status statement governs everything that follows: this is a measured prototype on a research track. The constraint systems, the soundness arguments, and every number in this section exist in the repository and were measured as described; nothing in this section is on the live block-validation or bridge path, and Section 9.7 states the program — and its honest cost — that separates the prototype from consensus-law deployment.
9.1 Problem and architecture
Sections 8.1–8.5 establish the cost shape: every consumer that re-verifies SOS finality inside a proof pays M zkVM cycles per ML-DSA-65 signature at the post-S1 baseline, because FIPS-204 verification — NTTs, modular arithmetic, SHAKE — is being emulated instruction-by-instruction as rv32im inside the zkVM’s universal execution circuit, and because algebraic batching across distinct signers is structurally unavailable (Section 8.2c). The emulation overhead, not the arithmetic itself, dominates: the same verification algebra, expressed directly as AIR constraints over a small prime field, is orders of magnitude cheaper to prove. The native-AIR program therefore moves the algebra into a dedicated circuit (Figure 5):
- 1.
-
2.
a thin zkVM guest verifies that one native proof in software (cost: cycles, the make-or-break quantity of Section 9.5) and commits to its journal which statement was verified;
-
3.
everything downstream is unchanged: the guest’s receipt enters the same env::verify recursion, image-id pinning, and (for the bridge) Groth16 wrap as today. The verification semantics — unmodified FIPS-204, bit-exact against the reference implementation — are preserved by construction and pinned by known-answer tests.
Two framework decisions are part of the record. Toolkit: Plonky3 is, to our knowledge, the only independently audited multi-tenant AIR toolkit [22, 23] and ships a production keccak-f[1600] AIR — relevant because SHAKE is the dominant cost center of a full FIPS-204 verification (Section 9.7). Field: the measured prototype runs over the 64-bit Goldilocks field, where a product of two canonical ML-DSA coefficients () fits in a single field element without limb decomposition — the fastest path to honest numbers; the production target is BabyBear (the 31-bit field native to the RISC Zero stack), where the same gadget requires a limb/carry decomposition (Section 9.7). To our knowledge no bit-exact FIPS-204 verification AIR has been published: existing lattice-signature circuits modify the scheme for arithmetization friendliness, which would break the SOS requirement that the circuit verify exactly the signatures the validators produce. The measurement guest commits as its journal, binding which statement (e.g. which NTT input/output pair) was verified; a production guest would commit the per-statement results (key digest, message, validity) for the recursion to consume.
9.2 Proof-system instantiation and the soundness stance
The STARK configuration is deliberately boring: keccak-f[1600] sponge hashing for Merkle commitments and the Fiat–Shamir challenger [7], a two-adic FRI polynomial commitment [16], a degree-2 binomial extension field for FRI challenges ( challenge space), and a query-phase proof of work. The prototype raises the FRI query count from the upstream benchmark default to queries at blowup factor , giving
where the quantum adjustment halves only the 16-bit grinding term (Grover), the FRI query term being a classical list-decoding bound for which the ethSTARK conjecture [18] assumes no quantum speedup. We state the honesty rider attached to these parameters in the code itself: is the conjectured (ethSTARK) soundness on which deployed STARKs stand; the provable Johnson-bound soundness at this rate is far lower ( bits per query), and a production deployment must ratify the conjectured stance explicitly — exactly as the existing zkVM stack already does implicitly — before any AIR receipt becomes consensus-law.
9.3 The mod- gadget (M0)
The atom of every lattice-verification circuit is multiplication in , (FIPS-204). The M0 prototype proves the NTT-domain pointwise product for all coefficients (FIPS-204 Algorithm 45), one coefficient per trace row.
Construction 9.1 (Range-checked mod- multiplication gadget).
Let . A trace row carries value columns and seven 23-bit decompositions: plain decompositions of and shifted decompositions of , , . The constraints, all of polynomial degree at most 2, are:
-
1.
booleanity: every bit column satisfies ;
-
2.
recomposition: each plain decomposition satisfies for its value column ;
-
3.
canonicity: each shifted decomposition satisfies for ;
-
4.
Euclidean identity: .
The width is columns; the M0 trace is .
Proposition 9.2 (Gadget soundness).
Over a prime field with , any row satisfying the constraints of Construction 9.1 has canonical (i.e. ) and , as integers.
Proof.
Constraints (1)+(2) force as integers: each is a sum of 23 boolean-constrained bits, and since the recomposition has no field wraparound. Constraint (3) additionally forces , i.e. , for : both decompositions of each value are necessary — the plain one excludes “negative” residues , the shifted one pins — and together they pin the unique canonical representative. Given these ranges, and , so and constraint (4) holds over the integers, not merely modulo : with , and is the unique canonical remainder. ∎
Each clause of Proposition 9.2 is load-bearing, and the prototype’s adversarial review demonstrated this constructively: without the shifted -decomposition a malicious prover commits (with ) whenever , breaking bit-exactness with FIPS-204; without the range check, a quotient of order satisfies the identity modulo for any claimed remainder; and the shifted input decompositions make the atom self-certifying — sound to compose into larger circuits (the NTT butterfly) without trusting an upstream range check. Four forgery vector classes (non-canonical remainder, non-boolean bit, over-large quotient, non-canonical input) are maintained as negative tests, each asserted to fail at the verifier’s out-of-domain constraint check rather than at some incidental proof-shape error. Bit-exactness is established by a known-answer test against the reference ml-dsa implementation — instantiated through the identical version-pinned field-arithmetic monomorphization the node itself executes, so the oracle is the deployed code, not a transcription — with an independent integer cross-check of the oracle. Measured [MEASURED PROTOTYPE]: the trace proves in ms on the host CPU at the 144-bit parameter set ( of the s post-S1 in-zkVM verification budget).
9.4 The forward-NTT AIR (M1)
M1 scales the gadget to the largest single algebraic block of FIPS-204 verification: the complete 8-layer forward NTT (FIPS-204 Algorithm 41) — layers butterflies Cooley–Tukey butterflies in exactly the reference implementation’s loop order, with twiddles , .
Construction 9.3 (Forward-NTT AIR).
The trace is : one butterfly per row, with row holding the 256-coefficient working state before butterfly (256 columns), the butterfly witness (, , the multiplication gadget’s quotient and canonical product , two conditional-subtraction bits, and the canonical outputs , ; 8 columns), and seven 23-bit decompositions instantiating the dual-decomposition discipline of Construction 9.1 for , , and the quotient (161 columns). Rows carry the butterflies; row holds the NTT output; rows are copy-padding so the output also appears on the last row. The butterfly schedule — which state pair a row touches, with which twiddle — is a public constant of FIPS-204, supplied as periodic columns (one twiddle column and one-hot operand indicators). The constraints (943 total, degree ) are: booleanity; the seven recompositions; operand extraction ( and symmetrically for ); the multiplication, addition, and subtraction gadgets; the state transition (the two scheduled slots take the butterfly outputs, all other slots copy); and boundary constraints binding the first row to the public input polynomial and the last row to the public output polynomial.
Three properties of Construction 9.3 deserve emphasis. Schedule integrity: periodic columns are never committed by the prover — prover and verifier each recompute them from the AIR definition, and the verifier evaluates each column itself at the out-of-domain point, so a malicious prover cannot substitute a different NTT schedule (the cost of this choice, 513 barycentric evaluations in the verifier, is exactly what lever B of Section 9.5 removes). Statement binding: unlike M0 (which proves a relation about a committed trace), M1 binds both the input and the output polynomial as public values absorbed into the Fiat–Shamir transcript; the negative tests confirm that tampering a public output is rejected at the transcript’s grinding check, and that an in-trace forgery with consistently adjusted publics is rejected by the copy-transition chain. Honest scope: the 256 public input coefficients are not range-checked in-circuit (they are public data; the consumer checks out-of-band, which is trivial); given canonical inputs, every intermediate value and the output are canonical inductively, because all state updates pass through the range-checked gadgets.
The KAT discipline is doubled for M1: the committed output is checked bit-exactly against two independent oracles — the reference implementation’s butterfly network (the identical monomorphization, as in M0) and a from-the-definition number-theoretic evaluation computed by square-and-multiply exponentiation and Horner evaluation, with the twiddle table anchored to FIPS-204 Appendix B values — pinning the layer structure and the schedule to the standard rather than to a transcription of the reference source. Measured [MEASURED PROTOTYPE]: the trace proves in s and verifies in s on the host CPU — about of the s post-S1 zkVM verification budget. Kill criterion 1 (kill the track if one NTT exceeds 10% of a full zkVM verify): cleared with margin.
9.5 The in-guest verifier and the crossover (M2)
The wrap-not-replace architecture stands or falls on one number: the cycle cost for the thin guest to verify one native AIR proof in software. Define the crossover
Visual explanationNative AIR soundness and crossover37 sec
Accessible transcript
FRI parameters. A blowup factor of two, 128 queries, and 16 grinding bits define the prototype configuration.
Honest claim. The 144-bit classical figure is explicitly conjectural; the quantum adjustment affects grinding.
Measured verifier. The thin guest rebuilds the AIR and verifier configuration from constants before checking a proof.
Crossover. Native batching wins only when quorum size exceeds the measured verifier-cost ratio.
Security property. Native acceleration cannot silently weaken consensus: verifier parameters are rebuilt inside the guest and adoption remains gated by explicit soundness and cost criteria.
the batch size at which one in-guest verification of the batched AIR proof beats direct in-zkVM ML-DSA-65 verifications at the post-S1 baseline (M cycles per signature, Table 6); the AIR path wins per quorum certificate of signatures iff (plus residual per-batch work). The M2 measurement guest is a real no_std rv32im build that deserializes the proof, rebuilds the verifying configuration and the AIR from constants (the host supplies only the proof, the public values, and an AIR selector — nothing the host says is trusted), runs the uni-STARK verifier, and journal-commits ; rejection is a guest panic, so no receipt exists for a bad proof (fail-closed). Two integration defects — an unstable standard-library feature on the pinned guest toolchain, and the absence of an atomic instruction extension on rv32im — were found and fixed only because the actual guest binary was built and executed, which we record as methodological support for the project’s measure-don’t-estimate policy. Two accelerations were then applied and measured [MEASURED PROTOTYPE]:
Lever A: keccak precompile routing.
The verifier’s dominant cost is keccak Merkle-path checking. The Plonky3 keccak backend calls the free function keccakf of the tiny-keccak crate for every Merkle sponge and compression permutation — and the existing upstream zkVM fork of that crate accelerates only the Permutation trait method, leaving the free function as pure software (a measured no-op for this path). The project therefore vendors a fork that routes the free function to the zkVM’s keccak accelerator under the guest target. The accelerator’s output is proof-composed (the permutation result is verified by the dedicated keccak circuit, not trusted), so behaviour is bit-identical to software; the TCB consequence is analyzed in Section 9.6. Measured on M0: (), .
Lever B: the schedule as a preprocessed trace.
The naive M1 verifier spends nearly everything on the 513 barycentric out-of-domain evaluations of the period-2048 schedule columns. Committing the schedule once as a preprocessed trace replaces those with one Merkle-checked opening per column per query (verifier work per column). The soundness crux is who computes the preprocessed commitment: the guest derives the verifier key in-guest from the deterministic in-crate schedule — it is never read from host input — and the verifier absorbs that commitment into the Fiat–Shamir transcript before drawing any challenge and Merkle-checks the proof’s preprocessed openings against it across all 128 queries, so a malicious host cannot substitute a different NTT schedule. Measured on M1: ( combined with lever A), . Table 7 collects the measured results.
| prototype | statement / configuration | trace | ||
|---|---|---|---|---|
| M0 | pointwise mod- multiply, software keccak | 189.5M | 51.6 | |
| M0 + lever A | + keccak precompile | 46.5M | 12.7 | |
| M1 | 8-layer NTT, periodic schedule | 1388.7M | 378.4 | |
| M1pp (A + B) | + preprocessed schedule | ( pp) | 174.1M | 47.4 |
Kill criterion 2 (kill the track if does not clear the realistic 67–128 signatures per QC): passed with measured data. A M-cycle in-guest verification amortized over a quorum certificate of – signatures costs –M cycles per signature — crossing below the M direct baseline with room for the residual per-batch work.
9.6 Adversarial soundness review and the trusted base
Both levers were adversarially reviewed against the uni-STARK verifier and zkVM sources and found sound: for lever B, the preprocessed verifier key is Fiat–Shamir-absorbed before the challenges, its openings are keccak-Merkle-checked at every query, the constraint evaluator reads the schedule only through the preprocessed accessor, and width/degree mismatches fail closed; for lever A, the routing covers every permutation call on the verification path with no endianness hazard. Three riders from that review are part of the verdict, not footnotes to it:
-
1.
The baked-VK floor. The M figure is valid only with the preprocessed verifier key baked into the guest as an image-id-pinned constant — the same trust model as the canonical sub-guest image ids of Section 7.2.3. Rebuilding the key in-guest (the measurement configuration) costs an additional G cycles per proof; a one-proof-per-run guest that rebuilds pays G total and the win evaporates (). A baked key must carry a build-time CI assertion that the constant equals the key freshly derived from the deterministic schedule under the pinned configuration — otherwise a maliciously generated constant would silently change the statement being verified. This control is procedural, not cryptographic, and is mandated in the same way as the existing image-id drift tests.
-
2.
Lever A is a real TCB expansion. Routing the verifier’s Merkle hashing through the zkVM’s keccak accelerator makes the zkVM’s keccak circuit soundness-critical for the AIR path: a forged permutation result now requires breaking that circuit (which thereby enters the trusted base of Section 10.3, item 1), where previously a divergent keccak implementation merely made verification fail. The expansion is acceptable only because the same circuit family already sits in the TCB for the S1-accelerated paths — but it must be named, audited with the rest of the circuit family, and reflected in the TCB inventory.
-
3.
Floors and accounting. M is a floor for a single 2048-row NTT-sized statement. A full batched- verification AIR is a larger circuit; its verifier cost grows roughly logarithmically in trace height (Merkle depth), so the production crossover is estimated at – — still inside the realistic QC range, but it must be measured at full scale before the AIR carries consensus weight. Symmetrically, the cycle-denominated is apples-to-apples only if the M baseline is held to the same proving-cost accounting: the keccak-accelerated paths add keccak-circuit segments and proof-composition (lift/join/resolve) work to the full prove that raw rv32im cycle counts do not show (the S1 lesson of Section 8.5).
9.7 From prototype to consensus-law: the remaining program
[RESEARCH] What is measured: the algebra (M0/M1) and the wrapper economics (M2). What remains is a substantial, enumerable engineering program: (1) the BabyBear limb/carry gadget — the prototype’s Goldilocks field gives the 46-bit coefficient product for free, BabyBear (31-bit, the zkVM-native field) does not, so the production gadget must split products into limbs with range-checked carries and re-prove the integer-inference argument of Proposition 9.2 per limb equation; (2) in-circuit SHAKE — hashing is of a full FIPS-204 verification ( keccak permutations per verification, of which ), so the realistic uncached full-verification gain is – rather than the headline algebra speedups, with the S2 key-cache of Section 8.5 (committing each validator’s expanded key once per epoch, deleting of the permutations) required to reach the upper end; (3) the Decompose/UseHint edge cases — the non-algebraic rounding steps where a single loose constraint is a forgery lever inside the TCB; (4) the full batched- verification AIR, measured at production scale per Section 9.6; and (5) an external audit. The estimate is 60–90 engineer-weeks (of which 10–16 are the audit); a credible hybrid — an algebra-only AIR with SHAKE remaining in the S1-accelerated zkVM — is estimated at 30–45 weeks for a – cycle reduction. Deployment discipline is fixed in advance: a mandated shadow-mode dual proof in which the AIR result is AND-gated with the existing rv32im receipt for many epochs, so that a hypothetical AIR soundness defect is a recoverable liveness halt, never a forgeable finality certificate; the raw quorum certificate remains authoritative throughout, exactly as for PCF (Section 8.4). We restate the status plainly: the feasibility risk is retired with measurements, the construction is not deployed, and nothing in this section should be read as a live consensus primitive.
10 Threat Model and Security Analysis
10.1 Adversary model
We consider a single adversary with all of the following capabilities, bounded only by the stated assumptions: full network control short of permanent partition (Assumption 6); adaptive corruption of validators up to the stake bound (Assumption 5); unbounded recording of all public data forever, with future quantum capability (“harvest now, exploit later”); operation of any number of provers, relayers, RPC nodes, and wallets (these roles are untrusted by construction); and submission of arbitrary transactions, proofs, blocks, and claims. The adversary’s quantum capability is assumed effective against elliptic-curve and pairing assumptions and ineffective against Assumptions 1–4 beyond generic (Grover-type) speedups.
10.2 Security claims
- •
-
•
Ledger integrity. Transparent forgery reduces to Assumption 1; shielded counterfeiting or foreign-spend reduces to Assumptions 3/4 (Claim 6.3); double-spends are excluded by the persisted nullifier set bound into app_hash; aggregate-value escape is excluded by Invariant 5.2 with hard-halt enforcement.
-
•
Shielded confidentiality. Note contents and linkage are protected by Assumptions 2/3 against a recording quantum adversary; anonymity is additionally bounded by anonymity-set and metadata considerations stated in Section 6.8 — we claim confidentiality unconditionally on the assumptions, and unlinkability only operationally.
-
•
Bridge. An Ethereum mint of wSOS reduces to SOS finality plus the enumerated Ethereum-side verifier (Theorem 7.1); no bridge-specific trusted party exists. A compromise of Ethereum (including a quantum break of BN254 or BLS) affects wSOS and the reverse-direction feed, and extends to the bridge_locked bucket: a forged sync-committee signature could falsely prove a wSOS burn, minting native SOS against the locked collateral (Section 7.5). The reverse direction verifies a real sync-committee-signed, finality-checked Ethereum light-client proof, and a node built without that verifier is fail-closed (minting refused).
-
•
Proof verification is public; spend witnesses are not outsourceable. Bridge provers and relayers are untrusted: every bridge proof is publicly verifiable, and a withheld proof is an availability event only. Privacy spend proving is different because the witness carries . In-circuit spend authorization prevents accepted private transfers from being rewritten to different public effects, but it does not hide from the proving machine. A third-party privacy prover must therefore still be treated as custody for spend authority; public deployments should route spends to user-controlled provers until witness-private delegation exists.
10.3 Trusted computing base and trust boundaries
An explicit inventory of what must be correct beyond the cryptographic assumptions:
-
1.
The zkVM circuit family (execution circuit, recursion circuits, and — where enabled — the Keccak accelerator circuit): a soundness defect here is a proof-forgery vector for privacy, bridge, and PCF simultaneously. Mitigations: the raw QC remains authoritative for real-time consensus; shadow-mode/differential policies are mandated before any proof artifact becomes consensus-law; upstream audits are tracked.
-
2.
Guest programs and their image ids. The guests are small, reviewed, and pinned; image ids are compile-time constants with CI drift tests, and the recursion pins sub-program ids inside the parent guest (Section 7.2.3). Reproducible guest builds across toolchains are required for validator-set-wide agreement on ids; the toolchain is pinned. Image ids remain immutable per deployment. The public testnet exercised a coordinated fresh-contract cutover with no dual intake, preserved old accounting, repeated both directions, and then rehearsed a validator-set rotation. This is the accepted capped-testnet policy, not the mainnet protocol: mainnet must bind a consensus-defined bridgeDomain and activation height into lock signatures, replay ids, guest journals, contracts, relayers, and the reverse trusted-address lifecycle so old-domain positions can drain without double minting.
-
3.
Receipt-kind discipline. SOS-internal verifiers must accept only bare STARK receipts; the generic receipt verifier would also accept a Groth16-wrapped receipt, so explicit kind-rejection is required at every internal verification site. This rejection is enforced at the privacy, ETH-burn, bridge-batch, and valset-transition verifier boundaries; the release gate is CI coverage that exercises all of those sites.
-
4.
The Ethereum boundary (enumerated, Definition 2.3): the Groth16/BN254 wrap and verifier contract, and the reverse light client’s BLS12-381 sync-committee verification. Failure domain: Ethereum-side assets only.
-
5.
Operational key handling: wallet seeds, the spend secret behind , validator consensus keys, and the prover-service deployment (which is hardened but handles spend witnesses by design).
10.4 Untrusted provers and tampered local nodes
Because every private action is proved on hardware the user controls (Section 6.7), a natural question is what stops an operator who runs a modified prover — or a modified node — from manipulating the actions a node “verifies locally.” Nothing is verified locally in any sense that bears on integrity: the object a prover emits is a publicly checkable STARK receipt, re-verified independently by every validator against a compile-time-pinned guest, and the only values that move state are read from that receipt’s journal (Section 6.5). The prover is a source of evidence, not an authority; proving location never enters the verification pipeline. Two adversaries make the boundary precise.
A malicious prover.
An adversary who rewrites their prover holds exactly one lever — the receipt they submit — and every receipt runs the same ordered, fail-closed pipeline on every node (Section 6.5). Each dishonest strategy is closed by a distinct, already-shipped check:
-
•
Forge a receipt for a false statement — excluded by STARK soundness (Assumption 4): a receipt that verifies is, but for negligible probability, a transcript of an honest execution of the pinned guest on some witness.
-
•
Swap in a cheating circuit (one that skips conservation or ownership) — excluded by image-id pinning: verification is anchored to the source-pinned CANONICAL_PRIVACY_GUEST_IMAGE_ID, never the locally built id, so a receipt from any guest but the audited one fails verify identically on every node; the node startup gate separately refuses to run a binary whose own embedded guest id has drifted.
- •
-
•
Double-spend a note — excluded by the persisted nullifier set: the nullifier is derived from inside the circuit and is therefore deterministic, so a second appearance is rejected across the whole history; the set is folded into app_hash.
-
•
Grind an anchor (prove inclusion against a self-authored tree) — excluded by anchor recency: the anchor must be one of the last distinct finalized roots (Section 6.5), a set the adversary cannot author.
-
•
Redirect or re-price a captured unshield — excluded by the recipient binding and the journal-bound amount, both recomputed by the node from the transaction before crediting.
A node compiled without the proof-system verifier does not fall back to weaker checks: it refuses every private action. A tampered prover can therefore produce only a rejected receipt.
A tampered local node.
An operator who patches their own node’s verifier to accept a fraudulent action changes only their own view. Every state change — the full shielded pool included — is folded into app_hash and chained through the quorum-signed block hash (Sections 3.3, 6.6), so a node that applied an action the honest rules reject computes a divergent app_hash and is rejected by the honest stake supermajority, exactly as a corrupted history is rejected on sync (Section 3.4). Finality is the agreement of independently verifying validators, not the assertion of any one node: a tampered node forks itself off the network rather than moving anyone else’s funds. (This is the same mechanism that makes an accidentally divergent binary self-eject — a heterogeneous guest toolchain that derives a different image id is caught by the startup gate before it can vote.)
What local proving is trusted for.
Exactly one thing, and it is confidentiality, not integrity: the spend witness carries , so the machine that proves a spend learns which notes are spent and could exfiltrate the spend authority itself. This is why proving runs on the user’s own hardware, and why witness-private delegated spend-proving is stated as an open problem rather than a feature (Section 6.7). A dishonest prover that receives can construct alternative spend witnesses; the proof statement now binds spend authorization so an accepted private transfer’s public effects cannot be substituted, but confidentiality and custody safety still rest on where is allowed to go. Integrity of accepted proofs rests on public verification against the pinned guest.
10.5 Known limitations
Stated against the code and deployment as of this writing: (i) no external security audit yet; the internal adversarial program is active and its material findings are incorporated. (ii) Both bridge directions and a public V0-to-V1 validator-set rotation have been demonstrated on live Sepolia with real proofs, caps, replay negatives, restart recovery, and monitoring (Section 7.8), but not yet as a sustained cross-chain workload under the multi-node fault harness. Image ids are immutable; the tested fresh-cutover policy still requires a consensus bridgeDomain lifecycle for mainnet. The fresh recovery chain deliberately keeps value-moving bridge ingress paused while the old Sepolia wSOS supply and validator-set domain are drained or migrated. SOS-side timeout refunds remain disabled until claim/refund exclusivity is proven. (iii) Proposer selection is stake-weighted among the active bounded set (Section 4.9); unit/regression suites, public coordinated activation, failover, a mixed-operation release smoke, and a six-hour fault campaign pass. An archival repeat with persistent exact operation/fault tallies and an economic audit remain mainnet release evidence. (iv) Private transfer has in-circuit spend authorization and journal-as-truth node application, and a July 2026 public-testnet round trip passed with real STARK receipts; deterministic phrase recovery, fail-closed paginated scanning and a 10,000-note RPC regression are implemented. A fresh-device real-proof E2E and clean-browser import/corrupt-record smoke passed first on an isolated three-validator V5 staging chain and then on the fresh public chain, including faucet, shield, private-send, unshield, nullifier reconciliation and restart parity. The public replay finished with four commitments and two nullifiers. Sustained real-KEM scan/prover load, external circuit and wallet review, and operational hardening remain mainnet gates. (v) The validator ceiling is – until the Section 8 program lands. (vi) Anonymity-set limitations per Section 6.8. (vii) Light-client and PCF artifacts exist, but shipping clients do not yet consume them and the weak-subjectivity checkpoint/offline policy is not fixed. (viii) Public nodes now run a pure verify-only build that compile-time rejects dev and secret-material RPCs. Wallet encrypted storage now includes the private scan cache; phrase recovery, corrupt-record replacement, consensus nullifier reconciliation and fail-closed unknown-balance behavior have automated, isolated-browser, and public-domain coverage. A sustained large-pool recovery benchmark and complete viewing-key compromise threat model remain. During the public rollout, a restart immediately after prevote but before commit left the three preserved vote WALs relaying the recorded height without progress; restarting the original proposer restored finality without deleting state. Deterministic mid-height rolling-restart recovery therefore remains a mainnet gate. (ix) The three public validator processes are co-located on one Hetzner host; RPC failover handles a process failure, not host, region, or operator independence. Independent validators, relayers/provers, monitoring, and alert ownership are mainnet requirements. (x) Treasury governance is deferred: both multisig-voting and fork-choice architectures are under evaluation; the choice is a pre-mainnet decision (Section 5.8). (xi) The performance evaluation is a small-network functional and chaos suite, not a scaling study; QC propagation, sustained bridge/prover throughput, state growth, and validator-count scaling remain to be benchmarked systematically.
Cryptographic parameter categories.
The asymmetry between ML-DSA-65 at NIST security category 3 (per FIPS-204, approximately 192-bit classical strength) and ML-KEM-1024 at NIST security category 5 (per FIPS-203, the most conservative parameter set, approximately 256-bit classical strength) reflects the different threat timelines of signatures and encryption. A signature’s vulnerability window is determined by the harvest-now-decrypt-later adversary: an attacker records a signed transaction today and, post-quantum, forges a different transaction with the same key. The effective security horizon is therefore the data-retention and migration-time sum (Mosca’s formula, Section 1.1). For encryption, the data itself (sealed notes, ciphertexts) is recorded and remains exposed to decryption for decades, making the cipher’s lifetime the full adversary timeline. Consequently, note encryption requires the most conservative parameter set (category 5), while signatures tolerate category 3 without weakening the overall post-quantum guarantee, provided the signed preimages are sufficiently large and domain-separated (Construction 4.3, Section 2.2) to resist the residual lattice-based attacks that motivate the category distinction.
11 Related Work
Post-quantum signatures and KEMs.
SOS builds directly on the NIST standards: ML-DSA [9, 11], ML-KEM [8, 12], and SHA-3/SHAKE [7]; SLH-DSA [10] and XMSS [14] are the conservative hash-based signature alternatives — attractive for their minimal assumptions, but their size (SLH-DSA) or statefulness (XMSS) made them unsuitable for high-frequency consensus votes. Post-quantum aggregation (Squirrel, Chipmunk, Lemur [48, 49, 50]) and lattice VRFs [51] are tracked as future enablers (Section 8.2).
Post-quantum shielded ledgers and comparison to prior art.
Quantum-resistant private-transaction schemes predate SOS. QRL [39] pioneered XMSS-authorized ledger transactions; its stateful one-time-signature indices impose a wallet-lifecycle model distinct from SOS, and its base protocol does not provide SOS’s opt-in shielded-note accounting. Abelian [40] combines custom lattice-based signatures, commitments, encryption, and zero-knowledge/ring-signature machinery to provide post-quantum private payments and optional accountability. MatRiCT and MatRiCT+ [41, 42] are practical lattice-based RingCT protocols rather than deployed NIST-standard primitives. These systems are important prior art, but make a different engineering choice: specialized lattice privacy algebra. PQ-MWEB instead uses standardized ML-DSA and ML-KEM for authorization and note transport, hash-only public note state, and a transparent STARK for explicit conservation and spend validity. This simplifies the public-state assumptions at the cost of substantially larger proofs and higher proving cost; it is not a claim that the surrounding STARK implementation is itself a NIST-standard primitive.
BFT consensus.
The protocol is in the PBFT–Tendermint–HotStuff lineage [25, 28, 29, 30] under the partial-synchrony model [26, 27]; the SOS-specific deltas are post-quantum vote authentication, the v4 binding of chain identity and validator-set hash into the QC-signed hash, and the design constraint of in-zkVM verifiability. Algorand [31] pioneered committee-sampled BFT; Section 8.2 explains why sampling composes poorly with un-aggregated lattice signatures at SOS’s margin.
Private ledgers.
Zerocash [37] and its Zcash realizations [38] established commitment/nullifier shielded pools with succinct proofs, on pairing SNARKs with trusted setup (later transparent-recursion variants remain elliptic-curve based); Mimblewimble/MWEB [34, 35, 36] established the opt-in extension-block deployment model on Pedersen algebra. PQ-MWEB keeps the deployment model and the accounting abstraction while replacing every primitive with hashes, lattice KEM encryption, and transparent STARKs — to our knowledge the first shielded-pool design with no elliptic-curve or pairing assumption anywhere in its verification path.
STARKs and proof-carrying infrastructure.
Transparent STARKs and FRI [15, 16, 17, 18] provide the post-quantum proof substrate; their QROM analyses [19] support the post-quantum claim. The zkVM and its recursion [21] provide proof composition in the proof-carrying-data tradition [20]. PCF (Section 8.4) is closest in spirit to Algorand’s compact state certificates [32] and to SNARK-based Ethereum light clients over the sync committee [46, 44, 45] — with the distinction that the SOS certificate proves the chain’s native FIPS-204 finality directly and transparently, rather than an auxiliary pre-quantum committee signature, so no security is delegated to a weaker co-signing layer.
Bridges.
Committee and multisig bridges place a trusted set on the value path; optimistic bridges add challenge latency and honest-watcher assumptions; SNARK light-client bridges [46] verify pre-quantum aggregate signatures. The SOS bridge binds an Ethereum mint to an in-proof verification of the source chain’s full stake-weighted post-quantum quorum, with the contract reconstructing the proof’s public outputs (Section 7.2.5) — the non-PQ residue confined to the single on-chain seal verification the destination chain forces.
12 Conclusion
SOS demonstrates that post-quantum security can be a whole-system property of a Layer-1 — consensus, transactions, opt-in privacy, succinct proofs, and cross-chain interoperability — rather than a signature substitution. The composition is held together by a small number of disciplined mechanisms: one hash family with a global domain registry; one signature scheme verified identically by nodes, light clients, and circuits; a block hash that makes the quorum attest the chain, the epoch, and the validator set; a shielded pool whose every byte is inside the quorum-signed perimeter; proofs that clients generate and the network merely verifies; and a bridge whose authorization reduces to the source chain’s honest stake and the explicitly enumerated proof/verifier assumptions. Both directions, the unattended relayer, committee-root maintenance, caps, and validator-set rotation have now been exercised on the public testnet. Where the system is unfinished — independent operation and audit, mainnet bridge-domain migration, shipping weak-subjectivity/PCF consumption, wallet recovery and scan scaling, and the validator ceiling pending the PCF/AIR program — this paper says so explicitly. We believe this is the appropriate standard of claim for a system whose premise is that security guarantees should survive an adversary the present cannot yet build.
Acknowledgements.
The design benefited from sustained internal adversarial review; several constructions in this paper (the ownership weld, the anchor window, the journal-reconstruction contract binding, the v4 hash) exist in their final form because a red-team argument broke their predecessors.
Appendix A Canonical Byte Layouts and Wire-Format Diagrams
This appendix collects every consensus-critical byte layout in the protocol, each as an offset table and/or an RFC-style field diagram. Every layout is transcribed from the implementation (the defining file is cited in a source comment next to each diagram); field widths in the diagrams are not drawn to scale. Conventions: multi-byte integers are little-endian (LE) in all SOS-native preimages and big-endian 32-byte words only inside the Ethereum ABI journal (A.4); orange boxes are domain-separation tag prefixes — for the hash inputs (A.2, A.3, A.6, A.7) they are absorbed into the hash but not counted in the offset annotations, whereas the vote preimage’s tag (A.1) is part of the signed 58 bytes and is counted; dashed boxes elide repeated groups.
A.1 Vote preimage (58 bytes)
| offset | len | field | encoding |
|---|---|---|---|
| 0 | 8 | tag | ASCII "SOSVOTE2" |
| 8 | 4 | chain_id | u32 LE |
| 12 | 32 | block_hash | raw; all-zero for nil |
| 44 | 8 | height | u64 LE |
| 52 | 4 | round | u32 LE |
| 56 | 1 | phase | 0 = prevote, 1 = precommit |
| 57 | 1 | nil | 1 iff block_hash |
Signed raw with ML-DSA-65, empty context, no pre-hash.
A.2 Block-hash v4 preimage (after the domain tag)
| offset | len | field | encoding |
|---|---|---|---|
| 0 | 4 | chain_id | u32 LE (current network 0x534F53) |
| 4 | 4 | epoch | u32 LE |
| 8 | 32 | validator_set_hash | Construction 4.2 |
| 40 | 8 | height | u64 LE |
| 48 | 8 | slot | u64 LE |
| 56 | 32 | tx_root | |
| 88 | 32 | utxo_root | |
| 120 | 32 | ext_root | |
| 152 | 32 | prev_app_hash |
Digest .
A.3 Validator-set hash preimage
"sos:bridge-valset:v2" then, per active validator in canonical order (effective stake desc, id asc): consensus_pk (1952) stake (u64 LE).
A.4 Bridge batch journal (Solidity abi.encode)
Head: blockHash (bytes32) height (uint64, 32-byte BE word) validatorSetHash (bytes32) epoch (uint32 word) chainId (uint32 word) offset (word). Tail: array length (word), then per operation 128 bytes: lockId (bytes32), ethRecipient (20 bytes right-aligned in a word), amount (uint64 word), relayFee (uint64 word). The contract verifies the seal against .
A.5 Note plaintext (83 bytes)
value (u64 LE, 8) (11) (32) (32); sealed per Construction 6.4 with .
A.6 Note commitment and nullifier preimages
commit_v3 input: tag value (u64 LE) (147 payload bytes); nullifier input: tag position (u64 LE) (72 payload bytes). Both are SHAKE-256 squeezed to 32 bytes.
A.7 Sealed-note blob and AEAD key derivation
On-chain blob: kem_ct (1568) aead_ct (plaintext length 16-byte Poly1305 tag), stored with a separate 1-byte view tag; . Key material: split as key (32) nonce (12) view tag (1).
A.8 Guest journal layouts (consensus and PCF epoch guests)
The consensus guest and the PCF epoch-checkpoint guest commit typed journals: the field sequences below, serialized by the zkVM’s canonical little-endian 32-bit-word serializer (env::commit) and decoded by their (pinned) consumers with the same library — so the wire encoding is library-defined and host/guest-identical by construction, and the security-relevant binding is at the typed-field level. The bridge-batch journal is the exception: it is hand-specified raw bytes (A.4, Figure 9), because an Ethereum contract must re-derive it.
(a) consensus guest — ConsensusProofOutput
(b) PCF epoch-checkpoint guest — EpochCheckpointOutput
(Construction 8.1)
Appendix B Domain-Separation Tag Registry
| tag | hash | purpose |
|---|---|---|
| bqp:block:v2/v3/v4 | SHA3-256 | block hash preimages (version-gated) |
| bqp:validator-pk:v1 | SHA3-256 | validator identity from consensus key |
| sos:weighted-proposer:v2 | SHA3-256 | weighted proposer-permutation draws |
| sos:bridge-valset:v2 | SHA3-256 | canonical validator-set hash |
| bqp:txid:v1 | SHA3-256 | transaction id |
| bqp:merkle:v1 | SHA3-256 | tx-tree node (sorted-pair) |
| bqp:private-pool:v4 | SHA3-256 | shielded-pool component of app_hash |
| sos:epoch-blocks:v1/:step | SHA3-256 | PCF per-epoch block commitment chain |
| sos:note-rcm:v1, sos:note-rho:v1, sos:note-psi:v1 | SHAKE-256 | per-note randomness derivation |
| sos:ak:v1, sos:nk:v1, sos:npk:v1 | SHAKE-256 | key derivations (Construction 6.1) |
| sos:note-commit:v2/v3 | SHAKE-256 | note commitment (v3 = ownership-welded) |
| sos:nullifier:v2 | SHAKE-256 | nullifier |
| sos:addr-pkd:v1 | SHAKE-256 | diversified transmission key |
| sos:cmt-node:v1, sos:cmt-empty:v1 | SHAKE-256 | commitment-tree nodes / empty leaf |
| sos:unshield-recipient:v1 | SHAKE-256 | unshield destination binding |
| sos:note-aead:v1 | SHAKE-256 | note AEAD KDF (45-byte output) |
| bqp:shield-auth:v1 | SHA3-256 | shield authorization signature domain |
| bqp:burn:v1 | SHA3-256 | Ethereum-side wSOS-burn replay id (reverse bridge) |
| sos:airdrop-leaf:v1, sos:airdrop-node:v1, sos:airdrop-claim:v1 | SHA3-256 | Merkle-drop commitment and claim |
Rules: a tag is never reused across purposes; semantic changes bump the version suffix behind an activation gate; both the bqp: and sos: namespaces are frozen constants.
Appendix C Parameter Summary
| parameter | value | where |
|---|---|---|
| signature scheme | ML-DSA-65 (FIPS 204, cat. 3; pk 1952 B, sig 3309 B) | §2.2 |
| note encryption | ML-KEM-1024 (FIPS 203, cat. 5) + ChaCha20-Poly1305 | §6.4 |
| hashes | SHA3-256 / SHAKE-256 (32-byte outputs) | §2.4 |
| chain id | 0x534F53 | §4.2 |
| supply cap | 21,000,000 SOS ( sats) | §5 |
| genesis supply / emission pool | 2,100,000 SOS (10%) / 18,900,000 SOS (90%) | §5.3 |
| emission | 210,000 SOS/yr; 7-day epochs; 70/20/10 split; 30% fee burn; cap-truncated | §5.5 |
| unbonding period | 21 days | §5.7 |
| slashing | double-sign 5%; downtime jail; other burns reserved | §4.8 |
| consensus tick / commit | 200 ms tick; 600 ms (4-node), 0.63 s (live 1-val) | §4.10 |
| max block size | 4 MiB (incl. consensus envelope) | §4.7 |
| validator pool / signers | 200 pool / 64 active signers per block (genesis) | §4.1 |
| launch active set | §8.3 | |
| quorum rule | strict effective stake; distinct signers | §4.5 |
| round-sync rule | strict effective stake at a higher round | §4.7 |
| commitment tree | depth 32, SHAKE-256 nodes | §6.2 |
| anchor window | 256 distinct recent roots, in app_hash | §6.5 |
| value bound (shielded) | sats per note/fee | §6.5 |
| note plaintext / view tag | 83 B / 1 B | §6.4 |
| in-zkVM ML-DSA-65 verify | 5.87 M cycles (3.67 M with S1) | §8.5 |
| AIR in-guest verify (M1pp) | 174 M cycles; (baked VK) | §9 |
References
- [1] S. Nakamoto. Bitcoin: A Peer-to-Peer Electronic Cash System. 2008. https://bitcoin.org/bitcoin.pdf
- [2] G. Wood. Ethereum: A Secure Decentralised Generalised Transaction Ledger. Ethereum Yellow Paper, 2014. https://ethereum.github.io/yellowpaper/paper.pdf
- [3] P. W. Shor. Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer. SIAM J. Comput. 26(5):1484–1509, 1997.
- [4] L. K. Grover. A Fast Quantum Mechanical Algorithm for Database Search. STOC 1996, 212–219.
- [5] M. Mosca. Cybersecurity in an Era with Quantum Computers: Will We Be Ready? IEEE Security & Privacy 16(5):38–41, 2018.
- [6] G. Alagic et al. Status Report on the Third Round of the NIST Post-Quantum Cryptography Standardization Process. NIST IR 8413, 2022. https://doi.org/10.6028/NIST.IR.8413
- [7] NIST. FIPS 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions. 2015. https://doi.org/10.6028/NIST.FIPS.202
- [8] NIST. FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard (ML-KEM). 2024. https://doi.org/10.6028/NIST.FIPS.203
- [9] NIST. FIPS 204: Module-Lattice-Based Digital Signature Standard (ML-DSA). 2024. https://doi.org/10.6028/NIST.FIPS.204
- [10] NIST. FIPS 205: Stateless Hash-Based Digital Signature Standard (SLH-DSA). 2024. https://doi.org/10.6028/NIST.FIPS.205
- [11] L. Ducas, E. Kiltz, T. Lepoint, V. Lyubashevsky, P. Schwabe, G. Seiler, D. Stehlé. CRYSTALS-Dilithium: A Lattice-Based Digital Signature Scheme. IACR TCHES 2018(1):238–268.
- [12] J. Bos, L. Ducas, E. Kiltz, T. Lepoint, V. Lyubashevsky, J. M. Schanck, P. Schwabe, G. Seiler, D. Stehlé. CRYSTALS-Kyber: A CCA-Secure Module-Lattice-Based KEM. IEEE EuroS&P 2018.
- [13] Y. Nir, A. Langley. ChaCha20 and Poly1305 for IETF Protocols. RFC 8439, 2018. https://www.rfc-editor.org/rfc/rfc8439
- [14] A. Huelsing, D. Butin, S.-L. Gazdag, J. Rijneveld, A. Mohaisen. XMSS: eXtended Merkle Signature Scheme. RFC 8391, 2018.
- [15] E. Ben-Sasson, I. Bentov, Y. Horesh, M. Riabzev. Scalable, Transparent, and Post-Quantum Secure Computational Integrity. IACR ePrint 2018/046. https://eprint.iacr.org/2018/046
- [16] E. Ben-Sasson, I. Bentov, Y. Horesh, M. Riabzev. Fast Reed-Solomon Interactive Oracle Proofs of Proximity. ICALP 2018.
- [17] E. Ben-Sasson, A. Chiesa, N. Spooner. Interactive Oracle Proofs. TCC 2016.
- [18] StarkWare. ethSTARK Documentation. IACR ePrint 2021/582. https://eprint.iacr.org/2021/582
- [19] A. Chiesa, P. Manohar, N. Spooner. Succinct Arguments in the Quantum Random Oracle Model. TCC 2019.
- [20] A. Chiesa, E. Tromer. Proof-Carrying Data and Hearsay Arguments from Signature Cards. ICS 2010.
- [21] RISC Zero, Inc. RISC Zero: A General-Purpose Zero-Knowledge Virtual Machine (zkVM). 2023. https://dev.risczero.com
- [22] Polygon Zero / Plonky3 contributors. Plonky3: A Toolkit for Polynomial IOPs and AIR-Based Proof Systems. 2024. https://github.com/Plonky3/Plonky3
- [23] Least Authority. Polygon Plonky3 Security Audit Report. 2024.
- [24] J. Groth. On the Size of Pairing-Based Non-interactive Arguments. EUROCRYPT 2016.
- [25] M. Castro, B. Liskov. Practical Byzantine Fault Tolerance. OSDI 1999.
- [26] C. Dwork, N. Lynch, L. Stockmeyer. Consensus in the Presence of Partial Synchrony. JACM 35(2):288–323, 1988.
- [27] M. J. Fischer, N. A. Lynch, M. S. Paterson. Impossibility of Distributed Consensus with One Faulty Process. JACM 32(2):374–382, 1985.
- [28] E. Buchman. Tendermint: Byzantine Fault Tolerance in the Age of Blockchains. M.Sc. thesis, University of Guelph, 2016. https://hdl.handle.net/10214/9769
- [29] E. Buchman, J. Kwon, Z. Milosevic. The Latest Gossip on BFT Consensus. arXiv:1807.04938, 2018. https://arxiv.org/abs/1807.04938
- [30] M. Yin, D. Malkhi, M. K. Reiter, G. Golan-Gueta, I. Abraham. HotStuff: BFT Consensus with Linearity and Responsiveness. ACM PODC 2019.
- [31] Y. Gilad, R. Hemo, S. Micali, G. Vlachos, N. Zeldovich. Algorand: Scaling Byzantine Agreements for Cryptocurrencies. ACM SOSP 2017.
- [32] S. Micali, L. Reyzin, G. Vlachos, R. S. Wahby, N. Zeldovich. Compact Certificates of Collective Knowledge. IACR ePrint 2020/1568; IEEE S&P 2021.
- [33] CometBFT contributors. CometBFT: Proposer Selection and Validator Documentation. 2024. https://docs.cometbft.com
- [34] T. E. Jedusor. Mimblewimble. 2016. https://docs.beam.mw/Mimblewimble.pdf
- [35] A. Poelstra. Mimblewimble. 2016. https://download.wpsoftware.net/bitcoin/wizardry/mimblewimble.pdf
- [36] D. Burkett. Mimblewimble Extension Blocks (MWEB), LIP-0002/0003. Litecoin Improvement Proposals, 2020. https://github.com/litecoin-project/lips
- [37] E. Ben-Sasson, A. Chiesa, C. Garman, M. Green, I. Miers, E. Tromer, M. Virza. Zerocash: Decentralized Anonymous Payments from Bitcoin. IEEE S&P 2014.
- [38] D. Hopwood, S. Bowe, T. Hornby, N. Wilcox. Zcash Protocol Specification. Version 2022.3.8, 2022. https://zips.z.cash/protocol/protocol.pdf
- [39] P. Waterland. Quantum Resistant Ledger (QRL). Project whitepaper, November 2016. https://github.com/theQRL/Whitepaper
- [40] Abelian Project. Abelian (ABEL): A Quantum-Resistant Cryptocurrency Balancing Privacy and Accountability. Whitepaper, 2022. https://download.abelian.info/release/docs/whitepaper.pdf
- [41] M. F. Esgin, R. K. Zhao, R. Steinfeld, J. K. Liu, D. Liu. MatRiCT: Efficient, Scalable and Post-Quantum Blockchain Confidential Transactions Protocol. ACM CCS 2019, 567–584. https://ia.cr/2019/1287
- [42] M. F. Esgin, R. Steinfeld, R. K. Zhao. MatRiCT+: More Efficient Post-Quantum Private Blockchain Payments. IEEE S&P 2022, 1281–1298. https://ia.cr/2021/545
- [43] D. Boneh, B. Lynn, H. Shacham. Short Signatures from the Weil Pairing. ASIACRYPT 2001; J. Cryptology 17(4), 2004.
- [44] Ethereum Foundation. The Beacon Chain Altair Light Client Sync Protocol. Ethereum consensus specifications, 2021. https://github.com/ethereum/consensus-specs
- [45] S. Agrawal, J. Neu, E. N. Tas, D. Zindros. Proofs of Proof-of-Stake with Sublinear Complexity. arXiv:2209.08673, 2022.
- [46] Succinct Labs. Proof of Consensus: A ZK Light Client for Ethereum Proof-of-Stake. 2022. https://www.succinct.xyz
- [47] V. Buterin. Proof of Stake: How I Learned to Love Weak Subjectivity. Ethereum Foundation blog, 2014.
- [48] N. Fleischhacker, M. Simkin, Z. Zhang. Squirrel: Efficient Synchronized Multi-Signatures from Lattices. ACM CCS 2022.
- [49] N. Fleischhacker, G. Herold, M. Simkin, Z. Zhang. Chipmunk: Better Synchronized Multi-Signatures from Lattices. ACM CCS 2023.
- [50] Lemur authors. Lemur: Scalable Post-Quantum Synchronized Multi-Signatures. IACR ePrint 2026/1161.
- [51] Z. Li et al. Post-Quantum VRF and its Applications in Future-Proof Blockchain. arXiv:2109.02012, 2021.
