基于区块链的加密货币通过维护全球分布式但同步的分类账区块链来实现点对点电子价值转移。任何独立的观察者都可以验证区块链的当前状态以及分类帐上所有交易的有效性。在比特币中,这项创新要求交易的所有细节都是公开的:发送方、接收方和转账金额。一般来说,我们将支付的隐私分为两个属性:(1)匿名性,在交易中隐藏发送者和接收者的身份;(2)保密性,隐藏转移的金额。虽然比特币通过比特币地址与现实世界身份的不可链接性提供了一些弱匿名性,但它缺乏任何机密性。这对比特币来说是一个严重的限制,对于许多用例来说可能是禁止的。如果这意味着他们的工资发布在公共区块链上,员工是否愿意以比特币获得他们的工资?
为了解决交易金额的保密问题,Maxwell [Max16] 引入了机密交易(CT),其中涉及的每笔交易金额都使用对金额的承诺隐藏起来,不让公众看到。这种方法似乎阻止了区块链的公开验证;观察者无法再检查交易输入的总和是否大于交易输出的总和,以及所有交易值是否为正。这可以通过在每笔交易中包含机密交易有效性的零知识证明来解决。
当前关于 CT 零知识证明 [PBF] 的提议要么大得令人望而却步,要么需要可信的设置。两者都不是可取的。虽然可以使用简洁的零知识证明 (SNARK) [BSCG13,GGPR13],但它们需要可信设置,这意味着每个人都需要相信设置已正确执行。人们可以通过使用 STARK [BSBTHR18] 来避免可信设置,但由此产生的范围证明虽然渐近有效,但实际上比目前提出的解决方案还要大。
如本文所述,没有可信设置的简短非交互式零知识证明在加密货币领域有许多应用。在证明通过网络传输或长期存储的任何分布式系统中,简短证明了总体成本的降低。
应用
我们首先讨论 Bulletproofs 的几个应用程序以及特定于这些应用程序的相关工作。 其他相关工作在第 1.3 节中讨论。
机密交易和 Mimblewimble
比特币和其他类似的加密货币使用基于交易输出的系统,其中每笔交易完全花费之前未花费交易的输出。 这些未花费的交易输出称为 UTXO。
比特币允许将单个 UTXO 用于许多不同的输出,每个输出都与不同的地址相关联。 要花费一个 UTXO,用户必须提供一个签名,或者更准确地说是一个 scriptSig,使交易 SCRIPT 能够评估为真 [BMC`15]。
除了 scriptSig 的有效性外,矿工还验证交易是否花费了之前未花费的输出,并且输入的总和大于输出的总和
Maxwell [Max16] 引入了“机密交易”的概念,其中交易中的输入和输出金额隐藏在 Pedersen 承诺中 [P`91]。
为了实现公开验证,交易包含一个零知识证明,即提交输入的总和大于提交输出的总和,并且所有输出都是正的,即它们位于区间 [0,2n], 其中 2n 远小于组大小。
当前所有机密交易的实现 [Max16, MP15, PBF`, NM`16] 都使用提交值的range proof范围证明,其中证明大小在 n 中是线性的。
这些范围证明是机密交易规模的主要贡献者。 在当前的实现中 [Max16],只有两个输出和 32 位精度的机密交易是 5.4 KB 字节,其中 5 KB 分配给范围证明。
即使最近进行了优化,范围证明仍将占用 3.8 KB。
我们在第 6 节中展示了 Bulletproofs 大大改进了这一点,即使对于单个范围证明,同时以边际额外成本(64 字节)将范围证明精度加倍。
logarithmic proof对数证明的大小还使证明者能够聚合多个范围证明,例如对于具有多个输出的交易,转换为一个简短的证明。
使用 Bulletproofs,m 范围证明只是单个范围证明上的 O(log(m)) 附加群元素。这对于当前形式的机密交易已经很有用,因为大多数比特币交易都有两个或多个输出。
它还提供了一个有趣的机会,可以将来自不同方的多个范围证明聚合为一个证明,例如在 CoinJoin 交易中需要的证明 [Max13]。
在 4.5 节中,我们提出了一个简单有效的 MPC 协议,该协议允许多个用户使用单个聚合范围证明生成单个交易。
用户不必向任何其他参与者透露他们的机密交易价值。