zoukankan      html  css  js  c++  java
  • RangeProof范围证明

    Pedersen Commitment对应C = r*G + v*H;

    将金额v表示成二进制形式:v = bn…b2,b1,b0,bi属于{0、1};

    将私钥r对应拆分为n个随机数分片之和:r = an…+ a2 + a1;

    将C对应拆分为n个Ci分片之和:C = Cn…+C2+C1; 其中Ci = ai*G + bi*(2^i)*H;

    取Ci、Ci – (2^i)*H为环签名的公钥集,则当bi = 0时,Ci = ai*G,bi = 1时,Ci – (2^i)*H = ai*G;

    两者必然有一个等于ai*G,被选择为环签名的真正的密钥对<ai, ai*G>,进行环签名,形成n个2元环签名,也就证明了v的二进制数值长度为n的正整数。验证者并不知道2元环签名中哪一个是真正的密钥对,因此无法推导出bi究竟是1还是0。

    矿工只需进行两步验证:1、Ci之和是否等于C;2、各个环签名是否正确;

    范围证明技术只认无符号正整数,假设采用8bit无符号整数表达金额,若v为负数(-1),那么在补码表示法中,高位全部都是1,v就会被误认为是255进行处理,这就会导致C = Cn…+C2+C1不能成立,无法通过验证,这就确保了v的值没有二意性,只能为正整数。

    Bulletproofs RangeProof

    是输入的金额(原始消息)

    Comm 是用普邓森见证加密的密文(根据原始消息 + 随机数得到)

    对 v 进行左、右简单处理,之后用普邓森见证加密(新原始消息 + 新随机数),得到 A,散列哈希得到 Cy

    随机数 S 也是用普邓森见证生成的,主要是方便后续使用,散列哈希得到 Cz

    T1、T2,原理相同,都是使用普邓森见证生成的,主要是方便后续使用,它们两者散列哈希得到 Cx

    内积(略)

    Tau,Th 展开的多项式

    Mu,随机数 & Cx (即 T1、T2)得到

    type RangeProof struct {

    Comm ECPoint 密文1

    A ECPoint 密文2

    S ECPoint 随机数1

    T1 ECPoint 随机数2

    T2 ECPoint 随机数3

    Tau *http://big.Int 密文3

    Th *http://big.Int 密文4

    Mu *http://big.Int 随机数5

    IPP InnerProdArg 密文6

    // challenges

    Cy *http://big.Int 指纹1

    Cz *http://big.Int 指纹2

    Cx *http://big.Int 指纹3

    }

    普邓森见证

    散列哈希

    A => Cy

    S => Cz

    T1, T2 => Cx

    普邓森见证(机密交易),多项式扩展

    Tau, Th => lhs

    Comm => rhs

    内积 = 展开的多项式

    内积,内乘积(也可分为3步)

    Th, IPP; A, S, Mu

    Mu, IPP => InnerProductVerifyFast

  • 相关阅读:
    8_python连接数据库
    7_数据类型
    Memcached delete 命令
    Memcached gets 命令
    Memcached get 命令
    Memcached CAS 命令
    Memcached prepend 命令
    Memcached append 命令
    Memcached replace 命令
    Memcached add 命令
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312594.html
Copyright © 2011-2022 走看看