引介 | Medalla 测试网网络动荡始末,Part-3
摘要: Prysm 客户端团队的 Raul Jordan 公开发表的事故总结,更清楚地说明了连锁故障发生的先后顺序
编者注:第五篇材料,是 Prysm 客户端团队的 Raul Jordan 公开发表的事故总结,更清楚地说明了连锁故障发生的先后顺序,也做了透彻的检讨,回应了很多疑问。
Eth2 Medalla 测试网事故
摘要
上周末,Eth2 公开测试网 Medalla 卷入了一系列连锁故障。这些故障暴露出了几个严重的漏洞,以及我们在处理致命情形时的错误方法。这一系列故障始于运行 Prysm 客户端的节点收到了来自 6 台不同时钟服务器的错误响应,这导致绝大多数运行 Prysm 客户端的节点在同一时间掉线。我们团队紧急推出了修复方案,而这一方案又包含了一个重大缺陷 —— 它移除了节点运行需要的所有必要特性。这个问题导致了网络分区,每个节点都在拼命同步区块链,但都无法找到一个健康的对等节点。Medalla 经历了一个命途多舛的周末,也为我们提供了非常宝贵的学习经验,来防止此类故障重演,尤其是在主网上。本文将涵盖此次事故的完整总结、它的结果、经验教训,以及在 eth2 主网启动之前我们进一步的具体行动计划。
问题澄清
Eth2 测试网的失败是因为依赖于 cloudflare.com 的时间服务器么?Eth2 中的时间戳依赖中会出现单点故障么?
当然不会。我们利用 roughtime 云服务器告知用户他们的系统时间可能偏离,并基于这些服务器的响应动态调整他们的时间,我们认为这一做法很好,但其实完全没有必要,反而会招致一些问题。如果我们让 eth2 中像时间戳这样重要的事情出现单点故障,那毫无疑问是个安全风险,且完全没有必要。打这次事故以后,我们只会依赖于系统时间。如果一名验证者的系统时间真的不对,我们会提醒他们,但绝不会强制更改他们的时间。我们会像其它 eth2 客户端实现一样,只使用系统时间。
测试网挂掉了?
并没有。只要还能运行节点,只要验证者还可以验证,测试网就永远可以回到完全可控的状态。当前,客户端实现团队已经增强了他们的链同步代码,使得节点的运行更加平稳,此举可以提高验证者的参与率,并使区块链再次实现终局性(finality)。我们还有希望。验证者的参与率已经从 0-5% 攀升到了 40%,当达到 66% 以上时,整条链就可以重新获得终局性了。。
本次事故对主网上线有何影响?会再次跳票么?
我们认为本次事故并不会影响主网的启动事件。Prysmatic Labs 团队建议 ETH2 保持原来的启动日程表,不再推迟。对于很多客户端而言,这周末发生的事故是一次很好的压力测试,并确实测验了一些启动清单上的需求。虽然主网启动的日期尚未明确,但我们认为将目标启动时间定为从 Medalla 创世后 2~3 个月依然是一个理想的时间安排。会有一个 Eth2 启动的公开需求清单,而本次 Medalla 上出现的事故势必会导致清单上添加许多新的条目,包括客户端弹性、安全性以及恰当的版本控制等事项。这就是我们目前已知的所有信息。
事故时间线
故障的初步迹象
中点 | 服务器名称 |
---|---|
2020 年 8 月 15 日 2:20:23 AM | Google-Sandbox-Roughtime |
2020 年 8 月 15 日 2:20:23 AM | Caesium |
2020 年 8 月 15 日 2:20:23 AM | Chainpoint-Roughtime |
2020 年 8 月 15 日 2:20:23 AM | Cloudflare-Roughtime |
2020 年 8 月 15 日 2:20:23 AM | int08h-Roughtime |
2020 年 8 月 16 日 2:20:23 AM | ticktock |
问题 #22:针对故障服务器的客户端健壮性
紧急修复更新(alpha.21)
尽管我们并不知道其中一台 roughtime 服务器报告的时间提前了 24 小时,但我们知道 roughtime 服务器出了问题,因此必须立即关闭。我们并没有完全删除 roughtime 代码,而是将其修改成需要开启一个运行时标签(runtime flag)才能调整时钟,而不再是默认自动调整时钟。测试网已处于水深火热之中,我们希望快速行动起来,于是决定推出一个 “紧急版本”,并要求每个人立即更新新代码。然而,还没等我们这样做,roughtime 服务器已经恢复正常了。
大规模罚没事件
事故发生前,我们本应对此有所预料,但真当它发生时,仍然震惊了所有人。大约上午 10 点的时候(北京时间),在 roughtime 事故中每一个活跃的验证者都开始主动发出会导致自己被罚没的见证消息。这就变成了一场大屠杀,在极短的时间内发生了超过 3000 次罚没,我们内部的验证者无一幸免。当时我们正忙于改进测试网的用户体验,因此没有及时为我们的内部验证者配置本地的罚没保护措施。
运转中的罚没保护
幸运的是,Prysm 在默认情况下使用了一个简单的罚没保护机制来跟踪见证消息和验证者生产的区块,防止他们对相同的消息重复签名。对许多用户而言,这使得它们免受罚没之灾。
真正的问题:alpha.21 版本中发现了 bug
由于太急于解决原始问题,我们没有考虑到潜在修复的所有影响,把关注点更多地放在了快速发布新版本上,而不是仔细检查新的版本是否会破坏我们节点中的其它东西。我们的队友 Nishant 第一个指出了我们发行的 alpha.21 版本存在严重缺陷。如果我们啥也不干的话,网络本可以自行恢复。
在发布这个修复程序时,我们意外地移除了 Eth2 信标链节点得以正常运行的所有关键特性的初始化部分,从而让问题变得一发不可收拾。我们在 discord 服务器和推特上向所有人宣布这个新版本后,质押用户开始快速升级他们的节点,这时我们才意识到问题有多么严重。更糟糕的是,现在 roughtime 的 bug 已经完全恢复了,如果没有我们火急火燎的一通骚操作,网络很可能已经正常。
回滚和同步问题
在意识到错误的范围之后,我们马上建议用户将客户端回滚到以前的版本,因为现在 roughtime 的问题已经解决了。然而这一举动最终变得十分艰难,因为网络已经分区了,而且用户也对短时间内有如此多更新感到一头雾水。由于绝大部分节点停机了一段时间,因此用户频繁重启他们的节点来获取更新,看上去几乎网络中的每个人都在尝试同步区块链,这导致获取最新的区块变得毫无可能。此外,节点想要解决分叉非常困难。也就是说,网络中充斥着无数的不良节点,想要找到一个好的节点犹如大海捞针。而且节点的资源消耗也在不断攀升。其它客户端实现都出现了大量的内存占用, Prysm 节点也受到了 CPU 使用过高的影响,这在解决分叉时毫无帮助。
现状
本次事故暴露了我们的节点在处理区块链高度分区事故中的分叉区块时所作的几个关键、有缺陷的假设。我们没有处理在某个 slot 时间内可能存在多个区块的多条代码路径,这导致我们的节点经常被卡住。此外,即便我们解决了这个问题,如果节点已经落后了,那么仍然无法重新同步到区块头。基于区块链稳定的假设来写代码并不难,但要让这些代码在充满不良节点、分叉、和网络分区时依然正常运转则完全是另外一回事了。改变假设之后,我们的同步逻辑在处理这类场景时就会变得足够稳健,我们的队友 Victor Farazdagi 可以很快解决这个问题。从那以后,我们又推出了一个修复更新,引导 Prysm 节点同步到区块链顶端并保持同步!在撰写本文时,绝大部分节点正在更新到这个版本。此时,我们只需要更多验证者上线,并使用他们已经同步好的信标链节点开始见证和提议区块就好了。接下来,我们会监视链上的参与情况,并尽可能多地与运行验证者的个人取得联系,去了解他们是否仍然会遇到问题。
如果你正在运行 Prysm,你可以前往我们的发布页面 https://github.com/prysmaticlabs/prysm/release 下载最新的版本,或者遵循我们文档中心 https://docs.prylabs.network/docs/install/install-with-script 发布的详细指南。我们会随着情况的进展不断通过我们的 Discord 更新状态。
经验教训
不要急于合并修复程序
如果我们没有急于修复 roughtime 时钟同步问题,本来可以避免整个事件。这次事件之所以会恶化,是因为我们合并了一个错误的 PR,而这个 PR 清除了节点运行所需的一切关键功能。由于迫切想解决最初的问题,我们没有认真思考修复程序会带来的所有影响,而是一心想着尽快发布,就没有仔细检查修复程序是否会破坏节点的其它功能。我们团队的 Nishant 是第一个指出 alpha 21 版本存在严重缺陷的。如果我们没有采取任何行动,测试网本来是可以自行恢复的。
看到全网运行 Prylabs 客户端的节点都出现故障,我们心急如焚,一心想着尽快缓解用户的担忧。虽然这个修复程序最初是由外部贡献者创建的,但是没有仔细审查是我们的错。这个修复程序中有一行代码将所有运行 Prylabs 客户端的节点还原回全局默认配置。见https://github.com/prysmaticlabs/prysm/pull/6898/files#diff-fb86a5d3c2b85d3e68cad741d5957c29L263。从今往后,在出现故障或危机期间,每一个待发布版本必须
-
经过整个团队和一名外部人士(如,以太坊研究员)的审查 -
先在模拟环境中经过一段时间的测试,可以是 Prysm ETH 2.0 攻击网,也可以是存在同样漏洞的本地测试网。
在不稳定时期,对外宣布更新必须慎之又慎
让用户能够无缝迁移到其它 ETH 2.0 客户端上,并提供清晰易懂的文档
对质押用户的启示
这种情况发生在测试网上是最好的
ETH 2.0 Phase 0 的风险
- “尝鲜者需承担的风险:验证者参与的是新网络的首次上线。就像所有新的软件那样,有可能存在漏洞。虽然可能性不高,但是潜在漏洞会导致罚没” -
- “我是早期开拓者,我接受因软件和设计存在漏洞而导致被罚没的情况” -
客户端单一化的风险
如何让节点保持更新
如果这次出故障的是主网会怎么样?
-
有完整的检查表,包括候选发行版本、模拟环境、外部通信和监控。 -
为用户提供在不同 ETH 2.0 客户端之间迁移的详细指南。 -
制定一个分步指南并由 ETH 2.0 客户端应急小组执行。Prysmatic Labs 有自己的内部手册,但是如果有一个能够协调所有 ETH 2.0 客户端的总指南,就能省去很多烦恼。 -
就如何在关键时刻通知权益者、节点运营者和普通用户更新节点制定详细的计划。
总结
(完)
原文链接:
https://medium.com/prysmatic-labs/eth2-medalla-testnet-incident-f7fbc3cc934a
作者: Raul Jordan
翻译&校对: 曾汨, 闵敏 & 阿剑
作者:以太坊爱好者;来自链得得内容开放平台“得得号”,本文仅代表作者观点,不代表链得得官方立场凡“得得号”文章,原创性和内容的真实性由投稿人保证,如果稿件因抄袭、作假等行为导致的法律后果,由投稿人本人负责得得号平台发布文章,如有侵权、违规及其他不当言论内容,请广大读者监督,一经证实,平台会立即下线。如遇文章内容问题,请发送至邮箱:linggeqi@chaindd.com
评论(0)
Oh! no
您是否确认要删除该条评论吗?