Architecture
Murena brings usable privacy to Solana via three core pieces:
1. Shielded Pool Program
Holds encrypted commitments (notes) and tracks nullifiers to prevent double-spends.
2. Relayer Network
Broadcasts transactions and pays fees so the sender's wallet isn't doxxed by fee-payer linkage.
3. Selective Disclosure
Optional proofs (view keys / negative-set attestations / payment receipts) so users can prove properties without revealing their graph.
High-level diagram
flowchart LR U[User Wallet] -->|commitments + proof| P[Shielded Pool Program] R[Relayer] -->|broadcast + priority fees| S[(Solana)] P -->|events| S U -->|optional view key / proofs| C[Counterparty / Auditor]
Data model (simplified)
- Commitment (Note): C = Commit(pk_recipient, value, blinding, memo_hash)
- Nullifier: N = Hash(sk_spend, note_id) (one-time; marks a note as spent)
- Merkle root: latest tree root of all commitments (used in proofs)
- Viewing key: read-only key for selective disclosure
Transaction flow (spend)
- Wallet picks input notes and constructs outputs (recipient + change).
- Wallet generates a zk proof:
- Inputs exist in tree, not previously spent
- Sum(inputs) = Sum(outputs)
- Correct ownership (knows sk_spend)
- Wallet submits {proof, publicSignals, outputs} to Relayer.
- Program verifies proof, stores nullifiers, appends outputs.
Privacy hardening: amount padding, randomized submission delays (user opt-in), batching via relayers.