当前位置:   金科网 > 区块链 > 正文

剑侠情缘手游怎么弄火,花千骨手游首充没用吗,cf手游生化沙漠bug,cf手游及碎片得的枪

上周,bitcoin core 0.16.3 版本客户端的突然发布,以及开发者敦促大家尽快升级一事,令比特币世界的人们感到了惊讶。表面上的原因,在于0.14-0.16.2版本客户端中存在一个拒绝服务 (DoS) 向量需要被修补。到后来,我们才发现,在0.15-0.16.2版本core客户端中的另一个漏洞,可能会引起比特币的超发问题。

在这篇文章中,作者试图说明:到底发生了什么?潜在的危险是什么?以及如果有人利用这个漏洞,还将会发生什么?

比特币DoS漏洞为何如此严重?

双重支付的两种方式

在我们接触实际的漏洞之前,我们需要解释一些东西。我们首先需要定义一下双重支付,因为这个漏洞就可以用于双重支付。

所谓双重支付的情况,就比如说爱丽丝(Alice)向鲍勃(Bob)支付了一笔币,然后她又把相同的币再一次支付给了查利(Charlie),爱丽丝基本上试图进行两次支付,其中的一笔她知道会被拒回。当然,当我们考虑支付时,爱丽丝的某些账户通过写这两次支付被透支了。这很接近比特币的工作原理,但并不是十分准确。

比特币并不是基于帐户模型的,而是基于未花费交易输出(UTXO)。一笔交易的输出基本包含了一个地址以及数量。一旦输出被使用了,它就无法再次被花费。试想一下一个UTXO(作为一笔发送给你的币),它可以是任意数量的,比如说0.413 BTC。

比特币的双重支付意味着一笔币(UTXO)被花费了两次。通常,这意味着爱丽丝将她的0.413 BTC发送给了鲍勃,然后她又把同一笔比特币又发送给了查利。

比特币的解决方法是,其中一笔交易会纳入一个区块,由此来决定实际谁得到了报酬。如果两笔交易不知何故都传递到了多个区块,那么后面发生的区块,就会被软件给拒绝掉。如果两笔交易都在同一个区块当中,那么这个区块也会遭到软件的拒绝。

基本上,比特币软件会检测到双重支付行为,如果有双重支付行为的发生,则应该拒绝掉相应的区块。

然而,在两笔不同的交易中发送同一个UTXO,并不是唯一的双花方法。实际还存在着同一UTXO在同一交易进行双重支付的病态情况。在这种情况下,爱丽丝向鲍勃发送同一笔币两次。所以,爱丽丝实际支付的是0.413 BTC,但鲍勃收到的却是0.826 BTC。这显然不是一个有效的交易,因为只有一笔价值0.413 BTC的UTXO 是被发送的。这就相当于,爱丽丝用同一10美元向鲍勃发送了两次,而鲍勃收到的则是20美元。

定义漏洞

因此,总结一下我们所定义的两种类型的双重支付尝试:

使用两笔或更多的交易,来花费相同的UTXO;

使用一笔交易花费同一UTXO多次;

结果表明,Bitcoin Core 软件正确地处理了第一个问题,而第二个问题,正是我们要关心的。任何人都可以像这样构造出一笔双花交易,但要让节点接受这种交易,又是另一回事了。

目前有两种方法可以让交易被纳入一个区块当中: A. 支付足够的费用,将交易广播到网络上,那么矿工会负责把交易纳入区块当中;

B. 作为一名矿工,把交易纳入一个区块;

(A) 除了创建交易,并将其广播到网络上的节点之外,你不需要做太多的工作。 (B) 需要你找到足够的工作量证明。这也是这次漏洞的关键。

(A) 不是一个可能的攻击向量,因为这些交易会立即被标记为无效的,网络上的节点会拒绝它们。没有矿工们的合作,这种交易就无法进入矿工们的记忆库,因为它们不会得到传播。

(B)是漏洞显现的唯一情况。换句话说,想要利用这个漏洞,你就需要工作量证明,或者说足够的矿机设备和电力。

为了明确起见,双花交易有4种情况需要处理:

1A — 多笔 mempool交易花费了同一UTXO ;

1B — 多笔区块交易花费了同一UTXO ;

2A — 单笔mempool交易花费了同一UTXO多次;

2B — 单笔区块交易花费了同一UTXO多次;

该漏洞有两种表现形式。在0.14.x版本客户端中,存在着一个拒绝服务(DoS)的漏洞,而在0.15.x - 0.16.2版本的客户端,则存在一个超发漏洞。接下来,我们会分别分析它们。

拒绝服务攻击

故事始于2009年的Bitcoin 0.1版本客户端,这一版本的代码通过拒绝案例1B和案例2B(检查区块没有双重支付)来强制达成共识。

比特币DoS漏洞为何如此严重?

你可以看到“检查冲突”的注释,其代码负责检查每个输入没有被花费。“将输出标记为已使用”注释下面的代码,标记了UTXO的使用。如果任何UTXO的花费超过一次,则会导致错误。