Appearance
Sum-Check & GKR
- Formal Verification of the Sumcheck Protocol
- Algebraic Methods for Interactive Proof Systems
- Proofs, Arguments, and Zero-Knowledge
- A GKR Tutorial
- Sum-Check: The Backbone of ZK Proofs
Intro
Sumcheck 是一种交互式的ZKP scheme.
Multivariate and multilinear polynomials
多变量多项式,形如:
的被称为多变量多项式,注意这些运算都是在有限域
multilinear polynomials 是一种特殊形式,其中所有的元素
布尔 hypercube
一个n维的hypercube包含所有的二进制点集,例如在三维中,
而对于多项式在hypercube上的估值,假设我们有一个三变量多项式
f(0, 0, 0) + f(0, 0, 1)
+ f(0, 1, 0) + f(0, 1, 1)
+ f(1, 0, 0) + f(1, 0, 1)
+ f(1, 1, 0) + f(1, 1, 1)这样求值后,就会得到
Equality function
eq是一个元素需要在
, if , if
Its multilinear extension over a field
The formula says if each bit of
- If
and : (Match) - If
and : (Match) - If
and : (Mismatch) - If
and : (Mismatch)
After we multiply all the terms, if the final result is 1 then it means all the terms are in "Match" state.
Sum-Check Protocol
假设我们有一个v变量多项式
在这里,
简单地说,就是 P 要证明这个求和是正确的,Sum-Check 可以使得 V 只需要检查 吐槽,感觉evaluate的翻译真不如改成赋值
Start-up
P发送一个值
Round 1
P 发送一个一元多项式,其形式为:
这里,小写部分表示此元素按
下面以一个二元多项式为例:
在这里,显然
并且声称
并且我们把正确的情况可以简化表示为
然后,V 检查
一旦通过,V 还要再选择一个在
Round j
记住我们在上一轮选取的随机值
然后V 进行检查并生成一个新的随机值
就这样不断递归运行
check:
Round v
直到运行到
此时,直接检查:
一个三变量的示例
Start-up
在Hypercube上,这个多项式的求和为:
Round 1
P计算
V检查
Round 2
P计算
V 检查
通过,选择随机值
Round 3
P 计算多项式
V 检查
V 选择随机值
如果检查都通过,则 V 接受证明
Sage Code
python
# Start-up
# 定义伽罗瓦域 GF(17)
F = GF(17)
# 这里设置 x1 , x2, x3
T.<x1,x2,x3> = F[]
Rx.<x> = F[]
# 定义多项式 g
g = 2*x1^3+x1*x2 + x2*x3
print("多项式 g:", g)
# 生成 维度为 3 的 hypercube
import itertools
dimention = 3
cube = list(itertools.product([0,1], repeat=dimention))
print("hypercube:", cube)
# 计算在Hypercube上的和H
H = sum([g(i) for i in cube])
print("H =", H )
"""
多项式 g: 2*x1^3 + x1*x2 + x2*x3
hypercube: [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
H = 12
"""python
# Round 1
# 计算多项式 g1(X_1)
g1 = sum([g(x1, x2, x3) for x2,x3 in itertools.product([0,1], repeat=2)])
print("多项式 g1(X_1)=", g1)
# 转换g1到单变量多项式
g1 = Rx(g1(x,0,0))
# 检查 g1(0) + g1(1)
sum_check = g1(0) + g1(1)
print("g1(0) + g1(1) =", sum_check)
assert(sum_check == H)
# 检查通过,选择随机值r1 = 2
# 一般来说可以使用 F.random_element() 来选择随机值
r1 = 2
"""
多项式 g1(X_1)= 8*x1^3 + 2*x1 + 1
g1(0) + g1(1) = 12
"""python
# Round 2
# 计算多项式 g2(X_2)
g2 = g(r1, x2, 0) + g(r1, x2, 1)
print("多项式 g2(X_2):", g2) # 注意这里是在 GF(17) 上的形式,所以输出和文章表述不一致
# 转换g2到单变量多项式
g2 = Rx(g2(0,x,0))
# 检查g2(0)+g2(1) == g1(r1) == 69 == 1 mod 17
left = g2(0) + g2(1)
right = g1(r1)
print("g2(0) + g2(1) =", left)
print("g1(r1) =", right)
# 选择 随机值 r2 = 3
r2 = 3
"""
多项式 g2(X_2): 5*x2 - 2
g2(0) + g2(1) = 1
g1(r1) = 1
"""python
# Round 3
# 计算多项式 g3(X_3)
g3 = g(r1, r2, x3)
print("多项式 g3(X_3):", g3)
# 转换g3到单变量多项式
g3 = Rx(g3(r1,r2,x))
# 检查 g3(0) + g3(1) == g2(r2)
left = g3(0) + g3(1)
right = g2(r2)
print("g3(0) + g3(1) =", left)
print("g2(r2) =", right)
# 最后选取 r3 = 6
r3 = 6
# 检查g3(r3) == g(r1, r2, r3)
left = g3(r3)
right = g(r1, r2, r3)
print("g3(r3) =", left)
print("g(r1, r2, r3) =", right)
"""
多项式 g3(X_3): 3*x3 + 5
g3(0) + g3(1) = 13
g2(r2) = 13
g3(r3) = 6
g(r1, r2, r3) = 6
"""GKR Protocol
假设 P 要向 V 证明 对于一个 在