零知识证明:从理论到实践 零知识证明(Zero-Knowledge Proof, ZKP)是密码学的重要分支,允许一方证明某个陈述的真实性,而无需泄露任何额外信息。 基本概念 定义 零知识证明满足三个性质: 完备性:如果陈述为真,诚实的证明者能说服验证者 可靠性:如果陈述为假,作弊的证明者无法说服验证者 零知识性:验证者只学到陈述为真,没有其他信息 经典案例:Ali Baba洞穴 证明者知道魔法词开门,向验证者证明知道密码但不泄露密码本身。
零知识证明(Zero-Knowledge Proof, ZKP)是密码学的重要分支,允许一方证明某个陈述的真实性,而无需泄露任何额外信息。
零知识证明满足三个性质:
A入口 | ===P=== / \ / \ B路径 C路径 \ / \ / ===Q=== | D出口
证明者知道魔法词开门,向验证者证明知道密码但不泄露密码本身。
将计算转化为算术电路:
输入 x = 5 输出 y = x^3 + 2x + 1 电路: [x] | [*] x / \ [x] [x] \ / [+] | [*] 2 | [+] 1 | [y]
将电路转换为多项式约束:
目标:存在多项式A, B, C满足 A(s) * B(s) = C(s) * H(s) * Z(s) 其中Z(s)是目标多项式 H(s)是商多项式
CRS生成(Common Reference String): 1. 生成随机数τ(toxic waste) 2. 计算公开参数:{τ, τ^2, τ^3, ..., τ^d} 3. 销毁τ(确保无法伪造证明) 要求:至少有一个参与者诚实销毁τ
递归编码压缩: 原始数据 → Reed-Solomon编码 → 采样 → 再编码 → 再采样 → ... → 小证明
链下: 1. 聚合1000笔交易 2. 计算新状态根 3. 生成ZK证明 4. 发布数据和证明 链上: 验证证明,更新状态根 成本:单笔交易成本降低100倍
// 证明年龄≥18而不透露生日 contract AgeVerifier { function verifyAge( bytes proof, uint256 commitment ) public { require( zkVerify(proof, commitment), "Invalid proof" ); } }
// 定义电路 template Multiplier() { signal input a; signal input b; signal output c; c <== a * b; } component main = Multiplier();
# 编译电路 circom multiplier.circom --r1cs --wasm # 生成见证 snarkjs calculatewasm multiplier.wasm input.json witness.wtns # 生成证明 snarkjs groth16 prove circuit_final.zkey witness.wtns proof.json public.json # 验证证明 snarkjs groth16 verify verification_key.json public.json proof.json
零知识证明正在重塑区块链隐私层和可验证计算的未来。