更新见证人节点版本至v1.27.6

Words
1407
Reading
7 min
Listen
Play
2y

一个月以前,HIVED发布了新版本1.27.6,这个版本修复了P2P通信中可能导致节点崩溃的BUG,并鼓励所有节点升级到这一版本。

image.png
(图源 :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那不得一路顺畅,丝般顺滑呀。

image.png

结果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"

image.png

查看代码发现如下内容:
image.png

再查看hive/scripts/setup_ubuntu.sh会发现和以前的版本相比,多安装了好几个库,甚至编译也改成了使用ninja

根据脚本做相应的调整,主要是手动安装了liburing-dev

sudo apt install liburing-dev

最终成功地编译出需要的程序(hived等)。

Artifacts file版本问题

虽然早就知道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有关)

Replay 遇到的问题

再次尝试直接运行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

image.png
(图源 :pixabay)

都弄好以后,就等待在新版本上出块即可,虽然很折腾,但是也是成就满满。

通过cutehive.com查了一下,发现已经成功在v1.27.6版本上出块
1720787291520.png

还有就是,更新完备份见证人节点,回头再去更新主见证人节点,主见证人节点因为只作为见证人节点存在,不需要更多的设置,能省力一些吧。

相关链接