如何在BSV网络上双花零确认交易
前两天国外有个网友reizu发帖,说自己成功在BSV网络上双花了零确认交易。让我们一起看看他是如何实现的。 在说明reizu如何双花之前,我们先来定义一下零确认交易和双花。 什么是零确认交易?就是所有已经开始广播,但仍未被挖矿节点打包到区块里的交易。 什么是双花呢?就是同一笔加密货币,重复使用。更具体一点来说,即使用相同的UTXO构造两笔交易,发送给两个不同的节点,同一笔币,成功花出去两次。 这里要说一下的是,节点验证交易的时候有一个原则,叫做“先到先得”。即按照时间验证交易,相同两笔交易,节点会认为第二笔是不合法的。 reizu自己编写了一个工具izubitcoin,用于连接网络里的所有节点,以便同时向这些节点发送交易。拿BSV网络为例,网络里现在大约有450个节点。 1-同时构造两笔交易,一笔交易T1发送到其中300个节点,另外一笔交易T2(双花)发送到另外150个节点。节点肯定会相互广播,但是会相互排斥。已经接收T1的节点,会排斥T2,反过来亦是如此。 2-如果T1发给了大部分非挖矿节点,而T2(双花交易)发给了小部分挖矿节点,那么网络大部分节点只看到T1,但实际上被打包到区块里的是T2。这就可以实施一次双花。 那么如何确定哪些是挖矿节点呢? 3-作者reizu修改了他的工具izubitcoin,向所有的BSV节点发送一笔带有随机数据的交易,用于记录所有交易被发送到哪个节点,以查看哪笔交易被打包到了下个区块里。Reizu用这个方法定位到了BSV的挖矿节点: 34%的算力集中在一个节点上。 59%的算力集中在两个节点上。 68%的算力集中在三个节点上。 75%的算力集中在四个节点上。 4- 因此,如果BSV网络有450个节点,可以把交易T1发送给446个节点,T2发送给4个挖矿节点。T2被打包的概率就是75%。 Reizu说在BSV网络上利用这个方法成功进行了多次双花,并给了他的结论: 可以通过节点的数量,控制成功的概率。如果你想要保证100%成功,那么就发送交易到20个节点。 把T2发送到6个节点,被检测到双花的概率很小。作者使用APP POP!进行测试,这款应用连接了10个节点检测双花交易,但是并没有成功。这是符合逻辑的,如果BSV网络有450个节点,检测到双花交易的概率大约是14%。 检测双花交易的难度与网络节点的数量成正比。 所有交易的手续费都要大于1聪/字节。 执行双花交易的时间不能超过20秒 发起双花交易的成本几乎为零,只需要连接网络,和一个中高等的路由器。 即使所有的矿工都是诚实的,这个方法也奏效。 在这里补充一点,作者这里说的双花攻击属于非算力用户双花,实际上还有一种双花,叫做算力用户双花。即针对零确认交易的双花攻击是由矿池发起的。攻击者可以直接把T2隐藏起来,不广播,只存在内存池里,等挖出区块再打包到区块里。 最后作者认为,解决双花问题很简单。当节点收到双花交易的时候,需要相互沟通(发送proof)。BU在Github提出过这样的方案BUIP088。 另外一个方法是连接到更多的节点,或者公开挖矿节点。不过作者认为这两个方法都并不高效,这样会让钱包和支付处理器变得更加复杂。更好的方法是改进协议,简化检测双花的过程,让SPV钱包也能在智能手机上完成检测。 总结 作者能够成功双花,主要原因在于节点相互之间的联系不够紧密且BSV是个新生的网络,这也说明为保证支付安全商家应该与挖矿节点保持联系。 |
2018-06-24
2018-11-20
2019-01-10
2019-01-10
2019-01-10
2019-11-14
2019-11-14
2019-11-14
2019-11-13