在密码学中,零知识证明(zero-knowledge proofs)或零知识协议(zero-knowledge protocols)是指一种特殊的协议。在此协议中,被称为证明者(prover)的参与方可以向被称为验证者(verifier)的参与方证明某个给定的陈述是正确的,但在此过程中不泄露除给定的陈述是正确的以外其他任何信息。本书的写作目标是为对零知识证明不熟悉的读者介绍零知识证明系统背后的数学原理及其应用。
在零知识证明协议中,所谓的零知识简洁的非交互式知识论证
(zero knowledge succinct, non interactive arguments of knowledge,简写为zk-SNARKs
)是特别令人感兴趣的。其令人感兴趣的原因是zk-SNARKs
产生的证明远远小于为证明陈述为正确所需要的原始数据且证明者与验证者之间仅需要进行一次交互。
从实践的角度看,zk-SNARKs
令人心潮澎湃的原因是zk-SNARKs
具有在不泄露任何计算输入的前提下向公众证明计算是诚实的,方法是将zk-SNARKs
的证明作为交易发送给公链上的实现验证者功能的智能合约。在此场景下,我们发现了一种将复杂计算外包到链下然后在公链上进行验证计算结果正确性的方法。此方法使公开可验证计算、区块链扩容和增加交易隐私性成为可能。
由于区块链和zk-SNARKs
的联系,对区块链技术日益增加的兴趣也增加了人们对优秀且详细的零知识证明协议、相关应用及其标准相关资料的需求。只有充分了解zk-SNARKs
的相关资料,开发者才能写出安全和高效的代码。
但是,零知识证明的细节是复杂的,更加深入的了解需要开发者熟悉数学和计算机理论学科,包括已有的计算模型和编程范式的更新。不幸的是,关于zk-SNARKs
的资料散落在博客、Github 仓库和数学论文中,这使得zk-SNARKs
仍旧是难以理解的,或者说是“神奇的”。资料的分散等问题阻碍了开发者探索或使用zk-SNARKs
在其项目中,从而减慢了zk-SNARKs
的广泛使用和向web3
的过渡。
本书尝试改变这一情况。本书专门为密码学经验较少的读者设计,写作目标是尽可能缩小知识门槛并以动手进行简单的纸笔运算的方式向开发者解释抽象概念。读完并计算本书示例后,读者将掌握理解zk-SNARKs
背后数学原理的所必须的概念。