重要公告 | 关于88号公投和近期Moonbeam区块生产中断的根本原因分析

news2024/11/16 13:34:17

2023年4月5日,Moonbeam网络经历了短暂的区块生产暂停问题,这是已批准的88号公投带来的意外结果。该问题源于链上公投的批准结果先于runtime升级发布,然而对这次公投的调用顺序却被安排在了runtime升级之后的区块。本文提供了对该事件的详细事后分析,概述了导致网络中断的事件顺序,以及为解决该问题并防止其再次发生而采取的后续措施。

事件摘要

一个包含system.remark调用的88号公投已在区块3276000上通过社区治理获得批准,并计划于区块3291300上执行。

在执行88号公投之前的一些区块(区块 3290853)已成功应用于runtime 2201升级。新的runtime包含了一个Substrate中的底层更改——变更了system.remark的调用索引,造成其与system.setHeapPages的调用索引匹配。

由于此更改,计划中的system.remark调用无意中切换为system.setHeapPages调用。新的调用有一个无效值,阻止了收集人生产区块,并且最终导致网络停止。

网络停止前的最后一个区块(即区块3291299)生产于2023年4月5日14:43:24 UTC。后续区块(即区块3291300)无法被生产,因为其区块中包含了一个计划中的,且带有错误配置的新HEAP_PAGES参数的调用。

Moonbeam开发贡献者和Parity立即着手调查,迅速发布了一个可供所有节点使用的新客户端,在接近4小时的中断后,网络重新恢复区块生产。

根本原因

Runtime 2201包含了一个Substrate中的底层更改——改变了system.remark的调用索引,造成其与system.setHeapPages的调用索引匹配。按照正常情况,这本来不是问题,因为一个基于新的runtime升级中的调用可以被分配给另一个新的调用索引。

88号公投包含了一个system.remark调用,这次公投本应该在Runtime2100上启动。对于该runtime,被分配了一个调用索引1。公投获得批准后,网络自动计划了把此公投的调用派送到区块3291300上执行。然而,该区块是Runtime2201的一部分。

当开始生产区块3291300时,新映射的system.setHeapPages的执行意味着一个非重要的链上配置值被更改,以至于收集人无法生产区块。最终导致在2023年4月5日14:43:24 UTC,网络停止生产区块。

Runtime升级会通过几个测试网络,在Moonbeam主网升级之前会通过完整测试。此次事件与runtime升级本身无关,而是因为一个错配在不同runitime升级的调用,导致执行关系发生了变化,调用索引在两者间发生了改变,才造成此次问题。

解决方案

Moonbeam团队发布了新客户端version 0.30.3以解决问题。更新的客户端可忽略链上储存的错误的HEAP_PAGES值,允许收集人继续生产区块。

在当天18:55:48 UTC(约问题产生后4小时12分24秒),随着区块3291300创建,网络恢复区块生产。

在收集人更新至新客户端(v0.30.3)后,网络开始以固定节奏生产区块,并逐渐恢复正常。反应迅速的升级离不开社区收集人对新客户端信息的重视,也是帮助网络区块生产恢复正常的关键。

未来计划

公投88号批准后的影响,以及后续从system.remark调用意外切换到system.setHeapPages调用而导致Moonbeam网络暂停事件,对社区来说是一次重要的经验教训。

Moonbeam开发贡献者们迅速发布新客户端,准确解决问题,体现了Moonbeam致力于维护安全可靠网络的承诺。来自Parity团队成员Basti对Moonbeam网络的恢复提供了重大帮助。该事件凸显了全面测试、runtime升级本身,以及基于不同场景的链上治理方案重要性。

为了防止将来的runtime版本发布中的调用索引再次发生类似问题,已经实施的解决方案被提交。应对于未来,runtime升级期间需要解决两个关键点:

  • 所有技术团队需在更新客户端或runtime至少一天前检查发布条件的清单

  • 改进测试工具,包含借助新客户端和runtime验证未来的公投

展望未来,加强网络的韧性以及确保稳健的性能,Moonbeam团队和社区将继续携手共进。

事件节点

  • 88号公投通过,一个system.remark的extrinsic已计划,准备在区块3291300上执行

  • Runtime 2201已成功在区块3290853上应用

  • 新的runtime包含一个在Substrate中的底层更改,改变了system.remark的调用索引,导致其与system.setHeapPages的调用索引匹配。造成计划中的system.remark调用自动切换为system.setHeapPages调用

  • 新的调用(system.setHeapPages)有一个无效值,阻止了收集人生产区块,并且最终导致网络停止。

  • 在网络停止前的最后一个区块(即区块3291299)生产于2023年4月5日14:43:24 UTC。后续区块(即区块3291300)无法被生产,因其发送了一个计划中包含带有新的错误配置的HEAP_PAGES参数的调用。

  • Moonbeam推出新的客户端(v0.30.3)来解决问题。更新的客户端可忽略链上储存的错误的HEAP_PAGES值,允许收集人继续生产区块。

  • 在当天18:55:48 UTC(约问题产生后4小时12分24秒),区块3291300创建。

  • 在收集人更新至新客户端(v0.30.3)后,网络开始以固定节奏生产区块,逐渐恢复正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16、CycriptLogos

一、Cycript Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用OC或者JavaScript,甚至两者并用.它能够挂钩正在运行的进程,能够在运行时修改很多东西. 官网下载/ MonkeyDev自动配置下载是一种脚本语…

浅析EasyCVR平台基于B/S架构的技术特点与应用

EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台兼容性强、拓展度高,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能。 EasyCVR视频融合平台采用…

手把手教你针对层级时间轮(TimingWheel)延时队列的实战落地

承接上文 承接上文,让我们基本上已经知道了「时间轮算法」原理和核心算法机制,接下来我们需要面向于实战开发以及落地角度进行分析如何实现时间轮的算法机制体系。 前言回顾 什么是时间轮 调度模型:时间轮是为解决高效调度任务而产生的调…

Delphi大师弗兰克·宝兰德(Frank Borland)回来了!

弗兰克宝兰德(Frank Borland) begin 弗兰克宝兰德(Frank Borland)的名字其实代表的是我们这些长期坚守Delphi的老程序员。但并非所有Delphi新开发人员都熟悉Borland。 弗兰克宝兰德是谁?他来自哪里?他的主…

动力节点Springsecurity笔记01-05认证入门

1 问题 如何保护我们的程序? 1.1 创建code目录 目的:后面的security工程均在此目录下学习 创建code目录,并使用idea打开 1.2 不使用安全框架的springboot web程序 1.2.1 新建子模块springboot-01-hello [外链图片转存失败,源站可能有防盗…

全志V85x MPP模块概述以及编译sample步骤

本文转载自:https://bbs.aw-ol.com/topic/3286/ 1. MPP 模块概述 MPP 系统控制模块,根据芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成 MPP(Media Process Platform 媒体处理平台)系统各…

索引失效了?看看这几个常见的原因!

索引是 MySQL 数据库中优化查询性能的重要工具,通过对查询条件和表数据的索引,MySQL可以快速定位数据,提高查询效率。但是,在实际的数据库开发和维护中,我们经常会遇到一些情况,导致索引失效,从…

2、八个JS中你见过的类型

1、前言 为一个变量指定类型的语法是使用"变量: 类型"的形式,如下: let num: number 123如果你没有为这个变量指定类型,编译器会自动根据你赋给这个变量的值来推断这个变量的类型: let num 123 num abc // error 不…

最简洁快速的kaggle注册(无需翻墙)

目录 1.打开浏览器,点击搜索栏最后3个点点 2.点击扩展,会到一个新页面 3.搜索获取(安装插件) 4.获取之后,网页搜索栏右边会出现该插件: 5.点击管理: 6.在下载规则中,填入下面的地…

SpringBoot整合JWT

一、What is JWT? Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519),该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场…

认识Spring 和 IoC

目录 何为Spring 1. 何为容器 2. 何为 IoC 2.1 传统的程序开发:耦合性太高 2.2 解决传统开发中的缺陷 2.3 对比总结:IoC的实现思想 3. 理解Spring IoC 4. 理解 DI 5. 总结 何为Spring Spring是一个包含了众多工具方法的 IoC 容器&#xff1…

【Scala入门】Scala下载及安装(Windows)以及Idea创建第一个scala项目

目录 一、安装准备 二、Scala下载安装 三、Idea 创建Scala项目 一、安装准备 在安装之前,确保你的电脑上装有Jdk 8(Jdk 1.8),且环境变量配置正确。如果没有安装Jdk,请参照其他文章先安装Jdk 8(Jdk 1.8&a…

vue3之Teleport传送组件

一、前言 Teleport 是 Vue3.x 新推出的功能, 没听过这个词的小伙伴可能会感到陌生;翻译过来是传送的意思,可能还是觉得不知所以,没事下边我就给大家形象的描述一下。 二、Teleport 是什么呢?干嘛用的? T…

【PMP】敏捷项目月报模板

敏捷项目月报怎么写呢?和普通项目周报有什么不同呢?不知道大家思考过没有? 为此咱们把敏捷项目月报和普通项目月报进行了对比,并且给出了一个参考月报模板和实例,供大家参考。 敏捷项目月报模板 [项目名称]敏捷月报 …

大屏如何打造智慧城市?30张大屏模板送你,零代码基础也会用

超500个智慧城市在路上了 根据国际数据公司(IDC)最新发布的《全球半年度智慧城市支出指南》显示,2023年全球智慧城市支出预计将达到1895亿美元。中国智慧城市市场在2023年规模将达到389.2亿美元,超过全球平均水平 德勤咨询发布的一…

电脑端(PC)按键精灵——3.其他命令

电脑端(PC)按键精灵——3.其他命令 前两节说了安装、键盘和鼠标命令,这一章说下其他命令 按键精灵小白入门详细教程: 电脑端(PC)按键精灵—小白入门 详细教程 命令介绍 1. Delay 延时 简介 //1秒=1000毫秒, 1分钟=60000毫秒,…

段式内存管理VS页式内存管理

在讲解段式内存管理、页式内存管理之前,需要了解X86体系结构中的实模式和保护模式相关内容。 在 X86 架构诞生之初,其实是没有虚拟内存的概念的。1978 年发行的 8086 芯片是 X86 架构的首款芯片,它在内存管理上使用的是直接访问物理内存的方…

Java版本-招投标采购系统源代码-高效管控招采流程-降低采购成本

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

Java数据结构和算法之第五章、LinkedList与链表

一、ArrayList的缺陷 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {// ... // 默认容量是10private static final int DEFAULT_CAPACITY 10;//... // 数组&#xff1a;用来存储…

分布式链路追踪之SkyWalking

一 链路追踪简介 在微服务架构中&#xff0c;一次请求往往涉及到多个模块&#xff0c;多个中间件&#xff0c;多台机器的相互协作才能完成。这一系列调用请求中&#xff0c;有些是串行的&#xff0c;有些是并行的&#xff0c;那么如何确定这个请求背后调用了哪些应用&#xff0…