原標題:事件回顧報告:利用Lotus API準確記賬
2021年3月18日,有報道稱,由于Filecoin的遠程過程調用(RPC)代碼存在 “嚴重漏洞”,出現了 “雙花”。這些說法是不正確的且具有強烈誤導性,
Lotus團隊對該報告進行了徹底調查,沒有發現任何Filecoin網路和RPC API代碼的相關問題。鏈本身不存在雙花問題,API代碼也沒有錯誤,有關交易所已經修正了該交易所內的錯誤交易記錄,并正在審查他們記賬系統中的充值處理邏輯,以改正他們的API使用,
事件回顧
- 事件報告 — 今日早前,Lotus團隊收到交易所錯誤使用Lotus API來計算Filecoin網路中的轉賬/存款,API錯誤使用情況是因為用戶報告了交易所他們的帳戶被交易所記賬系統錯誤地重復記錄,這一問題已在交易所記賬系統恢復 — 鏈上本身并沒有重復記錄,
- API誤解 — 該問題的核心是對于Lotus的鏈狀態檢查API使用不當,在處理多個類似消息時,其處理方式與所期待的不同。誤解Lotus API的輸出會導致記賬系統將原始消息和替換消息都算作相同的發送者和接收者。到目前為止,我們只知道有一個交易所受到這個問題的影響,
- 虛假報道成為文章標題 — 有關網路“雙花”的不正確陳述在社交媒體渠道中傳播,并進入文章標題,這些報道中的內容已被調查并確定為錯誤資訊,團隊并沒有發現Filecoin網路或RPC API代碼的問題。在了解了事實之后,許多團隊和媒體機構正在糾正其報道,
正在采取的行動
- 受到影響的交易所 — 有關交易所發現了這對于API的錯誤使用,并已立即采取行動,停止充值、提現和轉賬。他們已經恢復了有關的錯誤交易(所以在這次事件中沒有資金損失),并正在糾正他們對Lotus API的使用,以符合推薦的使用方法。
- 偶發案例 — 其他交易所已經收到預警,正在審查他們的代碼邏輯,以確保他們不受同樣錯誤的影響,其中許多審查已經完成——據我們所知,目前還沒有其他交易所以這種方式錯用API。
- Lotus團隊 — Lotus團隊正在積極與所有交易所合作,以確保正確處理這一行為,并改進API文檔(https://github.com/filecoin-project/lotus/pull/5838),確保所有其他交易所正確檢查Filecoin的鏈狀態,
- 社區和媒體 — 一些團隊正在共同努力,與媒體聯系,澄清所稱事件的細節和事實,并幫助消除錯誤資訊。
- 社區團隊 — 社區成員提供可以幫助其他社區成員準確、周到地報告問題的方法,避免意外傳播錯誤資訊,
技術細節
- 相同資訊 — 就lotus團隊所知問題源自于有兩條消息有相同的發送者/收到者詳細資訊、相同的nonce但擁有不同的Gas參數——被包含在同一tipset中,像這樣兩個類似的消息是非常常見的,比如以改變與消息的Gas費來替代消息就會形成這樣兩條類似的消息。這樣的情況會由Filecoin網路安全、正確地處理,不會導致兩次轉賬:兩條消息中的一條會被執行,另一條被忽略。
- 錯誤使用API — 然而,根據人們對鏈的檢查方式,這會呈現出消息被處理了兩次的樣子,具體來說,有關交易所使用了一種錯誤的處理鏈狀態的方式——在tipset的每個塊上調用ChainGetBlockMessages,然后在這些消息上調用StateGetReceipt。
- 錯誤的API期望 — 容易引發錯誤的地方是,當StateGetReceipt被調用在兩個相似的消息上(其中一個被執行,另一個被跳過),它將提供相同的結果給人感覺兩種消息都被執行了,這誠然是一種違背直覺思維的行為,但卻是有意為之,StateGetReceipt的主要應用場景是在Lotus礦工和處理交易過程中使用的事件處理程式(https://github.com/filecoin-project/lotus/blob/79a8ff04fd5362a367fd7d6469e5287a47baa571/chain/events/events_called.go#L586)中。在消息被替換的情況下,這些模塊并不關心返回的資訊是對應原始消息,還是對應替換的消息——它們只是想知道消息是否在鏈上成功執行,我們已經在這里的文檔中增加了澄清:https://github.com/filecoin-project/lotus/pull/5838。
- 使用正確的API — 大多數交易所都是正確使用了ChainGetParentMessages和ChainGetParentReceipts來記賬,以計算出鏈上執行了什么消息、哪些消息成功了,這些都是Lotus本身在鏈state計算過程中使用的API,以保證使用者能通過這種方式正確反映鏈狀態。對每一條消息執行StateReplay,可以得到完整的調用結果,這樣使用者就可以將返回的InvocResult中的MsgCid與查詢消息的CID進行比較,這是推薦交易所的正確檢查鏈狀態并保持內部報告系統同步的步驟,