在本文中,我们在本系列文章第二和第三部分基础上开发出一套可证实的多项式盲求值协议。在第五部分,我们将开始看见这样的一个协议会如何被用来构造SNARKs。
如同第二部分中的情况,我们假定Alice有一个阶数为 d d d的多项式 P P P,Bob有一个随机选取的点 s ∈ F p s \in \textbf F_p s∈Fp。在下面2个额外特性情况下,我们想构造一个协议让 Bob得到 E ( P ( s ) ) E(P(s)) E(P(s))。也就是, P P P 在 s s s 点求值的隐藏:
- 盲性:Alice 不会知道 s s s,Bob也不会知道 P P P。
- 可验证性:对于Alice已知的 d d d次多项式 P P P,Alice送一个有别于 E ( P ( s ) ) E(P(s)) E(P(s)) 的值给Bob,并且Bob接受该值。这件事发生的概率,可以忽略不计。
这就是我们称之为的多项式可验证盲求值。第二部分文章中的协议给了我们第一项特性。为了获得可验证性,我们需要第三部分文章中KCA的扩展版本。
可验证性和盲性这2个特性在一起会比较有用。这是因为它们可以让Alice在看不到 s s s的情况下决定用哪个多项式 P P P。1 在本系列文章的下一部分,这个直觉会更加清晰。
一个扩展KCA
我们在第三部分定义的KCA基本上说了这些:如果Bob给Alice某个 α \alpha α-对 ( a , b = α ⋅ a ) (a,b=\alpha \cdot a) (a,b=α⋅a),于是Alice产生另一个 α \alpha α-对 ( a ′ , b ′ ) (a',b') (a′,b′),然后她得到 c c c,使得 a ′ = c ⋅ a a'=c \cdot a a′=c⋅a。换句话说,Alice知道 a ′ a' a′ 和 a a a 之间的关系。
现在假定Bob不止送一个 α \alpha α-对 ,而是发送给Alice多个具有相同 α \alpha α 的 α \alpha α-对 ( a 1 , b 1 ) , . . . , ( a d , b d ) (a_1,b_1),...,(a_d,b_d) (a1,b1),...,(ad,bd);在接收到这些对子的挑战后,Alice生成一些其他的 α \alpha α-对 ( a ′ , b ′ ) (a',b') (a′,b′)。注意这里的要点是Alice必须在不知道 α \alpha α 的情况下做到这一切。
就像我们在第三部分看到的,Alice生成这样一个 α \alpha α-对的自然的方法,就是从收自Bob的多个 α \alpha α-对中挑选一个 ( a i , b i ) (a_i,b_i) (ai,bi),然后用某个 c ∈ F p ∗ c \in \textbf F_p^* c∈Fp∗来乘这2个元素。如果 ( a i , b i ) (a_i,b_i) (ai,bi)是一个 α \alpha α-对,那么 ( c ⋅ a i , c ⋅ b i ) (c \cdot a_i,c \cdot b_i) (c⋅ai,c⋅bi)也会是一个 α \alpha α-对。但是Alice可以有更多的办法生来成 α \alpha α-对么?毕竟她现在接收到了多个 α \alpha α-对。也许可以同时使用多个接收到的 α \alpha α-对来生成一个新的 α \alpha α-对。
答案是肯定的:例如,Alice可以选择2个值 c 1 , c 2 ∈ F p c_1,c_2 \in \textbf F_p c1,c2∈Fp,然后计算一对 ( a ′ , b ′ ) = ( c 1 ⋅ a 1 + c 2 ⋅ a 2 , c 1 ⋅ b 1 + c 2 ⋅ b 2 ) (a',b')=(c_1 \cdot a_1+c_2 \cdot a_2,c_1 \cdot b_1+c_2 \cdot b_2) (a′,b′)=(c1⋅a1+c2⋅a2,c1⋅b1+c2⋅b2)。一个简单的计算可以表明,只要 a ′ a' a′非零,这个结果也是一个 α \alpha α-对:
b ′ = c 1 ⋅ b 1 + c 2 ⋅ b 2 = c 1 α ⋅ a 1 + c 2 α ⋅ a 2 = α ( c 1 ⋅ a 1 + c 2 ⋅ a 2 ) = α ⋅ a ′ b'=c_1 \cdot b_1+c_2 \cdot b_2=c_1\alpha \cdot a_1 +c_2\alpha \cdot a_2=\alpha(c_1 \cdot a_1+c_2 \cdot a_2)=\alpha \cdot a' b′=c1⋅b1+c2⋅b2=c1α⋅a1+c2α⋅a2=α(c1⋅a1+c2⋅a2)=α⋅a′
更一般地,Alice可以对给定的 d d d个对做任意的线性组合。也就是选取任意的 c 1 , . . . , c d ∈ F p c_1,...,c_d \in \textbf F_p c1,...,cd∈Fp 然后定义 ( a ′ , b ′ ) = ( Σ i = 1 d c i a i , Σ i = 1 d c i b i ) (a',b')=(\Sigma_{i=1}^d c_i a_i, \Sigma_{i=1}^d c_i b_i) (a′,b′)=(Σi=1dciai,Σi=1dcibi)。
注意,当Alice采用这个策略来生成她的 α \alpha α-对时,她将会知道一些 a ′ a' a′ 与 a 1 , . . . , a d a_1,...,a_d a1,...,ad之间的线性关系。也就是,她知道 c 1 , . . . , c d c_1,...,c_d c1,...,cd 使得 a ′ = Σ i = 1 d c i ⋅ a i a'=\Sigma_{i=1}^d c_i \cdot a_i a′=Σi=1dci⋅ai。
扩展KCA规定,基本上,这是Alice生成 α \alpha α-对的唯一办法。也就是说,只要她成功了,她就会知道在 a ′ a' a′ 和 a 1 , . . . , a d a_1,...,a_d a1,...,ad 之间的这样一个线性关系。更正式地,假定 G G G 是 d d d阶群,它有一个用加法写的生成器 g g g,就像本系列文章中第三部分里面的一样。 G G G的 d d d阶系数知识假设(d-KCA)2如下所示:
d-KCA:假定Bob随机选择 α ∈ F p ∗ \alpha \in \textbf F_p^* α∈Fp∗ 和 s ∈ F p s \in \textbf F_p s∈Fp, 然后送给Alice这些 α \alpha α-对 ( g , α ⋅ g ) , ( s ⋅ g , α s ⋅ g ) , . . . , ( s d ⋅ g , α s d ⋅ g ) (g, \alpha \cdot g), (s \cdot g,\alpha s \cdot g),...,(s^d \cdot g,\alpha s^d \cdot g) (g,α⋅g),(s⋅g,αs⋅g),...,(sd⋅g,αsd⋅g)。假定Alice接下来输出了另一个 α \alpha α-对 ( a ′ , b ′ ) (a',b') (a′,b′)。于是,除非可忽略的可能性,Alice知道 c 0 , . . . , c d ∈ F p c_0,...,c_d \in \textbf F_p c0,...,cd∈Fp,使得 Σ i = 0 d c i s i ⋅ g = a ′ \Sigma_{i=0}^d c_i s^i \cdot g = a' Σi=0dcisi⋅g=a′。
注意,在d-KCA中Bob发送的不是一个任意的 α \alpha α-对集合, 而是带有一定"多项式结构“的。这在下面的协议中会很有用。
可验证盲求值协议
假设我们的HH是一个映射 E ( x ) = x ⋅ g E(x)=x \cdot g E(x)=x⋅g,其中 g g g是跟上面一样的 G G G上的发生器。为了简单起见,我们为这个特定的 E E E呈现协议如下:
- Bob选择一个随机 α ∈ F p ∗ \alpha \in \textbf F_p^* α∈Fp∗,把 1 , s , . . . , s d 1,s,...,s^d 1,s,...,sd 的 隐藏 g , s ⋅ g , . . . , s d ⋅ g g, s \cdot g,...,s^d \cdot g g,s⋅g,...,sd⋅g 和 α , α s , . . . , α s d \alpha,\alpha s,..., \alpha s^d α,αs,...,αsd的隐藏 α ⋅ g , α s ⋅ g , . . . , α s d ⋅ g \alpha \cdot g,\alpha s \cdot g,...,\alpha s^d \cdot g α⋅g,αs⋅g,...,αsd⋅g 发送给Alice。
- Alice用第一步发来的元素计算 a = P ( s ) ⋅ g a=P(s) \cdot g a=P(s)⋅g 和 b = α P ( s ) ⋅ g b=\alpha P(s) \cdot g b=αP(s)⋅g,并把这2个 结果发回给Bob。
- Bob检查 b = α ⋅ a b=\alpha \cdot a b=α⋅a,如果等式成立则接受Alice的发送。
首先,注意在给定 P P P的系数情况下, P ( s ) ⋅ g P(s) \cdot g P(s)⋅g是一个 g , s ⋅ g , . . . , s d ⋅ g g,s \cdot g,...,s^d \cdot g g,s⋅g,...,sd⋅g 的线性组合; α P ( s ) ⋅ g \alpha P(s) \cdot g αP(s)⋅g是一个 α ⋅ g , α s ⋅ g , . . . , α s d ⋅ g \alpha \cdot g,\alpha s \cdot g,...,\alpha s^d \cdot g α⋅g,αs⋅g,...,αsd⋅g 的线性组合。于是,跟第二部分中的协议相似,Alice实际上可以从Bob的消息中为她自己知道的一个多项式 P P P 计算出这些值。
其次,根据d-KCA,如果Alice发送 a , b a, b a,b 使得 b = α ⋅ a b=\alpha \cdot a b=α⋅a,然后最有可能她知道 c 0 , . . . , c d ∈ F p c_0,...,c_d \in \textbf F_p c0,...,cd∈Fp 使得 a = Σ i = 0 d c i s i ⋅ g a=\Sigma_{i=0}^d c_i s^i \cdot g a=Σi=0dcisi⋅g。在这个情况,由于Alice知道 P ( X ) = Σ i = 0 d c i ⋅ X i P(X)=\Sigma_{i=0}^d c_i \cdot X^i P(X)=Σi=0dci⋅Xi 这个多项式 ,于是 a = P ( s ) ⋅ g a=P(s) \cdot g a=P(s)⋅g。 换句话说,在上面第三步中Alice不知道这个 P P P 的同时Bob还接受Alice的发送,这件事的概率很低。
总结下,利用d-KCA,我们已经开发出了一个协议给可验证多项式盲求值。在下一篇文章里,我们将看到这些模块会如何被用来构造SNARK。