Ultima-1.2.0

是否强制更新及版本号

事项备注
是否强更
版本号ultima1.2.0
最迟升级时间2022.11.05 12:00
Github代码Tag版本https://github.com/vision-consensus/vision-core/releases/tag/mainnet_ultima_v1.2.0
Docker镜像版本maintainers/vision-mainnet:ultima_v1.2.0
maintainers/vision-mainnet:latest

版本功能变动

Ultima1.2.0 版本作出2个重大更新,5个小功能更新
1、新增光量子和熵的多档质押及档位复投,社区节点投票复投
2、JSONRPC接口兼容底层原生交易
3、社区节点修改投票地址手续费
4、社区节点奖励蒸发量统计
5、第一验证者批量发起多个提议参数校验
6、区块版本号升级
7、依赖库版本升级

CORE

1、新增光量子和熵的多档质押及档位复投,社区节点投票复投

在ultima1.1.1 之前的版本中,用户冻结光量子和熵可以同时获得投票权,在新版本中,我们引入多个档位的质押模型,用户可以选择不同档位进行光量子或熵的质押获得投票权,不同档位对应的质押周期以及投票加权系数不同。质押档位越高,加权系数越高。在档位质押到期后,会有一个复投考虑期的时间,在此时间范围内,用户可以选择解除资源冻结,如在此考虑期内未解除质押,则进入复投期,复投期内的档位质押,需要用户进行复投,同时该档位对应加权系数会继续有效。社区节点投票复投功能一致,在社区节点投票质押时间到期后,一样会存在复投考虑期,在考虑期内用户可以选择解除质押,否则进入复投期后,则需要用户进行复投。

2、社区节点修改节点地址手续费以及社区节点奖励蒸发量统计

在ultima1.1.1 之前的版本中,用户可以选择修改节点地址,在新版中,我们引入一个提案,第一验证者可以通过发起提案设置用户在修改社区节点地址时的手续费来控制网络,使得vision网络更加灵活。

3、区块版本号升级,依赖库版本升级

在Ultima1.1.1版本之前,vision网络出的每一个区块中block header的版本号都是初始值20,在新版本中,我们将开始迭代此版本号,对于有重大版本升级的功能,我们将递增该版本号。
由于fastjson1.2.80及之前的版本存在安全漏洞,因此,Ultima1.2.0版本将fastjson依赖库的版本更新到1.2.83,并且开启fastjson的safemode模式,保证了使用fastjson的安全性。

EVM

1、JSONRPC接口兼容vision网络底层原生交易

在ultima1.1.1之前的版本中,用户在使用JSONRPC接口接入vision网络,只能使用EVM相关的基础接口以及底层币转账和合约调用等功能,无法调用vision网络的原生交易,如投票,第一验证者申请,奖励提取等。在新版本中,vision网络对JSONRPC接口进行了兼容。我们对vision网络制定了一套标准,即将底层的原生交易类型按照合约的方法方式规范进行兼容,交易类型为合约方法,交易参数为合约方法的参数。

源码编译节点升级步骤

1. 关闭进程

# 获取正在运行的 vision-core 进程的PID
ps aux | grep "java -Xmx.*g -XX:+UseConcMarkSweepGC -jar"
# 停止该进程
kill -15 PID

2. 备份节点数据和配置文件

# 首先进入到自己节点的工作目录, 这里我们以 $OLD_WORKDIR 表示自己节点的工作目录, 具体路径大家要根据自己当初节点部署时候选定的目录来进行替换
cd $OLD_WORKDIR

# 备份当前运行的vision-core程序的jar包
mv FullNode.jar FullNode.jar.$(date '+%FT%T').bak

# 备份当前数据库
tar --force-local -zcvf "output-directory-$(date '+%FT%T')-backup.tar.gz" output-directory

# 备份配置文件
cp vision-mainnet.config vision-mainnet.config.bak

3. 获取新版本的jar包和最新的配置文件

# 获取最新版的java源代码
git clone https://github.com/vision-consensus/vision-core.git

# 编译源代码, 获取FullNode.jar 包
cd vision-core
gradle build -x test


# 拷贝 FullNode.jar 包到先前的工作目录, 用户需要根据自己所使用的的工作目录来替换下面命令中的$OLD_WORKDIR, 这样原先老的 FullNode.jar 文件会被新的 jar 包替换掉
cp -a build/libs/FullNode.jar $OLD_WORKDIR

# 回到节点工作目录中
cd $OLD_WORKDIR

# 获取最新的配置文件去替换掉原先的配置文件, 假设咱们得配置文件放在我们节点的工作目录的 configs 子目录中并且配置文件的文件名为默认的 vision-mainnet.config

wget https://vision-mainnet-configs.s3.us-east-2.amazonaws.com/stage001/vision-mainnet.config -O configs/vision-mainnet.config

📘

直接获取官方提供的jar包

也可以直接获取官方提供的 jar 包来重新运行服务。
获取地址: https://github.com/vision-consensus/vision-core/releases/download/mainnet_ultima_v1.2.0/FullNode.jar

4. 启动节点

# 进入到自己原先的工作目录, 请自行替换 $OLD_WORKDIR
cd $OLD_WORKDIR

# 启动节点
# FullNode:
nohup java -Xmx12g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c configs/vision-mainnet.config &

# FVGuarantee:
nohup java -Xmx12g -XX:+UseConcMarkSweepGC -jar FullNode.jar --witness -p <privateKey> -c configs/vision-mainnet.config &

# 如果有需要使用其他的witness账户, 请自行替换 <privateKey>

📘

使用 Google tcmalloc 库优化内存分配

若是使用 Google tcmalloc 库, 请在启动节点的命令前设置相关环境变量 , 比如,在 Ubuntu 18.04 上启动命令如下所示:

export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4"
export TCMALLOC_RELEASE_RATE=10

nohup java -Xmx12g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c configs/vision-mainnet.config &

5. 升级完成, 请等待全网升级完成

📘

删除备份数据以节约磁盘空间

等待全网升级完后, 用户可以去将前面我们备份的程序包、配置文件和数据库文件进行删除, 从而节约节点机器的磁盘空间

Docker镜像节点升级步骤

1. 关闭Docker 容器并删除

# 关闭docker容器, 请自行替换vision-core服务对应的容器名

docker stop $CONTAINER_NAME

docker rm $CONTAINER_NAME

2. 备份节点数据并删除节点配置文件

# 进入vision-core服务容器映射出来的外部卷, 请自行替换 VOLUME_NAME
cd $VOLUME_NAME

# 备份当前数据库
tar --force-local -zcvf "output-directory-$(date '+%FT%T')-backup.tar.gz" output-directory

3. 拉取最新 docker 镜像并更新配置文件

# 拉取docker镜像
docker pull maintainers/vision-mainnet:latest

# 更新配置文件, 这里假设我们原先的配置文件为docker容器的外部映射卷的configs子目录中的 mainnet.config , 我们进入到 该外部映射卷中,然后执行如下命令:
wget https://vision-mainnet-configs.s3.us-east-2.amazonaws.com/stage001/vision-mainnet.config -O configs/mainnet.config

🚧

先拉取镜像再运行容器

请先独立使用 docker pull 拉取最新的镜像。 再使用下面的 docker run 命令运行容器。 否则对于前面本地拉取过同名镜像的节点会直接使用原先的镜像运行容器。 这样的话, 节点相当于是重启了服务, 而没有升级新的底层代码.

  1. 使用新镜像启动Docker 容器服务
# fv  witness节点:
docker run -itd \
    -v "/data/mainnet:/data/vision" \
    -p 7080:7080 \
    -p 7081:7081 \
    -p 7082:7082 \
    -p 16666:16666 \
    -p 60061:60061 \
    -p 60071:60071 \
    -p 60081:60081 \
    --name vision-mainnet-FVGuarantee \
    maintainers/vision-mainnet:latest --private <private-key>

# 请自行使用自己节点使用的 witness 账户对应的私钥替换<private-key>.


# FullNode 节点:
docker run -itd \
    -v "/data/mainnet:/data/vision" \
    -p 7080:7080 \
    -p 7081:7081 \
    -p 7082:7082 \
    -p 16666:16666 \
    -p 60061:60061 \
    -p 60071:60071 \
    -p 60081:60081 \
    --name vision-fullnode \
    maintainers/vision-mainnet:latest

❗️

保持原有的外部挂载卷

在使用新的镜像重新运行容器时, 请务必注意保持原先的外部容器挂在卷的位置。 不要随意更改。

5. 升级完成, 请等待全网升级完成