零知识证明(ZKP)是一种密码学协议,允许证明者(Prover)向验证者(Verifier)证明某个命题为真,而无需泄露任何支持该命题的“秘密信息”(Witness)。
零知识证明不是直接对代码进行验证,而是需要将计算逻辑转化为数学约束。这个过程称为“算术化”。
用高级语言(如 Circom, Solidity, Rust)编写的程序逻辑。
将代码转化为算术电路或约束系统(如 R1CS)。
使用 QAP (SNARKs) 或 AIR (STARKs) 将约束转化为多项式问题。
使用椭圆曲线(KZG)或哈希函数(FRI)生成简洁的证明。
一种用来描述电路约束的数学格式。形式为 A * B = C。是生成 zk-SNARK 的常见中间步骤。
某些 ZK 系统(如 Groth16)在启动前需要生成公共参考串(CRS)。如果生成过程中的“有毒废料”未销毁,系统可被伪造证明。
一种基于椭圆曲线配对的多项式承诺方案。主要用于以太坊的 Proto-Danksharding 和 zk-SNARKs。
目前区块链领域最常用的两种 ZK 证明系统对比。
Succinct Non-Interactive Argument of Knowledge
仅几百字节,链上验证Gas费极低。
Groth16 等算法需要可信初始化(除了 Plonk/Halo2 等现代变体)。
依赖椭圆曲线离散对数问题,理论上可被量子计算机破解。
Scalable Transparent Argument of Knowledge
仅依赖公开的哈希函数,消除了后门风险。
不依赖椭圆曲线,基于哈希函数,安全性更高。
证明可达 40KB+,链上验证成本相对较高。
ZK-Rollup 将数千笔交易的执行挪到链下(L2),通过生成一个数学证明(Validity Proof)来向以太坊主网(L1)汇报状态。
收集用户交易,排序并打包成 Batch。执行交易并更新 L2 本地状态。
读取 Batch 数据,运行复杂的电路运算,生成 ZK 证明。这是最耗费计算资源的一步。
以太坊主网合约接收证明和新的状态根(State Root)。验证通过后,确认 L2 状态更新。
完全等效以太坊
不改变任何以太坊共识逻辑。生成证明最慢,但兼容性完美。
Ex: Taiko
EVM 等效
稍微修改 gas 费用或数据结构以优化 ZK 生成。应用层完全兼容。
Ex: Scroll, Polygon zkEVM
几乎 EVM 等效
移除难以 ZK 化的预编译合约。部分 DApp 可能需要重写。
Ex: Kakarot
高级语言等效
将 Solidity 编译为 ZK 友好的字节码。生成证明最快,但并不兼容 EVM 操作码。
Ex: zkSync Era, StarkNet
体验如何生成和验证零知识证明。
此数据作为 Witness,仅在本地计算,不上链。
Circuit Constraint:
template AgeCheck() {
signal input year;
signal input currentYear;
signal output isAdult;
// Constraint: age must be calculated correctly
var age = currentYear - year;
// Constraint: age >= 18
component ge = GreaterEqThan(8);
ge.in[0] <== age;
ge.in[1] <== 18;
isAdult <== ge.out;
}
智能合约确认用户满足年龄条件,但并未获取具体年份。
证明无效或逻辑校验失败。