Metamask
如何調試“帶有有效負載的 rpc 錯誤”
調試智能合約錯誤可能非常困難。有一種特殊類型的錯誤最讓我煩惱:臭名昭著的帶有 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複製到我的前端,一切又恢復了。大多數人似乎以這樣看似隨機的方式解決這些錯誤,但應該有一條不那麼令人沮喪的道路。所以我有兩個問題要問你:
- 您建議使用哪些步驟來調試此類錯誤?
- 是否在某個地方提出了問題以使處理此類錯誤對開發人員更加友好?
當重新啟動 ganache 後 Metamask 的 nonce 記憶體變得無效時,有時會出現此錯誤。
在這種情況下,解決方案是重置 Metamask,設置 - 高級 - 重置帳戶。
以下是在部署合約時遇到該錯誤後要嘗試的部分列表:
- 增加氣體
- 確保建構子參數正常
- 重置元遮罩
- 重新編譯智能合約
- 從建構子中刪除任何 require 語句