搭建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文件中的错误信息。