Metamask

如何調試“帶有有效負載的 rpc 錯誤”

  • July 5, 2020

調試智能合約錯誤可能非常困難。有一種特殊類型的錯誤最讓我煩惱:臭名昭著的帶有 payload 的 rpc 錯誤

new web3.eth.Contract().deploy()例如,就在幾個小時前,在使用into從前端部署智能合約時ganache-cli,我在瀏覽器的控制台中得到以下資訊:

MetaMask - RPC Error: Error: [ethjs-rpc] rpc error with payload {
 "id": 4972589614702,
 "jsonrpc": "2.0",
 "params": ["<a long hex string>"],
 "method": "eth_sendRawTransaction"
} [object Object]

我在Google搜尋時看到了其他類似的錯誤,除了最後一部分[object Object],包含實際的錯誤消息。但就我而言,沒有。

我嘗試將長十六進製字元串轉換為 Unicode,但沒有運氣:

> web3.utils.toUtf8('<a long hex string>')
Uncaught Error: Invalid UTF-8 detected

然後我嘗試了該.toAscii方法並得到了亂碼。不過,其中一些是清晰的;這是一個範例:

'\u0003\u0019\u0016R` \u0001P[PPPP`@Q\u0003
a\u0017)Wþ[\u0004PPPPPVþSafeMath: multiplication overflow¢ebzzr1X \u001aó9r\n' +
 '¢¥Ä

但是,由於還有其他錯誤字元串,我懷疑這是實際錯誤。因此,嘗試解碼該十六進製字元串可能是徒勞的。

在我的頭撞牆一段時間後,我truffle compile再次編寫了solidity程式碼,將新的JSON複製到我的前端,一切又恢復了。大多數人似乎以這樣看似隨機的方式解決這些錯誤,但應該有一條不那麼令人沮喪的道路。所以我有兩個問題要問你:

  1. 您建議使用哪些步驟來調試此類錯誤?
  2. 是否在某個地方提出了問題以使處理此類錯誤對開發人員更加友好?

當重新啟動 ganache 後 Metamask 的 nonce 記憶體變得無效時,有時會出現此錯誤。

在這種情況下,解決方案是重置 Metamask,設置 - 高級 - 重置帳戶。

以下是在部署合約時遇到該錯誤後要嘗試的部分列表:

  • 增加氣體
  • 確保建構子參數正常
  • 重置元遮罩
  • 重新編譯智能合約
  • 從建構子中刪除任何 require 語句

引用自:https://ethereum.stackexchange.com/questions/83954