以太坊爱好者2021-07-29 10:42:53
概述
2021年 7 月 21 日,OpenEthereum 团队注意到他们在 Ropsten 上的节点卡在了区块 10679538 处。人们原以为这是 OpenEthereum 的问题。其实,问题真正出在 go-ethereum 实现检查 1559 交易发送方余额的方式上。一个无效交易(发送方余额只够支付交易实际使用的 gas,而非交易指定的 maxFeePerGas 总额)被打包进了区块。由于 Ropsten 矿工运行的都是 go-ethereum,这个区块随后又被其它 go-ethereum 矿工接受,但是被网络中的其它一些客户端拒绝了。具体来说,OpenEthereum 和 Besu 拒绝了这个交易/区块,Nethermind、go-ethereum 和 Erigon(这些客户端实现的部分代码来自 go-ethereum 代码)接受了它。问题的根源已经找到,相关客户端已经在新的版本中修复了该问题:
go-ethereum: v1.10.6, fix PR;
Erigon: v2021.07.04-alpha, fix PR;
Nethermind: v1.10.79, fix PR。
问题区块的信息
网络:Ropsten
区块编号:10679538
哈希值:0x1252a34c4f2b061adc609e909d958c02e1ac39043e2e60c0ec47e565e3f625f1
OpenEthereum debug 日志
eth_getBlock 输出 (go-ethereum)
测试网事故的时间线(注:所有时间已转换成北京时间)。
2021 年 7月 21日
18 : 39:Ropsten 测试网上挖出区块 10679537。
21 : 53:OpenEthereum 开发者在 Ethereum R&D discord 的 #1559-dev 频道发帖称他们的节点卡在了区块 10679538 处。
21 : 58:@smixx 称他们的在 Ropsten 节点位于区块 10680453。
22 : 36:Besu 确认他们的节点也拒绝了区块 10679538。
22 : 51:确认挖出区块 10679538 的矿工是 go-ethereum节点。
22 : 55:确认 go-ethereum 矿工仍继续在区块 10679538 上面挖矿。
22: 56:确认 Nethermind 也接受了区块10679538。
23 : 08:go-ethereum 已确认问题的根本原因。
23 : 43:go-ethereum 开启 pull request,提供候选修复方案。
23 : 46:Erigon 开启 pull request,提供候选修复方案。
2021年 7月22 日
00 : 01:更新后的 go-ethereum 和 Besu 矿工在 Ropsten 上重启(此时,错误的链已经挖到了区块 10680803)。
00 : 43:EthereumJS 确认与 go-ethereum、Erigon 和 Nethermind 存在同样的问题。
01 : 57:Nethermind 开启 pull request,提供候选修复方案。
10 : 22:修复后的版本挖出了区块 10680804。
22 : 54:go-ethereum 发布了修复后版本 v1.10.6。
~23 : 00:Nethermind 发布了修复后版本 v1.10.79。
2021 年 7 月 23日
~00 : 00:Erigon 发布了修复后版本 v2021.07.04-alpha。
纠正措施建议提高规范中断言(assertion)的清晰度
该提交新增了关于 EIP 1559 类型交易有效性的断言。具体来说,在第 217 行代码新增了以下断言:
另外还要注意的是,在前几行代码(第 207 行)中,sender.balance 被修改成了减去交易量之后的部分(sender.balance -= transaction.amount)。这个参数引发了混乱,因为一些客户端团队在检查第 217 行定义的断言时使用的是全部 sender.balance(即,没有减去transactiion.amount 的发送者地址余额),而非更新后的值。
Go-Ethereum 恢复@holiman 关于 go-ethereum 恢复的说明:
节点同步时跟随错误的链
假设你正在运行 geth,并处于同步中。区块 X 上发生了分叉。你的节点跟随了总难度较高的错误的链。在区块 Z,你停止了节点并将其更新至修复后版本。
问题描述:节点依然在 “错误” 的链上。
解决方案:执行 debug.setHead{X-1) 回到分叉发生之前。这会将节点倒回区块 X 之前的某个状态,不一定是区块 X-1 的状态,因为 geth 不一定有区块 X-1 的完整状态,但是会有其它某个区块的完整状态。通常情况下,geth 大约每隔 1 万个区块(1 小时)和/或宕机时会将状态刷到磁盘。如果 geth 在 gcmode=archive 下运行,就会将每个区块都刷到磁盘。
当错误的链总难度较高时进行同步
假设你正在同步一个 geth 节点,区块 X 上发生了分叉。由于分叉已经发生了,再加上错误的链总难度更高,你很可能会同步错误的链,pivot 区块是 X+M。在这种情况下,由于你没有区块 X+M 之前的状态,无法执行 debug.setHead 来解决这个问题。
这种情况需要重新同步。但是,你需要防止 geth 同步错误的那条分叉链。这可以通过 whitelist 命令行参数实现。
因此,你需要执行 geth --whitelist 123123=0x2342fafa9af9af9af9af9af9。
所谓的白名单,就是一个 geth 节点在与另一个对等节点连接时会向对方请求区块 123123 的数据。如果该 geth 节点收到的区块头中的哈希与白名单中的不符,就会与之断开连接。这就意味着,节点将排斥错误的链上的对等节点,只与较短(但是正确的)链上的对等节点连接。
以太坊Layer 2必知必会2023-04-26 15:03:27
浅析NFT未来:仅少数项目上涨 出圈项目会成赢家2023-04-26 14:15:26
E-CNY时代来临:当你的工资成为数字人民币2023-04-26 12:43:48
浅谈为什么MEV搜索者矿池并不可行?2023-04-26 12:08:40
"庄家"互撕 曝出加密巨头拉的那些"帮派"2023-04-26 11:59:08
怎样到达Web3世界:使用Web3技术的公司及集成到业务的步骤2023-04-26 11:53:15
稳定币项目 HAI、Starknet 2023 路线图2023-04-26 11:46:35
ChatGPT类产品安全隐患解决?英伟达发布开源工具包2023-04-26 11:26:24
蚂蚁集团发布HOU、AntChainBridge、Web3开放联盟链等多个Web3产品2023-04-26 11:24:46
ChatGPT背后的算力博弈 中国企业亟待打破美国桎梏2023-04-26 10:59:28
简析DWF Labs:出手频繁 颇具争议的加密做市商2023-04-26 10:48:45
NFT 交易平台生存现状研究:后版税战争时代下的龙头之争2023-04-26 09:20:51
以太坊提款功能开启后的带宽使用情况2023-04-26 08:30:24
上海升级提款效应:数据揭示 LSD 项目们的表现2023-04-26 07:28:37
3分钟读懂基于LayerZero的多链抗MEV DEX聚合器Cashmere2023-04-25 20:05:34
对话去中心化流动性质押协议Rocket Pool:如何促进以太坊Staking民主化?2023-04-25 19:02:21
Bankless:欧美都想监管稳定币 他们怎么做?2023-04-25 17:43:44
Coinbase起诉SEC全文:请在合理时间内回应加密规则请愿书2023-04-25 16:43:34
慢雾:Web3 假钱包第三方源调查分析2023-04-25 15:43:36
Binance Sensei介绍:您的Web3 AI导师2023-04-25 13:20:55