这周,BitMEX Research发推特声称他们遭遇了比特币双花,识别出约21美元的BTC双重支出。一时之间引来了一些恐慌,社区和媒体讨论声不断,比特币价格暴跌。
关于这次双花,也有不少人解释过了,是一次错误的判断,不过由于影响比较大,而且很多人对双花还不是很了解,所以我们今天也再来讨论一下关于双花的定义、此次事件的实际情况等。
旧区块 新区块
在比特币白皮书中,所有节点都会自动切换到最重的有效链上。这样矿工就可以将自己的本地分类帐状态(谁拥有什么)与其他所有人同步。
如果两个矿工在几乎同一时间挖到一个新区块,并且这些区块具有相同的累积难度。然后,一些节点切换到一个块,而其他节点切换到第二个块。这样在很短的时间内,比特币网络就被分叉了。不过一旦找到下一个块,分叉就会解决,这也是很奇怪的一点。
例如,假设一些矿工正在666833-A区块上开采,而一些矿工正在666833-B区块上开采。一旦其中一个发现了块666834,此区块链将具有更高的累计难度,并且仍在666833-A上的所有节点将自动放弃其区块链,并切换到新的规范区块链。
这也是此次比特币网络中发生的情况,因为SlushPool和F2Pool(鱼池)同时发现了块666833,在币安的矿池发现666834区块,并且鱼池的区块就会自动放弃(变得陈旧),然后切换到新的区块链上。
现在旧的数据块出现的比较频繁,无需担心,但是双花呢?
什么是双花
双花,也就是双重支出,有两个普遍的定义,即技术性支出和实用性支出。
从技术上讲,当某方收到的转账(交易T1)首先被包含在区块链上,然后再被删除时,就会发生双花。仅当包含该交易本身的块变得陈旧时,才会发生这种情况。
此外,新的区块链不包含T1是不够的,否则它仍可以包含在下一个区块中。在两次花费中,T1的输入之一必须已由冲突事务T2花费。由于输入已花费在T2中,因此T1变为无效并从网络中删除。
我们称其为双花,不是因为用户已经花了双花,而是交易已经输入了。但实际上,T1-> T2是否实际上将硬币的所有权从一个用户更改为另一个用户也很重要。
换句话说,T1的接收者将不得不发送其它资金或产品作为交换。
我们举一个实际发生的例子:
1. 攻击者在交易所购买了价值100万美元的ETC
2. 将ETC换成等额的BTC并撤回
3. 然后,攻击者通过创建竞争性交易T2,在交易上花费双倍的费用,在该交易中,攻击者将最初用于交换的相同资产花回到自己身上
4. 攻击者现在拥有100万美元的ETC和100万美元的BTC,交易所的空头比特币为100万美元
步骤3等同于退回转账,这在比特币网络中极为困难。T1要求T1顶部的所有块,这将要求攻击者控制大量的哈希功率。因此,攻击只能由矿工或在诸如NiceHash这样的市场上租用哈希算力的人来执行。
请注意,最大的coin都不能以这种方式被攻击。如果有人从Nicehash(〜500 PH / s)租用了所有SHA256散列功率,那将是比特币当前散列率(123 EH / s)的0.4%。
基本上所有的双花事件,包括最近的事件,都是完全无害的。即使是大型矿工(不是两个矿池之间的意外竞赛)故意孤立了包含T1的区块,只要接收者遵循普遍的6确认经验法则,他们就无法通过攻击获利。在这种情况下,我们仅看到在不同时间确认了冲突的T1和T2。
正如我们现在所看到的,有充分的理由让比特币用户广播这种冲突的交易。
取代交易
每当用户将交易广播到网络时,他们都会参与第一价格拍卖。他们希望通过在交易中附加费用,希望矿工将其包括在其中。理性的矿工倾向于用最高薪的交易来填满他们,因为这给了他们最大的利润。
但是与常规拍卖不同,区块空间市场有一个怪癖:如果出价没有赢得它所竞标的区块空间,它不会被撤消,而是会自动进入下一个拍卖。如果出价仍然太低而无法包括在内,则交易(以及相应的代币)会长期停滞不前,那将是一个大问题。
因此,用户需要一种方法来提高已经发布的交易的费用 。有用的副作用是,用户可以降低交易费用费率,因为他们总是可以选择以后提高费用。这使得区块空间拍卖更加有效。
最后,关闭闪电般的支付渠道可能是必要的,例如在闪电网络中。不合作的关闭期限很艰巨,由于费用不足而错过该期限可能会导致用户资金损失。
用户可以通过三种方式提高交易量:CPFP、交易加速、RBF(费用更换)。
如果发出转账的人支付了不足的费用,那么用CPFP可以使接收用户加快交易速度。为此,他广播了一个辅助交易,该交易使用未确认交易的输出作为输入,并支付了比平常大的费用。如果矿工希望从子交易中获得费用,其有效性取决于子交易的有效性,那么他现在被激励将这两者都包括在内。
交易加速器是链下市场,用于确认在链上市场上支付了不足费用的交易。这些通常是由矿池提供的,既有免费版本,也有付费版本。用户可以将他们的交易ID粘贴到加速器中,然后挖掘池将优先级更高地包含它。由于不需要签名,因此发送方和接收方以及其他任何人都可以使用它们。
Replace-By-Fee允许用户创建一个替换交易,该交易花费至少与卡住交易相同的输入之一,但要支付额外的费用。(如果不花相同的投入,那将完全是一个单独的事务。)
除了在卡住的交易中增加费用外,交易替换对于诸如迭代付款批处理之类的用例非常有用。定期批处理将许多付款合并到同一笔交易中,然后再发布,但同样可以先发布交易,然后在广播之后但在矿工将其包含在区块之前,通过添加更多的输入和输出来迭代交易。
有问题的交易
到达实际点,在666833-1、666833-2和666834块中实际发生了什么?
如下图,一个用户广播了三次交易,与前一次相比,每一项都更新了费率。
第一个收费率为1 sat / b,这太低了,无法包含在一个区块中。因此,大约23小时后,她决定使用RBF替换该交易,并收取9.4 sat / b的较高费用。请注意,此时用户已经几乎整天等待了,在广播替代交易之前,她的交易仍未进行。但是,新的费用率仍然太低,因此她又在三个小时后用更高的费用率再次代替了它。
确认双花
我们确定用户可以在确认交易之前使用RBF替换交易。由于用户试图取消先前卡住的事务并将其发回给自己,因此更新后的事务通常具有与第一个事务不同的输出。这几乎可以肯定是用户的替代交易2和3发生的情况。
结果,交易的不同版本可以同时在网络中浮动。当矿工包括两个冲突的(但不是有害的)交易时,先前包含的交易可能变得无效。这使得它最初看起来像是双重支出。
虽然从理论上讲可能会在比特币网络上进行双重支出,但通常不会引起严重关注。以下是一些您应该何时惊慌的有用启发式方法:
无效交易的价值在几千万到几亿美元之间。考虑到这样的双重支出可能会严重损害比特币的声誉和市场价值,并且矿工使用的硬件价值数百亿美元,这是矿工实现“反弹支票”所需的最低费用。相比之下,今天的交易额约为25美元。
交易所或其他大型实体如果不等待更合理数量的确认,就不会接受如此大的交易作为最终交易。因此,攻击者实际上无法通过替换单个块来退回支票,他们很可能必须替换10个以上的块。这就要求大多数现有矿工相互勾结,并有可能同时破坏他们在采矿硬件上的投资。
像许多辩论一样,这归结为对“双花”一词的定义。我今天提供了其中的两个,其中一个是技术性的,指的是INPUT(而不是另一个用户)的双重支出。输入双花显然已发生,但对其他用户的影响为零。
从实际意义上说,双倍支出就像是在向另一位用户付款后退还支票。我们可以非常肯定地说这是有几个原因的。
其他更可能的解释的存在,例如用户(不是矿工)使他们自己的交易无效。
我们没有其他可能导致有害的双重支出的因素,例如,更大的无效交易和大量的陈旧区块。
由于媒体很快就会接受“双花”之类的术语,所以我认为当启发式方法没有一个指向有害意义上的双花时,我们应该谨慎使用。相反,我建议说“交易已失效”,这具有更广泛的含义,包括用户可能故意取消交易的多种方式。
后续
因此,我们已经确定这肯定不是双重花费(双花),矿工故意用较高难度的区块链替换一个区块链以弹起很大的支票。它没有矿工参与,只是一个陈旧的街区。
但是,许多人仍对用户所发布的不同交易的性质感到好奇。这个用户为什么要取代原来的交易呢?这是否是尝试使接受“零配置”的商人花双倍的钱?
我们可以立即排除后者,因为在初始交易和第一次替换交易之间几乎整天都过去了。但是,探索这个用户花钱的人还是很有趣。虽然我们不知道谁分别控制输出,但可以使用一些启发式方法来解决难题。
输入可以忽略,因为我们知道输入必须由用户控制。
具有一个输出的交易几乎总是内部转账(意味着同一用户的多个钱包之间)。您很少在钱包中输入正确的钱来付钱给其他人。
具有两个输出的交易通常会支付一个第三方的费用,并将其余的费用返还给用户(所谓的变更输出)。
将难题拼凑起来,我们可以看到事务2和3都只有一个输出,这意味着这个用户可能会控制这些输出。事务1与事务3共享一个输出,因此在这里也是如此。
这样就只剩下事务1的第二个输出3JaLvP…了。要回答这个问题,我们需要绕道而行。费用较低的交易(1 SAT / B)为什么赢了?Slushpool讨厌钱吗?
答案是否定的,Slushpool的行为完全符合预期。原因是这个用户或他的对手使用了我们之前讨论的另一种技术CPFP来确认交易。
换句话说,他进行了一个以前未知的第四笔交易,其中包括交易a13c2bd…的滞留输出(地址3JaLvP…)作为同一块中的唯一输入。
正如我们在此处看到的那样,新交易支付了更高的费用率(46.3 sat / byte),足以支付这两项交易。由于包含事务1290376…的条件是包含事务a13c2bd…,因此Slushpool必须同时包含两者。
通过从3JaLvP中支出资金,我们可以非常确定地知道这些资金确实到达了目标目的地,实际上并没有被重复使用。我们知道这一点是因为只有控制3JaLvP…私钥的人才能签署CPFP交易,最终使交易得到确认。
这个用户试图发送给第三方的可能性很小,鲍勃已经厌倦了等待钱到来。因此,他使用CPFP将未确认的输出花了给他。但这很可能只是这个用户在自己的钱包之间汇款和/或尝试各种方式提高交易费用。
因此,我们可以得出结论,所有输出确实都由这个用户控制。
Referece: