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

原文地址:https://www.cnblogs.com/hzcya1995/p/13312594.html