虽然中本聪 白皮书 暗示隐私是比特币协议的设计目标,区块链分析通常会破坏用户的隐私。这是个问题。比特币用户可能不一定希望全世界知道他们的钱花在哪里,他们的收入或拥有的数量,而企业可能不想将交易详细信息泄露给竞争对手—仅举一些例子.
但是有一些重新获得隐私的解决方案,例如CoinJoin。当今可用的一些最受欢迎的混合解决方案都使用此技巧,包括Wasabi Wallet(利用ZeroLink)和Samourai Wallet(利用Whirlpool)。在这两种情况下,用户都将其硬币切成相等的数量,以将它们彼此混合。等量使用被认为是有效混合的关键步骤.
这个迷你系列的第一部分介绍了比特币现金正在开发的一种名为CashFusion的新混合协议,该协议挑战了成功进行混合必须有相等数量的假设.
但即使在2017年, 纸 亚琛工业大学和卡尔斯鲁厄理工学院的研究人员深入分析了非等额CoinJoin的隐私,提出了一种无需使用等量即可通过CoinJoin获得隐私的解决方案:背包混合.
作者的注释:如果您不知道什么是CoinJoin交易,或者为什么要假设需要进行等量的混合,则应首先阅读本微型丛书的第1部分-或至少阅读该文章的前两部分.
混合付款
如本微型系列文章的第1部分所述,等量比特币混合可能在当今的比特币区块链上提供最佳可实现的隐私。但这确实给用户带来了不平等变化的输出。它们不能提供相同级别的隐私,甚至可能会带来隐私风险。 CashFusion可以帮助应对这些不平等的产出.
但是还有另一个问题。使用相等金额的要求会阻止用户通过CoinJoin交易进行实际付款:商家不太可能会在CoinJoin中收取确切的金额。因此,等额的CoinJoins实际上仅用于混合*:参与者投入资金并取回相同数量的资金。不幸的是,这意味着混合需要额外的区块链交易,这会花费交易费和时间.
亚琛工业大学的研究员Felix Konstantin Maurer,Till Neudecker和Martin Florian(卡尔斯鲁厄理工学院)都在2017年题为“具有任意值的匿名CoinJoin交易.他们提出了CoinJoin解决方案,该方案可能对实际付款有用-也就是说,它使用不相等的金额-同时仍提供隐私保护.
以 背包问题, 他们的解决方案称为背包混合.
背包混合
像CashFusion一样,背包混合背后的核心思想是生成一个CoinJoin交易,该交易可以被拼凑成潜在原始交易的几种不同配置。不同的配置会将不同的输入链接到不同的输出,从而打破了区块链上硬币的踪迹.
背包混合通过将原始交易的原始输出切成CoinJoin交易的较小输出来实现此目的。此外,它使用相对简单的技巧来确保较小的输出导致几种可能的配置成为可能.
毛勒(Maurer),诺德克(Neudecker)和弗洛里安(Florian)的论文包括背包混合的三种变体。第一个变体是白皮书本身中最充实的变体。第二个和第三个版本非常相似,其中第三个版本实际上是第二个版本的高级版本。 (本文的作者只是在撰写本文的后期才提出了第三版;否则,它在研究中可能会占据更重要的位置。)
让我们看一下不同的变体.
变体一
为了解释背包混合的第一个变种,让我们以这个迷你系列的第一篇文章中的CoinJoin示例为例。爱丽丝想向卡罗尔支付3.2个硬币,并有两个输入,分别价值2.3和1.4个硬币。同时,鲍勃想要支付戴夫4个硬币,并有两个输入,分别价值3和2个硬币.
简化后,这些事务如下所示:
2.3 + 1.4 = 3.2 + 0.5
和
3 + 2 = 4 +1
(0.5 BTC和1 BTC输出已更改。)
合并在一起后,CoinJoin交易将如下所示:
3 + 2.3 + 2 + 1.4 = 4 + 3.2 + 1 + 0.5
如前一篇文章所指出的,交易已合并,但是假设您知道有两个付款人,则只能在一种配置中将金额混淆在一起:原始交易。因此,重新发现哪些输入支付了哪些输出是微不足道的,这使制作CoinJoin的意义大打折扣.
背包混合改变了这一点。简而言之,它使用两个原始交易之间的价值差将最大交易中的原始输出分成较小的部分。这至少确保了两种配置,其中大多数输出可以链接到任何输入.
让我们逐步看一下。首先,将每笔交易的产出总额相加。对于Alice和Carol的交易,这是2.3 + 1.4 = 3.7。对于Bob和Dave的交易,这是3 + 2 =5。Bob和Dave的交易是最大的交易.
接下来,计算两者之差:5 – 3.7 = 1.3。然后,从最大交易中减去此差额。 Bob和Dave的交易是最大的一笔交易,我们将分割4个输出,因此:4 – 1.3 = 2.7.
因此,最大交易的四个输出在CoinJoin中分为1.3和2.7.
这次,CoinJoin看起来像这样:
3 + 2.3 + 2 + 1.4 = 3.2 + 2.7 + 1.3 + 1 + 0.5
现在我们回到令人费解的……
当然,原始配置仍然是可能的。只是Dave现在收到两个输出,而不是一个.
看起来像这样:
2.3 + 1.4 = 3.2 + 0.5
和
3 + 2 = 2.7 + 1.3 + 1个
但最重要的是,现在可以进行全新配置:
2.3 + 1.4 = 2.7 + 1个
和
3 + 2 = 3.2 + 1.3 + 0.5
结果,区块链分析师无法再确定地将输出3.2、2.7、1或0.5链接到任何输入!即使CoinJoin交易未使用等额金额,也可以保护隐私.
为了将新交易添加到组合中,所有先前交易(换句话说:现有CoinJoin)的值将被累加起来,就好像它是一笔交易一样。然后,就像第一次一样,这些先前交易与新交易之间的价值差将用于拆分输出。以此类推,用于下一个交易以及此后的其他任何交易.
变体2和3
尽管背包混合的变体之一很好地完成了将大多数输出与任何输入断开链接的工作,但是输入本身仍然可以链接到其他输入。这些设置对于两种配置都是相同的。这也不是隐私的理想选择.
背包混合版本2和3是专门设计用于取消输入链接的。但是,第二种方式确实要求CoinJoin中的所有参与者都学习彼此的输入和输出,这意味着它实际上并没有提供太多的隐私:第三种方式可以解决此问题。但是,出于本文的目的(专注于区块链隐私),差异很小,足以一次覆盖这两种变体.
我们采用与上述相同的示例。爱丽丝想付卡罗尔3.2硬币,鲍勃想付戴夫4硬币.
所以:
2.3 + 1.4 = 3.2 + 0.5
和
3 + 2 = 4 +1
对于变体2和3,将生成“虚拟交易”。该虚拟交易原本就不存在,但是区块链分析师将被欺骗以为它可能.
为了创建该虚拟交易,从每个原始交易中获取一个输入。然后,将这些输入的值相加.
例如,如下所示:
1.4 + 2 = 3.4
我们选择的输入的值为3.4。因此,虚拟交易的输出值也必须为3.4.
这很容易实现。我们再次从最大的原始交易中获得一个输出,在我们的示例中,该交易再次为4。我们还查看了该原始交易中最初与之匹配的输出:1.然后,我们拆分了大的输出(4),因此可以将两半之一与其原始匹配项(1)组合以生成虚拟值(3.4)。在这种情况下,这意味着将4分为2.4和1.6。 (毕竟2.4 + 1 = 3.4。)
现在,CoinJoin看起来像这样:
3 + 2.3 + 2 + 1.4 = 3.2 + 2.4 + 1.6 + 1 + 0.5
同样,基于此CoinJoin,当然仍然可以进行原始配置。只是Dave再次收到两个输出,而不是一个.
看起来像这样:
2.3 + 1.4 = 3.2 + 0.5
和
3 + 2 = 2.4 + 1.6 + 1个
但除此之外,还可以使用新的“虚拟配置”:
3 + 2.3 = 3.2 + 1.6 + 0.5
和
2 + 1.4 = 2.4 + 1个
不同的配置不仅使不同的输入匹配到不同的输出,而且不同的配置也使不同的输入彼此匹配!
背包缺陷
基于简单的技巧,背包混合可显着提高隐私性,特别是与进行常规交易相比.
尽管如此,背包混音并不像等量混音那样私密。等量混合实质上允许最大数量的配置。甚至比最好的背包组合还要多。也许更值得注意的是,背包混合仍然允许某些输入和输出之间的某种联系,或者至少是更可能的联系。.
实际上,在以上示例中,某些输入和输出在两种可能的配置中都匹配。在变体一中,将1.3输出与3和2输入进行匹配。因此,尽管区块链分析无法显示原始交易是什么,但仍可以显示3个输入和2个输入与1.3个输出之间的联系。变体2和3在彼此断开输入的同时,允许输入和输出之间的更多匹配.
还需要指出的是,用于背包的CoinJoin付款需要额外的输出,因此,与常规交易甚至常规CoinJoin交易相比,其成本仍然更高。它还可能要求商家在付款时提供两个地址,而不仅仅是一个.
换句话说,虽然在区块空间效率和费用方面等量混合方面有所改进,并且与常规交易甚至常规CoinJoin交易相比在隐私方面有了很大的改进,但背包混合仍然会带来一些额外的麻烦和成本.
*发表本文后,正确指出JoinMarket也允许通过CoinJoin付款.
作者注意:背包混合提案还有更多内容,例如CoinJoin交易的构造方式。当涉及到隐私时,还有其他一些微妙的风险和折衷方法,例如用户在混合前后如何处理自己的硬币。为了简化和可读性,本文仅关注背包混合背后的核心且可能是最有趣的想法:不等量混合.