承诺

承诺分为三个步骤:承诺,打开承诺,验证承诺。

承诺:承诺:发送方将某个值xx封装为yy发送给接收方。(1)发送方不能修改信封中的值(绑定性);(2)接收方无法知道xx(隐藏性)。

打开承诺:发送方揭露xx

校验承诺:接收方校验打开的值xxyy中封装的xx是否相同。

承诺一个值

  • 承诺:选择xx,计算y=f(x)y=f(x),发送函数值yy
  • 打开承诺:发送原象xx
  • 校验承诺:函数一致性y=f(x)y=f(x)

对函数有一定要求:

  • 函数求逆是 NP 困难的,需要指数时间暴力搜索。防止根据承诺值 y 计算 x。
  • 但是校验简单,仅需要多项式时间计算复杂度。
  • 该函数通常是哈希函数或 pedersen 承诺函数等。

承诺一个多项式

  • 承诺:选择n+1n+1个随机数a0,a1,...,ana_0,a_1,...,a_n,构造多项式f(x)=Σi=0naixif(x)=\Sigma_{i=0}^na_ix^i,计算Ai=aiG, i=0,...,nA_i=a_iG,\ i=0,...,n,发送AiA_i
  • 打开承诺:打开一个随机点kk,计算f(k)=Σi=0naikif(k)=\Sigma_{i=0}^na_ik^i,发送(k,f(k))(k,f(k))
  • 校验承诺:基于AiA_i,校验(k,f(k))(k,f(k))正确性,f(k)G=Σi=0n(kiAi)f(k)G=\Sigma_{i=0}^n(k^iA_i)

如果攻击者不知道多项式,选择随机数作为函数值,则发生碰撞的概率可忽略。

因此,不必打开多项式所有系数,仅打开一个或多个函数点即可,从而减少发送数据。

此外,没泄露多项式,具有保密性。需要 n+1 个值,才会泄露多项式的系数。

哈希承诺

  • 承诺:发送哈希值yy
  • 打开承诺:发送原象xx
  • 校验承诺:校验哈希一致性y=hash(x)y=hash(x)

哈希函数求逆满足NP困难

Merkle承诺与Merkle证明

  • 承诺:发送rootroot

  • 打开承诺:发送叶子节点xix_ipathipath_i,其中pathipath_i是指兄弟节点

  • 校验承诺:校验root=Merkle(xi,pathi)root=Merkle(x_i,path_i)

image-20230803155735081

问题:证明方证明知道每个叶子的值xi,i0=,..,2nx_i,i0=,..,2^n

低效做法:

  • 承诺:发送root
  • 打开承诺:发送所有叶子节点xix_i
  • 校验承诺:校验root=Merkle(x0,...,x2n)root=Merkle(x_0,...,x_{2^n})

高效做法:

  • 承诺:发送rootroot

  • 打开承诺:发送叶子节点xix_ipathipath_i

  • 校验承诺:校验root=Merkle(xi,pathi)root=Merkle(x_i,path_i)

发送数据和校验复杂度均降低。

如果每个叶子的取值是 0 或 1,则 n 次均成功概率为1/2n1/2^n

如果每个叶子的取值空间为m,则 n 次均成功概率为1/m201/m^{20}

核心思想:从概率角度,不必打开全部叶子节点;仅需要打开 n 个点,如果每次都正确,则伪造成功概率指数降低。因此,验证方相信证明方知道所有叶子节点。

Sigma零知识证明中的承诺

image-20230803160409620

承诺A=rGA=rG,挑战ee,相应z=r+eωz=r+e\omega,校验zG=A+eQzG=A+eQ

Pedersen承诺

初始化:椭圆曲线生成元为G,H,H=αGG,H,H=\alpha G,其中α\alpha保密

  • 承诺:Token数量为m和随机数为r,计算P=mG+rHP=mG+rH,发送P
  • 打开承诺:发送m和r
  • 校验承诺:校验一致性P=mG+rHP=mG+rH

Pedersen承诺的同态性

初始状态:A和B的余额密文是0

  • C对m1m_1个Token承诺:P1=m1G+r1HP_1=m_1G+r_1H,接收地址为AddrAliceAddr_{Alice},然后签名广播。打开承诺:私底下保密发送m1,r1m_1,r_1给A,A校验Pedersen承诺的一致性,且等交易单上链后,则收款成功
  • D对m2m_2个Token承诺:P2=m2G+r2HP_2=m_2G+r_2H,接收地址为AddrAliceAddr_{Alice},然后签名广播。打开承诺:私底下保密发送m2,r2m_2,r_2给A,A校验Pedersen承诺的一致性,且等交易单上链后,则收款成功

经过共识算法:矿工上链A余额密文:P1+P2=(m1+m2)G+(r1+r2)HP_1+P_2=(m_1+m_2)G+(r_1+r_2)H

A知道秘密,m1+m2m_1+m_2和随机数r1+r2r_1+r_2,则A能花费该费用。

  • A对m3m_3个Token承诺:P3=m3G+r3HP_3=m_3G+r_3H,接收地址为AddrBobAddr_{Bob},然后签名广播,打开承诺:私底下保密发送m3,r3m_3,r_3给B,B校验Pedersen承诺的一致性,且等交易单上链后,则收款成功

经过共识算法:矿工上链A和B余额密文:

A:P1+P2P3=(m1+m2m3)G+(r1+r2r3)HB:P3=m3G+r3HA:P_1+P_2-P_3=(m_1+m_2-m_3)G+(r_1+r_2-r_3)H\\ B:P_3=m_3G+r_3H

  • A知道(m1+m2m3),(r1+r2r3)(m_1+m_2-m_3),(r_1+r_2-r_3)可以继续支付
  • B知道m3,r3m_3,r_3也可以继续支付

如果α\alpha泄露:

A知道G,HG,H之间的离散对数α\alpha,后果很严重。

真实情况,A拥有小金额m=10m=10和随机数rr,余额承诺为P=mG+rHP=mG+rH

A能够计算α1\alpha^{_1},选择一个大金额m=200000m^{\prime}=200000,计算随机数r=r(mm)α1r^{\prime}=r-(m^{\prime}-m)\alpha^{-1}

  • A支付mm^{\prime}个Token,支付承诺为P=mG+rHP=m^{\prime}G+r^{\prime}H,接收地址为AddrBobAddr_{Bob},然后签名广播,打开承诺:私底下保密发送m,rm^{\prime},r^{\prime}给B,B校验Pedersen承诺的一致性,且等交易单上链后,则收款成功

经过共识算法:矿工上链B余额密文:P=mG+rHP=m^{\prime}G+r^{\prime}H

mG+rH=mG+(r(mm)α1)H=mG+rHmα1H+mα1H=mG+rH=Pm^{\prime}G+r^{\prime}H=m^{\prime}G+(r-(m^{\prime-m})\alpha^{-1})H\\ =m^{\prime}G+rH-m^{\prime}\alpha^{-1}H+m\alpha^{-1}H\\ =mG+rH=P

类似结论:zcash中各个生成元gi,hig_i,h_i之间的离散对数不能泄露