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)

  1. Wallet picks input notes and constructs outputs (recipient + change).
  2. Wallet generates a zk proof:
    • Inputs exist in tree, not previously spent
    • Sum(inputs) = Sum(outputs)
    • Correct ownership (knows sk_spend)
  3. Wallet submits {proof, publicSignals, outputs} to Relayer.
  4. Program verifies proof, stores nullifiers, appends outputs.

Privacy hardening: amount padding, randomized submission delays (user opt-in), batching via relayers.