Go-Ethereum
在私有網路上幾天后部署的合約地址變得不確定
我有一個私有區塊鏈,我可以在其中成功部署我的智能合約,然後我得到我儲存在我的關係數據庫中的智能合約的地址。當我嘗試使用以下程式碼訪問契約方法時,在 geth 控制台中
deployedContract = eth.contract(smart_contract_abi).at(contract_address) deployedContract.myMethod()
它工作正常並給我預期的輸出/結果
但是幾天后,當我嘗試訪問這些地址上的契約方法時,我收到了這個錯誤:
Error: new BigNumber() not a base 16 number: at L (bignumber.js:3:2876) at bignumber.js:3:8435 at a (bignumber.js:3:389) at web3.js:1110:23 at web3.js:1634:20 at web3.js:826:16 at map (<native code>) at web3.js:825:12 at web3.js:4080:18
這個錯誤的原因是什麼?
跟踪和修剪:預設情況下,最後 128 個塊的狀態保存在記憶體中。
https://github.com/ethereum/go-ethereum/wiki/Tracing:-Introduction
塊號是強制性的,它定義了執行指定事務的上下文(狀態)。無法對重鑄塊或早於 128 的塊執行呼叫(除非該節點是存檔節點)。
https://geth.ethereum.org/docs/rpc/ns-eth
預設情況下,Geth 使垃圾收集僅在記憶體中保留最新的 128 個塊,我敢打賭,你肯定在這 128 個塊被探勘之前部署了你的合約。
解決方案是使用,
--gcmode archive
它禁用垃圾收集並保留自創世紀以來的所有歷史狀態數據。