一个月以前,HIVED发布了新版本1.27.6,这个版本修复了P2P通信中可能导致节点崩溃的BUG,并鼓励所有节点升级到这一版本。
(图源 :pixabay)
而我却拖到这两天才进行了升级,原因是早在v1.27.6发布之前,我就已经通过给v1.27.3源码打补丁的方式重新编译生成了hived并替换原本的程序。
也就是说,尽管在见证人列表中查询到我还是运行着v1.27.3,但实际上运行的是修复了BUG的v1.27.3,而且还不需要replay区块链,完美。
然而尽管v1.27.3一直很好用,但是毕竟落后了好几个小版本,所以痛下决心,决定将见证人节点更新到最新版本,亦即v1.27.6。
升级过程中,果然遇到好多新问题,记录如下,备忘!
因为在当前的编译机器上已经编译过v1.27.3 及以前的各个版本,原本以为编译v1.27.6那不得一路顺畅,丝般顺滑呀。
结果git clone这步就出错啦,啥,版本不存在?
仔细研究了一下自己错在哪里,才发现v1.27.5 Release Candidate 0 以前,release中的链接都是v1.27.x这个样子,而从v1.27.5开始,release中的链接变成了1.27.5,所以1.27.6这版也要去掉v,否则就是无效的url啦。
URL整正确以后,继续编译过程,发现出这样的错误提示:
"Usage of the io_uring engine is preferred in this project"
查看代码发现如下内容:
再查看hive/scripts/setup_ubuntu.sh会发现和以前的版本相比,多安装了好几个库,甚至编译也改成了使用ninja。
根据脚本做相应的调整,主要是手动安装了liburing-dev
sudo apt install liburing-dev
最终成功地编译出需要的程序(hived等)。
虽然早就知道v1.27.3升级到v1.27.6需要Replay(重播)区块链,但是没想到先给我来个 Artifacts file版本不对的问题。
提示信息如下:
Artifacts file header version (1.0) must match to expected version(1.1) by hived.
Block artifacts file xxxx/block_log.artifacts exists, but its header validation failed.
然后开始重新构建Artifacts file
Block artifact file generation finished. Elapsed time: 4196460 ms. Processed blocks count: 87002102. Generation interrupted: false.
等Artifacts file完成,程序会自动退出。(可能是因为我直接运行hived有关)
再次尝试直接运行hived(其实根本没必要尝试,v1.27.3到1.27.6必须要replay)
果不其然,出如下错误提示:
Error opening database. If the binary or configuration has changed, replay the blockchain explicitly using
--force-replay.
我想试试--force-open,发现咦,--force-open选项不见了,虽然我明确地知道即便有这个选项也不可能好用😀
果断使用 --force-replay,区块链倒是开始replay了,可是哐哐弹错误信息:
FC_ASSERT triggered: {"source_file":"json_rpc_plugin.cpp","source_lineno":325,"expr":"api_itr != data._registered_apis.end()","message":"Could not find API database_api"}
我有些搞不懂为啥为出这个错误信息,以前无论运行时还是Replay时都没错呀。尝试了半天也没啥好办法,最后我重新生成了一份配置文件,可算可以正常replay啦。
这期间还发现几个小问题,比如忘记放到内存中去replay,逐一修改,然后用了大概十多个小时的时间,Replay总算完成啦。
因为是重新生成的配置文件,和之前久经考验的配置文件还是有很大区别的,所以运行时还需要做相应的修改。
包括但不限于:
- 启用http、ws端点
- 重新配置log-logger
- 启用一些我用到的api(plugin)
- 配置block-stats-report-type
- 添加配置见证人信息
因为首先升级的是本地的备份节点,除了提供备份见证人的功能外,还担负一些其它任务(命令行钱包连接、脚本服务等),必须做相应的配置调整。
比如不开启http、ws端点,脚本连接时就会出如下错误:
ConnectionRefusedError: [Errno 111] Connection refused
比如不在插件(plugin)中配置先攻的api,那么脚本调用时就会出现类似如下的错误:
'Assert Exception:api_itr != data._registered_apis.end(): Could not find API ' 'block_api'
还有就是命令行钱包也要更新,使用相应的版本,否则会出现奇怪的错误。
升级好备份节点后,就可以先将见证人切换到备份节点上运行。
这是通过更新系统里见证人出块密钥对应的公钥来实现的,亦即使用witness_update_operation来更新系统中对应的见证人公钥。
当然,如果你只有一台服务器跑见证人,那么建议做上边这一系列操作(编译除外)之前,先将见证人下线,亦即将见证人出块密钥公钥更新为:
STM1111111111111111111111111111111114T1Anm
(图源 :pixabay)
都弄好以后,就等待在新版本上出块即可,虽然很折腾,但是也是成就满满。
通过cutehive.com查了一下,发现已经成功在v1.27.6版本上出块
还有就是,更新完备份见证人节点,回头再去更新主见证人节点,主见证人节点因为只作为见证人节点存在,不需要更多的设置,能省力一些吧。