返回 Expert 笔记
Expert Day 230

Week 34 复习 — ZK 工具链对比

系统对比当前主流 ZK DSL(Circom/Noir/Halo2/Plonky2/Cairo)和 backend

2026-12-17
Phase 4 - ZK电路开发实战 (Day 223-243)
ZKDSL-comparisontoolchainreview

日期: 2026-12-17 方向: ZK工程 / 电路开发 阶段: Phase 4 - ZK电路开发实战 (Day 223-243) 标签: #ZK #DSL-comparison #toolchain #review


今日目标

类型内容
学习系统对比当前主流 ZK DSL(Circom/Noir/Halo2/Plonky2/Cairo)和 backend
实操整理 dsl_compare.md,作为日后选型参考
产出对比表 + 选型决策树 + Week 34 总结

本周 (Day 223-229) 学习回顾

Day主题核心收获
223Circom 入门signal/template/<== 心智模型
224Merkle ProofDualMux + Poseidon, 4.4k 约束
225Range Proofbit decomposition + boolean constraint
226snarkjs 端到端ptau → zkey → prove → Solidity verify
227Tornado 重构nullifier 范式 + relayer + ~360k gas
228Noir类型系统 + ACIR + UltraPlonk
229Halo2列模型 + custom gate + lookup

主流 ZK DSL 全景对比

表 1:DSL 维度

DSL维护者灵感风格Backend状态
Circomiden3 (Jordi Baylina)数学 R1CS信号导向snarkjs (Groth16/PLONK)生产成熟
NoirAztec LabsRust命令式Barretenberg (UltraPlonk)生产 (Aztec mainnet)
Halo2Zcash + PSEPLONK paper表格/列IPA / KZG生产 (Zcash, Scroll)
Plonky2Polygon Zerorecursion-first列+lookupFRI + Goldilocks生产 (Polygon zkEVM)
CairoStarkWareLisp + RustVM-styleSTARK生产 (StarkNet)
LeoAleoRust隐私第一Marlin生产 (Aleo)
o1jsMinaTypeScript函数式Kimchi PLONK生产 (Mina)
zkLLVM=nil; FoundationC++/LLVM IRLLVM-basedPLACEHOLDERbeta
PIL / PowdrPolygon Hermezrust-likerow-basedPLONKbeta

表 2:性能与开发体验

DSL学习曲线类型安全Debugger标准库中文资料
Circom中(量子约束概念)弱(单 felt)sym tracecircomlib(成熟)
Noir强(u8/u32/Field)nargo SSAstd::hash, std::ec中等
Halo2强(Rust)CircuitLayout 可视化gadgets crate
Plonky2自带
Cairo强(v1.0+)LSPcorelib

表 3:约束效率(同样的 Merkle proof depth-20)

DSL约束/行数Prove 时间Proof sizeVerify gas
Circom + Groth16~44001.2 sec800 B230k
Noir + UltraPlonk~44001.0 sec2.1 KB300k
Halo2 + KZG~4400 rows1.5 sec5 KB500k
Plonky2 + FRI~4400 rows0.5 sec~30 KB不直接上 ETH
Cairo + STARKtrace cells2 sec~50 KB不直接上 ETH

Backend / Proof System 对比

BackendProveVerifySetupRecursionField
Groth16中等极快 (3 pairing)per-circuit MPC困难bn128
PLONK / KZG中等快 (~5 pairing)universal SRS中等bn128
PLONK / IPA慢 (log-time)容易(Halo)pasta
STARK / FRI中等 (log-time)容易Goldilocks
Bulletproofs中等慢 (linear)困难secp

选型决策树 / Selection Decision Tree

你要做什么?

├── 上 EVM 链验证(最低 gas)
│    ├── circuit < 1M 约束 → Circom + Groth16
│    └── circuit > 1M 或要 recursion → Halo2 + KZG (PSE fork)
│
├── L2 / Rollup
│    ├── EVM-equivalent → Halo2 (Scroll) / Plonky2 (Polygon zkEVM)
│    └── 隐私 L2 → Noir + Aztec
│
├── zkApp / standalone
│    ├── 要类型安全 → Noir
│    ├── 要 zkML → Halo2 (EZKL) / Risc Zero
│    └── 入门最快 → Circom
│
├── zkVM
│    ├── EVM trace → Halo2 / Plonky2
│    └── 通用 RISC-V → Risc Zero / SP1
│
└── 跨链 light client / zkBridge → Plonky2 / SP1 (recursion 友好)

DSL 关键差异举例(同一个「prove sum of array」)

Circom

template Sum(N) {
    signal input arr[N];
    signal input total;
    var sum = 0;
    for (var i = 0; i < N; i++) sum += arr[i];
    sum === total;
}

Noir

fn main(arr: [Field; 8], total: pub Field) {
    let mut sum: Field = 0;
    for i in 0..8 {
        sum += arr[i];
    }
    assert(sum == total);
}

Halo2 (简化伪代码)

// 配置 sum 列 + 一个 selector
meta.create_gate("sum_step", |meta| {
    let s = meta.query_selector(s_sum);
    let prev = meta.query_advice(sum_col, Rotation::prev());
    let cur  = meta.query_advice(sum_col, Rotation::cur());
    let val  = meta.query_advice(arr_col, Rotation::cur());
    vec![s * (cur - prev - val)]
});
// 然后在 synthesize 中赋值 N 行

可以看出:Circom 最像数学,Noir 最像普通编程,Halo2 最贴近底层(但最灵活)。


学习路径建议 / Learning Path

入门路径(最短)

Week 1: Circom 入门 → 写「知道密码」「Merkle proof」
Week 2: snarkjs 端到端 → Solidity verifier
Week 3: 重构 Tornado Cash → 理解 commitment-nullifier 范式
Week 4: Noir → 看类型系统怎么帮助
Week 5: Halo2 → 看列模型与生产 zkEVM 的距离

深入路径

Month 2: Plonky2 + recursion → 写一个 IVC 例子
Month 3: zkVM (Risc Zero / SP1) → 把现成 Rust 程序变 ZK proof
Month 4: zkML (EZKL) → ML 模型上链
Month 5: Audit → 读 3 份 ZK audit report

真实工程数据(生产 ZK 应用)

项目DSL/Backend约束/规模Prove 硬件场景
Tornado CashCircom + Groth16~25k浏览器(10 sec)隐私混币
Aztec ConnectNoir + UltraPlonk~30M服务器集群隐私 DeFi
Scroll zkEVMHalo2 + KZG~100M / batchRTX 4090(5-10 min)EVM-equiv L2
Polygon zkEVMPlonky2 + 包装巨大(recursive)集群EVM-equiv L2
StarkNetCairo + STARKtrace ~10^7 cellsSHARP(共享 prover)通用 zk-Rollup
Risc ZerozkVM + STARKtrace ~10^7 cellsBonsai(云端)通用计算
Minao1js + Kimchirecursive浏览器(递归压缩)22 KB blockchain

DSL 命令对比速查

操作CircomNoirHalo2
编译circom x.circom --r1cs --wasmnargo compilecargo build --release
测试(手动)nargo testcargo test (MockProver)
witnessnode generate_witness.jsnargo executesynthesize()
provesnarkjs groth16 provenargo provecreate_proof::<...>()
verifysnarkjs groth16 verifynargo verifyverify_proof::<...>()
Soliditysnarkjs zkey export soliditverifiernargo codegen-verifiersolidity::write::<...>()

常见误区 / Common Pitfalls

误区真相
ZK = 隐私ZK 主要是 succinctness(小 proof),隐私是其中一种应用
ZK proof 总是小只有 SNARK;STARK proof 可能 50+ KB
Trusted setup = 不安全MPC ceremony 只要 1 人诚实就安全;Tornado 1100 人
Halo2 总比 Circom 好Halo2 学习成本高 5×;小项目 Circom 更快
Recursion 是黑魔法Plonky2/Halo2 已有标准 API;难点在 cycle of curves

Week 34 复盘问题 / Weekly Reflection

  1. 我能不能在 30 分钟内从零写一个 Circom 电路?✓
  2. 我能不能解释 <==<-- 的差别?✓
  3. 我能不能列出 Tornado Cash 的全部安全约束?✓
  4. 我能不能在 Halo2 中写一个 custom gate?✓
  5. 我能不能向同事解释 Noir 与 Circom 的差别?✓

关键速查(合集)

# Circom
circom c.circom --r1cs --wasm --sym -o build/
snarkjs powersoftau new bn128 14 ...
snarkjs groth16 setup ... && prove ... && verify ...

# Noir
nargo new x && cd x && nargo prove && nargo verify

# Halo2 (Rust)
cargo run --release  # 用 MockProver

# 通用对比
Groth16:    proof 800 B   verify 230k gas
PLONK/KZG:  proof 1-5 KB  verify 300-500k gas
STARK:      proof 30 KB+  verify 不直接上 ETH(需 wrap)

面试题

  1. Q: 给一个新项目(DeFi 协议要做隐私交易),你会选什么 ZK DSL?为什么? A: 看 (a) 需要 EVM 兼容否:是 → Noir + Aztec 或 Halo2/KZG;否 → Cairo/Plonky2;(b) 团队语言:Rust 强 → Halo2/Noir;JS 强 → Circom;(c) 性能:>10M 约束 → Halo2/Plonky2,< 1M → Circom。

  2. Q: 为什么 zkSync Era 早期用 Plonky2,后来引入 Halo2? A: Plonky2 用 Goldilocks field,proof 不能直接被 EVM verify,要包一层 Groth16/Halo2-KZG 才能上 L1。所以最终都需要某种 EVM-friendly 终态 proof。

  3. Q: ZK DSL 的「universal setup」和「per-circuit setup」差别? A: Groth16 是 per-circuit:每个电路要重新 trusted setup。PLONK 是 universal:一次 SRS 服务所有电路(只要约束数 ≤ SRS 大小)。所以 PLONK 系统更适合频繁迭代的项目。


明日预告

Day 231 — ZK 应用:身份。Semaphore、World ID、Sismo——把 ZK 用到 anonymous identity / proof of personhood 场景。