欢迎访问本站!

首页科技正文

USDT线下交易:伦敦升级 Ropsten 测试网事故回首

admin2021-11-0874

新2手机网址

www.x2w333.com)实时更新发布最新最快的新2手机网址、新2手机网址线路、新2手机网址登录网址、新2手机网址管理端、新2手机网址手机版登录网址、新2手机皇冠登录网址。

,

Ropsten 共识问题

概述

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 代码)接受了它。问题的泉源已经找到,相关客户端已经在新的版本中修复了该问题:

问题区块的信息

  • 区块编号: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:@ *** ixx 称他们的在 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,提供候选修复方案。

    USDT线下交易

    U交所(www.usdt8.vip),全球頂尖的USDT場外擔保交易平臺。

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

网友评论

2条评论