Skip to main content

Architecture Overview

Shroud Network consists of three layers that work together to provide privacy.

System layers​

┌──────────────────────────────────────────────────────────┐
│ Client SDK (TypeScript) │
│ Note management, proof generation, encrypted memos │
├──────────────────────────────────────────────────────────┤
│ ZK Circuits (Circom 2.x) │
│ Transfer circuit, withdraw circuit, Groth16 proofs │
├──────────────────────────────────────────────────────────┤
│ Smart Contracts (Solidity/EVM) │
│ ShieldedPool, Merkle tree, nullifier registry, verifier │
└──────────────────────────────────────────────────────────┘
│
Avalanche C-Chain (Fuji Testnet)

1. Smart Contracts​

On-chain logic that manages the shielded pool:

  • ShieldedPool — deposits, transfers, withdrawals, commitment Merkle tree, nullifier registry
  • Groth16Verifier — verifies ZK proofs on-chain using BN254 precompiles
  • MetaTxRelayer — gasless deposits and withdrawals via EIP-712 signed meta-transactions
  • Poseidon — on-chain hash function matching circuit parameters

2. ZK Circuits​

Circom 2.x circuits define what the prover demonstrates:

  • PrivateTransfer — proves a valid transfer without revealing amounts or parties (~25K constraints)
  • PrivateWithdraw — proves a valid withdrawal without linking to the depositor (~21K constraints)

3. Client SDK​

TypeScript library that runs in the browser:

  • Baby Jubjub keypair management
  • Note creation, encryption, and local storage
  • Merkle tree synchronization from on-chain events
  • Groth16 proof generation via snarkjs (WASM)
  • Transaction construction and relay integration

Data flow​

Deposit​

User → approve ERC20 → deposit(amount, commitment) → Merkle tree updated

Private transfer​

User → generate proof locally → submit(proof, nullifier, 2 new commitments) → verify on-chain

Withdrawal​

User → generate proof locally → submit(proof, nullifier, amount, recipient) → ERC20 released

Privacy model​

What's privateWhat's public
Transfer amountsDeposit amounts (ERC20 transfer is visible)
Sender identityWithdrawal amounts (ERC20 release is visible)
Receiver identityTotal pool balance
Account balancesNumber of commitments in the tree
Transfer graphNullifiers (but unlinkable to notes without the secret)