区块链技术技术简析柏林升级后 OpenEthereum 客户端出错始末

区块链技术技术简析柏林升级后 OpenEthereum 客户端出错始末

第17433篇区块链技术文章区块链技术技术简析柏林升级后 OpenEthereum 客户端出错始末

柏林以太坊的升级改变了用气量的计量方式,OpenEM客户端在错误交易的用气量计算上与网络中其他客户端存在差异。您可能听说过@openem客户端中的一个错误导致支持以太坊网络的一些重要服务停机。让我们考虑一下造成事故的原因。

首先,我要感谢所有对事故反应迅速、解决问题的工程师。

此外,我自己也没有追踪所有的细节。下面的重要事实都是由eth R&D;discord server中的用户EB提出的。

从错误的事务开始。

这是一种从kucoin交易所发送的合约呼叫交易,用于将eth分配到多个地址。事务调用数据的ABI码错误,最终导致了链分裂。您可以在Etherscan上看到交易的“输入数据”。当

1/在合同中调用sendEths时,它需要提供两个参数:一个是目标地址的无限长数组(动态大小数组);另一个是转账账户的无限长数组(Wei),两个配置将知道要向哪个地址转账多少钱。

2/我们可以分析呼叫数据,看看哪里出错了:第一行(在Etherscan上标记为“[0]”)表示地址列表以字节64开头(第“[2]”行)。第二行显示转账金额列表,从字节416开始(第“[13]”行)。因此,一般来说,我们要把一定数量的eth成对地从上到下发送到一个地址,这看起来非常直接。

4/但是,当我们开始遍历列表时,我们跳转到调用数据的正确字节,并且实心ABI表示数据的第一个字是整个不定长数组的长度。

5/这是最后一个错误的根本原因:因为call dada中的值是“0x10”(注意,这是十六进制!)但是调用数据只给出10个地址-值对。此调用数据的正确ABI代码(填写第[2]和[13]行)应为“0xa”-而不是“0x10”!

6/你可能已经猜到了那时会发生什么。我们可以通过执行痕迹看到。

7/契约成功地遍历了前10个地址。原来,这个时候合同应该停止了,但是根据通话数据的说法,还有很多地址!那就去吧。然而,根据呼叫数据的结构,“第11个地址”用于编码列表的长度。因此,契约尝试将0 eth发送到地址0x10。

8/此外,当合约尝试读取不存在的呼叫数据时,它似乎会返回0 eth—您可以想象,合约在这里出现了错误,但它继续将0 eth发送到它从呼叫数据读取的其他六个“地址”。

此时,您可能会注意到0x10可能是我们所谓的“特殊地址”之一,它完全在EVM预编译契约的范围内(所谓的“预编译契约”是一种特殊契约,它在EVM之外有最好的实现,但它的编译与大多数契约一样)。

并且我们不希望预编译的契约0x10返回eth。这样,它就变成了一个黑洞。然而,这并不一定会引起任何问题。是什么导致整个客户端崩溃?

原因是0x10实际上是eip-2537声明的预编译协定,它是为BLS配对加密程序设计的,但此eip尚未部署到主网。因此,尽管您可以与此地址进行交互,但主网络上的此地址中没有契约,因此不会有进一步的操作。另外,我们需要一个事实来解释这种分裂。正如您可能已经猜到的,它是柏林硬叉(这将这个问题带到表面):它改变了EVM中气体消耗的测量方法。

在eip-2929实现之后,如果在一个事务中多次对同一存储槽执行状态存储操作,则第一次执行将消耗更多的气体,而后续执行将消耗更少的气体。从理论上讲,这种重新定价可以更准确地反映客户端访问存储项的当前成本。此外,应该注意的是,在所有客户端的执行中,数据通常存储在更便宜的硬件层。

现在我们终于找到了openeim在blockᦇ12244294中遇到的bug:客户机包含作为eip-2929访问列表一部分的所有预编译实现。因为eip-2537已经在大多数客户机上实现了(而且它曾经被提议包含在柏林升级中!)openem为所有访问0x10的事务提供gas折扣。

但是,网络中的大多数活动客户机并没有以这种方式实现eip-2929。它们只对访问激活的预编译合同的事务提供gas折扣-eip-2537属于激活的预编译合同!因此,openem客户端对事务消耗的气体量的计算与网络中其他客户端的计算不同。

幸运的是,@mhswende很快发现了这个bug,@sorpaas努力修复它。

还有很多话要说,我希望当我能更好地观察整个情况时,会有更好的时间来写报告。

我只能说,这个bug凸显了硬分叉的固有风险以及继续构建更具弹性的基础设施的重要性。

依赖于openem客户端的单客户端系统今天已经关闭了一段时间,因为出现问题块后,客户端无法跟上网络。以太扫描本身被关闭了。

幸运的是,这个错误并不严重到足以导致严重的链分叉,但这种可能性并不存在。我们可以利用多客户机实现来增强阻力—多客户机是我们以太坊生态系统的优势之一—并推动您的基础设施提供商也这样做。

我们看到,2021年普及速度前所未有,前景十分光明。我们应该从这次事故中吸取教训,共同建设一个更好的以太坊。

源链接:推特网站你知道吗

但网络的绝大部分活跃客户端都不是这样实现 EIP-2929 的,它们只会给访问了已激活预编译合约的交易提供 gas 折扣 —— 而 EIP-2537 属于还未激活的预编译合约!所以,OpenEthereum 客户端对该交易消耗了多少 Gas 的计算与网络中其他客户端发生了分歧。

所幸,@mhswende 很快找出了该 bug,而 @sorpaas 出力修复了该 bug。

还有很多东西可说,我也预期会有比我更能观察到全貌人来撰写更好的时候报告。

我能说的只是,这个 bug 彰显了硬分叉的内在风险,以及持续致力于建设更有弹性的基础设施的重要性。

依赖于 OpenEthereum 客户端的单客户端系统在今天停机了一段时间,因为客户端无法在问题区块出现后与网络保持同步。Etherscan 自身也因此停机。

庆幸的是,这个 bug 没有严重到导致重大的链分叉,但这样的可能性并不是不存在。我们可以利用多客户端实现来提升抗性 —— 多客户端本身就是我们以太坊生态的一大长处 —— 并推动您的基础设施提供商也这样做。

我们已经看到,2021 年的普及速度已经前所未有地快,而且前景非常光明。我们要从这个事故中吸取教训,一起打造更好的以太坊。

来源链接:twitter.com

区块链技术技术简析柏林升级后 OpenEthereum 客户端出错始末 由www.b2bchain.cn 提供
文章整理自网络,只为个人学习与分享使用
链接地址https://www.b2bchain.cn/17433.html

区块链毕设网(www.a1fz.cn)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
a1fz.cn区块链面试课程设计代做网专注|以太坊Hyperledger fabric-计算机|java|毕业设计|代做平台 » 区块链技术技术简析柏林升级后 OpenEthereum 客户端出错始末