之前一直都在用着 2019 年版本的 geth,當時 Solidity 最新版都是 0.4 來着……然后最近在用web3.py的時候遇到各種問題,於是決定把 geth 和私鏈都升級一遍。
0. 遇到了什么問題?
部署合約的時候是沒什么問題的,但是調用合約的任何函數的時候,都會返回空信息,導致根本無法和合約交互。
這個錯誤的特征是在 abi 有 returns 列表的時候,出現一個 web3.exceptions.BadFunctionCallOutput,如果沒有 returns 列表那么就什么都不發生。
查詢了一下網上的信息,幾乎沒有什么幫助,唯一的提示在於這大概不是 web3 的問題,而是 geth 后端的問題。
於是就只能對 geth 進行一波升級了。
1. 升級 Golang 11.0 -> 16.0
golang 的升級還算順利,下載了 .msi 之后各種點擊就行了。
只是卸載老版本的時候,卡在了 Status: Removing shortcut 階段……
於是開任務管理器一頓騷操作,重新來一次。
要注意的是升級之后要注意用 Get-Command go 檢查一下是否升級成功,因為有可能 GOROOT 和新版本不一致,所以要把各種環境變量都修改一次。
2. 升級 geth
新版本的 geth 多出了一些依賴,為了編譯順利我把 GOPATH 都清空了,只剩下一個 github.com/go-ethereum,但是眾所周知 go 依賴的下載是一件很麻煩的事情,怎么辦呢?
我按之前的方法,嘗試了 netsh winhttp set proxy,git config --global http.proxy,但是都沒有用。
最后發現新版本的 Go 已經支持內部實現的代理機制了,只需要按 goproxy.io 上面的說明配置,即可順利安裝各類依賴。太爽了!
3. 升級私鏈
私鏈本體是沒法升級的,但是反正重建沒成本,就直接刪除老的私鏈,然后重新建一個。
在 $GOPATH\src\github.com\go-ethereum\cmd\devp2p\internal\ethtest\testdata\genesis.json 有一個 genesis,我以為這個是可以用的,就拿過來稍微修改了一下。
結果在最新的 0.8 的 Solidity 合約中出現了 invalid opcode SHR 的錯誤。
原來是那個 genesis 的 config 中沒有包括 "constantinopleBlock": 0,加入之后應該就可以了。