专栏名称: 以太坊爱好者
以太坊爱好者
目录
相关文章推荐
白话区块链  ·  Web3 安全入门避坑指南|硬件钱包的常见陷阱 ·  21 小时前  
请辩  ·  泡泡玛特做对了什么? ·  昨天  
请辩  ·  养老金为什么不能降? ·  2 天前  
请辩  ·  房价的下一轮崩盘从哪里开始? ·  3 天前  
白话区块链  ·  从MeMe到AI:加密市场的新机会在哪里? ·  2 天前  
51好读  ›  专栏  ›  以太坊爱好者

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

以太坊爱好者  · 公众号  · 区块链  · 2021-04-19 20:07

正文

请到「今天看啥」查看全文


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

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

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

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

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

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

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

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







请到「今天看啥」查看全文