1. Introduction
多项式承诺方案是一种密码协议,它允许一方(证明者)承诺一个多项式,而不透露其系数,并在之后向另一方(验证者)证明该多项式在特定点处计算出的值为某个特定值,而不透露有关该多项式的任何其他信息。在各种零知识证明系统中,多项式承诺都是不可缺少的重要组成部分。多项式承诺方案的发展在很大程度上决定了零知识证明系统的更新迭代进程。FRI 1(基于哈希函数)、KZG2和Bulletproof 3(基于椭圆曲线)是当前最为常见的多项式承诺协议。Plonky(2019年)最初使用的是KZG多项式承诺,Plonky2(2022年)参考了STARK的设计加入了FRI多项式承诺协议,Plonky3(2024年)中又增加了Brakedown多项式承诺协议。
KZG多项式承诺在椭圆曲线上实现,其优点是应用于单变量多项式时,验证成本很低,然而Prover 的大部分工作都会涉及到大量的FFT(产生多项式)和MSM(产生多项式承诺)计算,因此证明的计算速度很慢。FRI多项式承诺是基于哈希函数的,没有椭圆曲线的MSM运算,通过运用递归思想运算效率得到提升,它在证明者成本和验证者成本之间可以进行权衡,这取决于协议中使用的Reed-Solomon码率4。Brakedown5多项式承诺仍然使用了哈希函数,并结合纠错码理论使它比FRI更快,但是证明要大得多。相比与KZG多项式承诺,FRI和Brakedown证明速度有很大优势,而且是量子安全的,但是这两者不具备同态隐藏性质,限制了在某些场景中的应用。
2021年Alexander Golovnev等人提出了Brakedown多项式承诺方案,它参考了6中的线性时间编码实现和7中的Spartan线性时间交互式证明系统设计。Brakedown被认为是当下最快的多项式承诺协议,因此Orion8和Binius9 10都参考了此方案,而且在最新的Plonky3中也加入了Brakedown,它的主要缺点是Proof Size较大。
2. Preliminaries
Brakedown多项式承诺方案由线性时间编码多项式承诺方案(linear-time commitment scheme)演化而来,主要是使用Expander Graph对线性时间编码部分做了改进,它的主要技术组成如下图所示。
![外链图片转存失败,
Figure 1 Brakedown技术组成
2.1 张量(tensor)与张量积
在数学中,张量可以理解为一个多重线性映射,即将若干个线性空间 映射到域 上的映射。不同阶数(dimensionality)的张量与其他数据类型的关系如下:
-
标量(0 阶张量): 单个数值。
-
向量(1 阶张量): 一维数组。
-
矩阵(2 阶张量): 二维数组。
-
更高阶张量: 三维或更高维的数组,例如彩色图像 (每个像素包含 RGB 三个值)。
张量的积有很多种,如外积、内积、直积、Kronecker Product等,我们在这里只介绍直积(通常称为张量积),描述为:两个任意阶张量,第一个张量的每一个分量乘以第二个张量中的每一个分量,它们组合的集合仍然是一个张量,称为第一个张量乘以第二个张量的直积。直积的阶数等于因子张量阶数之和。下面是一个直观的例子:
[ a 1 a 2 ] ⊗ [ b 1 b 2 b 3 ] = [ a 1 b 1 a 1 b 2 a 1 b 3 a 2 b 1 a 2 b 2 a 2 b 3 ] \left[\begin{matrix}a_1\\a_2\end{matrix}\right]\otimes\left[\begin{matrix}b_1&b_2&b_3\end{matrix}\right]= \left[\begin{matrix}a_1b_1&a_1b_2&a_1b_3\\a_2b1&a_2b_2&a_2b_3\end{matrix}\right] [a1a2]⊗[b1b2b3]=[a1b1a2b1a1b2a2b2a1b3a2b3]
通常说的张量积就是直积,张量积具有扩充向量维度的作用,上式中两个一维向量扩充为二维矩阵,在ZK里面用到的就是张量直积,即将多项式系数组成的方阵分解为两个向量的张量积,如下式:
[ a 1 b 1 a 1 b 2 a 1 b 3 a 2 b 1 a 2 b 2 a 2 b 3 a 3 b 1 a 3 b 2 a 3 b 3 ] = [ a 1 a 2 a 3 ] ⊗ [ b 1 b 2 b 3 ] = a ⊗ b \left[\begin{matrix}a_1b_1&a_1b_2&a_1b_3\\a_2b1&a_2b_2&a_2b_3\\a_3b1&a_3b_2&a_3b_3\end{matrix}\right]=\left[\begin{matrix}a_1\\a_2\\a_3\end{matrix}\right]\otimes\left[\begin{matrix}b_1&b_2&b_3\end{matrix}\right]=\mathbf{a}\otimes\mathbf{b} a1b1a2b1a3b1a1b2a2b2a3b2a1b3a2b3a3b3 = a1a2a3 ⊗[b1b2b3]=a⊗b
2.2 Error Correcting Code and Linear Code
纠错码是一种用于控制数据传输或存储过程中错误的技术。它通过在原始数据中添加冗余信息来实现错误检测和纠正,从而确保数据的完整性和可靠性,在通信领域有着广泛的应用,主要工作过程包括:编码(Encoding)、传输/存储、解码(Decoding)和数据恢复。其中重复码是纠错码的一个简单例子,其编码原理是将每个数据位发送3次,解码时以重复次数较多的数位为准,具体如下表。重复码最多纠正一位错误位,或两位丢失位。
Table 1 重复码编码解码过程
传输数据 | 编码 | 接收的码字 | 解码 |
---|---|---|---|
0 | 000 | 000 | 0 |
001 | |||
010 | |||
100 | |||
1 | 111 | 111 | 1 |
110 | |||
101 | |||
011 |
纠错码中的一个重要分支是线性码,它利用线性代数原理来检测和纠正数据传输或存储过程中出现的错误。它的一个重要性质就是线性码中的码字可以通过对信息位进行线性组合得到。这意味着,任意两个码字的线性组合仍然是一个码字,这对多项式承诺的批量处理非常有用。线性码的几个基本参数包括:
-
码字 (Code word): 线性码中的每个有效编码元素都被称为码字。码字是由信息符号经过编码得到的。
-
码长 (Code length): 码字中的符号数量。
-
信息位 (Message bits): 原始信息中包含的位数。
-
校验位 (Parity bits): 添加到信息位中用于错误检测和纠正的额外位数。
-
码率 (Code rate): 信息位与码字长度的比率,表示编码效率。
-
汉明距离(Hamming distance):两个等长码字对应位置的不同字符的个数。
下面两种线性码均均可用到零知识证明系统中:
▲ \blacktriangle ▲ BCH码:BCH 码使用了有限域和多项式计算。为了检测错误可以构建一个检测多项式,这样接收端就可以检测是否有错误发生。BCH编码的基本思想是:假如消息是 m ( x ) m(x) m(x),然后乘上一个编码多项式 p ( x ) p(x) p(x),得到码字 m ( x ) p ( x ) m(x)p(x) m(x)p(x)。由于码字发送过程中会会受到很多干扰,于是多项式被加上错误多项式 e ( x ) e(x) e(x),而接收者的消息为 c ( x ) c(x) c(x),就有
c ( x ) = m ( x ) p ( x ) + c ( x ) c(x)=m(x)p(x)+c(x) c(x)=m(x)p(x)+c(x)
接收者事先和发送者约定了 p ( x ) p(x) p(x),只要让 c ( x ) c(x) c(x)除以 p ( x ) p(x) p(x),如果余项是0,即没有受到干扰,那么商就是 m ( x ) m(x) m(x),就是正确的消息。其中 p ( x ) p(x) p(x)必须是本原多项式(primitive polynomials),而且一个本原多项式只能纠正一个错误,错误的位置根据余项 e ( x ) e(x) e(x)来确定。
▲ \blacktriangle ▲Reed-Solomon码:Reed-Solomon码为BCH码的子集。它使用的本原多项式称为Generator多项式,即
p ( x ) = ( x − α 0 ) p ( x − α 1 ) ⋯ ( x − α 2 t − 1 ) p(x)=(x-\alpha^0)p(x-\alpha^1)\cdots (x-\alpha^{2t-1}) p(x)=(x−α0)p(x−α1)⋯(x−α2t−1)
由于Reed-Solomon编码也是执行再有限域上,这里的 α \alpha α表示有限域的生成元。所以编码为:
c ( x ) = m ( x ) p ( x ) c(x)=m(x)p(x) c(x)=m(x)p(x)
其中, m ( x ) m(x) m(x)长度为 k k k, p ( x ) p(x) p(x)长度为 l = 2 t l=2t l=2t,码字 c ( x ) c(x) c(x)长度为 n = l + k n=l+k n=l+k。
例如 m ( x ) m(x) m(x)的 k k k个值为 [ m 0 , m 1 , ⋯ , m k − 1 ] [m_0,m_1,\cdots,m_{k-1}] [m0,m1,⋯,mk−1],以这些值构成的多项式为:
m ( x ) = ∑ i = 0 k − 1 m i x i m(x)=\sum_{i=0}^{k-1}m_i x^i m(x)=i=0∑k−1mixi
则Reed-Solomon编码为:
c ( x ) = m ( x ) x m − ( ( m ( x ) x m ) m o d p ( x ) ) c(x)=m(x)x^m-((m(x)x^m) \mod p(x)) c(x)=m(x)xm−((m(x)xm)modp(x))
这里, ( ( m ( x ) x m ) m o d p ( x ) ) ((m(x)x^m) \mod p(x)) ((m(x)xm)modp(x))的degree小于等于 m − 1 m-1 m−1, c ( x ) c(x) c(x)的degree小于等于 n − 1 n-1 n−1。即 c ( x ) c(x) c(x)有以下形式:
c ( x ) = ∑ i = 0 n − 1 c i x i c(x)=\sum_{i=0}^{n-1}c_i x^i c(x)=i=0∑n−1cixi
所以编码后的码字为 [ c 0 , c 1 , ⋯ , c n − 1 ] [c_0,c_1,\cdots,c_{n-1}] [c0,c1,⋯,cn−1]。
2.3 哈希函数(Hash Function)
哈希函数是将输入数据打乱混合,重新创建一个叫做散列值/哈希值的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表,数学表示如下:
H m = H a s h ( m ) H_m=Hash(m) Hm=Hash(m)
其中, m m m表示任意长度消息(不同算法实现,长度限制不同); H a s h Hash Hash是一些列的排列和数学计算集合构成的哈希函数; H m H_m Hm是输出固定长度的哈希值。
哈希函数的特点是:
- *单向性:如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的,并且很难由输出推算出原始输入。
- 散列碰撞(collision):散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同。
- 防篡改:输入的数据稍微产生改变就会产生一个完全不同的散列值。
ZK系统的进化目标之一就是寻找计算友好的抗碰撞哈希函数,目前比较常见的哈希算法有SHA256、Keccak、Blake3、Poseidon2、Poseidon3(前面的文章做过详细介绍)的等。
2.4默克尔树(Merkle Tree)
默克尔树是一种树形数据结构,在零知识证明中主要使用的是二叉树结构,每个叶节点是数据块的哈希,除了叶节点以外的节点是其子节点的哈希。默克尔树的主要优点是能够高效、安全地验证大型数据结构的内容。
在区块链中,默克尔树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的有效途径。生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到Merkle树中,直到只剩一个哈希节点,该节点就是默克尔树的根。 具体如下所示:
Figure 2 默克尔树的结构
默克尔树是区块链技术的基础。第一,在区块链里,所有交易都按照默克尔树的格式组织起来,再与区块头(Block Header)对应起来,就可以保证本区块交易信息的不可篡改。第二,在默克尔树中,只要任一叶节点发生变化,根哈希都会变,这样可以很容易地在大量数据中找出哪些数据发生了变化,整个数据验证过程非常高效。第三,利用哈希函数的单向性可以构建零知识证明系统,仅通过部分节点的验证即可实现多项式承诺,而无需透露具体内容。第四,默克尔树用于POW共识算法,主要操作就是给定一定的数据,然后寻找其他的数据,合并起来计算出来的根哈希值小于某个值(通常说的挖矿),目前的比特币、以太坊,都是使用的POW共识。
References:
[1]https://drops.dagstuhl.de/storage/00lipics/lipics-vol107-icalp2018/LIPIcs.ICALP.2018.14/LIPIcs.ICALP.2018.14.pdf
[2] Kate, A., Zaverucha, G.M., Goldberg, I.. Constant-Size Commitments to Polynomials and Their Applications. International Conference on the Theory and Application of Cryptology and Information Security, 2010.
[3] https://doc-internal.dalek.rs/bulletproofs/notes/inner_product_proof/i ndex.html
[4] Ulrich Haböck. A summary on the fri low degree test. Cryptology ePrint Archive, Paper 2022/1216, 2022.
[5] https://eprint.iacr.org/2021/1043.pdf?ref=hackernoon.com
[6] J. Bootle, A. Chiesa, and J. Groth. Linear-time arguments with sub-linear verification from tensor codes. In TCC, 2020.
[7] S. Setty. Spartan: Efficient and general-purpose zkSNARKs without trusted setup. In CRYPTO, 2020.
[8] T. Xie, Y. Zhang, and D. Song, “Orion: Zero knowledge proof with linear prover time,” Cryptology ePrint Archive, Paper 2022/1010, 2022, https://eprint.iacr.org/2022/1010.
[9] B. Diamond, J. Posen,“Succinct Arguments over Towers of Binary Fields,” Cryptology ePrint Archive, Paper 2023/1784, 2023, https://eprint.iacr.org/2023/1784.pdf
[10] https://github.com/IrreducibleOSS/binius
[11] S. Ames, C. Hazay, Y. Ishai, and M. Venkitasubramaniam. Ligero: Lightweight sublinear arguments without a trusted setup. In CCS, 2017