重要公告 | 關于88號公投和近期Moonbeam區(qū)塊生產(chǎn)中斷的根本原因分析

2023年4月5日,Moonbeam網(wǎng)絡經(jīng)歷了短暫的區(qū)塊生產(chǎn)暫停問題,這是已批準的88號公投帶來的意外結果。該問題源于鏈上公投的批準結果先于runtime升級發(fā)布,然而對這次公投的調(diào)用順序卻被安排在了runtime升級之后的區(qū)塊。本文提供了對該事件的詳細事后分析,概述了導致網(wǎng)絡中斷的事件順序,以及為解決該問題并防止其再次發(fā)生而采取的后續(xù)措施。
事件摘要
一個包含system.remark調(diào)用的88號公投已在區(qū)塊3276000上通過社區(qū)治理獲得批準,并計劃于區(qū)塊3291300上執(zhí)行。
在執(zhí)行88號公投之前的一些區(qū)塊(區(qū)塊 3290853)已成功應用于runtime 2201升級。新的runtime包含了一個Substrate中的底層更改——變更了system.remark的調(diào)用索引,造成其與system.setHeapPages的調(diào)用索引匹配。
由于此更改,計劃中的system.remark調(diào)用無意中切換為system.setHeapPages調(diào)用。新的調(diào)用有一個無效值,阻止了收集人生產(chǎn)區(qū)塊,并且最終導致網(wǎng)絡停止。
網(wǎng)絡停止前的最后一個區(qū)塊(即區(qū)塊3291299)生產(chǎn)于2023年4月5日14:43:24 UTC。后續(xù)區(qū)塊(即區(qū)塊3291300)無法被生產(chǎn),因為其區(qū)塊中包含了一個計劃中的,且?guī)в绣e誤配置的新HEAP_PAGES參數(shù)的調(diào)用。
Moonbeam開發(fā)貢獻者和Parity立即著手調(diào)查,迅速發(fā)布了一個可供所有節(jié)點使用的新客戶端,在接近4小時的中斷后,網(wǎng)絡重新恢復區(qū)塊生產(chǎn)。

根本原因
Runtime 2201包含了一個Substrate中的底層更改——改變了system.remark的調(diào)用索引,造成其與system.setHeapPages的調(diào)用索引匹配。按照正常情況,這本來不是問題,因為一個基于新的runtime升級中的調(diào)用可以被分配給另一個新的調(diào)用索引。
88號公投包含了一個system.remark調(diào)用,這次公投本應該在Runtime2100上啟動。對于該runtime,被分配了一個調(diào)用索引1。公投獲得批準后,網(wǎng)絡自動計劃了把此公投的調(diào)用派送到區(qū)塊3291300上執(zhí)行。然而,該區(qū)塊是Runtime2201的一部分。
當開始生產(chǎn)區(qū)塊3291300時,新映射的system.setHeapPages的執(zhí)行意味著一個非重要的鏈上配置值被更改,以至于收集人無法生產(chǎn)區(qū)塊。最終導致在2023年4月5日14:43:24 UTC,網(wǎng)絡停止生產(chǎn)區(qū)塊。
Runtime升級會通過幾個測試網(wǎng)絡,在Moonbeam主網(wǎng)升級之前會通過完整測試。此次事件與runtime升級本身無關,而是因為一個錯配在不同runitime升級的調(diào)用,導致執(zhí)行關系發(fā)生了變化,調(diào)用索引在兩者間發(fā)生了改變,才造成此次問題。
解決方案
Moonbeam團隊發(fā)布了新客戶端version 0.30.3以解決問題。更新的客戶端可忽略鏈上儲存的錯誤的HEAP_PAGES值,允許收集人繼續(xù)生產(chǎn)區(qū)塊。
在當天18:55:48 UTC(約問題產(chǎn)生后4小時12分24秒),隨著區(qū)塊3291300創(chuàng)建,網(wǎng)絡恢復區(qū)塊生產(chǎn)。
在收集人更新至新客戶端(v0.30.3)后,網(wǎng)絡開始以固定節(jié)奏生產(chǎn)區(qū)塊,并逐漸恢復正常。反應迅速的升級離不開社區(qū)收集人對新客戶端信息的重視,也是幫助網(wǎng)絡區(qū)塊生產(chǎn)恢復正常的關鍵。
未來計劃
公投88號批準后的影響,以及后續(xù)從system.remark調(diào)用意外切換到system.setHeapPages調(diào)用而導致Moonbeam網(wǎng)絡暫停事件,對社區(qū)來說是一次重要的經(jīng)驗教訓。
Moonbeam開發(fā)貢獻者們迅速發(fā)布新客戶端,準確解決問題,體現(xiàn)了Moonbeam致力于維護安全可靠網(wǎng)絡的承諾。來自Parity團隊成員Basti對Moonbeam網(wǎng)絡的恢復提供了重大幫助。該事件凸顯了全面測試、runtime升級本身,以及基于不同場景的鏈上治理方案重要性。
為了防止將來的runtime版本發(fā)布中的調(diào)用索引再次發(fā)生類似問題,已經(jīng)實施的解決方案被提交。應對于未來,runtime升級期間需要解決兩個關鍵點:
所有技術團隊需在更新客戶端或runtime至少一天前檢查發(fā)布條件的清單
改進測試工具,包含借助新客戶端和runtime驗證未來的公投
展望未來,加強網(wǎng)絡的韌性以及確保穩(wěn)健的性能,Moonbeam團隊和社區(qū)將繼續(xù)攜手共進。
事件節(jié)點
88號公投通過,一個system.remark的extrinsic已計劃,準備在區(qū)塊3291300上執(zhí)行
Runtime 2201已成功在區(qū)塊3290853上應用
新的runtime包含一個在Substrate中的底層更改,改變了system.remark的調(diào)用索引,導致其與system.setHeapPages的調(diào)用索引匹配。造成計劃中的system.remark調(diào)用自動切換為system.setHeapPages調(diào)用
新的調(diào)用(system.setHeapPages)有一個無效值,阻止了收集人生產(chǎn)區(qū)塊,并且最終導致網(wǎng)絡停止。
在網(wǎng)絡停止前的最后一個區(qū)塊(即區(qū)塊3291299)生產(chǎn)于2023年4月5日14:43:24 UTC。后續(xù)區(qū)塊(即區(qū)塊3291300)無法被生產(chǎn),因其發(fā)送了一個計劃中包含帶有新的錯誤配置的HEAP_PAGES參數(shù)的調(diào)用。
Moonbeam推出新的客戶端(v0.30.3)來解決問題。更新的客戶端可忽略鏈上儲存的錯誤的HEAP_PAGES值,允許收集人繼續(xù)生產(chǎn)區(qū)塊。
在當天18:55:48 UTC(約問題產(chǎn)生后4小時12分24秒),區(qū)塊3291300創(chuàng)建。
在收集人更新至新客戶端(v0.30.3)后,網(wǎng)絡開始以固定節(jié)奏生產(chǎn)區(qū)塊,逐漸恢復正常。