之前一直都在用着 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,加入之后应该就可以了。