Try   HackMD

Inner Product Argument

https://dankradfeist.de/ethereum/2021/11/18/inner-product-arguments-mandarin.html

https://dankradfeist.de/ethereum/2021/06/18/pcs-multiproofs.html

https://eprint.iacr.org/2017/1066.pdf

符号约定

定义在

Fp 上的椭圆曲线群
G
,标量域为
Fr
,从
G
中选取两组独立的点作为 base:
G=(G1,G2,,Gn)

H=(H1,H2,,Hn)

两个向量的内积定义为:

ab=a,b=i=1naibi=a1b1+a2b2++anbn

问题

对于某

cFr,
CG
,证明者
P
需要说服验证者
V
P
知道两个向量
a=(a1,a2,,an)
b=(b1,b2,,bn)
,使得:
C=a,G+b,Handc=a,b

一个直观的想法是,

P 直接发送
a
b
V
,然后让
V
自行计算验证,但是这样通信量为
2n
Fr
的元素。验证者的工作至少是
2n
G
上的标量乘法。

通过 IPA,可以将通信量降低为

2log2n
G
上的点。验证者的工作没有特别降低,仍然
O(n)
G
上的标量乘法。

G,H 之后,新增另一个base,
UG
,然后问题转化为:

对于某

CG,证明者
P
需要说服验证者
V
P
知道两个向量
a=(a1,a2,,an)
b=(b1,b2,,bn)
,使得:
C=a,G+b,H+a,bU

协议描述

Commit

P 计算
C=aG+bH+ab U
并发送给
V

第一轮

假设

m=n2,令
aL=(a1,a2,,am)
aR=(am,am+1,,an)
,其他同理。

P

  • 计算:
  • zL=aRbL
  • zR=aLbR
  • CL=aRGL+bLHR+zLU
  • CR=aLGR+bRHL+zRU
  • 并将
    CL,CR
    发送给
    V

i

V:

  • 生成随机挑战值
    xFr
    ,发送给
    P
  • 自己计算:
  • C=xCL+C+x1CR
  • G=GL+x1GR
  • H=HL+xHR

P

  • 计算:
  • G=GL+x1GR
  • H=HL+xHR
  • a=aL+xaR
  • b=bL+x1bR

现在需要

P 证明
C=aG+bH+ab U

所有长度为前一轮的一半。然后替换:

C=C
G=G

H=H

a=a

b=b

如果此时

|a| 的长度不等于
1
,回到上一步;
否则这是最后一轮:

P:

  • 发送
    a=(a1),b=(b1)
    V

V:

  • 计算
    D=a1G1+b1H1+a1b1U
    ,如果
    D=C
    则接受,输出 True;否则拒绝,输出 False.

示例

问题

对于

CG
P
需要向
V
证明,
P
知道
a=(a1,a2)
b=(b1,b2)
, 使得
C=aG+bH+ab U=a1G1+a2G2+b1H1+b2H2+(a1b1+a2b2)U

Commit

P 计算
C
并发送给
P

第一轮

P

  • a
    中获取
    aL=(a1)
    aR=(a2)
  • b
    中获取
    bL=(b1)
    bR=(b2)
  • G
    中获取
    GL=(G1)
    GR=(G2)
  • H
    中获取
    HL=(H1)
    HR=(H2)
  • 计算
    CL=aRGL+bLHR+aRbL U=a2G1+b1H2+a2b1U
  • 计算
    CR=aLGR+bRHL+aLbR U=a1G2+b2H1+a1b2U
  • 并将
    CL,CR
    发送给
    V

第二轮

V:

  • 生成随机挑战值
    xFr
    ,发送给
    P
  • 自己计算:
  • C=xCL+C+x1CR
  • G=GL+x1GR=(G1+x1G2)
  • H=HL+xHR=(H1+xH2)

P:

  • 计算:
  • G=GL+x1GR=(G1+x1G2)
  • H=HL+xHR=(H1+xH2)
  • a=aL+xaR=(a1+xa2)
  • b=bL+x1bR=(b1+x1b2)
  • 长度为
    1
    ,这已经是最后一轮,发送
    a
    b
    V

V:

  • 计算

    D=aG+bH+abU=(a1+xa2)(G1+x1G2)+(b1+x1b2)(H1+xH2)+(a1+xa2)(b1+x1b2)U=(a1+xa2)G1+(a1x1+a2)G2+(b1+x1b2)H1+(b1x+b2)H2+(a1b1+a1x1b2+xa2b1+a2b2)U

  • C=xCL+C+x1CR=(xa2G1+xb1H2+xa2b1U)+(a1G1+a2G2+b1H1+b2H2+(a1b1+a2b2)U)+(x1a1G2+x1b2H1+x1a1b2U)=(a1+xa2)G1+(a2+a1x1)G2+(b1+x1b2)H1+(b2+xb1)H2+(xa2b1+a1b1+a2b2+x1a1b2)U=D

因此接受.

安全性分析

correctness

P 按照协议正确执行,那么
V
一定能够输出 True,因为

C 可以扩展为:
C=aG+bH+ab U=aLGL+aRGR+bLHL+bRHR+(aLbL+aRbR) U

如果

P 正确计算了
a
,
b
,
G
,
H
, 那么最后一轮
P
能够得出
D=C

D=aG+bH+abU=(aL+xaR)(GL+x1GR)+(bL+x1bR)(HL+xHR)+(aL+xaR)(bL+x1bR)U=aLGL+xaRGL+aLx1GR+aRGR+bLHL+xbLHR+x1bRHL+bRHR+(aLbL+xaRbL+x1aLbR+aRbR)U=(aLGL+aRGR+bLHL+bRHR+(aLbL+aRbR)U)+x(aRGL+bLHR+aRbLU)+x1(aLGR+bRHL+aLbRU)=C+xCL+x1CR=C

soundness

P 能否作恶来欺骗
V

假设

P 提交了
C=aG+bH+rU
,其中
rab

a=aL+xaR
b=bL+x1bR

G=GL+x1GR

H=HL+xHR

C=aG+bH+(xzL+r+x1zR)U

要想最后成功验证,第二轮的参数需要满足内积形式:

ab=xzL+r+x1zR
aLbL+aRbR+x1aLbR+xaRbL=xzL+r+x1zR

(aRbLzL)x2+(abr)x+(aLbRzR)=0

V 是在
P
承诺
r,zL,zR
后选取的随机
x
,因此上面等式成立的概率约为
2|Fr|
,是一个可以忽略的值。

性能优化

V 每轮都需要更新 base
G,H
,但是他其实只需要每轮把
xi
发送过去,只有最后的时候需要验证,因此可以把 base 更新放到最后,并且使用标量之间的运算替代中间步骤的 msm。

G:
(G1,G2,G3,G4,G5,G6,G7,G8)

H
:
(H1,H2,H3,H4,G5,H6,H7,H8)

(G1+x11G5,G2+x11G6,G3+x11G7,G4+x11G8)

(G1+x11G5+x21G3+x11x21G7,G2+x11G6+x21G4+x11x21G8)

G1+x31G2+x21G3+x21x31G4+x11G5+x11x31G6+x11x21G7+x11x21x31G8

fG(X)=j=0k1(1+xkj1X2j)

fG(X)
Xi
系数对应
Gi+1
的标量乘法。

fH(X)=j=0k1(1+xkjX2j)

fH(X)
Xi
系数对应
Hi+1
的标量乘法。

使用 IPA 验证多项式

承诺的计算

场景:

  • 验证
    f(x)=i=0n1aixi
    z
    处的取值。
  • a=(a0,a1,,an1)
    ,
    b=(1,z,z2,,zn1)
    ,则我们可以通过 IPA 验证承诺
    C
    具体“内积属性”。并且通过改进,还能验证
    f(z)=i=0n1aizi=ab
    的结果

内积属性的含义是:

C=aG+bH+abU

P:

  • 计算承诺
    F=aG
  • 发送承诺
    F
    V

V:

  • 发送自变量
    z
    P

P:

  • 计算
    y=f(z)
    ,发送
    y
    V

V:

  • 计算
  • C=aG+bH+abU=F+bH+yU
  • 因为
    b=(1,z,z2,,zn1)
    V
    来说是已知的。

这里有个问题,

P 可以作弊,比如他提交
F=aG+tU
,然后能够证明
f(z)=yt
。问题的来源是
P
在承诺的时候就知道了base
U
,因此
V
可以在收到
F
y
之后重新选择
U=wU
w
为一个随机标量。

  • 后面的交互式流程就和前面描述的 IPA 一样了。

优化

b=(1,z,z2,,zn1) 是已知的,可以参考前面对
G,H
的优化。由
fG(Z)
给出系数。

针对点值形式 evaluation format 的多项式

前面给出了系数形式的 IPA

虽然给定

n 个系数或者
n
个点都能唯一确定
n1
次多项式,但是点值形式转系数形式需要 FFT,有
O(nlogn)
次运算,并且要求定义域使用 Root of unity。否则是
O(n2)

为了避免这项开销,直接对值进行承诺:

F=f(x0)G0+f(x1)G1++f(xn1)Gn1
这表示
a=(f(x0),f(x1),f(x2),,f(xn1))

使用重心公式:

f(z)=A(z)i=0n1f(xi)A(xi)1zxi
如果我们选择
b
:
bi=A(z)A(xi)1zxi

就能得到

ab=f(z)

新场景

  • P
    知道
    a
    b
  • V
    知道
    b
    ,不知道(不想知道)
    a
  • base 为
    G=(G0,G1,,Gn1)
    U

过程:

  • Ca=aG
  • U=wU
  • C0=Ca+abU
  • CL1=aR0GL0+aR0bL0U
  • CR1=aL0GR0+aL0bR0U
  • C1=C0+x1CL1+x11CR1

一直到

k=logn:

  • ak=aLk1+xkaRk1
  • bk=bLk1+xk1bRk1
  • CLk=aRk1GLk1+aRk1bLk1U
  • CRk=aLk1GRk1+aLk1bRk1U
  • Ck=Ck1+xkCLk+xk1CRk

此外,

  • ak,Gk
    长度均为 1

Ca,ak,ab,CL,CR 发送给
V

V 验证:

  • Ck=Ca+abU+i=1k(xiCLi+xi1CRi)
  • Ck=?ak[0]Gk[0]+ak[0]bk[0]U

verify_multiexp:

  • i=1k(xiCLi+xi1CRi)+Ca+(abak[0]bk[0])Uak[0]Gk[0]=?0

G=(G0,G1,G2,,G255)
Cw=0255hiGi

h(x)=i=1255(hi1j255jixjij)

用 IPA 证明

h(4)=h4

asdfads

有两个数据 255,1,order+1

C1=0254HiGi+(order+1)G255
C2=0254HiGi+1G255