区块链中的密码学 —— 零知识证明

1. 什么是零知识证明(Zero-Knowledge Proof, ZKP)?

零知识证明是一种神奇的密码学技术 ,它允许"证明者"向"验证者"证明一个声明是正确的,而不泄露任何其他信息

一句话解释:我能证明我知道一个秘密,但我不会告诉你这个秘密是什么。


2. 生活中的例子

假设你想证明自己会解一道非常复杂的数独题,但你不想把答案告诉别人。

你可以这样做:

  1. 你拿着已经填好的答案,但用不透明的纸把每个格子盖住。
  2. 验证者随机挑几个格子要求你揭开,并检查是否符合规则。
  3. 重复多次,直到验证者相信你确实知道完整答案。

在这个过程中,你的解题能力得到了证明 ,但完整答案没有泄露

这就是零知识证明的核心思想。


3. 为什么区块链需要零知识证明?

在区块链中,很多场景需要验证交易的有效性,但又不能暴露隐私数据:

  • 隐私交易(如 Zcash):证明你有足够的余额进行交易,但不暴露余额具体数值和交易对象。
  • Layer2 证明(如 zkRollup):证明链下执行的成千上万笔交易是正确的,而无需把所有交易细节都上传链上。
  • 身份验证:证明你有某个资格(如年龄>18),但不泄露真实生日。

零知识证明的引入,解决了验证有效性隐私保护之间的矛盾。


4. 零知识证明的三大性质

无论是哪种具体算法,ZKP 都必须满足三个基本性质:

  1. 完备性(Completeness)

    如果命题是真的,且证明者和验证者都按协议行事,那么验证者一定会被说服。

    比如:数独题真的解出来了,验证者一定能验证通过。

  2. 可靠性(Soundness)

    如果命题是假的,证明者几乎不可能骗过验证者。

    你不会数独,不管怎么蒙,最终都会被验证者抓到破绽。

  3. 零知识性(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 为例,一个典型的零知识证明在区块链中的工作流程如下:

  1. 链下执行交易:在二层网络中批量处理数千笔交易。
  2. 生成零知识证明:通过 zk-SNARK 等算法生成一个证明,证明这些交易都是合法的。
  3. 链上验证证明:主链只需验证这个简短的证明文件,就能确认所有交易有效性。
  4. 更新状态:主链更新账户余额、合约状态等。

这样做的好处:

  • 大幅降低链上数据量(节省 gas)
  • 保护隐私(不暴露交易细节)
  • 提升吞吐量(更快确认)

8. 和非对称加密的关系

  • 从技术基础看

    • ZKP 常常依赖非对称加密中用到的椭圆曲线数学结构(如 BN254、BLS12-381)
    • 非对称加密的数学安全性支撑了部分 ZKP 协议
  • 从功能上看

    • 非对称加密 = "我用私钥证明我是谁"
    • 零知识证明 = "我证明我知道某个秘密,但我不告诉你这个秘密是什么"
  • 在区块链系统中的结合

    • Rollup + 签名验证:先用非对称加密验证交易的合法性,再用 ZKP 压缩和批量证明结果
    • 隐私支付:先用 ZKP 隐藏金额,再用非对称签名防止交易被篡改

打个比方

  • 非对称加密:像一把锁(公钥)和钥匙(私钥),别人可以锁上,但只有你能开
  • 零知识证明:像告诉别人"我知道开锁的方法",但不给他看钥匙

9. 最简单的ZKP

例子一:阿里巴巴洞(Ali Baba Cave)

目标:证明者 P 让验证者 V 相信"我会念出打开暗门的咒语",但不告诉咒语是什么。

场景

洞是个环形,左路 A 和右路 B 在尽头被一道暗门隔开。知道咒语的人可以从任一路到达尽头,开门穿越到另一边。

协议步骤(重复多轮)

  1. P 随机选路进入:P 随机选择 A 或 B 路进入洞中尽头(V 在洞外看不到)。

  2. V 发挑战:V 在洞口大喊"从 A 出来!"或"从 B 出来!",挑战是随机的。

  3. P 回应

    • 如果 P 确实会咒语:不管他最初进了哪边,都能在洞内开门,按 V 的要求从对应一侧出来。
    • 如果 P 不会咒语:只有当 V 碰巧要求的是 P 最初进去的那一侧,才能出来;另一半时间会露馅。
  4. 重复 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 色盲看不出差异)。

协议步骤(重复多轮)

  1. V 挑战洗牌:V 把两球背到身后,随机决定是否交换它们的位置,然后拿到面前(V 自己知道有没有交换,P 不知道)。

  2. P 判断:P 看颜色后回答:"交换了"或"没交换"。

  3. 验收

    • 如果两球确实颜色不同:P 每轮都能准确判断是否交换。
    • 如果两球其实颜色相同:P 只能猜,命中率 1/2。
  4. 重复 k 轮

为什么是零知识

  • 完备性:颜色不同则 P 每轮都能答对。
  • 可靠性:颜色相同的人每轮只有 1/2 概率猜对;k 轮全对概率 (1/2)k(1/2)^k(1/2)k。
  • 零泄露 :整个过程不暴露哪只球是红/绿;V 只学到"不同"这一事实,没有获得任何可用来区分具体颜色的信息。

10. 总结

零知识证明让我们可以在不暴露数据的情况下验证数据的正确性,在区块链中扮演着核心角色:

  • 提升隐私(保护用户数据)
  • 提高扩展性(压缩大量验证信息)
  • 适配 Layer2(高效批量验证)
相关推荐
效效超爱笑37 分钟前
数据结构---链式结构二叉树
数据结构·算法
汤永红1 小时前
week1-[循环嵌套]蛇
数据结构·c++·算法
zhangzibiao2 小时前
LLM 与传统解析技术的融合:网页数据提取的演进与最佳实践
算法
墨染点香2 小时前
LeetCode 刷题【42. 接雨水】
算法·leetcode·职场和发展
大白猴2 小时前
大白话解析 Solidity 中的防重放参数
区块链·智能合约·solidity·时间戳·重放攻击·nonce·防重放参数
小明的小名叫小明2 小时前
区块链技术原理(12)-以太坊区块
区块链
大白猴2 小时前
大白话解析“入口点合约”
区块链·智能合约·solidity·以太坊·账户抽象·入口点合约·erc4337
楽码3 小时前
理解自动修复:编程语言的底层逻辑
后端·算法·编程语言
stone51953 小时前
TOTP算法与HOTP算法
c语言·物联网·算法·嵌入式·iot平台·智能门锁