不好意思,停更好长时间了。这几天有空,快点继续更新。
前一篇文章(https://learnblockchain.cn/article/1158 )介绍了Monero的核心技术之一——环签名的一部分,这篇来介绍Monero隐藏交易数额的技术。
在以比特币为代表的UTXO交易模型中,普通交易中包括支付给矿工的手续费在内,不产生多余数额的币,交易输入与输出相等。由于比特币之类的UTXO时可以将交易中UTXO的数额显式地展现出来,矿工可以验证交易输出的数额不大于输入的数额即可。但是在隐私交易的需求下,验证交易数额的合法性变得较为复杂。退一步来想这个问题,实际上矿工只是想知道交易是否符合“输出的数额不大于输入的数额”这一要求(一般看是否相等),而并不必知道具体的数额是多少。换句话说,关于交易数额,矿工知道的比他想要知道的多,这也就是其中的gap。合理切割”矿工欲知“与”矿工所知“是隐藏交易数额的方法。
1. 简单加密数额
这里用到的方法与前文对一次性密钥中的噪声项处理方法相似,都是将数额字段加密。由于该加密方式具有加法同态性,对于输入、输出的数额密文字段作减法(减法可以看成加法),比较减法之后的结果是否为0的密文即可判断交易数额是否合法。具体做法是,在UTXO中使用字段
2. 盲化数额
以上的简单加密数额,并没有真正隐藏住UTXO的数额。详细来说,因为数额空间较小。以比特币为例,全网总共21,000,000BTC,以最小计量单位聪(Satoshi)来计算,总共枚Satoshi。恶意观察者可以让取遍所有可能的数额计算并比对UTXO中的数额字段,可以获UTXO被隐藏的数额。因为数额空间有限,可以在暴力搜索范围了。所有以上的方案并没有真正地隐藏数额字段。
3. 数额承诺的证明
盲化了数额字段之后,矿工简单地求交易输入输出金额字段的代数和已经不能验证交易过程没有产生多余的金额了。仍以上述二进三出的交易为例,其交易输入输出代数和
注意,这里发送人在构建交易时,组装数额承诺需要用到交易输入所对应的盲化因子和数额明文。这些都是需要从上一笔交易中获得,所以交易是需要将盲化因子和交易数额秘密传递给接收人,以便接收人可以顺利构建下一笔交易,花出UTXO。
4. 数额字段的秘密传递
由于在介绍地址那一节中提到,为了让接受人知道一次性公钥,采用了DH秘密交换的方式将随
总结,本文主要介绍Monero币用“Pedersen承诺+签名技术”来隐藏用户交易数额的隐藏问题的一部分。