零知识证明(ZKP)是什么?为什么能不透露信息也能证明 图 1
零知识证明(ZKP)是什么?为什么能不透露信息也能证明 · 图 1

结论先说

零知识证明(Zero-Knowledge Proof,ZKP)是一类密码学协议:证明者能让验证者确信某个陈述为真,而整个过程不透露”为真”以外的任何信息。它的价值在于把”请相信我”变成”你可以自己核验,但我不需要展示答案”。公链是这项技术最大的落地场景:L2 状态证明、隐私交易、身份合规验证背后都是它。

经典寓言:洞穴里的路

标准例子是这样的:圆形洞穴里有一扇只能用咒语打开的门,验证者 Bob 不知道咒语,证明者 Alice 声称知道。Bob 在洞口外面,Alice 走进任意一条路径后,Bob 随机要求她从”A 路出来”或”B 路出来”。如果 Alice 不知道咒语,每轮答对的概率只有一半;如果知道,她总能从 Bob 指定的方向出来。重复 20 轮后,不知道咒语的人蒙混过关的概率只剩五百万分之一。关键点:Bob 全程看不到咒语,甚至不知道 Alice 实际走了哪条路,他只观察到”她总能从指定方向出来”——验证完成了,信息却一点没泄露。

三个性质

形式化的零知识证明有三个性质。完备性:陈述为真且双方守规矩时,验证者一定会被说服。可靠性:陈述为假时,无论证明者多聪明,欺骗验证者的概率都极低。零知识性:验证者除了”陈述为真”学不到任何额外信息,即使验证者是恶意想套信息的也不行,他拿到的只是一串无意义的交互。现实里很多”验证”只满足前两条——比如出示身份证能证明身份,但也泄露了姓名——第三条才是 ZKP 的特殊之处,也是”零知识”三个字的含义。

从寓言到密码学

洞穴寓言是交互式思想实验,链上真正用的是非交互版本:证明者把要证明的陈述(例如”我知道某个公钥对应的私钥”或”状态 A 到状态 B 的转换是正确的”)编译成一组算术电路方程,然后生成一个很短的证明,通常只有几百字节;验证者执行一次固定的验证操作即可完成确认。整套技术的核心是”方程组有解”这件事可以被压缩成一个可验证的短对象,而解本身(即隐私信息)保持隐藏。这也是为什么 ZK 系统要分”证明生成”和”证明验证”两侧:前者算力密集,后者非常轻。

用在哪里

在公链与 L2 语境里主要有三类用途。一是 L2 状态证明:ZK Rollup 用证明担保状态转换正确,L1 合约直接接受新状态,不需要等挑战窗口。二是隐私场景:证明”余额充足”或”代币不在黑名单里”,而不暴露余额和地址本身。三是身份与合规:证明”已满 18 岁”或”已完成某种资质核验”,而不交出证件号。三类场景的信任结构不同,成本和风险也不同,选型时要分别评估。

边界与风险

第一,证明只和它的电路实现与密码学假设一样可靠:电路写错、底层数学假设被攻破,整个体系失效,这不是概率性风险而是实现质量风险。第二,证明生成昂贵,单条链的 prover 往往数量很少甚至默认由运营方承担,形成运营单点——它通常不是安全单点(恶意 prover 生成不了假证明),但 prover 故障会让链无法及时提交。第三,验证侧不是免费的,验证合约本身也需要审计,L1 上的验证合约被攻击同样是系统性风险。评估 ZK 项目时,重点看电路审计、证明系统的公开记录、prover 冗余设计,而不是”用了 ZK”这个标签。

小结

零知识证明是”证明而不揭示”的密码学工具:证明者展示陈述为真,验证者用短对象完成确认,全程不泄露”为真”之外的信息。理解完备性、可靠性、零知识性三个性质,以及算术电路压缩的机制,就能看懂 L2 状态证明和隐私应用的底层,也能理解为什么这项技术既强大又娇贵。