ETHER:科普 | OpenEthereum客户端 “柏林” 升级后出错始末

AlexStokes@ralexstokes:

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

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

首先,我想感谢所有快速反应到事故并解决了问题的工程师:https://twitter.com/OpenEthereumOrg/status/1382719444833726470?s=20…

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

先从那笔触发了错误的交易开始:https://etherscan.io/tx/0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247

稳定币crvUSD科普创新清算机制LLAMMA,可在抵押品价格下跌时逐步替换为稳定币:1月17日消息,Curve官方科普其稳定币crvUSD创新的清算机制LLAMMA,解释了LLAMMA通过AMM的特性进行针对债务人更友善的清算方式,让抵押品在价格下跌时逐渐转移成稳定币,让原本要清偿的债务有一定程度的稳定币可以偿还,同时在价格回稳时再逐渐把稳定币换回抵押品,而不是直接的触发清算导致债务人的亏损。

此前报道,2022年11月23日,去中心化交易平台CurveFinance开发者发布Curve即将推出的去中心化Stablecoin“crvUSD”的官方代码和白皮书。[2023/1/17 11:17:13]

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

徐明星新书《趣说金融史》正式发布 科普金融发展之道:金色财经现场报道,9月23日,欧科云链创始人徐明星携手著名财经作家李霁月、行业观察者顾泽辉力作《趣说金融史》一书,跨越5000年金融历史,重读金钱故事,并预测新的金融时代。该书由中信出版社出版,将于近期正式发售。据了解,本书可以更好地呈现金融的起源与发展,帮助人们理解货币、金融与未来经济。作为区块链行业领军企业——欧科云链的创始人,徐明星深知技术探索对经济社会的重要推动作用,他曾先后出版过《图说区块链》、《区块链:重塑经济与世界》、《通证经济》、《链与未来》等行业权威著作,解读区块链等新型技术的推动下,金融与社会的升级之道,对经济社会发展做出了重大贡献。其中,《区块链:重塑经济与世界》曾作为新中国70周年重点推荐图书之一被相关书店推荐。[2021/9/23 17:00:57]

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

欧易OKEx将于3月18日推出DeFi系列科普视频:据欧易OKEx官方消息显示,欧易OKEx将正式推出DeFi系列科普视频《欧易DeFi20讲》,本系列节目由欧易OKEx亚太区CEO马克金主讲。该视频首期将于3月18日11:00(HKT)推出,用户可以在欧易OKEx官方学院、金色财经观看。

《欧易DeFi20讲》主要包含DeFi入门指南、全景解读DeFi生态及如何参与DeFi三个篇章,可以轻松使用户了解DeFi原理,洞察DeFi价值,掌握DeFi热点,更多详情请关注欧易OKEx官方学院。[2021/3/18 18:55:59]

2/我们可以解析calldata来看看到底哪里出了错:第一行表示地址列表从字节64开始。第二行表示转移数额的列表从字节416开始。

声音 | 浪潮集团云南分公司总经理:云南区块链产业发展需从“科普”到“专精”不断深化:据昆明日报消息,浪潮集团云南分公司总经理郑昕表示,云南区块链产业发展需从“科普”到“专精”不断深化。下一步,浪潮将继续加大云南农业产业高质量发展体系建设力度,重点以普洱茶等云南优势产业为切入点,打造云南“绿色、有机农产品高地”的品牌形象,并在此基础上,开展基于区块链的供应链金融服务,解决中小企业贷款难、贷款贵问题。[2019/11/11]

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

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

动态 | 浙江卫视节目科普支付宝区块链防伪溯源产品:昨日,在浙江卫视播出的科普综艺栏目《智造将来》现场,支付宝首次展示了支付宝区块链防伪溯源产品,以接地气的方式公开向大众展示区块链在生活中的应用。[2019/3/4]

5/这就是最终bug的根源:因为calldada中的值是“0x10”,但是calldata只给出了10个地址-数值对。对这个calldata的正确ABI编码应该是“0xA”——不是“0x10”!

6/你可能已经猜到了那时候会发生什么事,我们可以通过执行情况跟踪器来看看:https://etherscan.io/vmtrace?txhash=0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247&type=parity

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

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

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

此时,你可能会注意到,0x10有可能是我们所谓的“特殊地址”之一,它完全在EVM预编译合约的范围内。

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

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

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

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

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

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

因为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年的普及速度已经前所未有地快,而且前景非常光明。我们要从这个事故中吸取教训,一起打造更好的以太坊。

原文链接:https://twitter.com/ralexstokes/status/1382750001026146304作者:AlexStokes翻译:阿剑

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

[0:15ms0-1:105ms