ParaloomPARALOOM

Security

Trust assumptions, what's enforced where, audit status, and how to report issues.

Security

Paraloom's security model is layered: the on-chain Anchor program is the trust anchor, Groth16 over BLS12-381 enforces shielded-pool soundness, and a BFT cohort with on-chain stake keeps liveness and finality fast. Each layer's compromise is bounded by the layers below it.

What enforces what

Enforced byIf compromised, attacker can
Nullifier uniquenessOn-chain PDA (init fails if exists)nothing — even a 10/10 malicious cohort can't double-spend
Withdrawal proof validityOn-chain Groth16 verificationnothing — chain re-verifies every proof
Replay preventionOn-chain expiration_slot checknothing — leaked proofs expire
Merkle root authenticityAuthority-signed update + on-chain storagemint commitments out-of-set (requires authority key)
Withdrawal livenessBFT cohortdelay or refuse withdrawals — not forge them
Validator stake / slashingOn-chain ValidatorAccount PDAnothing — economic penalty enforced on-chain

The pattern: safety lives on-chain, throughput lives off-chain. This is what makes paraloom a Layer 2 rather than a sidechain.

Trust assumptions

Cryptographic

AssumptionSource
Poseidon hash is collision-resistant (≈128-bit)Standard Sapling parameters (full 8 / partial 57, α=5)
Groth16 is sound under q-PKE / q-SDH on BLS12-381Established literature
BLS12-381 discrete log is hard (≈128-bit)Curve choice
At least one MPC ceremony participant is honestBGM17 phase-2 ceremony, public transcript

Operational

Assumption
At most 3-of-10 validators simultaneously maliciousBFT threshold; reputation gating + slashing make this expensive
Solana livenessStandard Solana L1 assumption
Anchor program integritySource published, deployed at fixed program ID, upgrade authority documented
Coordinator (HA primary)Doesn't need to be trusted for safety; only for liveness — failover < 30 s

Threat model

Mitigated

  • Double-spend: nullifier PDAs (on-chain init-or-fail). Cohort attacks can't bypass.
  • Value forgery: in-circuit u64 range proofs (#60) prevent field-arithmetic wrap attacks.
  • Replay: withdrawal proofs carry expiration_slot (#61); on-chain rejects expired txs.
  • Equivocation by validators: cryptographic evidence catalog → on-chain slashing.
  • Persistent unavailability: missed-heartbeat evidence → on-chain slashing.
  • Coordinator crash (liveness): active/passive HA failover.
  • Supply-chain compromise of releases: keyless Sigstore signatures bound to GitHub Actions OIDC (#70).

Not in scope (and how to mitigate at the application layer)

ConcernMitigation
Network metadata (IP, timing)Tor / VPN at submission time
Off-chain identity correlation (KYC at on-ramp before deposit)Outside paraloom's threat model
Statistical fingerprinting (unique amounts, predictable cadence)Use round denominations, vary timing
Endpoint compromise (your machine)Hardware wallets for keys; encrypt note storage
Front-running of public Solana txs around the privacy boundaryApplication-level intent layers; outside the privacy primitive

Privacy boundary

What's hidden:

  • Sender, recipient, amount of in-pool transfers
  • Link between deposit and withdrawal

What's necessarily visible:

  • Deposits enter the pool publicly (sender + amount on-chain)
  • Withdrawals leave publicly (recipient + amount on-chain)
  • Nullifier set (membership only — unlinkable to commitments)
  • Merkle root updates

Privacy is between deposit and withdrawal, not at the edges.

Trusted setup

The Groth16 system requires a per-circuit trusted setup. Paraloom uses the BGM17 phase-2 ceremony with the following discipline:

Phase 1Powers-of-tau ceremony (industry-standard, reused)
Phase 2Per-circuit, multi-contributor ceremony
Honesty barOne honest participant suffices for soundness
VerifiabilityFull transcript chain published; anyone can re-verify
Toolingparaloom-ceremony-contribute / verify / finalize

Devnet uses locally generated keys for development convenience. Mainnet is gated on a real ceremony with verified transcripts. Tracked in #64. See Ceremony for the contribution workflow.

Audit status

Status
Privacy circuitsinternal review
Anchor program (programs/paraloom/)internal review
BFT cohort + slashing logicinternal review
Networking + DHT discoveryinternal review
External auditplanned before mainnet — not yet commissioned
Formal verificationnot in scope for v0.5.0

External audit is a hard prerequisite for mainnet, alongside the MPC ceremony. The order is: audit → ceremony → mainnet activation.

Known limitations

These are public on purpose:

  1. No external audit yet. Internal review only. Don't move real-value funds on devnet.
  2. Compute layer is alpha. The output-notes path back into the shielded pool isn't wired; treat as experimental.
  3. No formal verification of circuits or program logic. Test coverage (407 tests) catches a lot but isn't a substitute.
  4. Single implementation. There's no second client to cross-check consensus or bridge behaviour.
  5. Limited fuzz coverage at the codec / proof boundary; this is on the pre-mainnet TODO.
  6. Devnet-only proving keys by default. Sending mainnet keys to devnet code (or vice versa) is a footgun the SDK will eventually guard against.

Validator operational security

Key fileschmod 600 for validator.key and validator-wallet.json
Backupsoffline copy of wallet keypair; the staked SOL depends on it
Time syncNTP — slot-based heartbeats break under large drift
FirewallTCP/9001 inbound from anywhere; TCP/9300 (metrics) only from your monitoring net
Monitoringwatch paraloom_proof_verify_seconds, paraloom_consensus_round_total, times_slashed
Graceful exitparaloom validator unregister before extended downtime — avoids unavailability slashing

See Validator guide for the full setup.

User security

Notes are bearer instrumentsanyone with the secret can spend the commitment
Backupsshielded notes are unrecoverable if lost — back them up encrypted
Hardware walletrecommended for the public wallet that owns the deposit/withdrawal addresses
Fresh addressesdon't reuse the same withdrawal address across many withdrawals
Round amountsunusual amounts narrow the anonymity set — prefer common denominations

The CLI writes notes with restricted permissions; if you build your own client, replicate that.

Reporting vulnerabilities

Please do not open public GitHub issues for security-sensitive findings.

Report privately to security@paraloom.network, or via GitHub's private vulnerability reporting on paraloom-labs/paraloom-core.

Include: clear description, reproduction steps, impact assessment, and (if you have one) a proposed fix. We'll acknowledge within a reasonable window and coordinate disclosure timing with you.

A formal bug bounty program will launch alongside the external audit. Until then, responsible disclosure is welcomed and credited.

Pre-mainnet security checklist

  • BGM17 phase-2 MPC ceremony executed end-to-end (#64)
  • External audit of circuits + Anchor program + BFT path
  • Compute layer output-notes integrated with shielded pool
  • Fuzz coverage on proof / codec boundary
  • Bug bounty program live
  • Decentralized validator set on devnet (multi-operator) before mainnet activation

This list is the gate. None of these are checked off yet.

On this page