零知识证明(ZKP)是一种密码学协议,它允许证明者(Prover)向验证者(Verifier)证明某个陈述是真实的,而无需向验证者透露任何关于该陈述本身的额外信息。其核心特性可概括为三点:完备性(诚实的证明者能让验证者确信)、可靠性(不诚实的证明者无法欺骗验证者)和零知识性(验证过程不会泄露任何秘密信息)。根据验证的交互方式和密码学假设,ZKP协议主要分为交互式和非交互式两大类,并衍生出SNARK和STARK等现代高效协议。

协议类型 核心特点 代表协议 主要优缺点
交互式零知识证明 证明者与验证者进行多轮挑战-响应交互。 Σ-协议 (Schnorr, Fiat-Shamir等) 优点:概念直观,通常基于标准数论假设(如离散对数)。缺点:需要多轮通信,验证效率较低。
非交互式零知识证明 证明者生成单一证明,验证者可随时独立验证。 zk-SNARK (Groth16, PLONK), zk-STARK 优点:证明简短,验证极快,适合区块链等场景。缺点:通常需要可信设置(Groth16)或依赖更复杂的数学工具。

1. 经典交互式协议:Schnorr身份认证协议

Schnorr协议是基于离散对数问题的交互式ZKP经典示例,常用于身份认证。它证明了证明者知道一个私钥 x(对应公钥 Y = g^x),而无需泄露 x

# 简化版Schnorr协议交互流程(使用椭圆曲线群,此处为示意)
# 公共参数:生成元G,阶为q的群。
# 证明者私钥:x, 公钥:Y = x * G

# 步骤1: 证明者生成随机数r,计算临时承诺 R = r * G
import random
q = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 # 示例,secp256k1的阶
x = random.randint(1, q-1) # 私钥
r = random.randint(1, q-1) # 随机数
G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
     0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8) # 示例,secp256k1生成元
# 假设有椭圆曲线点乘运算 scalar_mult(point, scalar)
R = scalar_mult(G, r)

# 步骤2: 验证者发送随机挑战 c
c = random.randint(1, q-1)

# 步骤3: 证明者计算响应 s = r + c * x mod q
s = (r + c * x) % q

# 步骤4: 验证者检查 s * G == R + c * Y 是否成立
Y = scalar_mult(G, x)
left_side = scalar_mult(G, s)
right_side = point_add(R, scalar_mult(Y, c)) # 假设有椭圆曲线点加运算 point_add
assert left_side == right_side # 验证通过

此协议中,R是承诺,c是挑战,s是响应。零知识性体现在:验证者看到的 (R, s) 对于不同的挑战 c 可以模拟生成,不包含 x 的信息。完备性由等式 s*G = r*G + c*x*G = R + c*Y 保证。可靠性基于离散对数问题的困难性:如果证明者能对两个不同的挑战 cc' 给出有效响应 ss',则可计算出私钥 x = (s - s')/(c - c') mod q

2. 现代非交互式协议:zk-SNARK (以Groth16为例)

zk-SNARK(简洁非交互式零知识知识论证)是目前区块链隐私扩容(如ZK-Rollup)和可验证计算的核心技术。它将计算问题转化为算术电路,再表示为R1CS(Rank-1 Constraint System)或QAP(Quadratic Arithmetic Program)等约束系统。Groth16是其中最著名且最高效的方案之一。

其核心流程分为三个阶段:

  1. 可信设置(Trusted Setup):为特定电路生成证明密钥(pk)和验证密钥(vk)。这个过程依赖于“有毒废物”,必须安全地丢弃,否则可能危及系统安全。实践中常通过多方计算(MPC)仪式来分散信任,例如使用snarkjs进行的powers of tau仪式。
  2. 证明生成(Proving):证明者使用私密输入(witness)、公开输入(statement)和证明密钥 pk,运行证明算法生成一个简短的证明 π
  3. 验证(Verification):验证者使用公开输入、验证密钥 vk 和证明 π,运行验证算法,输出接受或拒绝。
// 使用snarkjs库进行Groth16证明的简化示例(Node.js环境)
const snarkjs = require("snarkjs");
const fs = require("fs");

async function runGroth16() {
    // 1. 加载可信设置生成的密钥对(通常来自powers of tau仪式和电路专用zkey生成)
    const vkey = JSON.parse(fs.readFileSync("verification_key.json"));
    const zkey = "circuit_final.zkey"; // 证明密钥

    // 2. 定义公开输入和私密见证(例如,证明我知道一个数x,使得x^3 + x + 5 == 35)
    const input = {
        "in": "35", // 公开输入:承诺的输出值
        "x": "3"    // 私密见证:我知道x=3能满足方程 (3^3 + 3 + 5 = 35)
    };

    // 3. 生成证明
    const { proof, publicSignals } = await snarkjs.groth16.fullProve(input, "circuit.wasm", zkey);
    console.log("Proof generated:", proof);

    // 4. 验证证明
    const isValid = await snarkjs.groth16.verify(vkey, publicSignals, proof);
    console.log("Verification result:", isValid); // 应输出 true
}

runGroth16().catch(console.error);

Groth16的证明非常简短(仅三个椭圆曲线点),验证成本极低(仅需几次配对运算),但其主要限制是需要为每个电路进行一次性的可信设置。

3. 另一类现代协议:zk-STARK

zk-STARK(简洁透明零知识论证)是另一类重要的非交互式ZKP。与SNARK相比,其核心优势是透明性(无需可信设置)和后量子安全潜力(依赖哈希函数和默克尔树,而非椭圆曲线配对等代数结构)。其缺点是证明尺寸较大(通常数十到数百KB),验证时间也相对较长。

STARK的核心技术栈包括:

  • 算术化:将计算转换为多项式约束系统(如AIR,代数中间表示)。
  • 低度测试:使用FRI(快速里德-所罗门近距离证明)协议来证明多项式的低次数。
  • 多项式承诺:使用基于哈希的默克尔承诺(如Merkle Tree)来绑定多项式。
# zk-STARK(如RISC Zero zkVM)工作流程示意
流程:
  1. 执行追踪: 在zkVM(如RISC-V虚拟机)中运行程序,生成详细的执行踪迹(execution trace)。
  2. 约束生成: 将执行踪迹转化为一系列多项式约束,确保踪迹的每一行都符合正确的计算规则。
  3. 证明生成: 
     a. 将约束多项式组合成一个低次复合多项式。
     b. 使用FRI协议证明该复合多项式是低次的。
     c. 构建所有相关多项式的默克尔承诺,并生成开放证明。
  4. 验证: 
     a. 验证者检查FRI证明,确信多项式是低次的。
     b. 根据默克尔承诺和随机挑战点,验证约束在随机点处成立。

STARK的透明性使其在无需信任第三方的场景中更具吸引力,例如RISC Zero zkVM通过生成计算的零知识证明,实现可验证的链下计算。

4. 应用场景与协议选择

零知识证明协议的选择取决于具体应用需求:

应用场景 推荐协议类型 理由
区块链隐私交易/支付 zk-SNARK (Groth16, PLONK) 证明尺寸极小(~200字节),验证Gas成本极低,适合链上验证。
身份认证与访问控制 交互式协议 (如Schnorr) 或 基于SNARK的匿名凭证 交互式协议简单直接;SNARK可实现复杂属性的匿名证明。
可验证计算/zkVM zk-STARK 或 递归SNARK STARK无需可信设置,适合通用虚拟机;递归SNARK可用于证明其他SNARK证明。
安全多方计算(MPC)辅助 高效NIZK (如Spartan, Bulletproofs) MPC中常需验证中间步骤的正确性,需要高效且无需可信设置的NIZK。
大规模数据完整性证明 zk-STARK 证明生成可高度并行化,且透明性对公开审计场景至关重要。

总结:零知识证明协议从基础的交互式挑战-响应模型,发展到如今高效的非交互式SNARK和透明的STARK。Groth16等SNARK协议凭借极简的证明和快速的验证,在区块链隐私与扩展领域占据主导,但其可信设置要求催生了复杂的多方计算仪式来分散风险。而STARK协议则通过消除可信设置和依赖更简单的密码学假设,为需要更高透明度和后量子安全考虑的场景提供了有力替代。理解这些协议的设计原理、权衡取舍是实现安全、高效隐私保护系统的关键。


参考来源

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐