最后更新:
零知识证明 (ZKP) 是一种加密方法,它允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需透露除该陈述真实性本身以外的任何信息。
ZKP 使各方能够证明其拥有秘密信息或计算的正确性,同时保持底层数据的隐藏,这使得它们在身份验证、数字身份和 区块链 系统等领域的隐私保护和安全方面非常有用。[1]

知识证明(Proof of knowledge)是一种加密证明,证明者在不泄露信息本身的情况下,向验证者证明其知晓某些信息(例如私钥)。证明者是创建加密证明的实体或程序,而验证者是检查该证明的实体或程序。
零知识证明(ZKP)是一类特殊的知识证明,它具有额外的属性:验证者除了得知声明是否属实之外,无法学到任何其他信息。在一个理想的零知识协议中,如果声明是真实的且证明者正确遵守了协议,验证者会被说服,但无法获得任何关于用于构建证明的见证(witness)或秘密的可利用信息。[7][11]
零知识证明被广泛应用于需要隐私保护验证的各种系统中,包括身份验证协议、数字身份方案,以及基于区块链的应用(如隐私交易和可扩展的 Rollup)。[14][1]

零知识证明的正式概念由 Shafi Goldwasser、Silvio Micali 和 Charles Rackoff 在 1985 年发表的论文《交互式证明系统的知识复杂性》(The Knowledge Complexity of Interactive Proof-Systems)中提出。该论文定义了交互式证明,并展示了证明者如何在不泄露底层见证(witness)的情况下,使验证者相信某个陈述的真实性。[11] 早期的构建主要具有理论意义,因为它们对于实际部署来说效率太低。
在 2010 年代,更高效的非交互式零知识系统,如 zk-SNARKs(零知识简洁非交互式知识论证),使实际应用成为可能。专注于隐私的加密货币 Zcash 于 2016 年推出,是 zk-SNARKs 的首批大规模部署之一,利用该技术实现了在链上完全加密但仍可在网络共识规则下进行验证的屏蔽交易。[8] [12]
随后的研究引入了 zk-STARKs(零知识可扩展透明知识论证),它避免了可信设置并旨在实现更好的可扩展性;此外还有其他证明系统,如用于 Monero 等代币机密交易的 Bulletproofs。[9] [13] 包括以太坊在内的主要智能合约平台都采用了对 ZKP 友好型密码学原语的支持,推动了 zk-rollups、zkEVMs 以及其他依赖 ZKP 验证链外计算的扩容方案的出现。[14] [15]
最近的研究重点在于提高证明生成速度、验证者效率和可组合性,包括可以将多个证明聚合为一个的递归证明系统,以及可以证明通用程序正确执行的零知识虚拟机(zkVMs)。[15]
从高层级来看,零知识证明涉及两个角色:证明者(拥有某些秘密信息或执行了某项计算)和验证者(希望确认关于该秘密或计算的陈述是否属实)。证明者利用随机性和加密承诺将其知识编码为证明,并将该证明(以及可能的某些公开输入)发送给验证者,验证者随后运行验证算法以检查是否应接受该证明。[2]
大多数零知识证明结构可以描述为对计算陈述的证明:证明者展示其在某些(可能是隐藏的)输入上正确执行了程序并获得了特定输出。现代系统将计算编码为算术电路或约束系统,然后生成一个简洁的证明,证明这些约束在不泄露底层输入的情况下得到了满足。验证者使用公开参数和声称的输出检查证明;如果证明通过验证,验证者则接受该陈述为真。
零知识证明通常旨在满足三个核心属性。完整性(Completeness)意味着如果陈述为真且证明者正确遵守协议,诚实的验证者将被说服。可靠性(Soundness)意味着如果陈述为假,任何作弊的证明者都无法说服验证者(概率微乎其微)。零知识性(Zero-knowledge)意味着验证者除了陈述为真这一事实外,学不到任何其他信息,这通常通过要求验证者的交互视图可以在不访问见证数据的情况下进行模拟来形式化。[14]
现代证明系统还专注于效率和可组合性。Succinct(简洁)系统(如 zk-SNARKs 和 zk-STARKs)旨在实现极短的证明和快速的验证,从而使其能够在链上计算成本昂贵的区块链上使用。递归证明技术允许一个证明证明其他证明的有效性,这对于扩展 Rollup 以及将许多交易或计算聚合为单个简洁证明至关重要。[7][15]
零知识证明有几种主要类型,它们在交互方式、效率实现以及所依赖的假设方面有所不同:
除了这些类别之外,现代系统还引入了通用证明框架,例如 zk-虚拟机 (zkVMs),它可以证明用主流语言编写的任意程序的正确执行,以及可以将许多较小证明聚合为单个简洁证明的递归证明系统。这些方法被广泛应用于可扩展的 rollup 和可验证计算服务中。[14][15]




零知识证明(ZKPs)在任何需要证明事实或计算结果而又不泄露底层数据的场景中都有广泛的应用。在隐私保护身份验证中,用户可以证明自己知道密码或拥有凭证,而无需将其发送给服务方,从而降低凭证被盗的风险。在匿名凭证系统中,用户从发行方获取可验证凭证,随后证明这些凭证的属性(如年龄或成员身份),而无需透露其完整身份。[1]
在安全投票方案中,ZKPs 可以帮助选民证明其选票格式正确且已被计入,而无需透露其投票内容。类似的技术也适用于隐私保护调查和拍卖,参与者需要确保计票或清算价格正确,而无需暴露个人出价或答案。[1]
在 blockchain 系统中,ZKPs 支撑着隐私币和扩展解决方案。面向隐私的 cryptocurrencies(如 Zcash 和 Monero)使用 ZKPs 隐藏交易细节(金额和地址),同时仍允许公众验证没有代币被凭空创造或销毁。在 smart contract 平台(如 Ethereum)上,zk-rollups 和 zkEVMs 在链下批量处理多笔交易,生成一个简洁的证明来证实所有状态转换计算正确,并将此证明发布到主链,从而在保持安全性的同时提高可扩展性。类似的设计如 validium 和 volition 将数据存储在链下或可选链上,同时使用 ZKPs 证明状态更新的有效性,在数据可用性、成本和隐私之间进行权衡。[14][15]
ZKPs 还用于数字身份和合规监管场景。用户可以证明国籍、年龄或认证状态等属性,而无需披露完整的身份文件,这对于寻求最小化数据暴露的“了解您的客户”(KYC)和反洗钱(AML)机制非常重要。Central bank digital currency (CBDC) 设计和隐私保护支付系统正在探索 ZKPs,以便在允许监管机构进行必要监督的同时,保护日常交易细节不被广泛披露。[1]
除金融领域外,ZKPs 还支持可验证计算和数据完整性用例。在云计算中,服务器可以证明其正确执行了客户端的计算(例如机器学习模型评估),而客户端无需重新运行计算。在数据共享和 AI 流程中,ZKPs 可以证明数据集或模型训练的属性(例如遵守某些约束或来源要求),而无需泄露原始数据,这对于敏感或专有信息至关重要。这些模式延伸到了供应链追踪、医学研究和其他实体必须验证机密数据声明的领域。[14]
虽然零知识证明(ZKP)提供了显著的优势,但它们也面临着影响采用和设计选择的若干挑战。许多结构是计算密集型的,特别是在证明者端,这可能导致复杂陈述或大规模应用的证明生成过程昂贵或缓慢。尽管现代系统和硬件加速已经提高了性能,但缩短证明时间仍然是一个活跃的研究领域,特别是对于 blockchain 卷轴(rollups)和可验证计算服务。[15]
另一个挑战是标准化和互操作性。ZKP 还没有统一的标准,不同的协议(如 zk-SNARKs、zk-STARKs、Bulletproofs 和基于 zkVM 的系统)在信任假设、性能和证明大小方面做出了不同的权衡。这种多样性可能会阻碍跨平台的组合性,并减慢通用工具和库的开发。[6]
安全和信任假设也是重要的考虑因素。一些结构依赖于可信设置仪式来生成公共参数;如果这个过程受到损害,系统的可靠性可能会面临风险。由于 ZKP 非常复杂且错误难以检测,实现过程还必须处理微妙的密码学和协议级漏洞。最后,ZKP 系统对于开发人员和用户来说可能难以理解和集成,从而产生了可用性和教育障碍,工具和文档工作旨在减少这些障碍。[14]