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
v 是输入的金额(原始消息)
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