文/曲艺 编辑/毕彤彤 来源/PANews

1月6日爆出的以太坊经典(ETC,Ethereum Classic)遭历史重组事件仍在持续发酵,1月8日,交易所Gate.io 发文表示已正式确认 ETC 被“双花攻击”,目前已追踪到攻击者地址。至此,近一年来发生在多个币种发生的“双花攻击”又新添了一例。

自2018年4月开始接连发生的双花攻击事件,如同笼罩在区块链上空的乌云,不断给持币者们心头添堵,目前提出的诸多“应对方案”也多是“亡羊补牢”。

这如洪水猛兽一般来势汹汹的“双花攻击”到底是什么?

微信图片_20190111114645.png

一、双花攻击是什么

关于双花攻击(Double-spending),维基百科给出的定义是“一种数字货币体系天然带有的潜在缺陷,单个数字代币存在被重复使用的可能。”简单来说,就是用同一笔钱发起两次及以上交易。

举个例子,A兜里只有十块钱,想喝10元一杯的奶茶又想买10元一个的热狗,在钱有限而欲望又急需满足的情况下,可能A就要动歪脑筋,想着用10块钱既买奶茶又买热狗。

在传统货币时代,A的这种想法很难实现。首先从货币角度分析,A可以动手制作货币来复制自己有限的财富,但不论以何种方法仿制货币,做出来的都只能是“假币”,而假币本身是可鉴别的,且制造假币的风险和成本极高;从交易流程分析,如果是最原始的“一手交钱一手交货”,那么A除了把钱偷回来,没有其他重复利用同一张纸币的方法。如果是使用银行或第三方机构作为中转的支付手段,那么中间机构的存在会使交易成为非常典型的中心化结构,“中心”可以确保交易的处理是有序且受到监控的,即使支付行为能够同时发起,“中心”也会分先后依次处理交易请求,因此只有一笔交易可以成功,A即便手速极快地同时刷了两次卡,也最终只能成功交易一次。

然而在区块链世界,数字代币使“双花”变得“简单”。依旧从货币和交易两个维度分析,首先,数字代币的实质是一串代码,而代码的复制不像现实货币的复制那样是存在成本和真伪之别的,因此原理上通过复制数字代币实现“双花”是可行的,不过,中本聪在设计比特币的时候,通过使用区块链盖时间戳并发布全网的方式,确保代币不能重复使用;但是,在交易过程中,由于区块链“去中心化”的特性,缺乏中心处理机构的保障,也没有账户的概念,双花攻击仍然是有可能发生的。

二、实行双花攻击的5种方法

1.Race attack

在0确认时(即一次确认也没发生前),向商家发起直接交易请求,如果商家同意不经过确认直接接受转账,那么就给“双花攻击”提供了机会。只要付款人同时发起两笔交易,一笔交易发给自己,一笔交易发给商家。商家0确认条件下接受转账,而发给自己的交易加了较多的给矿工的小费,更容易被打包成区块并认证为正确交易,因此首先发起向商家的交易就会失效,从而实现资产回滚。

2.Finney attack

假设攻击者自身在挖矿。在他生成的每个区块中,都设置了从A到B的资产转移,AB都处在其控制之下。为了达到欺诈目的,攻击者不会对自己的挖矿行为进行广播。相反,他会向某一商家发起交易,设置从A到商家地址C的付款路径。商家可能在等待付款成功后交付货物,而此时攻击者就会公开广播自己的区块,A到B的转账会被认定优先级高于A到C的转账,从而使商家收款失效,资金回滚到攻击者账户,双花攻击成功。

3.Vector 76 Attack

Vector76 Attack,是Race Attack和Finney Attack的组合,又称“一次确认攻击”,也就是交易即便有了一次确认,交易仍然可以回滚。这种攻击的目标主要是设置只接受一次确认就支付的钱包(用户出于省时目的),且钱包接受其他节点的直接连接并且使用静态IP地址。

具体方式是:攻击者控制AB两个全节点,A全节点只连接到电子钱包的节点,B全节点与一个或多个运行良好的节点相连,攻击者先后发起交易1和交易2,分别发送到攻击目标和攻击者自己的钱包地址,但交易1的矿工小费要远高于交易2,并且两笔交易都不广播,这时攻击者会在交易1所在链条上进行挖矿,该链条我们称为分叉1,在挖到区块后攻击者不广播而是在节点A发送交易1,在节点B发送交易2。

由于节点A只连接到电子钱包,节点B连接了更多节点,因此广播发布更快,从概率上说交易2更容易被认定是有效的,所以交易1的款项会回滚。

4. Alternative Attack

这种攻击主要发生在商家等待交易确认的过程中,但需要攻击者有较多的算力,可能有浪费大量电力的风险。主要原理也是攻击者同时发起两笔交易,一笔指向商家,命名为交易1,另一个指向攻击者自己的钱包,命名为交易2。在商家等待N次确认后,向攻击者交付货物,此时攻击者凭借较高的哈希率,挖到了N个以上区块,则交易2的链条长度超过交易1,资金回滚,双花成功;否则失败。

5. 51% 攻击

51% 攻击又叫Majority attack,指攻击者占有超过全网50%的算力,可以创造一条高度大于原来链的新链,那么旧链中的所有交易都会被重组,区块被逆转,通过反向交易实现双花。目前BTG、XVG、ZEN、LCC接连遭受的双花攻击都属于51%攻击,最近发生在ETC上的事故也于8号上午被Gate.io认定为51%攻击。

三、应对双花攻击的方法

区块链上的账户就是一个二维码的哈希地址,从比特币白皮书上来看区块链上的数字货币本身是不加密的,加密的是账户,而每个账户都有成对的公私钥(公钥能够通过私钥推出,并且能解码由私钥加密的数据,但是公钥不能反推私钥),保证了区块链的数字货币是安全的,并且是难以伪造的。在进行货币转移时都需要用自己的私钥对交易进行数字签名,全网通过公钥对交易进行所有权验证。区块链从密码学的角度解决了货币本身所有权的问题;从交易上,区块链引入工作量证明,也叫共识机制。常见的有PoW、 PoS, 也就是区块链去中心化的核心思想,用奖励的方式让全网一起参与计算,共同计算的过程就是挖矿。在区块链的世界,要是用户之间要发生一笔交易,那么假设这双方是A和B,那么A要交易一个资产给B的话,需要这样做:

1.      把数字资产p用A的私钥签名并且广播到全网

2.      这时候,提交的资产被称为UTXO,此时的交易是未经过验证的

3.      全网通过A的公钥去验算是否这个数字资产属于A的

4.      当通过后,全网的机器都把数字资产A的具体交易信息记录进入区块链账本

账户进行两次消费时,两笔交易会同时向全网广播,所有区块链节点会同时收到广播,每个节点上都会受到全网的所有区块信息即全网账户信息,来验证交易的合法性,当两笔交易前后到达,则完全可以验证是否为双花攻击;若同时到达,一部分节点收到交易A于是对本地数据进行了更新,则全网出现分叉。但区块链的确认有两个特点:

1.     存在与最长分支中的block

2.     至少有5个验证过的block再其后面得到验证

所以出现分叉之后,全网的矿工会继续按照自己的区块更新,再之后的几次区块中自然会更新出最长的一条区块来,全网的所有矿工都以最长的区块信息为准。当然这样也不是绝对的,当账户控制了全网超过51%的算力,那么就能实现账本分叉,但是要实现超过51%算力的控制权,是需要相当大的代价和成本的。

参考资料:

Yewei Andy’s Blog《区块链——双花问题》

比特评级《链科普丨双花攻击——区块链世界的魔兽》

Odaily星球日报《卷走百万美元后,攻击者仍未放过ETC》

Wikipedia: Double-spending (https://en.wikipedia.org/wiki/Double-spending)