Monero技术详解(四):隐藏交易数额之Pederson承诺

  • victorsun
  • 更新于 2020-07-09 17:10
  • 阅读 5390

Monero隐藏用户交易数量技术之一——Pedersen承诺

系列导航: Monero技术详解(一):技术方案总览 Monero技术详解(二):一次性地址 Monero技术详解(三):核心技术——环签名(1) Monero技术详解(四):隐藏交易数额之Pederson承诺


不好意思,停更好长时间了。这几天有空,快点继续更新。

前一篇文章介绍了Monero的核心技术之一——环签名的一部分,这篇来介绍Monero隐藏交易数额的技术。

在以比特币为代表的UTXO交易模型中,普通交易中包括支付给矿工的手续费在内,不产生多余数额的币,交易输入与输出相等。由于比特币之类的UTXO时可以将交易中UTXO的数额显式地展现出来,矿工可以验证交易输出的数额不大于输入的数额即可。但是在隐私交易的需求下,验证交易数额的合法性变得较为复杂。退一步来想这个问题,实际上矿工只是想知道交易是否符合“输出的数额不大于输入的数额”这一要求(一般看是否相等),而并不必知道具体的数额是多少。换句话说,关于交易数额,矿工知道的比他想要知道的多,这也就是其中的gap。合理切割”矿工欲知“与”矿工所知“是隐藏交易数额的方法。

1. 简单加密数额

这里用到的方法与前文对一次性密钥中的噪声项处理方法相似,都是将数额字段加密。由于该加密方式具有加法同态性,对于输入、输出的数额密文字段作减法(减法可以看成加法),比较减法之后的结果是否为0的密文即可判断交易数额是否合法。具体做法是,在UTXO中使用字段$C \leftarrow C(a) = aG $来表示数额。

以输入为2笔UTXO、输出为3笔UTXO的交易为例,输入的$C_1^{in} = a_1G$,$C_2^{in} = a_2G$,输出为$C_1^{out} = b_1G$,$C_2^{out} = b_2G$,$C_3^{out} = b_3G$,在考虑到输入输出数额相等的条件下$a_1 + a_2 = b_1 + b_2 + b_3$,必然会成立$(C_1^{in} + C_2^{in}) -(C_1^{out} + C_2^{out} + C_3^{out}) = 0G$ ,可以以此来判断交易数额的合法性(为简单起见,暂未考虑手续费问题)。实际上矿工也是可以通过这种简单的验证来确定交易过程没有产生多余的数额。

2. 盲化数额

以上的简单加密数额,并没有真正隐藏住UTXO的数额。详细来说,因为数额空间较小。以比特币为例,全网总共21,000,000BTC,以最小计量单位聪(Satoshi)来计算,总共$2.1\times 10^{15}$枚Satoshi。恶意观察者可以让$a$取遍所有可能的数额计算并比对UTXO中的数额字段,可以获UTXO被隐藏的数额。因为数额空间有限,可以在暴力搜索范围了。所有以上的方案并没有真正地隐藏数额字段。

在上面的方案的基础上,盲化数额密文字段。取另外一个椭圆曲线的另一个生成元$H$,选取随机数$x$作为随机数,UTXO的数额字段取$C \leftarrow C(x, a) = xG + aH$。由于$x$的随机性,无法使用上面提到的暴力破解的方式来获取真正的数额。实际上这是Pedersen承诺。

另一问题,从信息论上来说,由于$x$的随机性,$C$可以解释为任何数额的“密文”(实际上并不能像之前一样称为密文,应称为对于数额的承诺)。并且掌握$H$与$G$之间的关系,可将$C$解释称任意数额。具体地来说,假设$H = \gamma G$,其中$\gamma$被掌握,$C = xG + aH = (x + (a-a')\gamma)G + a'H$,这样$C$可以结束为任意的数额$a’$(因为解密不具有唯一性,所以不能称为密文)。所有为了消除获取$\gamma$的可能,令$H \leftarrow \mathcal{H}_p(G)$,伪随机地取曲线上的一点作为生成元。这个hash函数将椭圆曲线上点映射到椭圆曲线上点。

3. 数额承诺的证明

盲化了数额字段之后,矿工简单地求交易输入输出金额字段的代数和已经不能验证交易过程没有产生多余的金额了。仍以上述二进三出的交易为例,其交易输入输出代数和 $$ \Sigma = (C_1^{in} + C_2^{in}) -(C_1^{out} + C_2^{out} + C_3^{out}) = ((x_1+x_2)-(y_1+y_2+y_3))G + ((a_1+a_2)-(b_1+b_2+b_3))H $$ 若$a_1 + a_2 = b_1 + b_2 + b_3$,则$\Sigma = ((x_1+x_2)-(y_1+y_2+y_3))G \neq 0$ ,不能验证交易金额总额不变。需要交易发起者额外证明。

由于交易发送人具有$x_1,x_2$(从上一次交易中秘密获取),交易构建时发送人输入交易金额$y_1,y_2,y_3$,可以$k\leftarrow ((x_1+x_2)-(y_1+y_2+y_3))$为私钥的签名,以$\Sigma$为公钥,来作签名$\sigma_c$来证明数额总和在交易前后未变化。这个签名的验证用公钥$\Sigma \leftarrow ((C_1^{in} + C_2^{in}) -(C_1^{out} + C_2^{out} + C_3^{out})) $来验证这个签名的合法性,如果签名正确,那么总数额交易前后未变化,否则数额不正确,交易非法。因为如果交易前后数额总和不一致,令$\delta \leftarrow ((a_1 + a_2) - (b_1 + b_2 + b_3))$,$\Sigma = ((x_1+x_2)-(y_1+y_2+y_3))G + \delta H$,由于发送人没有$\gamma$,无法作出可通过公钥$\Sigma$验证的签名。

注意,这里发送人在构建交易时,组装数额承诺需要用到交易输入$C_1^{in},C_2^{in}$所对应的盲化因子$x_1,x_2$和数额明文$a_1,a_2$。这些都是需要从上一笔交易中获得,所以交易是需要将盲化因子和交易数额秘密传递给接收人,以便接收人可以顺利构建下一笔交易,花出UTXO。

4. 数额字段的秘密传递

由于在介绍地址那一节中提到,为了让接受人知道一次性公钥,采用了DH秘密交换的方式将随机数$R = rG$传递给接收人,交易发送人和接收人共享了秘密$rK^v = k^vR$,可用该共享的秘密来将盲化因子和交易数额传递给接受人。将噪声项$\mathcal{H}_n(rK)$,

总结,本文主要介绍Monero币用“Pedersen承诺+签名技术”来隐藏用户交易数额的隐藏问题的一部分。

点赞 1
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
victorsun
victorsun
江湖只有他的大名,没有他的介绍。