映月读书网 > 区块链:技术驱动金融 > 6.4 分布式混币 >

6.4 分布式混币

分布式混币(Decentralized Mixing),不同于一般的混币交易,指的是用一种用户之间的点对点模式实现混币交易的协议。正如你可以想象的,这种方式在理念上与比特币更加契合。

分布式模式具有更高的可操作性。首先,分布式没有自举的问题,用户不需要等待一个有公信力的集中式混币提供商出现。其次,盗币行为在分布式混币模式下几乎不太可能发生,这种协议可以保证你可以收回你在进行混币交易时等值的比特币,正是因为这一点,即便是要进行一些对分布式混币有用的中心化的协作,由于无须说服别人自己是值得信任的,任何人都可以更加容易地设置并提供这样的服务。最后,在某些方式中,分布式混币模式可以提供更好的匿名性。

合币

分布式混币模式的主要方案被称为合币(Coinjoin)。在这个协议中,不同的用户共同创建一个单一的比特币交易,该交易包含所有的用户输入。让合币得以有效运作的核心技术原理为:当一个交易拥有多个来自不同地址的输入时,来自每一个输入的签名都是分离并且相互独立的,所以这些不同的地址可以被不同的人所控制,而不需要任何一方来提取所有的私钥(参见图6.9)。

图6.9 合币交易

这样就可以让一组用户通过使用单一交易来进行混币交易。每一个用户提供一个输入和输出地址,然后组合起来就形成一个交易。由于输入和输出地址的顺序是随机的,因此攻击者无法建立输入和输出的匹配关系。参与者可以查询他们的输出地址已经包含在交易里,并且会接收到和他们输入时数量相同的比特币(减去所有的交易手续费)。一旦他们确认了这些,就可以对这个交易进行确认签名。

当其他人在区块链网络上查询这笔交易的时候,即使他们知道这是一笔合币交易,也不能确定输入地址和输出地址的匹配。从一个外来者来看,这些比特币已经被充分混币了,这就是合币的精髓。

到目前为止,我们已经描述了一轮混币交易,但是我们在6.3节中讨论的原则仍然适用,你想要(想必会)和不同组的用户重复这样的流程,你也想保证这些交易比特币块大小是标准的,这样就避免了无意中引入会造成信息泄露的旁路。

现在让我们来探究一下合币的细节,我们可以把该流程分为5个步骤:

1.找到想要混币的交易对手,作为节点。

2.交换输入/输出地址。

3.建立交易。

4.发送这个交易给其他人,每一个节点在确认他们的输出地址之后,进行签名。

5.广播这个交易。

一组想要进行混币的节点,首先需要发现彼此。这个动作需要由一个服务器来完成,其角色有点像一个“饮水坑”(watering holes)[1],允许这一组用户互相连接并组合在一起。不像中心化的混币服务,这些服务器既不可能有机会盗取用户的资金,也不可能危及用户的匿名性。

一旦一组节点形成,这些节点必须要互相交换它们的输入和输出地址。地址交换中要保证即便是组中其他节点也不能知道这些输入和输出地址之间的匹配关系。这一点非常重要,否则即使你与一组看上去随机的节点进行了合币交易,攻击者还是有可能伪装自己进入这个节点组,并由此获取输入和输出的对应匹配。要做到无关联的地址交换,我们就需要一种匿名通信协议。我们可以使用之前探讨过的Tor网络,或者一种被称为加密混币网络(mix-net)的特殊目的匿名路由协议。

输入和输出地址信息一经传达,其中一个用户——不管是谁——将会基于这些相对应的输入和输出地址构建一个交易,这个未被签名过的交易将会被转发传递,每一个节点都会验证这个输入和输出地址是否正确,并且签名确认。

如果所有的节点都遵循这个协议,那么这个系统就会正常工作。任何一个节点都可以组装交易,并且任何一个节点都可以将这个交易广播到网络中,甚至这些节点中的两个可以独立广播,当然,这个交易只会在区块链网络中被公布一次。但是,如果一个或多个节点想要进行破坏,那么启动一个拒绝服务攻击并阻止这个协议完成,是很简单的事情。

特别地,一个节点可以参与协议的第一阶段,提供输入和输出地址,但拒绝在第二阶段进行签名。或者,也可能是,在对交易进行签名确认之后,一个想要破坏交易的节点可以尝试使用它所提供给其他节点的输入地址到其他的交易中去,如果另一交易在网络中被抢先确认,那么合币交易就会被当作双重支付交易而被拒绝。

在合币交易中,有多种方案可以防止拒绝服务式攻击。其中一个就是对协议中参与交易的节点施加成本,不管是通过一种工作证明机制(类似于挖矿),或者是通过一种销毁证明机制(一种可证实能销毁你所拥有的微量比特币的技术,这一点我们在第3章探讨过)。另外的办法包括,使用一些密码学手段鉴别不符合规定的参与者,并且可以把它们从节点组里剔除。在本章结尾处,我们会看到一些相关细节。

高风险交易流(high-level flows)

我们之前谈到过旁路攻击。现在我们来仔细看一下产生旁路的玄机。我们假设,通过一个特定的地址,爱丽丝每周都固定地收到一定数量的比特币,比如43.12312个比特币,有可能这是她的薪水。进一步假设她有一个习惯,每当收到这笔资金的时候就把其中的5%立刻自动存入另外一个比特币地址,那是她的退休基金账号。我们将这种转账模式称为高风险交易流。在这种情况下,没有一种混币模式可以隐藏这两个地址之间的关系,考虑到这种行为模式会在区块链网络中是透明可见的——这样特定了金额和时间的行为,几乎不可能是偶然发生的。

有一种技术,可以帮助用户在高风险交易流的情形下重获无关联性,这种技术叫作合并规避(merge avoidance),是由比特币创始人迈克·赫恩(Mike Hearn)提出的。一般来说,为了完成一笔支付,用户会尽可能地组合所拥有的比特币,以便有足够多的数额可以支付到单一接收地址来完成交易。他们是否可以规避会导致所有输入地址被关联在一起的合并行为呢?这种合并规避协议通过允许接收方提供多个输出地址的方式(尽可能多的),使得无关联性成为可能。发送方和接收方可以达成一致,通过把一个数额较大的支付分拆为一组小面值的支付方式,使得这个支付使用多个交易来完成,如图6.10所示。

图6.10 合并规避

注:爱丽丝想要用8个比特币去购买一只茶壶,店铺提供了两个地址给她,她可以支付5个比特币到其中一个地址而支付3个比特币到另外一个地址,与她的可用输入资金匹配了,这样就可以避免暴露两个地址都是属于爱丽丝的事实。

假设,店铺最终将这两笔支付和收到的其他支付合并在了一起,这两个地址就不再是很明显互相关联的了。店铺应该避免在收款的同时,马上重新把这两个输入合并在一起,否则这两个输入来自同一个个体的事实还是会很明显。当然,爱丽丝也要避免在同一时间发送这两笔支付交易,这也有可能类似地暴露信息。

总的来说,合并规避可以帮助缓解高风险交易流的问题:如果某一个交易流水被拆分成许多互相无法关联的小额流水,攻击者可能就不会辨别这个交易。这样做也可以使依赖于识别单一交易中共时花费的多个比特币的地址簇技术失效。

[1] 这个比喻来自非洲草原上的饮水坑,需要饮水的动物都会到坑边去。掠食动物也常常在坑边埋伏捕猎。在网络安全上,这种类似“饮水坑”的网站也往往是黑客选择攻击目标的场所,此类攻击也被称作“水坑攻击”。