承诺
承诺分为三个步骤:承诺,打开承诺,验证承诺。
承诺:承诺:发送方将某个值x封装为y发送给接收方。(1)发送方不能修改信封中的值(绑定性);(2)接收方无法知道x(隐藏性)。
打开承诺:发送方揭露x。
校验承诺:接收方校验打开的值x与y中封装的x是否相同。
承诺一个值
- 承诺:选择x,计算y=f(x),发送函数值y
- 打开承诺:发送原象x
- 校验承诺:函数一致性y=f(x)
对函数有一定要求:
- 函数求逆是 NP 困难的,需要指数时间暴力搜索。防止根据承诺值 y 计算 x。
- 但是校验简单,仅需要多项式时间计算复杂度。
- 该函数通常是哈希函数或 pedersen 承诺函数等。
承诺一个多项式
- 承诺:选择n+1个随机数a0,a1,...,an,构造多项式f(x)=Σi=0naixi,计算Ai=aiG, i=0,...,n,发送Ai
- 打开承诺:打开一个随机点k,计算f(k)=Σi=0naiki,发送(k,f(k))
- 校验承诺:基于Ai,校验(k,f(k))正确性,f(k)G=Σi=0n(kiAi)
如果攻击者不知道多项式,选择随机数作为函数值,则发生碰撞的概率可忽略。
因此,不必打开多项式所有系数,仅打开一个或多个函数点即可,从而减少发送数据。
此外,没泄露多项式,具有保密性。需要 n+1 个值,才会泄露多项式的系数。
哈希承诺
- 承诺:发送哈希值y
- 打开承诺:发送原象x
- 校验承诺:校验哈希一致性y=hash(x)
哈希函数求逆满足NP困难
Merkle承诺与Merkle证明
-
承诺:发送root
-
打开承诺:发送叶子节点xi和pathi,其中pathi是指兄弟节点
-
校验承诺:校验root=Merkle(xi,pathi)
问题:证明方证明知道每个叶子的值xi,i0=,..,2n
低效做法:
- 承诺:发送root
- 打开承诺:发送所有叶子节点xi
- 校验承诺:校验root=Merkle(x0,...,x2n)
高效做法:
-
承诺:发送root
-
打开承诺:发送叶子节点xi和pathi
-
校验承诺:校验root=Merkle(xi,pathi)
发送数据和校验复杂度均降低。
如果每个叶子的取值是 0 或 1,则 n 次均成功概率为1/2n 。
如果每个叶子的取值空间为m,则 n 次均成功概率为1/m20。
核心思想:从概率角度,不必打开全部叶子节点;仅需要打开 n 个点,如果每次都正确,则伪造成功概率指数降低。因此,验证方相信证明方知道所有叶子节点。
Sigma零知识证明中的承诺
承诺A=rG,挑战e,相应z=r+eω,校验zG=A+eQ
Pedersen承诺
初始化:椭圆曲线生成元为G,H,H=αG,其中α保密
- 承诺:Token数量为m和随机数为r,计算P=mG+rH,发送P
- 打开承诺:发送m和r
- 校验承诺:校验一致性P=mG+rH
Pedersen承诺的同态性
初始状态:A和B的余额密文是0
- C对m1个Token承诺:P1=m1G+r1H,接收地址为AddrAlice,然后签名广播。打开承诺:私底下保密发送m1,r1给A,A校验Pedersen承诺的一致性,且等交易单上链后,则收款成功
- D对m2个Token承诺:P2=m2G+r2H,接收地址为AddrAlice,然后签名广播。打开承诺:私底下保密发送m2,r2给A,A校验Pedersen承诺的一致性,且等交易单上链后,则收款成功
经过共识算法:矿工上链A余额密文:P1+P2=(m1+m2)G+(r1+r2)H
A知道秘密,m1+m2和随机数r1+r2,则A能花费该费用。
- A对m3个Token承诺:P3=m3G+r3H,接收地址为AddrBob,然后签名广播,打开承诺:私底下保密发送m3,r3给B,B校验Pedersen承诺的一致性,且等交易单上链后,则收款成功
经过共识算法:矿工上链A和B余额密文:
A:P1+P2−P3=(m1+m2−m3)G+(r1+r2−r3)HB:P3=m3G+r3H
- A知道(m1+m2−m3),(r1+r2−r3)可以继续支付
- B知道m3,r3也可以继续支付
如果α泄露:
A知道G,H之间的离散对数α,后果很严重。
真实情况,A拥有小金额m=10和随机数r,余额承诺为P=mG+rH
A能够计算α1,选择一个大金额m′=200000,计算随机数r′=r−(m′−m)α−1
- A支付m′个Token,支付承诺为P=m′G+r′H,接收地址为AddrBob,然后签名广播,打开承诺:私底下保密发送m′,r′给B,B校验Pedersen承诺的一致性,且等交易单上链后,则收款成功
经过共识算法:矿工上链B余额密文:P=m′G+r′H
m′G+r′H=m′G+(r−(m′−m)α−1)H=m′G+rH−m′α−1H+mα−1H=mG+rH=P
类似结论:zcash中各个生成元gi,hi之间的离散对数不能泄露