以太坊 OpenEthereum 单客户端在区块 #12244294 处发生的 Bug 导致当时的以太坊网络停机,并在问题区块产生后无法与网络保持同步。那么造成这个事故的原因究竟是什么呢?
先看触发了这个事故的交易:
https://eth.tokenview.com/cn/tx/0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247
这是一笔合约调用交易,是从 KuCoin 交易所向其他地址分发ETH。
我们仔细分析一下合约调用过程:
在浏览器的“数据输入”栏展示的是合约调用的参数,融易资讯网(www.ironge.com.cn),第一行表示地址列表从“40”(16进制)字节,也就是 64 字节开始,图中第4行,第二行表示转移数额的列表从“1a0”(16进制)字节,也就是 416 字节开始,数据输入栏第15行。
转账是按照地址列表的顺序进行的,往每个地址转入的数额和转移数据的列表一一对应的。
现在我们开始遍历地址列表,看第三行的“10” (16进制),表示的是即将为接下来的 16 个地址转入 ETH。
按照图上顺序,当数到第11个地址的时候,发现值是“10”。这个值会被认为是地址列表中的第11个地址,然而事实上是表示转移数额的列表长度。那么按照第三行的指示,应该向 16 个地址转入,合约会把“0x10”当成地址继续执行转账操作,向地址“0x10”转入 0 个 ETH。
注意,“0x10”是EVM “特殊地址” 之一,它完全处在 EVM 的预编译合约列表内。它是一个由 EIP-2537 断言的预编译合约,是为 BLS 配对密码学程序而设的,但这个 EIP 还未部署到主网上。
那么在柏林硬分叉中给“0x10”发送 0 ETH 会造成什么呢?会造成 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希望携手更多的开发者打造更好的区块链世界。
文章标题:【因 “0x10” 地址的 Gas 消耗分歧产生的柏林硬分叉 Bug】 内容摘要:以太坊 OpenEthereum 单客户端在区块 #12244294 处发生的 Bug 导致当时的以太坊网络停机,并在问题区块产生后无法与网 ... 免责声明:融易新媒体转载此文目的在于传递更多信息,不代表本网的观点和立场。文章内容仅供参考,不构成投资建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。
本文网址:http://mt.ironge.com.cn/html/zt/315bgt/266856.html
美国6月将达疫苗目标 货币政策收紧利空比特币
以太坊Gas费创2021年以来新低 是时候把所有DeFi应
如何选择 Eth2 质押服务?一文了解 Eth2 各类质押
HECO行业快讯:4月24日-4月27日
金色观察|以太坊2.0信标链的“15ETH损失”小插曲
上原亚衣“打碎”NFT写真 新玩法再造天价NFT?
刘子昂湖北李时珍涉传|男子靠暗号机智配合领导
打新机会分享:Ascendex新拍卖来了
MIST 一个神秘的王者 为什么值得关注
4.26早行情:行情现V型走势 部分币种表现强势
10年前的今天 比特币创造者中本聪发送了最后一
鑫联盟涉嫌传销再次被立案调查!
作为抗通胀资产 比特币和黄金可以彼此互补
2021数御未来-数据与存储产业成都峰会 圆满成功
明智的比特币矿工 应当通过模型了解收益变化