导致新加密货币的硬分叉为加密交换运营商带来了独特的机遇和挑战。Poloniex在最近的Bitcoin Cash硬叉之后面临的一个挑战是保护我们的客户免受重播攻击。由于SV链后面的开发团队选择在分叉后近两周才实施重放保护,因此Poloniex工程师的任务是设计解决方案。
社区中的许多人对Poloniex如何应对这一特殊挑战感到好奇,因此我们决定提供一些见解。
什么是重播攻击?
虽然名称暗示某种恶意行为,但重放攻击可能是由于节点在硬分叉后经历的混乱而发生的。这种混淆可能导致代币持有人无意中在其中一条新链上发送交易,从而导致资金损失。
在硬分叉之前,比特币现金节点都在监听新的有效比特币现金交易。当节点听到新交易时,它会执行数学测试,以便验证发件人是否是资金的真正所有者。如果此数学测试告诉节点该事务是有效的,它将告知网络中的其他节点,并且该事务最终将被添加到区块链中。
在硬分叉之后,一些节点运营商立即升级到比特币ABC链,一些运营商升级到SV链。当一个链上的节点听到另一个听起来有效的链的事务时,会发生重放攻击,因此它会将其传递给网络的其余部分。例如,Alice向Bob发送了1个比特币ABC,最终也无意中向Bob发送了1个比特币SV。她的交易在第二条链上得到“重播”。
为什么会这样?
要理解为什么会发生这种情况,我们必须看看比特币现金交易的内幕。
如果Alice有一个15比特币现金的钱包,她没有15个独立的BCH - 她拥有多块比特币现金,称为输出,最多可加15比特币现金。例如,Alice的15 BCH可能是两个输出的组合:10 BCH和5 BCH。在区块链拆分后,比特币现金硬叉之后,爱丽丝现在在两个不同的区块链上具有相同的输出:10个BCH-ABC,5个BCH-ABC和10个BCH-SV,5个BCH-SV。可以使用相同的私钥来移动所有这些输出。
为简单起见,假设Alice想要将她的5 BCH-ABC发送给Bob(尽管交易通常涉及多个输出的组合)。使用她的私钥,她签署了一条消息,说明将此BCH- ABC的特定输出发送给Bob。此时,BCH-ABC节点可以执行我们前面提到的数学测试,证明Alice拥有私钥来发送此事务。比特币SV节点“偷听”此事务时出现问题。比特币SV节点可以执行相同的数学测试,并得出结论,Alice使用她的私钥将5 BCH SV的特定输出发送给Bob。
Alice的数字签名在两个链上都有效。即使她只打算向Bob发送5个BCH-ABC,她也最终还向他发送了5 BCH SV的匹配输出。
如何防止重放攻击
如您所见,重放攻击可以在硬分叉后立即发生,因为每个人在两个不同的链上都有相同的输出。在一条链上移动输出的数字签名能够在另一条链上移动匹配的输出。
然而,由于两个链条都在叉子之后单独开采,因此通过新的coinbase奖励引入了新的独特输出。ABC链上的硬币基础奖由SV链上不存在的输出组成,反之亦然。这些后叉输出是防止重放攻击的关键。
比方说,吉米是比特币现金矿工。如果在分叉后,Jimmy开始挖掘BCH-ABC并获得新创建的BCH-ABC的币基奖励,这些将是SV链上不存在的输出。如果他将这5个BCH-ABC发送给Alice,她可以将它们发送给Bob而不用担心重播攻击。如果比特币SV节点无意中听到此事务,它将无法识别Alice尝试发送的输出,因此没有比特币SV会移动。
使用post-fork输出防止重放攻击
在分叉之后,Poloniex立即开始收集一小组后叉输出或UXTO。如果Alice是Poloniex的客户并且要求撤销5 BCH-ABC,我们将混合至少1个后叉输出。如果BCH-SV节点无意中听到我们的事务,则包含post-fork输出将阻止SV节点识别事务。数字签名将移动ABC链上的指定输出而不是SV链上的指定输出,因为这些特定输出并非全部存在于SV链上。
通过采用包括1个后叉输出以及所有BCH-ABC和BCH-SV撤销的方法,Poloniex能够充满信心地操作交易所及其客户不会因重放攻击而遭受资金损失。
文章来自Connor Dempsey
致March Boorstin领导BCH硬叉的工程设计,并与Anders Brownworth一起为本文提供了技术见解。