想研究零知识证明能不能进一步压缩、加速,首先得熟悉现在的实现方法。
然后一查发现零知识证明的技术基础有一点丰富。
参考教程:https://learnblockchain.cn/column/117
1 前置准备
1.0 数学知识
参考这篇文章:BLS、BBS、BBS+与其数学基础
或者 参考教程 的前几章。
1.1 将解决方案变成布尔表达式
所有密码学算法(NP难问题)都有一个共通的特点:解决问题困难、验证答案简单。
所以期待能有一种通用的语言来描述NP问题和解决方案。
Cook-Levin 定理:所有的P类问题和NP类问题都可以表示为一个布尔表达式。
直观理解:任何问题都能翻译成一堆二进制状态 + 状态变换规则,而这些规则最后都能被写成布尔公式。
布尔表达式就是一个典型的求解困难、验证简单的问题。
1.2 算数电路
布尔电路:仅限于布尔输入(True、False)和基本的布尔运算(与、或、非)。
但是,用布尔电路表达加法这类算数运算就会非常冗长。比如三个4bit的整数相加 a+b=c 写成布尔表达式:
((a₄ ∧ b₄ ∧ c₄) ∨ (¬a₄ ∧ ¬b₄ ∧ c₄) ∨ (¬a₄ ∧ b₄ ∧ ¬c₄) ∨ (a₄ ∧ ¬b₄ ∧ ¬c₄)) ∧
((a₃ ∧ b₃ ∧ ((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(¬a₃ ∧ ¬b₃ ∧ ((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(¬a₃ ∧ b₃ ∧ ¬((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(a₃ ∧ ¬b₃ ∧ ¬((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))))) ∧
((a₂ ∧ b₂ ∧ ((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))) ∨
(¬a₂ ∧ ¬b₂ ∧ ((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))) ∨
(¬a₂ ∧ b₂ ∧ ¬((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(a₂ ∧ ¬b₂ ∧ ¬((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))))) ∧
((a₁ ∧ b₁ ∧ c₀) ∨ (¬a₁ ∧ ¬b₁ ∧ c₀) ∨ (¬a₁ ∧ b₁ ∧ ¬c₀) ∨ (a₁ ∧ ¬b₁ ∧ ¬c₀)) ∧
((a₀ ∧ b₀ ∧ c₀) ∨ (¬a₀ ∧ ¬b₀ ∧ c₀) ∨ (¬a₀ ∧ b₀ ∧ ¬c₀) ∨ (a₀ ∧ ¬b₀ ∧ ¬c₀)) ∧
¬ ((a₄ ∧ b₄) ∨
(b₄ ∧ (a₃ ∧ b₃) ∨ (b₃ ∧ (a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))) ∨
(a₃ ∧ (a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))))
这显然把一个常用的运算写成了过于复杂的形式,并且3个变量却又12个输入。因此考虑能否用另一种方式等价表示电路。
算数电路:算术电路是一个仅使用加法、乘法和相等的方程系统。例如:
6 = x₁ + x₂
9 = x₁x₂
我们说布尔电路是 满足 的,如果我们对输入变量有一个赋值,使输出为真。类似地,算术电路是满足的,如果可以对变量赋值,使所有的方程均成立。
例如,上述电路由 x1=3,x2=3x1=3,x2=3 满足,因为电路中的两个方程都成立。相反,电路由 x₁ = 1, x₂ = 6 不满足,因为方程 9 = x₁x₂ 不为真。
与布尔电路一样,它检查所提出的输入集合是否有效,但不计算解决方案。
可以证明,算数电路和布尔电路是等效的。
简单来说,与或非三个布尔运算都可以通过加法和乘法表示,并且可以约束输入为0或1。
1.2.1 记号
算术电路中的变量被称为 信号 (Signal)。
=== 运算符表示相等。电路中,相等并非赋值,而是检查。可以等价理解成断言 assertEq(a, b)。
见证:一个让电路成立的解。例如,考虑以下电路:
x₁(x₁ - 1) === 0
x₁x₂ === x₁
以下对 (x₁, x₂) 的赋值都是有效的见证:
- (x1,x2)=(1,1)
- (x1,x2)=(0,2)
- (x1,x2)=(0,1337)
- (x1,x2)=(0,404)
1.2.2 对比布尔电路
下表显示布尔电路和算术电路之间的区别,但请牢记,它们服务于相同的目的:验证见证。
| 布尔电路 | 算术电路 |
|---|
| 变量为0, 1 | 信号为数字 |
| 唯一的运算是AND, OR, NOT | 唯一的运算是加法和乘法 |
| 当输出为真时满足 | 当所有方程的左侧等于右侧时满足(没有输出) |
| 见证是使布尔电路满足的布尔变量的赋值 | 见证是使所有相等约束满足的信号赋值 |
2 Rank 1 Constraint System(R1CS)
这一节讲的是一种算数电路的约束。
可以回想一下数据库、编译原理里的各种约束。
就是把一个人类更易懂的表达,通过一种可以程序编码的方法,转换成一个更机器友好的形式。
R1CS是对算数运算的一种约束,要求一个等式里最多出现一次乘法。
例如:
z=2x2y+3x
不满足R1CS,需要改写成等价的两个等式:
v1z=2xx=v1y+3x
其中第二个式子可以改写成 z−3x=v1y ,改写后得到:
v1z−3x=2xx=v1y
将算数运算改写成符合R1CS约束的形式,是为了后续更方便的生成电路。
每个等式都形如:
多项式×多项式=多项式
由一系列等式组成的方程组,可以用线性代数抽象,得到矩阵形式的表达:
Oa=(La)∘(Ra)
其中,a 为见证向量(即输入的所有信号),运算 ∘ 表示逐元素相乘。在上述例子中:
a=1xyv1z
约定第一个元素是 1 用来表示常量运算。同理可以写出对应的系数:
OLR=[000−3001001]=[0020000100]=[0010010000]
最终,任意复杂的算数电路,都可以转换成符合R1CS约束的形式,变成4个向量的运算。
3 二次算数程序(QAP)
3.1 目的
R1CS 左右两侧的结果是一个向量:
Oa=(La)∘(Ra)
假设现在有 3 个约束,见证向量 4 维,展开:
O11O21O31O12O22O32O13O23O33O14O24O341a1a2a3=L11L21L31L12L22L32L13L23L33L14L24L341a1a2a3∘R11R21R31R12R22R32R13R23R33R14R24R341a1a2a3
其中 ∘ 表示逐元素相乘。
可见等式两边最终的结果是 4 维的向量。
要比较两个 n 维向量是否相等,最朴素的方法就是遍历,逐个对比。
因此,R1CS 验证需要遍历所有约束,时间复杂度是 O(n) 。
如果见证向量维度很大,验证的时间成本就会很高。
有没有方法快速验证?
3.2 Schwatz-Zippel引理
Schwatz-Zippel引理:如果有两个多项式 p(x) 和 q(x) ,他们的次数分别为 dp 和 dq ,并且 p(x)=q(x) ,那么 p(x) 与 q(x) 的交点数量**小于等于 **max(dp,dq) 。
该引理对于有限域中的多项式也成立。
这个引理其实挺符合直觉的,但是有什么用?举个例子:判断两个多项式是否相等。
理论上,我们得判断两个多项式的每个系数,时间复杂度是 O(d) 。
但是,在一个比较大的有限域上,随机取一个点,他们相交的概率非常小。几乎就可以通过随机取点以 O(1) 的时间复杂度判断。
进一步延伸:判断多项式相等→判断两个向量是否相等。
向量可以转换成多项式。
转换的方法有:
虽然转换和计算这个多项式仍然需要很多时间,但是验证者可以高速验证。
QAP里采用的转换方式是拉格朗日差值,为什么不直接把向量当做系数?
3.3 方法
将 R1CS 中的系数矩阵纵向拆分,每一列用拉格朗日差值得到一个多项式:
L=u1(x)l11l12l13l14u2(x)l21l22l23l24u3(x)l31l32l33l34u4(x)l41l42l43l44R=v1(x)r11r12r13r14v2(x)r21r22r23r24v3(x)r31r32r33r34v4(x)r41r42r43r44O=w1(x)o11o12o13o14w2(x)o21o22o23o24w3(x)o31o32o33o34w4(x)o41o42o43o44
每个矩阵向量乘积 La Ra Wa 的同态等价于以下多项式:
i=1∑4aiui(x)=a1u1(x)+a2u2(x)+a3u3(x)+a4u4(x)=u(x)i=1∑maivi(x)=a1v1(x)+a2v2(x)+a3v3(x)+a4v4(x)=v(x)i=1∑maiwi(x)=a1w1(x)+a2w2(x)+a3w3(x)+a4w4(x)=w(x)
4 可信设置