登录客服
手机网
手机网
欢迎您,
首页>> 外汇学院>>  正文
新闻

OpenEthereum 客户端 “柏林” 升级出错始末

2021-04-20 17:06:05 来源:中亿财经网整合 作者:佚名
关注外汇网:
扫描二维码 外汇网官方微信
我要分享

  Alex Stokes@ralexstokes:

  你可能已经听说了,@OpenEthereum 客户端的一个错误导致了一些支撑以太坊网络的重要服务宕机。

  我们来琢磨一下那笔造成事故的交易。

  首先,我想感谢所有快速反应到事故并解决了问题的工程师:

  https://twitter.com/OpenEthereumOrg/status/1382719444833726470?s=20…

  另外,我没有自己跟踪所有的细节,下文中的重要事实都由用户 eb 在 Eth R&D discord 服务器里提出。

  先从那笔触发了错误的交易开始:

  https://etherscan.io/tx/0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247

  这是一笔合约调用交易,从 KuCoin 交易所发出,向许多地址分发 ETH。对该笔交易的 call data 的 ABI 编码错误,最终导致了链分裂。你可以在 Etherscan 上看看这笔交易的 “Input Data”。

  在合约中调用 sendEths 时,需要提供两个参数:一个是关于目标地址的不定长数组(dynamically sized array);一个是关于转账数额(以 wei 为单位)的不定长数组;两者相搭配才知道要转移多少钱给哪个地址。

  我们可以解析 call data 来看看到底哪里出了错:第一行(在 Etherscan 上标记为  “[0]”)表示地址列表从字节 64(行 “[2]”)开始。第二行表示转移数额的列表从字节 416(行 “[13]”)开始。

   因此,大体上,我们是希望成对成对地、从上往下、向某个地址发送一定数量的 ETH —— 看起来很直接嘛。

  然而,当我们开始遍历这个列表,我们先跳转到 call data 的正确字节,而 Solidity ABI 声明了数据的第一个字是整个不定长数组的长度。

  这就是最终 bug 的根源:因为 call dada 中的值是 “0x10”(注意,这可是 16 进制!),但是 call data 只给出了 10 个  地址-数值对。对这个 call data 的正确 ABI 编码(填在行 [2] 和行 [13] 的)应该是 “0xA” —— 不是 “0x10”!

  你可能已经猜到了那时候会发生什么事,我们可以通过执行情况跟踪器(execution trace)来看看:

  https://etherscan.io/vmtrace?txhash=0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247&type=parity

  合约成功地遍历了前 10 个地址。本来合约应该在此时停止执行,但根据 call data 的声明,还有很多个地址!那就继续执行吧。

  但是,根据 call data 的结构,“第 11 个地址” 是用于编码列表长度的 0x10,所以合约就尝试发送 0 ETH 到地址 0x10。

  此外,似乎,当合约尝试读取并不存在的 call data 时,会返回 0 ETH —— 你可以想象成合约在这里跑出了一个错误,但它却继续发送 0 ETH 到它从 call data 中读取的另外 6 个 “地址”。

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

  而我们也并不期望预编译合约 0x10 能够返回 ETH 。如此,它就成了一个 ETH 黑洞。但是,这也并不必然造成任何问题。到底是什么导致了整个客户端崩溃?

  原因在于,0x10 实际上是一个由 EIP-2537 断言的预编译合约,是为 BLS 配对密码学程序而设的,但这个 EIP 还未部署到主网上。所以虽然你能够跟这个地址互动,但主网上的这个地址里没有任何合约,不会有任何进一步的动作。

  此外,我们还需要一个事实来解释这次分裂,你可能也猜到了,就是 “柏林” 硬分叉(也正是这次硬分叉使这个问题浮出水面):它改变了 EVM 中 Gas 消耗量的计量方法。

  在 EIP-2929 实施后,如果你在一笔交易中对同一个存储槽多次执行状态存储操作,第一次执行会消耗更多 Gas,后续执行的消耗会更少。这种重定价理论上能更准确地反映当前的客户端访问存储项的成本 ……

  而且,要知道,在所有客户端的执行中,这些数据通常都换存在更便宜的硬件层中。

  现在我们终于找到了 OpenEthereum 在区块 #12244294 处发生的 Bug:该客户端包含了 所有 已实现的预编译,作为 EIP-2929 访问清单的一部分。(译者注:此处应为 “EIP-2930”)

  因为 EIP-2537 在大部分客户端中都已经实现就绪了(而且一度有人提议要把它包含在 “柏林” 升级里面!),OpenEthereum 对所有访问了 0x10 的交易都给了 gas 折扣。

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

  所幸,@mhswende 很快找出了该 bug,而 @sorpaas 出力修复了该 bug:https://github.com/openethereum/openethereum/pull/364

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

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

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

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

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

()
中金在线外汇网声明:中金在线外汇网转载上述内容,不表明证实其描述,仅供投资者参考,并不构成投资建议。投资者据此操作,风险自担。

推荐阅读

随着加密货币总市值突破两万亿,仿佛市场的轮回一样,加密货币行业又回到了那个「新兴 VC 遍地走、开盘几十倍,一级市场抢到就是赚到」的「盛况」。众多所谓的「明星」项目会将大部分额度留给团队和投资者,而仅...

04月20日 17:06

XRPscan数据显示,作为 Ripple Labs 的前首席技术官,Jed McCaleb 在过去10天里再次卖出 1.4 亿枚 XRP ,总价值接近 1.95 亿美元,目前 Jed钱包余额为453...

04月20日 17:06

Crypto 作为一种新的资产类别,虽然大体上投资原则和传统市场没差别,但实际操作的时候,GP 还需要重新评估,有时候也得根据 crypto 的特征调整投资方法,构建 crypto 风投基金也是这样。...

04月20日 17:06

DeFi是和NFT本质上不同的物种NFT概念仍在火热,OpenSea单日交易额最高已经突破1千万美元,但是也在逐渐遭到质疑,主要问题在于估值和流动性问题,估值问题见仁见智,给具有精神消费意义的商品作价...

04月09日 20:07

众所周知,币圈朋友银行账户常因不明原因被公安机关冻结。由于公安机关往往不会主动联络银行账户的所有人(除非有明显且重大的犯罪嫌疑),被冻账户的朋友在一头雾水的同时,亦不知法律上的救济渠道。为此,飒姐团队...

04月09日 20:06

疫情期间,区块链在非信环境下构建多方协同信任的能力倍受关注,慈善捐助、食品溯源、出入通等创新应用不断涌现,成为了新基建中耀眼的新星。政策红利之下,社会各界掀起了一股“区块链+”的热潮,各行各业积极探索...

04月07日 17:05

4月1日起,区块链电子发票又双叒叕上线新功能了。深圳市移动办税平台新上线“开票易”功能,开具区块链电子发票可在线上完成。区块链发票上线“开票易”功能新上线的“开票易”功能彻底解决了用票烦恼。通过手机登...

04月07日 17:05

周四,CNBC《财经论谈》节目发布了杰伊·克莱顿(Jay Clayton)的采访稿。克莱顿表示,SEC(美国证券交易委员会)不认为比特币是证券,但这并不意味着不应该对比特币进行监管。克莱顿在谈及比特币...

04月07日 08:35

4月2日,全球化加密金融服务提供商Amber Group股东知名加密货币交易所Coinbase发文表示,美国证券交易委员会于4月1日宣布,有关A类普通股拟直接公开上市的S-1表格注册声明已宣布生效。这...

04月07日 08:35

根据数据分析公司 CB Insights 近期发布的一份报告,2021 年第一季度,约 129 家专注于区块链的初创企业筹集了约 26 亿美元的资金。这一数字轻松超过了 2020 年全年 341 次融...

04月07日 08:35