
據(jù)報(bào)道,2021年3月18日,由于Filecoin的遠(yuǎn)程過(guò)程調(diào)用(RPC)代碼中的“嚴(yán)重錯(cuò)誤”,出現(xiàn)了“雙花”問(wèn)題。這些說(shuō)法是不正確的,而且具有誤導(dǎo)性。
Lotus團(tuán)隊(duì)對(duì)報(bào)告進(jìn)行了徹底的調(diào)查,沒(méi)有發(fā)現(xiàn)Filecoin網(wǎng)絡(luò)或RPC API代碼有任何問(wèn)題。區(qū)塊鏈本身沒(méi)有雙花,API代碼中也沒(méi)有bug。有問(wèn)題的交易所已經(jīng)在其記賬系統(tǒng)中恢復(fù)了錯(cuò)誤的交易,并且正在審查其存款處理邏輯以糾正API的使用。問(wèn)題報(bào)告
今天早些時(shí)候,Lotus團(tuán)隊(duì)收到了一份報(bào)告,稱一家交易所錯(cuò)誤地使用Lotus api評(píng)估Filecoin網(wǎng)絡(luò)中的轉(zhuǎn)賬/存款。這種不正確的API使用是由用戶報(bào)告的,當(dāng)他們的帳戶被錯(cuò)誤地記入交易所記賬系統(tǒng)的存款兩次。這一點(diǎn)后來(lái)在交易所的記賬中被恢復(fù)了——Filecoin區(qū)塊鏈本身沒(méi)有任何雙花問(wèn)題。交易所的API濫用
所討論的交易所沒(méi)有正確地檢查鏈狀態(tài)以消除具有相同發(fā)送者和接收者的多個(gè)消息的重復(fù)問(wèn)題。其中根本原因是錯(cuò)誤地使用了Lotus API(而不是API本身的錯(cuò)誤)——從而沒(méi)有按照他們預(yù)期的方式工作。這個(gè)記賬錯(cuò)誤導(dǎo)致交易所展現(xiàn)錯(cuò)誤的帳戶存款信息。到目前為止,我們只知道有一個(gè)交易受到這種API混淆的影響。虛假報(bào)道會(huì)成為頭條新聞:關(guān)于網(wǎng)絡(luò)上“雙花”的不準(zhǔn)確說(shuō)法在社交媒體渠道上傳播,并成為文章頭條
這些聲明中的問(wèn)題有許多已被調(diào)查,并被確定為虛假的。團(tuán)隊(duì)發(fā)現(xiàn)Filecoin網(wǎng)絡(luò)或RPC API代碼沒(méi)有問(wèn)題。在了解事實(shí)后,許多團(tuán)體和媒體機(jī)構(gòu)正在糾正他們的報(bào)道。該交易所發(fā)現(xiàn)了這種錯(cuò)誤使用API的行為,并立即采取行動(dòng),停止存款、取款和轉(zhuǎn)賬。他們已經(jīng)恢復(fù)了有問(wèn)題的不正確交易(因此在這個(gè)事件中沒(méi)有資金損失),并且正在糾正他們對(duì)lotus api的使用,以符合推薦的用途。其他交易所已經(jīng)收到了警告,并正在檢查它們的代碼,以確保它們沒(méi)有受到影響。許多審查已經(jīng)完成——據(jù)我們所知,目前還沒(méi)有其他交易所以這種方式錯(cuò)誤這個(gè)API。Lotus團(tuán)隊(duì)正在積極地處理所有交易,以確保正確處理此行為,并改進(jìn)API文檔,以確保其他所有人正確地檢查Filecoin區(qū)塊鏈的狀態(tài)。一些組織正在與媒體合作,澄清所謂事件的細(xì)節(jié)和事實(shí),并幫助消除錯(cuò)誤信息。社區(qū)成員正在創(chuàng)建材料,以幫助其他人準(zhǔn)確和深思熟慮地報(bào)告問(wèn)題,以避免意外傳播錯(cuò)誤信息。Lotus團(tuán)隊(duì)了解,問(wèn)題是由于兩條消息共享相同的發(fā)送方/接收方詳細(xì)信息和相同的nonce,但在同一個(gè)tipset中包含不同的gas參數(shù)而引起的。兩個(gè)類似的消息是更改與消息相關(guān)的gas費(fèi)用的常見消息替換形式。Filecoin網(wǎng)絡(luò)安全機(jī)制正確地處理了這種情況,不會(huì)導(dǎo)致進(jìn)行兩次消息執(zhí)行:兩條消息中的一條被執(zhí)行,另一條被忽略。但是,根據(jù)檢查鏈狀態(tài)的方式,這可能會(huì)顯示消息被處理了兩次。具體來(lái)說(shuō),這個(gè)交易使用了一種錯(cuò)誤的方式來(lái)處理鏈狀態(tài)——在tipset中的每個(gè)區(qū)塊上調(diào)用ChainGetBlockMessages,然后在每個(gè)消息上調(diào)用StateGetReceipt。混淆在于,當(dāng)對(duì)兩條類似的消息(一條被執(zhí)行,另一條被跳過(guò))調(diào)用StateGetReceipt時(shí),它將提供相同的結(jié)果:都對(duì)應(yīng)于被執(zhí)行的消息。這顯然是違背直覺(jué)的,但卻是有意為之的行為。StateGetReceipt方法的主要用例是Lotus Miner和交易制定過(guò)程使用的事件處理程序。在替換消息的情況下,這些模塊不關(guān)心返回的收據(jù)是否與原始消息對(duì)應(yīng),或者與替換的消息對(duì)應(yīng)——它們只想知道消息是否在鏈上成功執(zhí)行。我們?cè)谶@里對(duì)文檔進(jìn)行了說(shuō)明:https://github.com/filecoin-project/lotus/pull/5838。大多數(shù)交易所都正確地使用了ChainGetParentMessages和ChainGetParentReceipts來(lái)進(jìn)行記賬,以確定在鏈上執(zhí)行了哪些消息并取得了成功。這些是Lotus本身在狀態(tài)計(jì)算期間使用的api,因此可以保證以這種方式正確地反映鏈狀態(tài)。對(duì)每個(gè)消息執(zhí)行StateReplay將為您提供完整的調(diào)用結(jié)果,以便您可以將返回的InvocResult中的MsgCid與查詢消息的CID進(jìn)行比較。這是交易所正確檢查鏈狀態(tài)并保持其內(nèi)部報(bào)告系統(tǒng)同步的推薦路徑。感謝閱讀!
在右下角留下你的贊吧