搭建Solo单节点主链
Solo单节点共识机制,是一个简单易部署的但只能用于非生产环境的共识机制,通常被区块链初始者用于搭建单节点测试链。
应用场景
用户在做区块链调研的开发测试中,可以采用Solo单节点共识机制快速部署测试链,完成数据上链的验证。
本文分别介绍Window和Linux两种操作系统上搭建单节点Chain33主链,请根据实际情况查阅对应文档。
下载软件包
下载单节点solo测试链软件包: 资源下载
根据操作系统,下载对应版本的软件包,再解压到任意指定目录。
软件包包含以下文件:
# window版本下包含:
chain33.exe -- chain33节点程序
chain33-cli.exe -- chain33节点命令行工具
chain33.solo.toml -- chain33主链配置文件
# linux版本下包含:
chain33 -- chain33节点程序
chain33-cli -- chain33节点命令行工具
chain33.solo.toml -- chain33主链配置文件
修改配置文件
根据实际情况修改配置文件中以下参数:
[rpc]
# 链的jsonrpc和grpc地址,可以自定义,也可直接使用默认端口。
jrpcBindAddr=":8801"
grpcBindAddr=":8802"
[consensus.sub.solo]
# 创世积分所在的地址,可以修改成自己的地址。
· 命令行地址生成方式:https://chain.33.cn/document/126 【创建一个账户地址和私钥】
· JAVA-SDK地址生成方式:https://baas.33.cn/doc/detail/69 【创建区块链公私钥和地址】
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
[exec.sub.manage]
# 链管理合约的super manager地址,用于设置一些合约权限相关的配置,地址生成方式参考上述genesis地址。
superManager=["14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"]
搭建单节点主链
windows
1.在软件包解压目录打开windows终端,执行启动命令,启动后会一直打印日志。
chain33.exe -f chain33.solo.toml
2.在软件包解压目录下重新打开windows终端,执行以下命令查询主链网络信息,判断单节点主链是否创建成功。
chain33-cli.exe net peer
如果执行出错,请检查logs/chain33.log文件中的错误信息。
linux
1.在节点服务器中,解压软件包。
tar -zxvf chain33_solo_linux_0670237.tar.gz
2.在软件包解压缩目录中,执行启动命令。
nohup ./chain33 -f chain33.solo.toml >/dev/null 2>&1 &
3.执行命令,查看进程。
ps -ef | grep -v grep | grep chain33
4.执行命令,查询主链网络信息,判断单节点主链是否创建成功。
./chain33-cli net peer
如果执行出错,请检查logs/chain33.log文件中的错误信息。
搭建单节点docker联盟链
QBFT联盟链共识机制,是复杂美自研的一种共识算法,意为快速的拜占庭容错算法。在正式的开发环境中QBFT联盟链共识机制要求节点数满足N>3f,至少需要3f+1个节点(也就是最少需要4台服务器),但在前期调研测试场景下也能实现以1台服务器搭建单节点联盟链。
应用场景
本文介绍在Linux操作系统上以QBFT联盟链共识机制搭建单节点测试联盟链。
在测试联盟链中无需真实的4个联盟共识节点,而是虚拟出4个docker容器作为共识节点,由于是在1台服务器上部署的联盟链,所以无法避免单点故障,所以仅能在测试场景下使用,不可在生产环境中使用。
准备环境
- 安装前检查
确保curl和wget命令可用,如果不可用,通过以下方式安装。如果提示Failed connect to...,可能是因为服务器无法访问镜像,请绑定公网后重试。
#ubuntu系统
sudo apt-get install wget
sudo apt-get install curl
#centos系统
sudo yum install wget
sudo yum install curl
- 下载软件包
下载单节点docker联盟链软件包: 资源下载
解压软件包到服务器任意目录,软件包中包含以下文件:
chain33 -- chain33节点程序
chain33-cli -- chain33节点命令行工具
chain33.toml -- chain33主链配置文件
docker-build.sh -- docker镜像生成脚本
env.sh -- docker和docker-compser安装脚本
安装启动
安装docker(支持ubunt和centos)
如果服务器上没有安装docker命令,可使用env.sh安装,如果已经安装则跳过此步骤。
# 在软件包解压缩目录下,执行以下命令,安装docker。
sudo bash env.sh
# 当出现以下提示,表示docker和docker-compose安装成功
Checking env..... SUCCESS
注意:如果用户是centos操作系统,在安装docker过程中可能会出现no docker-compose in (/sbin:/bin:/usr/sbin:/usr/bin)问题,导致docker-compose组件安装失败。此时,需要用户在上述指定目录下自行下载安装docker-compose组件,安装成功后再重新执行docker安装命令。
docker-compose安装失败
生成配置文件
docker-build.sh脚本用于生成chain33镜像和对应的配置文件。
# 执行以下命令,生成chain33镜像和对应的配置文件。
sudo bash docker-build.sh
# 当出现以下提示,表示环境编译成功
docker build chain33 image sucess!
【说明】默认使用4个节点和172.50.0.0网段,用户也可以自己配置。
#用法
./docker-build.sh <num> <network>
num --- 节点数量,默认是4个节点。
network -- 节点网络,默认是172.50.0.0。
#例子
./docker-build.sh 4 172.50.0.0
执行成功后会生成docker-compose.yaml和Dockerfile文件,以及对应节点的挂载目录。
启动docker
sudo docker-compose -f docker-compose.yaml up --build -d
# 当出现以下提示,表示docker联盟链环境启动成功。
Creating network "chain33_qbft_docker_app_net" with driver "bridge"
Creating chain33-172.50.0.3 ... done
Creating chain33-172.50.0.2 ... done
Creating chain33-172.50.0.5 ... done
Creating chain33-172.50.0.4 ... done
检查启动情况
sudo docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
chain33-172.50.0.2 /app/chain33 -f /app/chain ... Up 33001/tcp, 0.0.0.0:8801->8801/tcp,:::8801->8801/tcp
chain33-172.50.0.3 /app/chain33 -f /app/chain ... Up 33001/tcp, 0.0.0.0:8802->8801/tcp,:::8802->8801/tcp
chain33-172.50.0.4 /app/chain33 -f /app/chain ... Up 33001/tcp, 0.0.0.0:8803->8801/tcp,:::8803->8801/tcp
chain33-172.50.0.5 /app/chain33 -f /app/chain ... Up 33001/tcp, 0.0.0.0:8804->8801/tcp,:::8804->8801/tcp
检查同步状态
sudo docker exec chain33-172.50.0.2 /app/chain33-cli net is_sync
true
检查节点连接 sudo docker exec chain33-172.50.0.2 /app/chain33-cli net peer
搭建私有链开发环境
私有链,也称专有链,节点的写入权限归某组织内部控制,读取权限和可视需求可选择性的公开。
应用场景
私链采用raft共识,节点数配置一般为3,5,7等奇数个。区别于联盟链,私有链之前的区块同步采用主从同步的方式,更偏中心化一些,常用于对隐私保障和监管控制有更高要求的企业和集团内部场景。
本文介绍快速搭建一个包含3个节点的私有链开发环境,需要提前准备3台服务器。
下载软件包
下载多节点私有链集群软件包: 资源下载
在其中一台节点服务器上解压软件包到任意目录。
tar -zxvf chain33_raft_0370237.tar.gz
软件包包含以下文件:
chain33 -- chain33节点程序
chain33-cli -- chain33节点命令行工具
chain33.raft.toml -- chain33主链配置文件
genconfig.sh -- 节点目录生成工具
生成节点目录
1.在准备的私有链其中一台节点服务器中使用工具生成3台服务器对应的节点目录。
假设3台服务器的ip分别为10.0.0.1, 10.0.0.02, 10.0.0.3
./genconfig.sh "10.0.0.1,10.0.0.2,10.0.0.3"
2.将生成的节点目录,分别发送到对应的节点服务器。
#将10.0.0.2文件发送到IP为10.0.0.2的节点服务器指定目录中,如root目录。
scp -r ./10.0.0.2 root@10.0.0.2:/root
#需要输入节点服务器的登录密码。文件发送需要一定时间,请耐心等待。
root@10.0.0.2's password:
chain33 66% 50MB 129.2KB/s 03:21 ETA
启动节点
1.登录各个服务器,切换至对应的节点目录下执行启动命令。
nohup ./chain33 -f chain33.raft.toml >/dev/null 2>&1 &
2.执行命令,查看进程。
ps -ef | grep -v grep | grep chain33
3.执行命令,查询节点同步状态。
./chain33-cli net is_sync
返回结果为true则说明运行成功。
4.执行命令,查询p2p节点信息。
./chain33-cli net peer
如果执行出错,请检查logs/chain33.log文件中的错误信息。
搭建联盟链集群环境
联盟链,是指一些有业务协作或业务交易的成员集合,由这些成员共同参与管理的区块链,通过联盟自治和节点准入准出控制策略,保障联盟的安全健康发展。
应用场景
联盟链采用采用QBFT共识,要求节点数满足N>3f,至少需要3f+1个节点(也就是最少需要4台服务器),与单节点docker部署方式更加适用于实际生产环境。
本文介绍快速搭建一个包含4个节点的联盟链开发环境,以及联盟链节点管理。
请提前准备至少5台服务器,其中4台用于搭建联盟链,1台用于体验节点管理。
下载软件包
下载多节点联盟链集群软件包: 资源下载
在其中一台节点服务器上解压软件包到任意目录。
tar -zxvf chain33_qbft_7fe229c.tar.gz
软件包包含以下文件:
chain33 -- chain33节点程序
chain33-cli -- chain33节点命令行工具
chain33.toml -- chain33主链配置文件
genconfig.sh -- 节点目录生成工具
修改配置文件
搭建联盟链时,根据具体情况在chain33.toml配置文件中修改以下参数。
[p2p.sub.gossip]
# 用于p2p隔离。如果相同网络内部署多条链,不同链之间channel值不能配成一样。
channel=1099
[rpc]
# 链的jsonrpc和grpc地址,可以自定义。
jrpcBindAddr=":8801"
grpcBindAddr=":8802"
[consensus.sub.qbft]
# 创世积分所在的地址,可以修改成自己的地址。
· 命令行地址生成方式见: https://chain.33.cn/document/126【创建一个账户地址和私钥】
· JAVA-SDK地址生成方式见:https://baas.33.cn/doc/detail/69【创建区块链公私钥和地址】
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
# 创世积分数量
genesisAmount=100000000
[exec.sub.manage]
# 链管理合约的supermanager地址,用于设置一些合约权限相关的配置,地址生成方式参考上述genesis地址。
superManager=["14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"]
生成节点目录
1.在其中一台节点服务器中使用工具生成4台服务器对应的节点目录。
假设4台联盟链节点服务器的IP分别为172.27.0.2、 172.27.0.5、172.27.0.9、 172.27.0.15。
# 生成四个节点的区块链程序及配置文件。(在云服务器上部署,存在外网地址和内网地址的情况下建议使用内网IP,千兆网络P2P传输性能更好。)
./genconfig.sh "172.27.0.2,172.27.0.5,172.27.0.9,172.27.0.15"
2.将生成的节点目录,分别发送到对应的节点服务器。
#将172.27.0.2文件发送到IP为172.27.0.2的节点服务器指定目录中,如root目录。
scp -r ./172.27.0.2 root@172.27.0.2:/root
#需要输入节点服务器的登录密码。文件发送需要一定时间,请耐心等待。
root@172.27.0.2's password:
chain33 66% 50MB 129.2KB/s 03:21
注意: 4台服务器之间防火墙需要放行13802(p2p端口)、33001(共识端口),以及8801(区块链对外jsonrpc端口)。
启动节点
1.登录到各个节点执行启动命令,顺序不分前后,建议在一分钟内全都启动。
nohup ./chain33 -f chain33.toml >/dev/null 2>&1 &
2.执行命令,查看进程
ps -ef | grep -v grep | grep chain33
3、执行命令,查询节点同步状态(同步时间需要5分钟左右)。
返回结果为true则说明运行成功。
./chain33-cli net is_sync
4.执行命令,查询p2p节点信息。
./chain33-cli net peer
如果执行出错,请检查logs/chain33.log文件中的错误信息。
管理节点
Chain33联盟链节点有两种角色,一种是验证节点,一种是共识节点。
验证节点:只同步区块,广播交易但不参与共识。
共识节点:参与共识的节点。
验证节点可以经由全网共识后变成共识节点,同时共识节点也可以由全网共识后退化成验证节点。
添加验证节点
1.在其中一台联盟链节点服务器的节点目录下,将chain33、chain33-cli、chain33.toml和genesis.json(公钥文件)拷贝到新节点任意目录上 (chain33.toml和genesis.json不要做任何修改)。
#假设拷贝到新节点172.27.0.16的“/root/fold”目录下。
scp -r ./chain33 chain33-cli chain33.toml genesis.json root@172.27.0.16:/root/fold
2.登录新节点服务器,进入指定目录,然后生成私钥文件。
# 生成私钥文件,-n:生成数量,-t:签名算法,默认生成私钥文件“priv_validator_0.json”。
./chain33-cli qbft gen_file -n 1 -t bls
#将“priv_validator_0.json”重命名为“priv_validator.json”。
MV priv_validator_0.json priv_validator.json
3.执行启动命令,运行新节点。
nohup ./chain33 -f chain33.toml >> qbft.out&
4.执行命令,查询p2p节点信息。
添加新节点成功后,可以查询到5个节点的信息。
./chain33-cli net peer
变更节点角色
1.设置qbft-manager账户
查询是否已有[添加或者删除节点权限]的账户qbft-manager。
如果有,无序执行后续步骤;如果没有,在原有节点(因为新节点可能还没有同步到最大高度,所以最好在原节点上执行)上执行后续步骤。
./chain33-cli config query -k qbft-manager
# 输出样例
{
"key": "qbft-manager"
}
在原有节点服务器的节点目录下,执行以下步骤,设置qbft-manager账户。
# 配置qbft-manager。-c:qbft-manager,-o:add(表示添加),-v:qbft-manager的地址,与配置文件中的superManager地址相同。
./chain33-cli config config_tx -c qbft-manager -o add -v 1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs
# 签名交易。 -k 链的supermanager的私钥。
./chain33-cli wallet sign -k 0xdb9415dfbd54ed84dccde80a0f9f2497c7b967116da92d8682900b324ea33d68 -d 上一步返回的结果
./chain33-cli wallet send -d 上一步返回的结果
# 查询qbft-manager账户。
./chain33-cli config query -k qbft-manager
# 输出样例。
{
"key": "qbft-manager",
"value": "[1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs]"
}
2.验证节点变为共识节点
将新节点的公钥通过交易发送到链上,由全网所有共识节点进行共识。
# 发送交易,添加共识节点。-p:新节点的公钥,-w:节点权重,不超过原有节点权重之和的1/3,-k:qbft-manager账户私钥,即superManager账户私钥。
./chain33-cli send qbft add -p F4E29F6C49D4BE13A9271C0E66D96413C64A0D6C -w 10 -k 3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8
# 查询当前共识节点数目,检查是否存在新增的节点。
./chain33-cli qbft nodes
3.共识节点变为验证节点
将要删除的共识节点的公钥通过交易发送到链上,由全网所有共识节点进行共识。
# 发送交易,删除共识节点。-p:删除节点的公钥,-w:节点权重,0表示删除,-k:qbft-manager账户私钥,即superManager账户私钥。
./chain33-cli send qbft add -p F4E29F6C49D4BE13A9271C0E66D96413C64A0D6C -w 0 -k 3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8
# 查询当前共识节点数目
./chain33-cli qbft nodes
平行链环境搭建
平行链的运行是依赖于主链的,它通过grpc接口同主链进行通信,所以平行链一定是在主链环境已经具备的情况下才能搭建。
应用场景
为解决专有问题,适用于特定场景,用户可以在主链上搭建平行链来解决,实现各个击破 。平行链共享主链共识网络,每条平行链只运行自己的数据,平行链与平行链之间数据相互隔离。
本文分别介绍Window和Linux两种操作系统上搭建Chain33平行链,请根据实际情况查阅对应文档。
环境准备
准备好已搭建好的主链。主链的形态可以是:
单节点solo,用于开发和测试
单节点docker,用于开发和测试
私有链集群
联盟链集群
下载软件包
下载页面: 资源下载
平行链软件包有window和linux两个版本,根据自己的操作系统下载对应的平行链软件包,再解压到任意指定目录。
软件包分别包含
# windows
chain33.exe -- chain33节点程序
chain33-cli.exe -- chain33节点命令行工具
chain33.para.toml -- chain33平行链配置文件
# linux
chain33 -- chain33节点程序
chain33-cli -- chain33节点命令行工具
chain33.para.toml -- chain33平行链配置文件
配置文件
平行链根据具体情况修改对应的平行链title,主链地址,和super manager地址。
# 平行链title,用来唯一标识一条平行链,修改其中的xxxx(只支持英文字符,另外xxxx后面那个 . 不能省略)
Title="user.p.xxx."
# 平行链上创世积分的名称,可以自定义,但只支持英文字符
CoinSymbol="para"
[rpc]
# 平行链的jsonrpc和grpc地址,可以自定义,如果主链和平行链放在同一台服务器上, 只需要保证以下两个端口和主链配置不一样就行
jrpcBindAddr=":8901"
grpcBindAddr=":8902"
[consensus]
# 平行链创世积分所在的地址,可以修改成自己的地址(命令行地址生成方式见: https://chain.33.cn/document/126#1%20%E5%B9%B3%E8%A1%8C%E9%93%BE%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E5%8F%8A%E8%BF%90%E8%A1%8C, JAVA-SDK地址生成方式见:https://baas.33.cn/doc/detail/69 )
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
[consensus.sub.para]
# 主链的grpc地址,根据主链节点的具体情况修改 (具体的端口可以看主链配置文件中的:grpcBindAddr这个参数的配置)
ParaRemoteGrpcClient="127.0.0.1:8802"
# 指示从主链哪个高度开始同步,比如主链高度是1万,建议配置是提前1000个区块(10000-1000=9000),配置为1代表从主链第1个高度开始同步。 此参数不能配置成大于主链的高度
startHeight = 1
[exec.sub.manage]
# 平行链管理合约的super manager地址,用于设置一些合约权限相关的配置, 地址生成方式参考上述genesis地址
superManager=["14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"]
[exec.sub.evm]
# 前面coins.是固定配置,后面的参数和上述的CoinSymbol对应
ethMapFromSymbol="coins.para"
节点启动
windows
1.在软件包解压目录打开windows终端,执行启动命令,启动后会一直打印日志。
chain33.exe -f chain33.para.toml
2.在软件包解压目录下重新打开windows终端,执行以下命令查询平行链网络信息,判断平行链是否创建成功。
chain33-cli.exe net peer
如果执行出错,请检查logs/chain33.log文件中的错误信息。
linux
1.在待搭建平行链的服务器中,解压软件包。
tar -zxvf chain33_para_linux_0670237.tar.gz
2.在软件包解压缩目录中,执行启动命令。
nohup ./chain33 -f chain33.para.toml >/dev/null 2>&1 &
3.执行命令,查看进程。
ps -ef | grep -v grep | grep chain33
4.如果进程已经启动,执行命令查询平行链网络信息。
# --rpc_laddr参数指向的是平行链jsonrpc端口地址, 此端口配置对应在配置文件的 jrpcBindAddr
./chain33-cli --rpc_laddr="http://localhost:8901" block last_header
如果执行出错,请检查logs/chain33.log文件中的错误信息。