Rationale
Why an L3 on Base
shh settles to Base rather than living as a contract on an existing chain. That choice buys it dedicated block space, a privacy-native genesis, and Base's security — all without giving up Ethereum finality.
shh is an OP Stack rollup that settles its batches to Base (an Ethereum L2). Running as its own chain — rather than a set of contracts on Base — is what makes a privacy-first default UX practical.
Inherited security, dedicated space
- Settlement to Base inherits Base's security and, through it, Ethereum (L1) finality.
- Its own block space means privacy traffic isn't competing with unrelated congestion, and fees follow shh's own gas policy.
- Privacy-native predeploys and genesis let a profile make the shielded pool the default value path, instead of an app bolted onto a transparent chain.
Ethereum L1
│ (settlement of Base)
┌───┴────┐
│ Base │ L2 (OP Stack)
└───┬────┘
standard bridge │ shielded bridge
┌───┴────────────────────┐
│ shh (L3) │ OP Stack rollup,
│ settles batches to Base │ single sequencer
└──────────────────────────┘Single sequencer, by design (for now)
Locally, a single sequencer keeps the devnet deterministic and cheap — exactly what you want when reproducing zk proofs and Merkle roots while iterating. The same Docker images deploy against Base Sepolia or mainnet by swapping the L1 (settlement) endpoint and the operator keys; nothing about the privacy core changes.
Why not just a mixer contract?
A single privacy contract on a public chain can only ever be opt-in, and its anonymity set is fragmented across every other use of that chain's block space. An L3 lets shh treat privacy as the substrate: notes can be the canonical balance representation (Profile A), the bridge can deposit straight into the shielded set, and the genesis can ship the verifiers and hasher as predeploys. The trade-off is operating a chain — which the OP Stack tooling and this repo's infra/ make turn-key.
Continue to The two privacy profiles to see what each profile exposes by default.