Go-Ethereum

在私有網路上幾天后部署的合約地址變得不確定

  • February 25, 2020

我有一個私有區塊鏈,我可以在其中成功部署我的智能合約,然後我得到我儲存在我的關係數據庫中的智能合約的地址。當我嘗試使用以下程式碼訪問契約方法時,在 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它禁用垃圾收集並保留自創世紀以來的所有歷史狀態數據。

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