由于本书旨在完整介绍与初学者有关的所有主题,因此有多种方式可以阅读此书。最明显的阅读方法就是按照章节顺序线性阅读此书。如果读者几乎没有对于数学和密码学的前置知识,我们推荐这种阅读方法。我们从最基础的概念,比如自然数、素数开始,并介绍如何用不同种类的计算在这些集合中进行计算。然后,我们将继续学习代数结构,如群(group)、环(ring)、素数域(prime field)和椭圆曲线(elliptic curve)。

在本书的开始,我们开发了一个示例。随着我们学习的深入,该示例将逐渐扩展。通过这种方式,我们在成熟的密码学体系上递增构建了一些真实世界中的SNARK。这些SNARK都十分简单,我们可以通过纸笔计算以详细展示其中的每一步。

如果希望更好理解在零知识证明系统中出现的椭圆曲线,读者可以从5.6.4节快速阅读。在此节中,我们介绍了BLS6_6曲线,这是一种可以使用纸笔运算且配对友好(pairing-frendly)的椭圆曲线。在第 5 章中,我们将介绍了所有关于这条曲线的概念。开发zk-SNARKs的程序员经常面临这种情况,在进行真实实现前需要使用纸笔进行一些计算,但是这些计算通常因为加密算法使用的椭圆曲线大小而无法进行。在本书中,我们特别设计了BLS6_6曲线以实现纸笔计算。这是一条配对友好曲线,具有在没有任何计算机辅助的情况下进行基于配对的计算所需要的所有属性。这种计算有助于读者理解系统的细节。此外,我们推导出Tiny-jubjub曲线,该曲线可用于使用纸笔计算EdDSA

如果读者对于使用纸笔从零开始构建简单zk-SNARK感兴趣,读者可以阅读所有有关三分解问题(3-factorization problem)的示例。在 示例 115 中,我们引入三分解问题作为形式语句(formal language)中的语句(statement)。如果此例子过于抽象,读者可以在 示例 124 开始,在此示例中,我们将三分解问题描述为一种代数电路(algebraic circuit)。在 示例 126 中,我们执行了此电路。在 示例 118 中。我们引入了实例(instance)和见证(witness)概念以便稍后实现各种级别的零知识证明。在 示例 120 中,我们将电路转换为关联的 Rank-1 约束系统(Rank-1 Constraint System),并在 示例 122 中,我们计算了此问题的构造性证明(constructive proof)。在 示例 131 中,我们将约束系统(constraint system)转换为二项式算术程序(Quadratic Arithmetic Program),并展示如何将构造性证明(constructive proof)转换为多项式整除问题(polynomial divisibility problems)。在 示例 145 中,我们使用这些示例的结果完成从三分解问题推导Groth16 zk-SNARK的过程。在 8.3 节,我们计算证明者和验证者密钥。在 示例 147 中,我们计算zk-SNARK并在 示例 148 中进行验证。在 示例 149 中,我们将展示如何模拟证明。

如果读者希望更好了解高级语言如何被编译为零知识证明系统可以接受的表示,读者可以从 第 7 章 开始阅读。在第七章中,我们推导出一种带有可以将高级语言编译为图像电路表示的brain-complier的玩具语言。像R1CS等重要的表示将在 6.2.1 中解释,构造性证明、见证和实例等核心概念将在6.1 中解释。

此节中的超链接目前均无效,但随着本书的翻译将逐渐补齐