目录
日期 : 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 主题 核心收获 223 Circom 入门 signal/template/<== 心智模型 224 Merkle Proof DualMux + Poseidon, 4.4k 约束 225 Range Proof bit decomposition + boolean constraint 226 snarkjs 端到端 ptau → zkey → prove → Solidity verify 227 Tornado 重构 nullifier 范式 + relayer + ~360k gas 228 Noir 类型系统 + ACIR + UltraPlonk 229 Halo2 列模型 + custom gate + lookup
主流 ZK DSL 全景对比
表 1:DSL 维度
DSL 维护者 灵感 风格 Backend 状态 Circom iden3 (Jordi Baylina) 数学 R1CS 信号导向 snarkjs (Groth16/PLONK) 生产成熟 Noir Aztec Labs Rust 命令式 Barretenberg (UltraPlonk) 生产 (Aztec mainnet) Halo2 Zcash + PSE PLONK paper 表格/列 IPA / KZG 生产 (Zcash, Scroll) Plonky2 Polygon Zero recursion-first 列+lookup FRI + Goldilocks 生产 (Polygon zkEVM) Cairo StarkWare Lisp + Rust VM-style STARK 生产 (StarkNet) Leo Aleo Rust 隐私第一 Marlin 生产 (Aleo) o1js Mina TypeScript 函数式 Kimchi PLONK 生产 (Mina) zkLLVM =nil; Foundation C++/LLVM IR LLVM-based PLACEHOLDER beta PIL / Powdr Polygon Hermez rust-like row-based PLONK beta
表 2:性能与开发体验
DSL 学习曲线 类型安全 Debugger 标准库 中文资料 Circom 中(量子约束概念) 弱(单 felt) sym trace circomlib(成熟) 多 Noir 缓 强(u8/u32/Field) nargo SSA std::hash, std::ec 中等 Halo2 陡 强(Rust) CircuitLayout 可视化 gadgets crate 少 Plonky2 陡 强 弱 自带 少 Cairo 中 强(v1.0+) LSP corelib 多
表 3:约束效率(同样的 Merkle proof depth-20)
DSL 约束/行数 Prove 时间 Proof size Verify gas Circom + Groth16 ~4400 1.2 sec 800 B 230k Noir + UltraPlonk ~4400 1.0 sec 2.1 KB 300k Halo2 + KZG ~4400 rows 1.5 sec 5 KB 500k Plonky2 + FRI ~4400 rows 0.5 sec ~30 KB 不直接上 ETH Cairo + STARK trace cells 2 sec ~50 KB 不直接上 ETH
Backend / Proof System 对比
Backend Prove Verify Setup Recursion Field 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 Cash Circom + Groth16 ~25k 浏览器(10 sec) 隐私混币 Aztec Connect Noir + UltraPlonk ~30M 服务器集群 隐私 DeFi Scroll zkEVM Halo2 + KZG ~100M / batch RTX 4090(5-10 min) EVM-equiv L2 Polygon zkEVM Plonky2 + 包装 巨大(recursive) 集群 EVM-equiv L2 StarkNet Cairo + STARK trace ~10^7 cells SHARP(共享 prover) 通用 zk-Rollup Risc Zero zkVM + STARK trace ~10^7 cells Bonsai(云端) 通用计算 Mina o1js + Kimchi recursive 浏览器(递归压缩) 22 KB blockchain
DSL 命令对比速查
操作 Circom Noir Halo2 编译 circom x.circom --r1cs --wasmnargo compilecargo build --release测试 (手动) nargo testcargo test (MockProver)witness node generate_witness.jsnargo executesynthesize()prove snarkjs groth16 provenargo provecreate_proof::<...>()verify snarkjs groth16 verifynargo verifyverify_proof::<...>()Solidity snarkjs 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
我能不能在 30 分钟内从零写一个 Circom 电路?✓
我能不能解释 <== 和 <-- 的差别?✓
我能不能列出 Tornado Cash 的全部安全约束?✓
我能不能在 Halo2 中写一个 custom gate?✓
我能不能向同事解释 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)
面试题
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。
Q: 为什么 zkSync Era 早期用 Plonky2,后来引入 Halo2?
A: Plonky2 用 Goldilocks field,proof 不能直接被 EVM verify,要包一层 Groth16/Halo2-KZG 才能上 L1。所以最终都需要某种 EVM-friendly 终态 proof。
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 场景。