零知识证明(九)——私密交易构建上

357 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

有帮助的话请点个赞吧~

用一笔私密交易展现一种比特币交易过程,本篇主要介绍pederson证明。

私密交易Confidential Transaction

  • 一个payeR发起一笔私密交易,他要向payeE付款,他将发送一个加密的数据包到世界(全网),里面是交易双方的身份,以及密文的交易金额、购买数量等数值内容;
  • 此外,他还需附加三个公开的证明内容,供其他所有人查验:
    • Pederson承诺:证明输入输出的数学关系;
    • 区间证明:证明输入输出均为正数;
    • 所有权证明:证明R的账户里有钱。

image.png

Pederson承诺

  • 这里是基于同态加密实现的,需要一个满足加法同态的加密算法E,也就是说明文的相加得到的结果和密文相加得到的结果解密相同,即a+b=Dec(Enc(a)+Enc(b))a+b=Dec(Enc(a)+Enc(b))
  • 假如R账户余额为100,要付给E的金额为10,找零就是90,那么他向交易输入Enc(100)Enc(100),输出Enc(10)Enc(10)给E、输出Enc(90)Enc(90)给R(找零给自己)。
    • 外界将看到三个乱码,但是他可以算出输出的两个乱码Enc(10)Enc(10)Enc(90)Enc(90)相加等于输入的乱码Enc(100)Enc(100),因而虽然他不知道具体金额,但他不得不相信这笔交易的输入输出之间的数学关系没问题。
    • 将具体数字通用化,该过程如图: image.png
      • 其中Enc(balance)=Enc(change)+Enc(price)Enc(balance)=Enc(change)+Enc(price)
  • 这个过程通常使用基于椭圆曲线的加密方法,也就是基于离散对数困难问题。但是过程重点在于生成一个承诺,所以是无需解密的。
    • 在椭圆曲线密码学场景下,承诺生成公式可以表示为c=ran×G+data×Hc=ran\times G+data\times H
      • 其中GGHH为特定椭圆曲线的生成元;datadata为要加密证明的数据信息;ranran为一个随机数,保证对同一个datadata生成的承诺不相同;
    • 对上述的balance,change,pricebalance, change, price分别生成上述的证明Cb,Cc,CpC_b, C_c, C_p,然后验证Cb=Cc+CpC_b=C_c+C_p是否成立。
      • 过程中需要注意生成CbC_b时所用到的ranbran_b并不是随机生成的,而是另外两个证明中随机数的和,即ranb=ranc+ranpran_b=ran_c+ran_p
      • 此时可以推导一下证明:
        Cb=ranb×G+balance×HC_b=ran_b\times G+balance\times H
           =(ranc+ranp)×G+(change+price)×H\quad\ \;=(ran_c+ran_p)\times G+(change+price)\times H
           =(ranc×G+change×H)+(ranp×G+price×H)\quad\ \;=(ran_c\times G+change\times H)+(ran_p\times G+price\times H)
           =Cc+Cp\quad\ \;=C_c+C_p
  • 这里用来约束加法关系,那其实换个乘法同态方法,也可以验证乘法等各种更为复杂的约束。

问题

  • Pederson承诺只能约束数值之间的数学关系,并不能约束数据本身的合法性。
    • 比如说R输入他的余额,但是输出给E的内容是一个负数,那么找零给自己的反而还多了,这也就是一个非法印钞的过程;
    • 再比如R随便输入一个数,正常输出给E金额,然后把剩下的钱找给自己,那R简直是人有多大胆找零有多长,这是个偷偷铸币的过程。
  • 区间证明和所有权证明就是用来解决上述两个问题的,具体后面的文章。

参考

[1] 浅谈零知识证明之二:简短无交互证明(SNARK)_安比实验室SECBIT的博客-CSDN博客
[2] 区块链中的数学 - Pedersen承诺 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn)

【接着改论文去了、今天谈崩了一笔小生意状态奇差嘤嘤嘤】


欢迎指正与讨论!