https://medium.com/coinmonks/zero-knowledge-proofs-um-what-a092f0ee9f28
Pedersen 承诺是一种加密算法,它允许证明者在不透露或无法更改它的情况下承诺某个值。
当您花费Token时,您花费的输入值和您发送的输出值被加密并且对每个人(每个输出的接收者除外)都是不透明的。 Pedersen的承诺允许您发送Token,而无需透露交易的价值。
Pedersen 承诺的核心公式:
其中,c为生成的承诺值,g, h 为椭圆曲线上的生成元,v为原始信息,r为盲因子。由于g, h 为椭圆曲线上的生成元,因此 可以视为公钥。同理,v, r也可以视为私钥。
由于盲因子r是一个随机数,因此针对相同的 v 也会产生不同的承诺 c,从而提供了信息论安全的隐藏性。这一点类似 ECDSA、Schnorr 签名采用的手法。
Pedersen 承诺的构造分为 3 个阶段:
- 初始阶段:选择阶为大素数 q 的乘法群G、生成元g 和 h,公开元组 ( g , h , q ) ;
- 承诺阶段:承诺方选择随机数r作为 盲因子,计算出 承诺值 c后发送给接收者;
- 打开阶段:承诺方发送 ( v , r ) 给接收者,接收者验证 c是否等于$(gv + hr)$ 如果相等则接受承诺,否则拒绝承诺。
Pedersen 同态性:
Pedersen 承诺的同态性是指,如果$c_1,c_2$分别使用盲因子$r_1,r_2$对密文$v_1,v_2$计算承诺,那么$c_1*c_2$可以有盲因子$r_1+r_2$对密文$v_1+v_2$计算得到。 这是因为:$r_3=r_1+r_2$
Pedersen承诺的应用
- 恒等关系验证
!https://pic3.zhimg.com/80/v2-d4dc9d7f1b0213943f7e1c4a50c36fea_720w.webp
只要第一个数等于后两个数之和,验证者不会看到交易量具体值,但是又不得不承认A真的分了一部分钱给B,然后还有一部分钱又退回给了A。这样既隐藏了数据本身,又证明了数据的关系。虽然Pederson承诺证明了数字之间的关系,但是并没有限制任何数字的取值区间,因此还需要对隐藏的数值进行范围证明!
刚才我们说了Pddersen在不泄漏转账数字的情况下可以把交易这个活干了,他是怎么实现的呢?
首先是一个等式,大家想想看,如果我有8个mw 币 ,给你转了6个,1个是找零,还有1个是矿工费用
这个等式为 8 - 6 =1 + 1,这个对吧?把P承诺公式套进来尝试看一下它的交易逻辑!
左上角的那个是传统的UTXO,一个UTXO 5个token,一个UTXO 3个Token ,如果Alice想给Bob转6个Token,找零1个,交易费1个。左下角那个图是MW里的交易过程,看不到数额,右边2个图是Alice 在MW里转移6个Token 给Bob的过程,这里面利用了前面说的Pederson等式!
- Cin1 = r1G + 5H (r1是Alice的私钥 5是数量), 同理Cin2 = r2G + 3H, 5 和3即为Alice持有的token数量
- C change (找零) = r3G + 1H, r Alice = r1 + r2 - r3(加加减减还是一堆秘钥,不告诉你就破解不了)
- 对于Bob来说,他利用自己的私钥r4 和G, H还有他要收到数量6一样生成个Pedersen等式,在生成一个K,利用r alice 和自己的r4 产生的,每一个交易都会产生这么个东西,留着给矿工用。
- 大家回过头来看看,Bob知道r alice的结果,但是解不出来 r1 r2 和r3,即他不知道Alice的秘钥,或者你再给其一个系数G,变成Ralice=r alice *G,离散对数里的方程,假如已知 R 和G,你是计算不出来r alice的。
- Bob可以检查等式两边是否相等,同样矿工利用公布出来的数据也可以检查两边的数据是否相等,也不需要知道里边的秘钥细节,总之out=in+找零 相等就行了。