8月3日,ETC 官方推特公布了,区块链数据分析公司 Bitquery 针对 ETC 遭受51%攻击事件的调查报告。
报告显示,8月1日0:30-8月2日11:30,ETC 遭受51%攻击。
此次攻击由一个独立矿工“0x75d1e5477f1fdaad6e0e3d433ab69b08c482f14e”发起。该矿工悄悄产出了3594个区块,随后一并广播给其他矿工,由于这些区块数量众多,区块顺序比其他矿工所建立的链占有更大权重,致使其他矿工不得不接受这一系列区块,最终攻击者区块成功取代了原有区块,从区块高度10904146到10907740区块发生重组。
而链上数据表明,该名矿工故意从外部购买了哈希算力以发起攻击,且该矿工地址自7月29日才显示为活跃状态,连续3天每天生成30个区块。最终该攻击者仅花费了17.5 BTC(约合17万美元)欺骗整个 ETC 网络12个小时,成功实施攻击。
此外,由于在 ETC 网络中,并非所有由节点和矿工运行的软件都具有相同的行为,节点版本和软件的多样性使得此次攻击更加严重:基于 Geth 和 Hyperledger Besu 两个客户端的节点接受攻击者的区块并选择最长的分叉链;基于 Open Ethereum 客户端的节点仍保留旧的链。而这些都导致有些矿工基于旧链转账,但在主要的 ETC 链(分叉链)上并未反映,而基于不同客户端的节点可能面临双花。
据相关机构的调查,其具体过程如下:
1. 恶意矿工(ETC 地址:0x75d1e5477f1fdaad6e0e3d433ab69b08c482f14e)挖掘了约3000个区块。
2. 2Miners矿池由于Multi-geth结束对Ethereum classic的支持而短暂下线进行维护。
3. 当2Miners矿池维护的这段时间内,2Miners矿池并没有产生新的区块。在2Miners矿池结束维护上线后,约3000个区块同时被插入到2Miners矿池中。
4. 由于 Ethereum Classic 上所有的 Parity 或者 OpenEthereum 节点,都无法处理这3693个来自 Core-Geth 节点的区块,因此就出现了链分叉:所有的 Parity 或者 OpenEthereum 节点上的矿工都依旧在原始主链上进行挖掘,但是在 Core-Geth 节点的矿工就在被插入约3000个区块的新链上挖掘。
5. 根据工作证明(POW)共识,在新链上的工作量会逐渐超过原始主链,在原始主链上Parity节点的一些矿工根据会“选择在更多工作量的链上进行挖掘”的准则,转移到新链上进行挖掘。最终,在区块高度10904146处,总共3693个区块被通过重组(reorgnization)的方式被加入到区块链中。
通过两个机构的调查和信息公布,很明显的原因有两个:一是因为近期的客户端支持问题,二是攻击者恰恰利用了这一点。
不同的客户端代表着不同的接入角色,矿工既是网络维护方,也是数据的产生者,这意味着,如果在客户端提供一些不正确的数据时,被其他节点同步,也就是攻击的开始。