零知识证明(十)——私密交易构建中

223 阅读2分钟

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

有帮助的话请点个赞吧~

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

私密交易

回顾一下——

  • 一个payeR发起一笔私密交易,他要向payeE付款,他将发送一个加密的数据包到世界(全网),里面是交易双方的身份,以及密文的交易金额、购买数量等数值内容;

  • 此外,他还需附加三个公开的证明内容,供其他所有人查验:

    • Pederson承诺:证明输入输出的数学关系;
    • 区间证明:证明输入输出均为正数;
    • 所有权证明:证明R的账户里有钱。 image.png
  • 之前证明了输入输出的数学关系,但是也发现了要是输出个负数会出大问题,所以就来个区间证明来控制R操作的都是正数。

区间证明Rangeproof

  • 这里要用到算术电路。
  • 想要证明数字nn是一个正整数,根据计算机系统字长,可以把问题转化为证明n{0,2256}n\in\{0,2^{256}\}
    • 如果用之前约束0和1的方式构建一个的多项式,就是n×(n1)××(n2256)n\times(n-1)\times\dots\times(n-2^{256}),那算术电路里要放22562^{256}个乘法门,电路复杂度大到不可估量……
    • 那换二进制思路,把nn拆成256位,只要每一位都是0011也能达到同样的目的,判断每一位ni (i{0,,255})n_i\ (i\in\{0, \dots, 255\})需要一个乘法门(如图),那就只需要256256个乘法门,复杂度一下就降了好多。
      image.png
  • 通过256256个二进制取值约束电路限制了nn为正整数之后,还要证明一下,刚才取值约束用到的每一位还能拼回去变回nn,也就是20×n0+21×n1++2255×n255n=02^0\times n_0+2^1\times n_1+\dots+2^{255}\times n_{255}-n=0
    image.png
    • 这里面需要257257个乘法门。
  • 然后把上面两组电路拼起来就可以完成区间证明啦
    • 输入的内容是nnni (i{0,,255})n_i\ (i\in\{0, \dots, 255\}),前者输入第二个电路,后者输入两个电路;
    • 输出为0则证明了nn可以被256位二进制数表达,且这256位或0或1的数确实是nn拆出来的。

参考

[1] 浅谈零知识证明之二:简短无交互证明(SNARK)_安比实验室SECBIT的博客-CSDN博客

【和4月say bye啦、话说忙碌到完全没有放假的感觉】

欢迎指正与讨论!