1. 什么是零知识证明(Zero-Knowledge Proof, ZKP)?
零知识证明是一种神奇的密码学技术 ,它允许"证明者"向"验证者"证明一个声明是正确的,而不泄露任何其他信息。
一句话解释:我能证明我知道一个秘密,但我不会告诉你这个秘密是什么。
2. 生活中的例子
假设你想证明自己会解一道非常复杂的数独题,但你不想把答案告诉别人。
你可以这样做:
- 你拿着已经填好的答案,但用不透明的纸把每个格子盖住。
- 验证者随机挑几个格子要求你揭开,并检查是否符合规则。
- 重复多次,直到验证者相信你确实知道完整答案。
在这个过程中,你的解题能力得到了证明 ,但完整答案没有泄露 。
这就是零知识证明的核心思想。
3. 为什么区块链需要零知识证明?
在区块链中,很多场景需要验证交易的有效性,但又不能暴露隐私数据:
- 隐私交易(如 Zcash):证明你有足够的余额进行交易,但不暴露余额具体数值和交易对象。
- Layer2 证明(如 zkRollup):证明链下执行的成千上万笔交易是正确的,而无需把所有交易细节都上传链上。
- 身份验证:证明你有某个资格(如年龄>18),但不泄露真实生日。
零知识证明的引入,解决了验证有效性 和隐私保护之间的矛盾。
4. 零知识证明的三大性质
无论是哪种具体算法,ZKP 都必须满足三个基本性质:
-
完备性(Completeness)
如果命题是真的,且证明者和验证者都按协议行事,那么验证者一定会被说服。
比如:数独题真的解出来了,验证者一定能验证通过。
-
可靠性(Soundness)
如果命题是假的,证明者几乎不可能骗过验证者。
你不会数独,不管怎么蒙,最终都会被验证者抓到破绽。
-
零知识性(Zero-Knowledge)
验证过程中不会泄露额外信息。
验证者只知道你会做这题,但没拿到完整答案。
5. 零知识证明的类型
常见的 ZKP 技术主要有两类:
(1)交互式(Interactive ZKP)
证明者和验证者需要多次来回交互(提问-回答-验证),直到验证者确信证明正确。
优点:简单直观
缺点:需要多次通信,不适合区块链这种高延迟、无状态的环境。
(2)非交互式(Non-Interactive ZKP, NIZK)
证明者一次性生成一个证明文件 ,验证者用公开信息就能验证,无需反复互动。
这类证明通常依赖公共参考字符串(CRS) 。
适合区块链,因为链上验证必须是一次性的。
区块链上常用的 NIZK 技术:zk-SNARK、zk-STARK
6. 主流零知识证明技术
技术 | 特点 | 优点 | 缺点 |
---|---|---|---|
zk-SNARK | 需要可信设置(Trusted Setup) | 证明短、验证快 | 生成证明时间较长 |
zk-STARK | 无需可信设置 | 抗量子攻击、安全性高 | 证明文件大、验证慢 |
Bulletproofs | 无需可信设置 | 证明短,适合隐私交易 | 验证速度比 SNARK 慢 |
PLONK | 通用型 zk-SNARK | 一次可信设置可多次复用 | 复杂度高 |
7. ZKP 在区块链开发中的应用流程
以 zkRollup 为例,一个典型的零知识证明在区块链中的工作流程如下:
- 链下执行交易:在二层网络中批量处理数千笔交易。
- 生成零知识证明:通过 zk-SNARK 等算法生成一个证明,证明这些交易都是合法的。
- 链上验证证明:主链只需验证这个简短的证明文件,就能确认所有交易有效性。
- 更新状态:主链更新账户余额、合约状态等。
这样做的好处:
- 大幅降低链上数据量(节省 gas)
- 保护隐私(不暴露交易细节)
- 提升吞吐量(更快确认)
8. 和非对称加密的关系
-
从技术基础看
- ZKP 常常依赖非对称加密中用到的椭圆曲线数学结构(如 BN254、BLS12-381)
- 非对称加密的数学安全性支撑了部分 ZKP 协议
-
从功能上看
- 非对称加密 = "我用私钥证明我是谁"
- 零知识证明 = "我证明我知道某个秘密,但我不告诉你这个秘密是什么"
-
在区块链系统中的结合
- Rollup + 签名验证:先用非对称加密验证交易的合法性,再用 ZKP 压缩和批量证明结果
- 隐私支付:先用 ZKP 隐藏金额,再用非对称签名防止交易被篡改
打个比方
- 非对称加密:像一把锁(公钥)和钥匙(私钥),别人可以锁上,但只有你能开
- 零知识证明:像告诉别人"我知道开锁的方法",但不给他看钥匙
9. 最简单的ZKP
例子一:阿里巴巴洞(Ali Baba Cave)
目标:证明者 P 让验证者 V 相信"我会念出打开暗门的咒语",但不告诉咒语是什么。
场景
洞是个环形,左路 A 和右路 B 在尽头被一道暗门隔开。知道咒语的人可以从任一路到达尽头,开门穿越到另一边。
协议步骤(重复多轮)
-
P 随机选路进入:P 随机选择 A 或 B 路进入洞中尽头(V 在洞外看不到)。
-
V 发挑战:V 在洞口大喊"从 A 出来!"或"从 B 出来!",挑战是随机的。
-
P 回应:
- 如果 P 确实会咒语:不管他最初进了哪边,都能在洞内开门,按 V 的要求从对应一侧出来。
- 如果 P 不会咒语:只有当 V 碰巧要求的是 P 最初进去的那一侧,才能出来;另一半时间会露馅。
-
重复 k 轮:V 连续发 k 次随机挑战。
为什么是零知识
- 完备性:会咒语的人每轮都能按要求出来。
- 可靠性:不会咒语的人每轮蒙对的概率只有 1/2;k 轮都蒙对的概率是 (1/2)k(1/2)^k(1/2)k,例如 k=20 时约百万分之一。
- 零泄露 :V 只看到"P 每轮都能按要求从指定出口出来",并没有得到任何咒语内容或开门细节。换句话说,V 能生成一份一样的"成功记录"来骗第三方("我就写:我让 P 从 A 出来,他也从 A 出来了......"),因此记录本身不含可验证的秘密。
例子二:颜色辨识(Color-Blind Proof)
目标:P 让色盲的 V 相信"这两球颜色不同(红/绿)",却不泄露"哪个是红、哪个是绿"。
道具
两只外形完全相同的球,只是颜色不同(P 能分辨,V 色盲看不出差异)。
协议步骤(重复多轮)
-
V 挑战洗牌:V 把两球背到身后,随机决定是否交换它们的位置,然后拿到面前(V 自己知道有没有交换,P 不知道)。
-
P 判断:P 看颜色后回答:"交换了"或"没交换"。
-
验收:
- 如果两球确实颜色不同:P 每轮都能准确判断是否交换。
- 如果两球其实颜色相同:P 只能猜,命中率 1/2。
-
重复 k 轮。
为什么是零知识
- 完备性:颜色不同则 P 每轮都能答对。
- 可靠性:颜色相同的人每轮只有 1/2 概率猜对;k 轮全对概率 (1/2)k(1/2)^k(1/2)k。
- 零泄露 :整个过程不暴露哪只球是红/绿;V 只学到"不同"这一事实,没有获得任何可用来区分具体颜色的信息。
10. 总结
零知识证明让我们可以在不暴露数据的情况下验证数据的正确性,在区块链中扮演着核心角色:
- 提升隐私(保护用户数据)
- 提高扩展性(压缩大量验证信息)
- 适配 Layer2(高效批量验证)