如何解決 EOSIO 上的常見報錯

在 EOSIO 上做開發,用戶可能會遇上一些報錯信息。有時這些報錯信息很不好被理解,導致我們經常在開發羣裏看到各種截圖和問題。

爲了幫助剛上手的開發者克服這些挑戰,我們對一些最常見報錯信息做了一個小總結。

請注意,一些錢包和其它的應用界面可能會對原消息格式做更改,讓它更易懂。比如 nodeos(EOSIO 的操作軟件)的原輸出可能會是這樣的:


{
  "code": 500,
  "message": "Internal Service Error",
  "error": {
    "code": 3080004,
    "name": "tx_cpu_usage_exceeded",
    "what": "Transaction exceeded the current CPU usage limit imposed on the transaction",
    "details": [
      {
        "message": "billed CPU time (2115 us) is greater than the maximum billable CPU time for the transaction (162 us)",
        "file": "transaction_context.cpp",
        "line_number": 553,
        "method": "validate_cpu_usage_to_bill"
      }
    ]
  }
}

而你收到的報錯信息可能是會變成:
billed CPU time (2115 us) is greater than the maximum billable CPU time for the transaction (162 us)
譯:需要的 CPU(2215 us)超出了交易允許的最大值

而在這篇文章中,我們會用後者這樣更簡潔的信息來進行討論。

報錯 1:“Insufficient CPU Available”(CPU 不足)

Transaction failed - billed CPU time (1342 us) is greater than the maximum billable CPU time for the transactions (71 us)

譯:交易失敗 - 需要的 CPU(1342 us)超出了交易允許的最大值 (71 us)
 

這個報錯的意思是,在給這個交易提供 CPU 的賬戶中,爲 CPU 抵押的代幣數量不足。CPU 的單位是微秒(us),是按照 BP 節點處理一個交易所需的時間所計算的。

解決方法:你需要給 CPU 抵押更多代幣

你可以抵押更多自己的代幣在 CPU 上,也可以用其它賬戶爲你抵押(抵押在這裏指英文的 “stake” 或 “delegate”)。你也可以從 REX 中租賃某些 EOSIO 鏈的資源,CPU 一次可以租30天,30天期限到了還可以續租。

專家提示

你的 CPU 使用量是會每24小時被完全重置的。 在區塊瀏覽器上查看帳戶信息時,它可能顯示你的帳戶上的一些 CPU 是佔用的,沒顯示重置,那是爲它在你推送新的一筆交易後纔會更新。

報錯 2:“Incorrect signatures”(簽名錯誤)

Provided keys, permissions, and delays do not satisfy declared authorizations, transaction declares authority '{"actor":"testaccount1","permission":"active"}', but does not have signatures for it under a provided delay of 0 ms, provided permissions [], provided keys [EOS7j9ViHGp….Po57], and a delay max limit of 3888000000

譯:提供的密鑰、權限和延遲無法滿足授權需求,交易要求授權權限: '{"actor":"testaccount1","permission":"active"}',但無在延遲爲 0 ms,權限爲 [],密鑰爲[EOS7j9ViHGp….Po57] 和最大延遲上限爲 3888000000 的條件下的簽名
 

這個錯誤出現的原因是用戶使用的密鑰不能滿足簽署的交易所需要的權限。常見的情況是你的錢包裏管理着多個密鑰,或者你的錢包經過重置後無法訪問之前的密鑰。

解決方法:使用正確的密鑰簽署交易

不是每一個用戶都知道怎麼去確定應該用哪個密鑰。首先,可以去區塊瀏覽器上查下,一般在賬戶頁面上會列出你的權限。如果你用 eosq,你可以看到如下信息:

eosq-賬戶權限

然後,看到你的公鑰,你用的私鑰是要跟公鑰匹配的。一般情況下你都是需要用你的 active(活躍)權限簽署交易,那你就需要檢查下你用的私鑰是不是跟 active 權限的公鑰匹配的。

如果你重置過你的錢包,你可能需要通過之前的備份或密語恢復之前密鑰,恢復方式區別於各個錢包,但一般錢包在你導入密鑰/創建賬戶時都會說明它們的恢復方式。

專家提示

建議熟悉下 EOSIO 的賬戶權限系統。瞭解了它以後你會發現它能實現很多強大的功能。我們建議你在測試網上創建一個賬戶,更改你的密鑰,自己設定不同的權限。這是個熟悉權限系統很好的方式,嘗試過你就知道了,並沒有那麼複雜。

報錯 3:“Arbitrary Data is not enabled”(未啓用任意數據)

Transaction failed - Please enable arbitrary data on ledger device within EOS app. {"name":"TransportError","message":"Failed to sign with Ledger device: U2F TIMEOUT"

譯:交易失敗 - 請在EOS應用內的分類帳設備上啓用任意數據。 {"name":"TransportError","message":"Failed to sign with Ledger device: U2F TIMEOUT"

 

解決方法:啓用任意數據簽名

使用分類賬硬件錢包的用戶如果沒有啓用任意數據簽名, 就會遇到這個報錯。大家會問:“什麼是任意數據?”任何一個不屬於核心系統合約的操作就是任意數據。如果你不想只能跟系統合約交互,你需要啓用這個功能。

專家提示

當你在更新你的分類賬設備的時候,你可能需要重新開啓這個功能。所以如果你再遇到這個報錯,請檢查你是否需要啓用它。

報錯 4:“Irrelevant authority”(無關的權限)

updateauth action declares irrelevant authority '{"actor":"testaccount1","permission":"active"}'; minimum authority is {"actor":"testaccount1","permission":"owner"}

譯:updateauth (權限更新)操作發現無關的權限 '{"actor":"testaccount1","permission":"active"}'; 所需最小權限爲 {"actor":"testaccount1","permission":"owner"}
 

這個報錯可能出現在你嘗試更改賬戶的 owner(所有者)權限的時候。如果你想更改你的 owner 密鑰,是需要原 owner 的權限授權的,而如果你不指定選擇權限,一般錢包是默認使用 active(活躍)權限簽署交易的,不能滿足執行的要求。

其實可以把賬戶權限想象成一個樹型結構,最頂層的母權限可以控制下面的所有子權限,下面的每一級的權限又可以控制它們下面的其它權限。

解決方法:確定使用正確的權限

無論你用的是哪個錢包,確保用正確的密鑰去簽署相應的操作。owner 的級別最高,可以控制其下的所有權限。

專家提示

應時刻保持你的 owner 密鑰的安全,儘量用 active 和級別低的密鑰授權操作。這樣的話,如果你的密鑰被盜,還可以用 owner 密鑰恢復你對賬戶的控制

報錯 5:“Block Producer voting”(BP節點投票)

Transaction failed - producer is not currently registered

譯:交易失敗 - 節點當前未註冊

 

有的用戶可能一次性的設置了對節點的投票後就不再去想它了,這時候我們需要去檢查被投票的節點是否還是註冊狀態。如果你遇到這個報錯,說明你支持的一個節點已經註銷了他們的節點業務。

解決方案:確定節點的業務還在運行

可以在很多區塊瀏覽器上查看你所支持的節點的狀態。如果你之前投票的節點的業務停止了,你可以再選擇投票給其它節點。

專家提示

也有一種情況是節點的基礎架構遇到問題了,需要暫時註銷去修復它。在你重新檢查你的30個節點投票前,可以先等幾個小時重新投票,看看報錯還有沒有再出現。

報錯 6:“Custom account names”(自定義賬戶名)

Assertion failure with message: only suffix may create this account

譯:斷言失敗並顯示消息:只有後綴可以創建此帳戶

 

EOSIO 鏈有個命名空間拍賣的概念,讓用戶可以擁有小於12個字符的靚號。然後用戶可以用這個命名空間去創建“子域名”賬號。比如,你拍下了 com 這個賬號,你就有了 .com 這個後綴的所有權,可以創建 123.com、 crypto.com 這樣的賬號。如果你在沒有相應的命名空間的情況下去創建自定義賬戶名,就會遇到這個報錯。

解決方案: 拍下相應的命名空間

你需要贏下拍賣才能獲得命名空間的擁有權。命名空間拍賣是最多每24小時關閉的,只有在整個24小時的期間,在所有命名空間的出價中最高的人才會獲得他競拍的命名空間。你可以閱讀這篇文章來具體瞭解命名空間的拍賣系統

專家提示

你也可以用現在市場上的一些服務去從拍下命名空間的人手中直接買到它。

報錯 7:“Account has insufficient RAM” (賬戶 RAM 不足)

Transaction failed - Account using more than allotted RAM usage, account testaccount1 has insufficient ram; needs 4468 bytes has 4382 bytes.

譯:交易失敗 - 帳戶正要使用的 RAM 超過了分配的使用量,帳戶 testaccount1 的 ram 不足; 需要 4468 個字節,卻僅有 4382 個字節。

 

EOSIO 鏈上的三種資源之一是 RAM,RAM 是用來長期存儲賬戶數據的。而正因爲它是長期存儲數據的,賬戶需要去購買它,而不是通過抵押來獲得。

解決方案:購買更多 RAM

如果你遇到這個報錯,買夠能滿足交易需要的 RAM 就行了。一般錢包都有相關的功能。

專家提示

即使你把賬戶上的某個代幣全部交易出去,那個代幣佔用的 RAM 還是沒有被釋放的。想要釋放相應的 RAM,需要先看代幣合約中有沒有 close 操作。調用 close 操作後,相應的 RAM 就會被釋放了。

解決更多的報錯

以上總結的是在與 EOSIO 鏈交互過程中可能遇到的一些最常見的報錯。如果你遇到其它類型的報錯信息,可以跟我們討論,加入我們的微信Telegram 開發者羣,關注我們的 Twitter 微博。如果你感興趣,歡迎來訪問我們的 Github 源碼庫,別忘了幫我們點亮星標哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章