测试网0.11.0版本升级手册和升级时间讨论

各位伙伴们,大家好:

以下是测试网0.11.0版本升级手册全文,发出来给大家讨论,对于升级文档操作内容和升级时间有任何问题,欢迎随时讨论;

备注:版本下载链接和Commit ID等信息会在升级时间确定后进行更新,敬请关注;

升级时间讨论:本次通过链上治理的方式进行升级,需要发起版本升级提案,暂定的链上提案发起时间是北京时间2020年4月8日10点

版本说明

功能新增

一、支持WASM合约

  1. 支持编译,部署,调用WASM合约
  2. 支持WASM合约升级,销毁
  3. 提供Java、Javascript sdk调用wasm合约
  4. platon-truffle支持wasm合约
  5. 支持权限模型
  6. 存储结构增加封装Array, Map, MultiIndex

功能优化

一、对低(零)出块率惩罚机制做了优化

问题:当前PlatON对于零出块节点的惩罚策略过于严厉

影响:影响用户体验

解决方案
根据PlatON链上原协议,只要当选为验证人的节点在一个共识周期内没有出过块那么此节点将被处罚,当前测试网的处罚策略为强制节点解除质押,质押金将被锁定一定的结算周期。
近期根据PlatON拉力赛参赛节点反馈,节点在升级过程中或由于网络抖动原因导致不能在被选为验证人时及时出块,多数节点认为PlatON当前的处罚策略过于严厉。
为进一步加强PlatON网络的健壮性,综合各个节点的意见,本次优化对零出块处罚条件做以下调整:

  • 只有在一定时间范围内持续不出块(时间范围用共识周期数衡量)才进行处罚。

  • 只有超过一定的不出块次数,才会处罚。

二、platon命令行参数删除了wallet、ethstats以及gcmode参数

说明: 这三个参数从以太坊中保留下来的,在PlatON中没有使用或暂时不支持,先从命令行中删除掉。

PlatON令牌发现没有预售机制,不需要使用wallet子命令,ethstats为以太坊原有接口上报指标服务,PlatON暂未使用。 gcmode开关是配置statecache里面的triedb要不要做缓存的开关,PlatON对存储进行了优化,暂不支持这个开关。

功能修复

一、修复了fast同步中途退出后节点启动失败问题

问题:一旦fast同步过程中断,节点重新启动将失败

解决方案:
在节点首次进行fast同步时,如果同步途中因某些原因进程退出,造成底层存储的数据不一致,节点再次启动时会失败(数据不一致导致无法继续运行)
本次对fast同步机制做了修改,如果首次fast同步不成功,后面再次启动节点时需要重新进行fast同步。

二、修复了频繁调用GetTransactionCount接口导致节点内存溢出问题

问题:在链停止出块的前提下,频繁调用GetTransactionCount接口会导致节点内存不断增长,节点最终会因内存溢出而终止

解决方案:
此问题时RPC接口查询链上数据时父区块和子区块存在交叉引用,导致每次申请的内存没有办法回收,修复方案为对RPC接口做特殊处理,查询执行完直接解除引用

三、修复了不能向内置合约转账的问题

问题:在测试网测试发现,不能直接向内置合约中转账

解决方案:
由于之前的版本对内置合约地址做了特殊处理,判断了data字段不能为空,所以直接转账会失败,本次通过升级提案对这个错误做了修复,可以直接转账到内置合约

四、修复了节点view差距很大时view同步慢的问题

问题:3月9号链停止出块,11号升级恢复时发现节点间view差距较大,view同步太慢导致较长时间后链才恢复出块

解决方案:
判断如果当前节点和邻居节点view差距超过2时不再等超时,而是直接同步下一个view

五、修复了测试网节点同步时出现vrf invalidate问题

问题:节点在同步偶尔会出现vrf invalidate问题,会导致节点同步停止,块高不会继续增长

解决方案:
此问题是由于CBFT引擎在出块时的时间过长导致,当前节点会根据时间超时启动再次出块,但由于上一个块还没出完,导致该节点双出,最终导致vrf校验失败,
本次修改出块机制,出过一次当前高度的块将不会再次出同一高度的区块。

六、偶现BAD BLOCK问题

问题:在存在EVM合约调用的交易中,个别节点执行区块出现BAD BLOCK

解决方案:
此问题由于PlatON存储优化设计中相同value被多个key引用导致,当前版本的修复方案是对value的引用做计数,当计数为0时才会删除。

七、交易索引被删除导致交易信息查不到的问题

问题:在存储优化删除交易回执时连带交易索引一起删除导致交易详情查询不到

解决方案:
交易索引数据不存在链上,删除数据对共识不会产生影响,但会导致查询交易时不能根据索引获取详情,修复方案是删除回执时只删除回执,不删除索引

https://github.com/PlatONnetwork/PlatON-Go/issues/1290

八、修复了EVM合约中调用blockhash函数,部分节点执行过程中会出现panic问题

问题:solidity合约中使用blockhash指令时个别节点在获取链上状态时由于区块确认速度不一致导致获取不到

解决方案:
底层适配不同状态

九、解决了随机选取验证人节点时计算小版本号问题

问题:此问题为拉力赛节点反应强烈的幸运块问题

解决方案:
一期解决方案是选取验证人时忽略小版本号,二期会考虑增加随机性因子

十、storage存储增加引用计数,解决value相同时被优化掉的问题

问题:在0.11.0之前的版本,相同value使用同一个k-v,导致可能被优化掉

解决方案:
在0.11.0之后的版本,存储时value增加引用计数,以避免被优化掉导致bad block

十一、增加0.11.0版本前的合约黑名单,解决由于存储优化导致bad block问题

问题:继续未增加引用计数的旧版合约可能存在问题

影响:为避免在0.11.0后继续使用旧版本合约,导致badblock,新版本将旧版本合约地址做了黑名单限制,0.11.0后调用旧合约将会失败

版本信息

本次升级的版本信息如下:

Version: [platon 版本号]
Git Commit: [git commit hash]

操作步骤

以下操作步骤以 Ubuntu 系统为例,请严格按照以下步骤操作升级,如有需要帮助请联系客服。

备份旧版本二进制文件

如果之前是通过PPA方式安装的,二进制文件默认在/usr/bin/PlatON目录下:

sudo cp /usr/bin/PlatON/platon /tmp/platon_$(date +%Y%m%d)

如果是通过源码构建的方式安装的,请根据各自安装的路径备份二进制文件。

更新二进制文件

方式一:

执行以下命令通过PPA更新二进制到[版本号]

# 更新
apt update
# 卸载 [platon 版本号]
apt remove platon[platon 版本号] --purge
# 安装 [platon 版本号]
apt install platon[platon 版本号]

方式二:

从PlatON官方下载渠道下载正确的 platon 二进制压缩文件后,将文件解压到之前 platon 安装的目录(如果之前是PPA安装默认在/usr/bin/PlatON/)下。

下载地址:http://47.91.153.183/platon-node/platon-ubuntu-amd64-[platon 版本号].tar.gz

注意以下命令如果platon安装路径不是在/usr/bin/PlatON/下请替换为实际platon所在路径:

sudo tar -xvf platon-ubuntu-amd64-[platon 版本号].tar.gz --strip-components 1 -C /usr/bin/PlatON/ sudo chmod u+x /usr/bin/PlatON/platon

方式三:

如果之前是通过源码编译的方式安装的,请按照下面的命令进行升级:

cd PlatON-Go
git fetch --all
git checkout -b [release 版本号] [git 版本号]
make all

全新源码编译安装方式可以参考官方文档Ubuntu源码安装进行升级。
编译完成之后在PlatON-Go/build/bin目录下会重新生成新的platon文件,将该文件替换到之前安装的platon路径即可(记得加执行权限chmod u+x platon)

重启进程

准备重启脚本

编辑以下脚本,将nohup启动命令替换为本节点之前的启动命令(注意如果platon不在系统/usr/bin目录下需要指定platon所在的绝对路径,另外datadir路径以及nodekey和blskey路径同样需要指定为绝对路径)
将便捷好的脚本保存为restart.sh,以下操作假设当前目录为/opt/platon:

#!/bin/sh
ps -ef | grep platon | grep datadir | grep -v grep | cut -c 9-15 | xargs kill
sleep 2
nohup platon --identity platon --datadir /opt/platon/data --port 16789 --testnet --rpcport 6789 --rpcapi 'db,platon,net,web3,admin,personal' --rpc --nodekey /opt/platon/data/nodekey --cbft.blskey /opt/platon/data/blskey --verbosity 3 --rpcaddr 127.0.0.1 --syncmode 'full' &

**注意:**上述脚本各参数,特别是data路径、端口号、key相关路径等,请根据实际环境调整!

给脚本加执行权限:

chmod +x ./restart.sh

特别注意:共识中,特别是正在出块的节点,请勿重启!!

如果当前节点质押过,首先通过区块链浏览器查看节点是否已经被选为验证人(共识中)
如果已经当选,请等待节点退出共识(共识中转为活跃中)后再进行以下操作。

重启进程执行以下命令:

sudo ./restart.sh

检查

查看进程启动情况,如不能正常启动,请及时联系客服人员。

反馈

升级后通过以下命令查看版本号:

platon version

请将版本号通过以下任意方式发送:

  1. 发送至 gitter room
  2. 验证人微信群
  3. 邮箱 rally@platon.network

提案处理

  • 质押过的节点,请通过区块链浏览器查看当前节点是否是以下状态:
  1. 出块中
  2. 共识中
  3. 活跃中

如果当前节点为上述3中状态的一种,请按照升级提案投票操作对版本[platon 版本号]进行投票,提案id为[提案 id]

如果节点状态为“候选中”,则需要做版本声明,方法请参照版本声明进行操作。

  • 未质押过的节点,跳过本步骤。
2 Likes