0

区块链分叉带来的安全挑战

 1 year ago
source link: https://www.51cto.com/article/719312.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

区块链分叉带来的安全挑战

作者:佚名 2022-09-21 15:14:09
区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉,一种不支持向后兼容的软件升级方式。

如果要成功分叉一条区块链并不容易,并非直接复制原网络的代码即可,需要进行基本的修改才能保证它安全运行,为此,我们总结了几种常见的安全问题及防护方法。

05557212284043e134c65252eb61802ffa00c6.jpg

由于分叉链是独立于原网络的区块链,首先需要在网络层(P2P)进行隔离:

1、种子节点

种子节点,也称 bootnode 或者 seednode,是区块链启动时网络首先会尝试进行连接的节点。分叉链在启动时首先连接种子节点列表里的节点,从而进一步发现网络中其它的对等节点,然后才能进一步同步区块,达成共识。因而必须要修改种子节点列表,防止连接到原网络的节点。

2、异形攻击

即使种子节点列表改变了,但并不代表分叉网络不会连接到原网络,因为双方的 P2P 协议是相同的,如果有一个节点无意中添加了另外一个网络的节点连接,那么两个节点将成功握手,并将对方添加到节点地址池。不仅如此,双方节点还会将自己节点里的地址分享给对方,进而造成双边网络节点池互相污染。关于这个问题,慢雾此前曾单独披露过《冲突的公链!来自 P2P 协议的异形攻击漏洞》。

为了解决地址池互相污染的问题,需要在通信协议上做网络识别。早期的以太坊并不支持网络分隔,但后续的版本中在协议里加入了 NetworkID 做为网络区分的标志,NetworkID 通常是每个链的 ChainID,例如以太坊主网的 NetworkID 和 ChainID 都为 1,而 ETHW 初始版本中并未对 NetworkID 进行分叉,可能存在异形攻击漏洞。

在比特币网络中,使用的是 Magic 值来标识不同的网络,通常在 chainparams 里进行定义,例如比特币主网值为 F9BEB4D9,测试网值为 FABFB5DA。

1、交易隔离

通常与区块链交互时,我们需要用自己的私钥签署一笔交易,随后这笔交易被广播到网络,并被矿工或者出块节点打包到区块中。但如果区块链出现分叉,这笔交易可能会被两个网络分别打包到不同的区块当中,假设这是一笔原链上 的转账,那么分叉链上也会有相同的一笔转账,显然这是一个非预期行为,会造成资产损失。

这时就需要对交易进行重放保护,在早期以太坊的版本中没有做这样的保护,后来 EIP155 之后在交易结构中加入了 ChainID,确保用户签署的交易只用于当前网络。如果对以太坊进行分叉,那么也需要对 ChainID 进行重新定义,当然这并不是只修改配置里的 ChainID 这么简单,因为分叉链需要对旧的区块做兼容,所以需要在分叉高度之后使用新的 ChainID,才能保证分叉链正常运行。

比特币的交易结构中不存在 ChainID,那么它是如何做重放保护的呢?比特币使用了一种叫做 UTXO 的模型,简单说它是对一笔交易(UTXO)进行花费,而不是对账号进行花费,通常全新启动的网络不会存在相同的两笔交易,也就不存在重放的场景。

但是在硬分叉的情况下,还是会存在交易重放的问题,例如 2017 年的 BCH 分叉以及后来的BSV分叉。BCH 通过在交易数据签名添加SIGHASH_FORKID(0x40),使得 BCH 上的交易和 BTC 的交易不再互相兼容,从而达到重放保护的目的。

2、算力调整

在分叉前,原链占有全网所有的算力,那么依据 PoW 共识算法,它的出块计算难度也是比较高的。分叉后,算力分散到不同的区块链上,那么分叉链由于共识不足通常无法获得足够的算力去生产新的区块,区块的增长会陷入停滞。这时有必要降低分叉后的初始计算难度,给分叉链赢得一个快速调整算力的时间窗口。

3、防范 51% 攻击

网络和交易都隔离开了,区块链分叉了,新区块顺利产出,一切都看似正常。然而安全问题依旧突出,它依旧存在一种更普遍、更难以防御的攻击:51% 攻击。

挖矿是逐利的,当出现分叉币时,哪边的挖矿收益高矿工就会把算力切换到那个网络,但现实是分叉币往往币价低,导致整体的算力十分低。以 ETHW 分叉为例,我们从 2miners 上看到,原 ETH 网络算力峰值最高超过 900TH/s,而在写稿时 ETHW 的算力只有 30TH/s 左右,大量算力消失并不是好事,它随时可以对 ETHW 发起 51% 攻击。

对于这种 51% 攻击的防范几乎没有什么很好的方法,只能通过增加确认数来防范。

我们把建立在交易上的应用,如基于虚拟机的智能合约,统归为应用层。区块链在分叉时,也会对运行在区块链上的应用产生巨大影响。

1、签名重放

签名重放与上文提到的交易重放是相同道理的,有一些合约,例如 Gnosis Safe,它会在合约里验证用户的签名,如果签名里没有包含 ChainID,那么这个签名非常可能可以在两个链上重放,导致资产损失。

2、预言机失效

分叉后的区块链多数智能合约依旧可以正常运行,例如 Token 合约、AMM 合约,这些自运行系统不依赖于链下数据就可以稳定运行,但类似 MakerDAO 等借贷系统,高度依赖预言机的价格数据,在失去链下喂价支持后,它将无法继续运行下去。

3、价格剧变

区块链分叉了,一个应用同时运行在两个链上,用户该使用哪个链上的应用?哪个算是“正统”的呢?这个问题又回到了共识上,通常哪个区块链拥有正统的共识,那么它上面的资产就会保留原有的价值共识,而另一个区块链上的资产会在瞬间失去价值。

这种价格上的剧烈变化,会导致 DeFi 应用彻底崩溃,借贷应用永远无法平仓,有一些有识之士会抓住分叉的时间窗口,把“归零”的资产通过 AMM 等应用兑换成主链代币,从而保留了一些价值,在 ETHW 分叉事件中,我们观察到了大量分叉链上的套利行为。

至此,我们从网络层、共识层和应用层对区块链分叉的安全性进行了分析,可以看到其中存在的技术风险,对于分叉我们需要十分审慎地对待。并且,不少分叉的背后不仅仅是技术变革的需要,有的可能存在商业上的直接利益,例如发起方在分叉中直接获取大量的分叉币,这些都需要用户准确认识,避免不必要的损失。

区块链是一种去中心化的系统,它的升级不依赖于单一个人或组织,因此分叉在区块链里难以避免,虽然给社区用户带来混乱,但也促进了系统向前发展以更好地服务社会。

责任编辑:华轩 来源: 中金网

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK