
这个周期以太坊的价格表现被很多的 ETH 持有者抱怨,有些人会寄希望于即将到来的 Pectra 升级,期待这次从去年延续到今年的重要升级,能为以太坊生态带来新的气象。但是这次升级在两个公开测试网的激活都不顺利,第一次 Holesky 至今无法获得最终性确认,而第二次,也就是上周在 Sepolia 上的激活,也发生了一个插曲,好在核心开发团队及时发布了新的客户端版本,从而使整个网络最终恢复了正常。 我们自己在跑 Sepolia 的全节点,由于之前在 Holesky 发生了问题,所以我们这次在升级前就在关注网络状态,发现在升级激活后,网络中很快出现了大量空块,也就意味着网络无法打包交易,随后查看了 @TimBeiko 的 tweet 后得到确认,升级发生了问题。随后的几个小时后,Geth 以及其他的几个执行客户端都发布了新的版本,整个网络随后恢复了正常。我们也比较好奇,究竟事情的来龙去脉是什么。 @vdWijden 是 Geth 团队的核心开发者,也亲历了整个处理过程,他写了一篇文章回顾了经过,让我们也更加了解了整个过程。 问题发生的主要地方在以太坊质押的存款合约,这次 Pectra 升级的一个功能是可以在执行层触发从这个存款合约里取款,所以在升级激活后,测试人员发了一个取款交易进行测试,正是这个交易,导致了整个网络出现了问题。 而出问题的原因是因为这个存款合约和主网的合约不太一样,以太坊开发团队做了特殊的定制,叫做 "token gated deposit contract",也就意味着只有拥有这个特殊的 token 的人才能直接和该合约交互,类似一种白名单的机制。不过他们没有想到的是,这个 "token gated" 机制和 deposit contract 的处理发生了冲突,具体是 ERC20 token 在转账的时候会 emit 事件,而deposit contract 的处理逻辑的假设是没有这类的事件发出的,如果有的话,就会认为是非法区块,从而拒绝承认该区块。 在分析完 root cause 之后,各个客户端都紧急出了 fix 的版本,计划在三个半小时后统一发布更新。而为了让网络在等待的这段时间也能正常出块,测试人员撤销了之前引发问题的那笔交易,从而让整个网络恢复正常。 但是意外发生了,在网络暂时恢复后,马上又出现了之前的问题,他们调研后发现,有攻击者利用相同的漏洞攻击他们,此外他们还怀疑之前的一些公开的技术讨论被攻击者看到。所以他们决定私下讨论,并秘密在团队控制的节点发布更新来缓解问题,好在三个半小时之后整个网络都进行了升级,这个攻击也就不再奏效了。 后面的这个插曲很有意思,感兴趣的话,可以读读原文。不过我们可以看到,去中心化网络面临的协调难度以及攻击强度都是巨大的,即使在测试网,都会出现这些难处理的事情。 另外一方面,以太坊牵动着非常广泛社区的利益,即使是测试网升级的风吹草动,也牵动着很多持币者的心,希望之后核心团队还是能更加谨慎的对待升级测试。 最后还是希望以太坊主网的 Pectra 升级一切顺利!