以太坊 OpenEthereum 单客户端在区块 #12244294 处发生的 Bug 导致其时的以太坊网络停机,并在问题区块发生后无法与网络坚持同步。那么造成这个事端的原因究竟是什么呢?

运用 Tokenview以太坊浏览器查看触发了这个事端的买卖:https://eth.tokenview.com/cn/tx/0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247

这是一笔合约调用买卖,是从KuCoin买卖所向其他地址分发ETH。

因「0x10」地址的Gas消耗分歧产生的柏林硬分叉Bug

咱们仔细分析一下合约调用进程:

因「0x10」地址的Gas消耗分歧产生的柏林硬分叉Bug

1. 在浏览器的“数据输入”栏展示的是合约调用的参数,第一行表明地址列表从“40”(16进制)字节,也便是 64 字节开端,图中第4行,第二行表明搬运数额的列表从“1a0”(16进制)字节,也便是 416 字节开端,数据输入栏第15行。

2. 转账是依照地址列表的次序进行的,往每个地址转入的数额和搬运数据的列表一一对应的。

3. 现在咱们开端遍历地址列表,看第三行的“10” (16进制),表明的是即将为接下来的 16 个地址转入 ETH。

因「0x10」地址的Gas消耗分歧产生的柏林硬分叉Bug

依照图上次序,当数到第10个的时候,发现值变成了“10”。这个值事实上是表明搬运数额的列表长度。可是依照第三行的指示,应该向16个地址转入,那么合约会把“0x10”当成地址持续履行转账操作,向地址“0x10”转入0个ETH。

事实上,“0x10”是EVM “特殊地址” 之一,它完全处在 EVM 的预编译合约列表内。它是一个由 EIP-2537 断言的预编译合约,是为 BLS 配对密码学程序而设的,但这个 EIP 还未布置到主网上。

那么在柏林硬分叉中给“0x10”发送0ETH会造成什么呢?会造成Gas耗费发生不合。

“0x10”地址的Gas耗费不合

柏林硬分叉改变了 EVM 中 Gas 耗费量的计量办法。在 EIP-2929 实施后,如果在一笔买卖中对同一个存储槽多次履行状况存储操作,第一次履行会耗费更多 Gas,后续履行的耗费会更少。

这便是 OpenEthereum 在区块 #12244294 处发生 Bug 的本源:OpenEthereum包含了EVM已完成的预编译列表。所以OpenEthereum 会对该笔买卖中访问了“0x10”的买卖给gas 扣头。但网络的绝大部分活跃客户端都不是这样完成 EIP-2929 的,它们只会给访问了已激活预编译合约的买卖供给 gas 扣头。

由此,OpenEthereum 客户端对该买卖耗费了多少 Gas 的核算与网络中其他客户端发生了不合。

这场由Gas耗费不合引起的 OpenEthereum 单客户端停机,虽没有严重到导致重大的链分叉,但也提醒咱们利用多客户端完成来提升抗性。

不可否认,区块链技术依然处于不断尝试不断前进的进程中,2021 年爆发的Defi和NFT也以史无前例的速度遍及给更多的受众,Tokenview期望携手更多的开发者打造更好的区块链国际。

视野开拓

上大学给人带来的最明显的好处是能赚更多的钱,而有更多的钱能让人过上更好的生活。在20世纪70年代末,拥有学士学位或更高学位的人与只拥有高中文凭的工人相比,平均新资高了约40%。到2000年,这个被经济学家称为“收人溢价”的指标翻了一番,达到天文数字般的80%。-《Deaths of Despai ad the Futue of Capitalism》

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注