v3.17.1¶
v3.17.1 是 v3.17.0 的修复版本,修复一个可导致节点状态分叉的执行器缓存问题、一个可远程触发节点进程退出的签名解析问题,以及若干 Web3 RPC 与大区块传输问题。建议所有 v3.17.0 用户升级至本版本。
修复¶
执行器状态分叉:修复合约字节码分析缓存按合约地址而非代码哈希作为 key 的问题。
eth_call、eth_estimateGas与被放弃的共识提案等投机执行中部署的合约,会把「该地址存在代码」错误地泄露给进程内后续所有执行,导致EXTCODESIZE读到非零、单节点状态分叉并停止出块(重启后恢复)。缓存 key 改为(codeHash, revision),该修复随bugfix_v1_eoa_as_contract开关生效。相关PR:#5528非法签名致节点退出:修复 secp256k1 签名
v(recovery id)字节超出 0..3 合法范围时,节点在恢复发送方地址阶段直接将其传入底层库触发进程abort()的问题。该路径处于交易准入阶段,一笔未经认证的非法交易即可使节点进程退出;现在在所有相关调用入口前统一将其拒绝为非法签名。相关PR:#5594eth_estimateGas 估算偏低:修复
eth_estimateGas对预编译合约目标(如余额预编译合约0x1011)仅返回固定 21000 的问题。回执中的gasUsed不包含预编译内部子调用的消耗,客户端按该值发送交易会因 gas 不足而执行失败。现在参照以太坊做法,在「请求指定 gas」与「链上交易 gas 上限」二者的较小值范围内二分查找交易能成功执行的最小 gas 上限;普通合约调用保持两次执行的快速路径。相关PR:#5594大区块消息被静默丢弃:修复 front 层单条消息载荷上限(8MB)与网关层消息上限(32MB)不一致的问题。落在 (8MB, 32MB] 区间的大区块共识提案与区块同步应答会被网关放行、却在接收端被静默丢弃,单个区块约 6.5 万笔交易以上时可导致链停止出块。相关PR:#5465
相关修复的完整列表见 GitHub Release 与代码仓库 ChangeLog.md。
兼容性说明¶
兼容版本¶
需要升级的链的“数据兼容版本号(compatibility_version)”为如下版本时:
3.4.x ~ 3.17.0:数据完全兼容当前版本,直接替换二进制即可完成升级
3.3.x、3.2.x、3.1.x、3.0.x:支持通过替换二进制进行灰度升级,若需使用当前版本的新特性,需升级数据兼容版本号,操作见版本升级指南
3.0-rc x:数据不兼容,无法升级,可考虑逐步将业务迁移至3.x正式版
2.x:数据不兼容,2.x版本仍持续维护,可考虑升级为2.x的最新版本
重要
本版本包含随数据兼容版本号(compatibility_version)3.17.1 启用的 bugfix 开关。必须待全网所有节点完成二进制替换并重启后,再将 compatibility_version 提升至 3.17.1;提升后链即按新逻辑运行,不支持回退到旧版本二进制混跑。
本版本新增的 bugfix 开关¶
以下开关随 compatibility_version 升级至 3.17.1 自动开启,从低版本升级且未提升版本号时保持关闭,与旧版本行为一致:
| Bugfix 开关 | 说明 |
|---|---|
| bugfix_v1_eoa_as_contract | 合约字节码分析缓存按代码哈希而非地址作 key,修复投机执行泄露导致的状态分叉 |
用 v3.17.1 通过 build_chain.sh 新建的链,其创世块 compatibility_version 默认即为 3.17.1,无需额外操作。
升级方法¶
该操作仅支持将3.x版本升级为本版本,不支持3.0-rc或2.x的升级。从 v3.17.0 升级时,「非法签名致节点退出」「eth_estimateGas 估算偏低」「大区块消息被静默丢弃」三项修复随节点二进制替换立即生效;执行器状态分叉的修复需将数据兼容版本号提升至 3.17.1 后生效。
查询数据兼容版本号(compatibility_version)¶
用控制台 进行查询,如当前返回的版本为3.17.0
[group0]: /apps> getSystemConfigByKey compatibility_version
3.17.0
替换节点二进制¶
需将所有节点 的二进制逐步替换为当前版本。为了不影响业务,替换过程能够以灰度方式进行,逐个替换并重启节点。替换过程中,当前的链仍然会以旧的数据兼容版本号的逻辑继续执行。当所有节点二进制替换完成并重启后,需用控制台修改数据兼容版本号为当前版本。
设置数据兼容版本号(compatibility_version)¶
用控制台 设置数据兼容版本号,如当前版本为3.17.1。
[group0]: /apps> setSystemConfigByKey compatibility_version 3.17.1
{
"code":0,
"msg":"success"
}
注:若开启权限治理功能,需要使用 setSysConfigProposal 命令
设置成功,再次查询,得到当前版本已升级为3.17.1
[group0]: /apps> getSystemConfigByKey compatibility_version
3.17.1
当前链已经完成升级,至此,链开始以新的逻辑继续运行。