区块链分叉成功并不容易。直接复制原网络的代码是不行的。需要进行基本修改以确保其安全运行。为此,我们总结了几种常见的安全问题和防护方法。网络层由于分叉链是独立于原网络的区块链,因此首先需要在网络层(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.签名重放签名重放和上面说的交易重放是一样的。一些合约,比如GnosisSafe,会验证用户在合约中的签名。如果签名中不包含ChainID,那么这个签名很有可能在两条链上都被重放,造成资产损失。2.预言机故障分叉后,区块链中的大部分智能合约仍然可以正常运行,例如Token合约和AMM合约。这些自运行系统可以在不依赖链下数据的情况下稳定运行。依赖预言机的价格数据,在失去链下喂价的支持后,将无法继续运行。3.价格变化剧烈。区块链是分叉的,一个应用同时运行在两条链上。用户应该使用哪条链?哪一个是“正统”的?这个问题回到了共识。通常哪个区块链有一个正统的共识,那么它上面的资产就会保留原有的价值共识,而另一个区块链上的资产就会瞬间失去价值。这种剧烈的价格变动将导致DeFi应用的彻底崩溃,借贷应用将永远无法平仓。一些有识之士会抓住分叉的时间窗口,将“归零”的资产换成主链代币,从而保留部分价值,在ETHW分叉事件中,我们观察到分叉链上存在大量的套利行为。综上所述,我们从网络层、共识层、应用层分析了区块链分叉的安全性,可以看出其中存在的技术风险。我们需要对分叉非常谨慎。而且,很多分叉的背后不仅是技术变革的需要,有些可能还有直接的商业利益。例如,发起者在分叉中直接获得大量的分叉币。这些都需要用户准确理解,避免不合理的必要损失。区块链是一个去中心化的系统,其升级不依赖于单一的个人或组织,因此分叉在区块链中是不可避免的。虽然给社区用户带来了困惑,但也促进了系统的发展,更好地服务于社会。
