Skip to main content

Security Model

Platus enforces guarantees in three layers:

  • C: ZK circuit (packages/noir)
  • K: Smart contract (packages/contracts)
  • S: SDK pre-submission (packages/sdk)

Properties held only in S are convenience, safety-critical properties are in C and/or K.

Actors

PartyTrust Model
User device, contracts, UltraHonkHonest — key never exfiltrated, immutable code
Bundler, indexer/RPCUntrusted — can censor or reorder, cannot violate safety
Chain observer, batch peers, quantum adversaryActive — see all data, harvest ciphertexts

Properties

#Property(C/K/S)Mechanism
1Value conservationC + KPedersen commitments + binding Schnorr over aggregated blinding factors
2Spend authorityCIn-circuit Schnorr on rerandomized key rk = ak + α·G
3No double-spendC + KNullifiers nf = H(nk, ρ, ψ, cm); spent-set + transient dedup
4No intra-Action inflationCnf1 ≠ nf2 + 129-bit range checks
5Faerie-Gold resistanceCcm binds nf; rho-chaining (ρ_new = nf_old)
6Membership soundnessC + KDepth-16 Merkle proof + rootHistory anchor
7Recipient unlinkabilityC + SStealth addresses, fresh esk, view tags
8Batch isolationKGas-capped per-action execution; per-bundle settlement
9Refund integrityKPre-execution balance snapshots (F1)
10Aggregator soundnessC + KVK pinning: ACTION_VK_HASH, RECURSIVE_2_LEAF_VK_HASH, RECURSIVE_2_INNER_VK_HASH
11Post-quantum confidentialitySML-KEM-768 hybrid encryption

Key Mechanisms

Binding signature. The contract reconstructs bvk = Σ cv_net,i − netPublicValue·H and verifies the bundler's Schnorr signature, proving value balance without revealing amounts. Per-bundle asset uniformity prevents cross-asset minting.

Spend authorization. The Schnorr check on rk happens in-circuit, with challenge e bound to authCtx (chainId, orchestrator, deadline, asset, etc.) via publicsDigest. No per-Action on-chain signature needed.

Nullifier defense. nf = H(nk, ρ, ψ, cm) binds to the specific note. Circuit enforces nf1 ≠ nf2 and cm1 ≠ cm2 (via rho-chaining). Cross-transaction dedup on-chain; transient dedup in-bundle.

Refund integrity (F1). Pre-execution snapshots ensure only balanceOf − snapshot (this bundle's deposit) can be swept to refundTarget, protecting foreign AppAccount balances even when enableSpends=false.

VK pinning. Each recursion layer asserts child key_hash matches pinned VKs; finalize constrains root to {leaf, inner} set. Contract passes pinned hashes as public inputs.

Post-quantum. Hybrid ECDH + ML-KEM-768 via HKDF. Ciphertexts harvest-now-decrypt-later resistant; spend authority (Schnorr) not yet PQ-secure.

Residual Risks

  • View-tag grief: Corrupt hint forces full decapsulation scan (note recoverable)
  • Censorship: Mitigated by multiple bundlers, self-submission, rootHistory window
  • Stranded assets: Non-refundAssets tokens sent to Orchestrator are unrecoverable
  • Fee-on-transfer tokens: Revert on Vault.pull exact-balance check