17. 典型场景示例

本章节将介绍“长安链·ChainMaker”在实际使用过程中的一些经典范例。

17.1. 构造新节点加入网络

假设现在存在一个由4个共识节点组成的链chain1,我们期望构造一个新的节点加入到网络中,在【加入网络】中详细的描述了一个新的节点加入网络需要的操作步骤,以下是这些步骤以及相关命令行示例

17.1.1. 准备节点运行的目录、配置、和执行文件

通过执行以下几个步骤,可以生成新节点的运行目录,目录结构为:

chainmaker-go/build/release]# ll
drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org1.chainmaker.org
drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org2.chainmaker.org
drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org3.chainmaker.org
drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org4.chainmaker.org
drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org5.chainmaker.org
chainmaker-go/build/release]# tree -L 3 chainmaker-v2.2.1-wx-org5.chainmaker.org
chainmaker-v2.2.1-wx-org5.chainmaker.org
├── bin
│   ├── chainmaker
│   ├── chainmaker.service
│   ├── docker-vm-standalone-start.sh
│   ├── docker-vm-standalone-stop.sh
│   ├── init.sh
│   ├── panic.log
│   ├── restart.sh
│   ├── run.sh
│   ├── start.sh
│   └── stop.sh
├── config
│   └── wx-org5.chainmaker.org
│       ├── certs
│       ├── chainconfig
│       ├── chainmaker.yml
│       └── log.yml
├── data
│   └── wx-org5.chainmaker.org
│       ├── block
│       ├── history
│       ├── ledgerData1
│       ├── result
│       └── state
├── lib
│   ├── libwasmer.so
│   └── wxdec
└── log

具体操作步骤如下:

  • 基于目前的链上已存在的组织和节点扩展出新的证书,参考【扩展证书】,示例脚本和说明如下:

    current_version="v2.2.1"
    chainmaker_path="/home/projects/test/chainmaker-go"
    cryptogen_path="/home/projects/test/chainmaker-cryptogen"
    gen_new_cert(){
    echo "------------在chainmaker-cryptogen下生成org5的节点证书:-------------------"
    cd "${cryptogen_path}/bin"
    # 1.备份旧的证书文件
    rm -rf crypto-config-bk
    mv crypto-config crypto-config-bk
    # 2.复制链上所有节点的证书到bin目录下,适用于在现有组织证书的基础上扩展节点证书
    cp -r "${chainmaker_path}/build/crypto-config" ./
    # 3. 修改配置文件
    # 如果增加一个共识节点,node: -type: consensus 下面的count: 本来是1,改为2就等于增加一个共识节点,适用于在现有组织证书的基础上扩展节点证书
    # 如果想增加一个新的组织:修改host_name: wx-org下的count,适用于增加一个新的组织及其节点
    vim ../config/crypto_config_template.yml
    # 请手动编辑后保存。
    # 4. 执行命令生成新的证书
    ./chainmaker-cryptogen extend -c ../config/crypto_config_template.yml
    }
    

    方法执行后会在chainmaker-cryptogen/bin目录下生成新节点的证书:

    chainmaker-cryptogen/bin]# tree -L 1 crypto-config
    crypto-config
    ├── wx-org1.chainmaker.org
    ├── wx-org2.chainmaker.org
    ├── wx-org3.chainmaker.org
    ├── wx-org4.chainmaker.org
    ├── wx-org5.chainmaker.org
    
  • 构建节点的执行目录

    copy_node_file(){
    echo "------------复制org5节点的包文件-------------------"
    cd "${chainmaker_path}/build/release"
    #1. 复制org1的节点目录
    cp -r "chainmaker-$current_version-wx-org1.chainmaker.org" "chainmaker-$current_version-wx-org5.chainmaker.org"
    #2. 把chainmaker-*-wx-org5.chainmaker.org/bin下所有的.sh脚本中所有wx-org1.chainmaker.org替换为wx-org5.chainmaker.org"
    cd chainmaker-*-wx-org5.chainmaker.org/
    sed -i 's/org1/org5/g' bin/start.sh
    sed -i 's/org1/org5/g' bin/stop.sh
    sed -i 's/org1/org5/g' bin/restart.sh
    sed -i 's/org1/org5/g' bin/run.sh
    #3.删除data和log
    rm -rf data/*
    rm -rf log/*
    # 4. config/下的org1目录重命名为org5
    mv config/wx-org1.chainmaker.org config/wx-org5.chainmaker.org
    }
    

    以上方法执行后,会在build/release下生成新的节点目录:

    chainmaker-go/build/release]# ll
    drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org1.chainmaker.org
    drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org2.chainmaker.org
    drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org3.chainmaker.org
    drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org4.chainmaker.org
    drwxr-xr-x 7 root root     4096 Jun 28 20:14 chainmaker-v2.2.1-wx-org5.chainmaker.org
    
  • 更新节点目录下的证书:

    在第2步中,我们只对节点目录中对应的名称进行了替换,未将org5的证书放在目录 中,因此需要将在第1步生成的org5的证书复制过来

    update_cert(){
    # 使用chainmaker-cryptogen生成的wx-org5.chainmaker.org下的node和user分别覆盖掉wx-org5.chainmaker.org/config/wx-org5.chainmaker.org/certs下的node和user"
    crypto_cert=${cryptogen_path}/bin/crypto-config/wx-org5.chainmaker.org
    chainmaker_cert=${chainmaker_path}/build/release/chainmaker-*-wx-org5.chainmaker.org/config/wx-org5.chainmaker.org/certs
    cp -rf $crypto_cert/user $chainmaker_cert
    cp -rf $crypto_cert/node $chainmaker_cert
    }
    
  • 修改org5的节点配置文件和链配置文件

    update_config(){
    echo "----------------修改org5的chainmaker.yml----------------"
    # 1. 把wx-org5.chainmaker.org/config/wx-org5.chainmaker.org/chainmaker.yml中所有wx-org1.chainmaker.org替换为wx-org5.chainmaker.org
    sed -i 's/org1/org5/g' config/wx-org5.chainmaker.org/chainmaker.yml
    # 2. 修改net模块,把 listen_addr: /ip4/0.0.0.0/tcp/11301 修改为 listen_addr: /ip4/0.0.0.0/tcp/11305"
    old_config="/ip4/0.0.0.0/tcp/11301"
    new_config="/ip4/0.0.0.0/tcp/11305"
    sed -i "s%${old_config}\+%${new_config}%g" config/wx-org5.chainmaker.org/chainmaker.yml
    sed -i 's/12301/12305/g' config/wx-org5.chainmaker.org/chainmaker.yml
    sed -i 's/14321/14325/g' config/wx-org5.chainmaker.org/chainmaker.yml
    sed -i 's/24321/24325/g' config/wx-org5.chainmaker.org/chainmaker.yml
    # 3. 如果是新增同步节点,将consensus证书改成common证书,如果新增的是共识节点,这一步略过。
    # sed -i 's/consensus1/common1/g' config/wx-org5.chainmaker.org/chainmaker.yml
    echo "----------------修改org5的bc1.yml----------------"
    # 4. 修改chainmaker-*-wx-org5.chainmaker.org/config/wx-org5.chainmaker.org/chainconfig/bc1.yml中的trust_roots模块
    # 把所有 ../config/wx-org1.chainmaker.org 修改为 ../config/wx-org5.chainmaker.org
    sed -i "s/wx-org1.chainmaker.org\/certs\/ca/wx-org5.chainmaker.org\/certs\/ca/g" config/wx-org5.chainmaker.org/chainconfig/bc1.yml
    }
    
  • 如果使用cmc命令行需要更新相应的证书文件

    update_cmc_cert(){
    crypto_cert=${cryptogen_path}/bin/crypto-config
    cmc_cert=${chainmaker_path}/tools/cmc/testdata/
    ls $crypto_cert
    ls $cmc_cert
    cp -rf $crypto_cert $cmc_cert
    }
    
  • 调用以上方法完成节点目录的生成

    gen_new_cert
    copy_node_file
    update_cert
    update_config
    update_cmc_cert
    

17.1.2. 添加组织根证书

如果新的节点证书是基于新的组织根证书(例如org5的ca证书)签发的,则需要添加组织根证书。

如果新的节点证书是基于旧的组织根证书(例如org1的ca证书)签发的,则不需要这一步。 使用cmc添加组织根证书

./cmc client chainconfig trustroot add \
--sdk-conf-path=./testdata/sdk_config.yml \
--org-id=wx-org1.chainmaker.org \
--user-tlscrt-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
--user-tlskey-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
--user-signcrt-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt \
--user-signkey-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key \
--trust-root-org-id=wx-org5.chainmaker.org \
--sync-result=true \
--trust-root-path=./testdata/crypto-config/wx-org5.chainmaker.org/ca/ca.crt

17.1.3. 启动节点

添加trustroot之后,节点就可以做为同步节点加入网络,启动节点使区块同步到最新高度,就可以使用后续的操作步骤加入共识:

chainmaker-go/build/release/chainmaker-v2.2.1-wx-org5.chainmaker.org/bin]# ./start.sh

17.1.4. 添加共识org:

使用cmc添加共识节点 (为新加入的组织添加共识节点) 添加共识org的作用:

  1. 添加参与共识的组织( 即将org5添加到共识组织列表中)

  2. 添加org5组织下的节点nodeid

如果是添加了新的组织org5,要将组织以及组织下的节点(org5_node1) 添加到共识当中,则需要执行这一步

如果是在原有组织or1-org4的基础上,扩展新的共识节点(例如org1原来有1个共识节点org1_node1,需要加入org1_node2也做为共识节点,则不需要这一步,直接执行下面步骤。

./cmc client chainconfig consensusnodeorg add \
--sdk-conf-path=./testdata/sdk_config.yml \
--org-id=wx-org1.chainmaker.org \
--user-tlscrt-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
--user-tlskey-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
--user-signcrt-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt \
--user-signkey-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key \
--node-ids=QmaGii9BS7tWpkXTb9Z5Bbvw43bjt1Jnc4C2U68NnAm28b \
--sync-result=true \
--node-org-id=wx-org5.chainmaker.org

添加成功后,可查看log/system.log如下关键信息

cat system.log |grep "validator.go"
cat system.log |grep "new validator set"

17.1.5. 添加共识节点ID

为已经加入共识的组织,例如or1-org4, 以及执行过和3步的组织,添加更多的共识节点

./cmc client chainconfig consensusnodeid add \
--sdk-conf-path=./testdata/sdk_config.yml \
--org-id=wx-org1.chainmaker.org \
--user-tlscrt-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
--user-tlskey-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
--user-signcrt-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt \
--user-signkey-file-path=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key \
--node-id=QmaGii9BS7tWpkXTb9Z5Bbvw43bjt1Jnc4C2U68NnAm28b \
--sync-result=true \
--node-org-id=wx-org5.chainmaker.org

添加成功后,可查看log/system.log如下关键信息

cat system.log*|grep "addedValidators"

17.2. 使用docker部署chainmaker并连接docker-vm

“长安链·ChainMaker”支持Docker-go合约开发,Docker-go合约运行在独立Docker VM容器中,本文将介绍长安链使用docker方式部署时,与Docker-vm通信的几种部署方式。

17.2.1. 使用docker方式部署ChainMaker:

cd chainmaker-go
# 清空旧的构建数据
rm -rf build
make docker-build
docker images

17.2.2. 准备链需要的配置文件

参考 在工作目录下 使用脚本搭建,使用脚本生成docker需要的节点配置文件

cd chainmaker-go/scripts
./prepare_pk.sh 4 1
./build_release.sh
./cluster_quick_start.sh
./cluster_quick_stop.sh

17.2.3. 复制配置文件到chainmaker docker能读取的位置

docker启动时,默认加载如下路径的配置:chainmaker-go/scripts/docker/config/four-nodes

cd chainmaker-go/scripts/docker/config/four-nodes
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org1.chainmaker.org/config/wx-org1.chainmaker.org ./
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org2.chainmaker.org/config/wx-org2.chainmaker.org ./
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org3.chainmaker.org/config/wx-org3.chainmaker.org ./
cp -r ../../../../build/release/chainmaker-v2.2.1-wx-org4.chainmaker.org/config/wx-org4.chainmaker.org ./

17.2.4. 修改节点ip地址:

  • 场景一:一台host启动4个chainmaker docker node 需要将配置文件中的ip换成docker容器的ip

    • 分别打开四个节点的chainmaker文件:

    # 查看容器ip ipv4_address: 
    chainmaker-go/scripts/docker] vim four-nodes.docker-compose.yml
    # 修改chainmaker.yml的配置
    chainmaker-go/scripts/docker/config/four-nodes/wx-org1.chainmaker.org] vim chainmaker.yml
    
    • 找到如chainmaker.yml的如下位置

    seeds:
      - "/ip4/127.0.0.1/tcp/11301/p2p/XXX"
      - "/ip4/127.0.0.1/tcp/11302/p2p/XXX"
      - "/ip4/127.0.0.1/tcp/11303/p2p/XXX"
      - "/ip4/127.0.0.1/tcp/11304/p2p/XXX"
    
    • 两种修改方式任选其一

    第一种:使用four-nodes.docker-compose.yml中配置的容器ip

    seeds:
        - "/ip4/172.48.1.11/tcp/11301/p2p/XXX"
        - "/ip4/172.48.1.12/tcp/11302/p2p/XXX"
        - "/ip4/172.48.1.13/tcp/11303/p2p/XXX"
        - "/ip4/172.48.1.14/tcp/11304/p2p/XXX"
    

    第二种:使用four-nodes.docker-compose.yml中配置的容器名

    seeds:
        - "/dns/cm-node1/tcp/11301/p2p/XXX"
        - "/dns/cm-node2/tcp/11302/p2p/XXX"
        - "/dns/cm-node3/tcp/11303/p2p/XXX"
        - "/dns/cm-node4/tcp/11304/p2p/XXX"
    
  • 场景二:四台host启动4个chainmaker docker node

    参考如上修改方式,ip修改为四台host的ip

17.2.5. 修改docker-vm相关配置

“长安链·ChainMaker”V2.2.1之后,在节点配置文件chainmaker.yml中关于docker的两种连接方式对应的配置为:

第一种:本地的socket文件

uds_open: true

第二种:tcp , 当chainmaker使用docker方式部署时,推荐使用这种配置

uds_open: false
  • 场景一:chainmaker以【docker】方式部署,docker-vm与chainmaker-vm部署在【不同的】host :

    假设:A(192.168.0.9)机器上启动了chainmaker 的docker容器, B(192.168.0.78)机器上启动了对应的docker-vm

      uds_open: false
      docker_vm_host: 192.168.0.78
      docker_vm_port: 22351
    
  • 场景二:chainmaker以【docker】方式部署,docker-vm与chainmaker-vm部署在【同一台】host:

    假设:A机器上启动了chainmaker的docker容器,同时启动对应的docker-vm 由于docker-vm和chainmaker在同一台host下,需要保证两个docker环境在使用同一个网桥的情况下ip在同一网段,即处在同一局域网内,例如使用如下命令启动docker-vm

    docker run -d -p22351:22359 --network docker_localnet --ip 172.48.1.21 --privileged chainmakerofficial/chainmaker-vm-docker-go:v2.2.1
    

    配置文件修改时,注意端口号为-p22351:22359中的后者, 并且ip 为上面指定的ip

    uds_open: false
      docker_vm_host: 172.48.1.21
      docker_vm_port: 22359
    
  • 场景三:chainmaker以【进程方式】部署,docker-vm与chainmaker部署在【不同的】host:

    uds_open: false
      docker_vm_host: 192.168.0.78
      docker_vm_port: 22351
    
  • 场景四:chainmaker以进程方式部署, ocker-vm与chainmaker部署在【同一台】host:

    uds_open: false
      docker_vm_host: 127.0.0.1
      docker_vm_port: 22351