Skip to main content

Full privacy overview

Goal

Private by default:

  • Hide sender/receiver, amounts, transaction graph
  • Privacy against the sequencer (not just against L1 observers)
  • Decentralized ordering + recoverability
  • Hide smart-contract state + private execution

Architecture in one picture

Clients execute → prover layer → encrypted mempool → decentralized sequencer ordering → decrypt-after-ordering (obfuscated data) → batch proof → Solana verifies + stores roots (not only store roots in L1 also L2) → users scan encrypted outputs

Solana is the finality + verifier + root anchor, not the execution engine. (Note: we can still think about the where we want the finality at)


On-chain Solana program responsibilities

Keep it minimal (fast/cheap):

Store:

  • state_root (Merkle root of all private state)
  • nullifier_root (or accumulator commitment)
  • batch_index
  • batch_commitment_hash (commitment to DA data)

Verify on SubmitBatch:

  1. old_root == current_root
  2. committee approval (M-of-N sequencer signatures over batch header)
  3. ZK proof verifies old_root -> new_root and correct nullifier update
  4. update roots + batch commitment

That’s it. No plaintext state ever.


Off-chain state model (what you actually prove)

Use Zcash-style notes (UTXO commitments) for best privacy and simplest circuits:

  • Commitments: C = Commit(note) for new notes/state objects

  • Nullifiers: N = PRF(sk, note) for spent notes (unlinkable)

  • Encrypted outputs: ciphertexts addressed to receiver viewing keys

  • Private app state: also committed into the same state tree (or separate subtree)

Global truth is only the root(s) on Solana. (Note: maybe user can also just look at the sequencers state so we can have faster updates on the user side)


How users learn state updates (wallet logic)

Users do NOT get “pushed” balances.

They:

  1. watch finalized batches (roots anchored on Solana)
  2. fetch batch data from DA (or sequencer caches)
  3. scan encrypted_outputs[]
  4. decrypt what belongs to them (notes / state diffs)
  5. mark spends by checking if their nullifiers appear
  6. maintain local wallet state (unspent notes + app state)

This keeps privacy and avoids storing global state.


“Full privacy against the sequencer”

You need encrypted mempool + decrypt-after-ordering.

Minimal viable (MVP)

  • TX object is already “opaque”: {proof, nullifiers, commitments, encrypted_outputs}
  • sequencer still sees those objects, but not addresses/amounts/state (because they’re not present)

Real full privacy (target, decentralized order sequencing)

  • Users submit ciphertexts to the mempool:
    • cipher = Encrypt(PK_committee, tx_object)
  • Sequencers order ciphertexts blindly
  • Order is committed (signed hash of ciphertext list)
  • Only then the committee performs threshold decryption to reveal tx objects
  • Prover builds batch + proof

This prevents:

  • content-based censorship
  • MEV/front-running on private actions
  • early linkage via tx contents

You still add:

  • relayers + batching windows to reduce IP/timing correlation.

Decentralization plan (without drowning)

Don’t try to ship everything at once.

Phase 1 (ship a working private rollup)

  • Shielded notes + nullifiers + encrypted outputs
  • Single sequencer, permissionless prover
  • DA via committed hash + replicated storage
  • Solana verifies batch proofs + updates roots

Phase 2 (decentralize ordering)

  • Sequencer committee (rotating leader)
  • M-of-N signatures required to submit batch
  • Decentralized prover layer

Phase 3 (true “sequencer-blind” privacy)

  • encrypted mempool with threshold encryption
  • decrypt-after-ordering
  • relayers + batching windows

Data availability (DA) so users can always recover

Never rely on “sequencer database only.”

You need:

  • a DA store for batch blobs (encrypted outputs + commitments + nullifiers + ordering)
  • on Solana: store batch_hash + pointer/reference

For maximum safety: publish DA on Solana accounts (expensive).
For maximum throughput: external DA + strong replication + hash anchored on Solana.

Sequencers are caches/CDNs, not the source of truth.


Performance choices for “fastest”

  • Batch aggressively (one proof per batch)
  • Use a proof system with cheap verification on Solana
  • Keep on-chain verification minimal (roots + verifier + committee signatures)
  • Avoid on-chain storage of blobs unless needed; anchor hashes + pointers

Build checklist (what to implement)

  1. Note format + commitment scheme
  2. Nullifier scheme + anti-double-spend logic
  3. State tree + inclusion proofs
  4. Client proving pipeline (private execution) or prover layer
  5. Batch prover (aggregates txs → new roots + batch proof)
  6. Solana program: verify proof + update roots
  7. DA publishing + batch hash anchoring
  8. Wallet scanner (decrypt outputs, track nullifiers)
  9. Committee sequencing (M-of-N approvals)
  10. Encrypted mempool (threshold) + relayers + batching

One-sentence summary

Fastest full-privacy Solana rollup = client-side private execution (with prover layer) + ZK validity proof batches + Solana root verification + decentralized sequencer committee + encrypted mempool (decrypt-after-ordering) + DA anchored by batch commitments + wallets that scan/decrypt outputs and track nullifiers.