当前位置:首页区块链柏林升级后openem客户端错误分析

柏林升级后openem客户端错误分析

柏林以太坊的升级改变了用气量的计量方式,OpenEM客户端在错误交易的用气量计算上与网络中其他客户端存在差异。

原题:通俗科普客户端升级后出错的全过程“柏林”
作者:亚历克斯·斯托克斯
翻译:阿健

您可能已经听说,@openem客户机中的一个错误导致了支持以太坊网络的一些重要服务的停机。

让我们想想造成事故的原因。

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

另外,我自己也没有追踪所有的细节。下面的重要事实都是由ETH RD;discord server中的用户EB提供的。

从引发错误的交易开始。

这是kucoin交易所的一项合约买入交易,用于将ETH分配到多个地址。事务调用数据的ABI码错误,最终导致了链分裂。您可以在ETHerscan上看到交易的“输入数据”。

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

2/我们可以分析呼叫数据,看看哪里出错了:第一行(在ETHerscan上用“[0]”标记)指示地址列表以字节64开头(第“[2]”行)。第二行显示转账金额列表,从字节416开始(第“[13]”行)。

3/因此,一般来说,我们希望将一定数量的ETH成对地从上到下发送到一个地址-这似乎非常直接。

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

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

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

7/contract成功地遍历了前10个地址。原来,这个时候合同应该停止了,但是根据通话数据的说法,还有很多地址!那就去吧。

然而,根据呼叫数据的结构,“第11个地址”用于编码列表的长度。因此,契约尝试将0 ETH发送到地址0x10。

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

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

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

原因是0x10实际上是eip-2537声明的预编译协定,它是为BLS配对加密程序设计的,但该eip尚未部署到主网。因此,尽管您可以与此地址进行交互,但主网络上的此地址中没有契约,因此不会有进一步的操作。

此外,我们需要一个事实来解释这种分裂。正如你可能已经猜到的,这是柏林硬叉(这使问题浮出水面):它改变了测量方法的天然气消耗电动汽车。

在eip-2929实现之后,如果在一个事务的同一个存储槽上执行多个状态存储操作,那么第一次执行将消耗更多的gas,而后续执行将消耗更少的gas。理论上,这种重新定价可以更准确地反映客户访问存储项的当前成本

此外,应该注意的是,在所有客户机的执行中,数据通常存储在较便宜的硬件层中。

现在我们终于在block#-12244294找到了openeim的bug:客户机包含所有预编译的实现,作为eip-2929访问列表的一部分。(注:应为“eip-2930”)

因为eip-2537已经在大多数客户机上实现了(而且它曾经被提议包含在“Berlin”升级中!)openem为所有访问0x10的事务提供gas折扣。

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

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

还有很多话要说,我希望有一个更好的时间写一份报告,比我可以观察全景。

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

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

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

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

温馨提示:

文章标题:柏林升级后openem客户端错误分析

文章链接:https://www.btchangqing.cn/237820.html

更新时间:2021年04月20日

本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。

区块链

挖矿是什么?为什么挖?矿能挣钱?

2021-4-20 17:16:55

区块链数字货币行情

4月20日BTC及ETH双重探底是否有效分析解析

2021-4-20 17:20:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索