部署区块链

  • 本章节会通过一个示例说明如何使用物料包工具, 也会介绍使用物料包构建好的环境中比较重要的一些目录
  • 如果你希望快速搭建fisco bcos测试环境,请转至部署区块链sample

下载物料包

  1. $ git clone https://github.com/FISCO-BCOS/fisco-package-build-tool.git

目录结构以及主要配置文件作用:

  1. fisco-package-build-tool
  2. ├── Changelog.md 更新记录
  3. ├── config.ini 配置文件
  4. ├── ext 拓展目录
  5. ├── generate_installation_packages.sh 启动shell文件
  6. ├── installation_dependencies 依赖目录
  7. ├── LICENSE license文件
  8. ├── README.md 使用手册
  9. └── release_note.txt 版本号

使用

  1. bash generate_installation_packages.sh -h
  2. Usage:
  3. Optional:
  4. -p <path> The fisco-bcos path.
  5. -d Download the specified fisco-bcos version from github.
  6. -c Clone and build fisco-bcos if /usr/local/bin/fisco-bcos is not exist or not the specified version.
  7. -b Build opration, working with -d,-p,-c
  8. -e Expand operation, working with -d,-p,-c
  9. build Build operation.
  10. expand Expand operation.
  11. -v Version info.
  12. -h Help.
  13. Example:
  14. bash generate_installation_packages.sh build
  15. bash generate_installation_packages.sh expand
  16. bash generate_installation_packages.sh -b -p ../../fisco-bcos
  17. bash generate_installation_packages.sh -b -d
  18. bash generate_installation_packages.sh -b -c
  19. bash generate_installation_packages.sh -e -p ../../fisco-bcos
  20. bash generate_installation_packages.sh -e -d
  21. bash generate_installation_packages.sh -e -c
  22.  
  • build : 根据config.ini配置文件, 创建一条新的区块链链的安装包
  • expand : 根据config.ini配置文件, 创建已经存在的区块链的扩容的安装包
  • -b : 根据config.ini配置文件, 创建一条新的区块链链的安装包, 可以与-p,-c,-d参数配合使用
  • -e : 根据config.ini配置文件, 创建已经存在的区块链的扩容的安装包, 可以与-p,-c,-d参数配合使用
  • -p : 指定使用fisco-bcos的路径,适用于用户需要使用自己编译的fisco-bcos的情况
  • -d : 从github下载对应版本的fisco-bcos
  • -c : 下载FISCO-BCOS源码,编译对应版本fisco-bcos
  • -v : 显示物料包版本号
  • -h : 帮助信息

配置

  1. $ cd fisco-package-build-tool
  2. $ vim config.ini

配置文件config.ini

  1. [common]
  2. ; 物料包拉取FISCO-BCOS源码的github地址.
  3. github_url=https://github.com/FISCO-BCOS/FISCO-BCOS.git
  4. ; 物料包拉取FISCO-BCOS源码之后, 会将源码保存在本地的目录, 保存的目录名称为FISCO-BCOS.
  5. fisco_bcos_src_local=../
  6. ; 需要使用FISCO-BCOS的版本号, 使用物料包时需要将该值改为需要使用的版本号.
  7. ; 版本号可以是FISCO-BCOS已经发布的版本之一, 链接: https://github.com/FISCO-BCOS/FISCO-BCOS/releases
  8. fisco_bcos_version=v1.3.8
  9.  
  10. ; 节点信息
  11. [nodes]
  12. ; 格式为 : nodeIDX=p2p_ip listen_ip num agent
  13. ; IDX为索引, 0开始增加.
  14. ; p2p_ip => 服务器上用于p2p通信的网段的ip.
  15. ; listen_ip => 服务器上的监听端口, 用来接收rpcchannel的链接请求, 建议默认值为"0.0.0.0".
  16. ; num => 在服务器上需要启动的节点的数目.
  17. ; agent => 机构名称, 若是不关心机构信息, 值可以随意, 但是不可以为空.
  18. node0=127.0.0.1 0.0.0.0 4 agent
  19.  
  20. ;端口配置, 一般不用做修改, 使用默认值即可.
  21. [ports]
  22. ; p2p端口
  23. p2p_port=30303
  24. ; rpc端口
  25. rpc_port=8545
  26. ; channel端口
  27. channel_port=8821
  28.  
  29. ; 扩容使用的一些参数
  30. [expand]
  31. genesis_follow_dir=/follow/
  32.  
  33. [docker]
  34. ; 当前是否构建docker节点的安装包. 0: 1:是
  35. docker_toggle=0
  36. ; docker仓库地址.
  37. docker_repository=fiscoorg/fisco-octo
  38. ; docker版本号.
  39. docker_version=v1.3.x-latest
  40.  
  41. ; 生成web3sdk证书时使用的keystoreclientcert的密码.
  42. ; 也是生成的web3sdk配置文件applicationContext.xmlkeystorePassWordclientCertPassWord的值.
  43. [web3sdk]
  44. keystore_pwd=123456
  45. clientcert_pwd=123456
  46.  
  47. [other]
  48. ; CA拓展, 目前不需要关心
  49. ca_ext=0

配置详解

  • [common] section
  1. [common]
  2. ; 物料包拉取FISCO-BCOS源码的github地址.
  3. github_url=https://github.com/FISCO-BCOS/FISCO-BCOS.git
  4. ; 物料包拉取FISCO-BCOS源码之后, 会将源码保存在本地的目录, 保存的目录名称为FISCO-BCOS.
  5. fisco_bcos_src_local=../
  6. ; 需要使用FISCO-BCOS的版本号, 使用物料包时需要将该值改为需要使用的版本号.
  7. ; 版本号可以是FISCO-BCOS已经发布的版本之一, 链接: https://github.com/FISCO-BCOS/FISCO-BCOS/releases
  8. fisco_bcos_version=v1.3.8
  • 物料包在构建安装包过程中(非扩容流程), 会启动一个默认的临时temp节点用来进行系统合约的部署, 将所有的节点注册到节点管理合约, 然后导出系统合约信息生成genesis.json文件。
  • 在扩容流程中, 需要手动将扩容节点注册到节点管理合约, 参考后面的扩容流程。
  • 每个节点启动时需要占用三个端口: p2p、rpc、channel. 对于启动的临时节点temp节点, 使用就是配置的nodes section中的p2p_port、rpc_port、channel_port配置端口, 要确认端口没有被占用。
  • 对于FISCO BCOS节点, 每台服务器上第一个节点使用nodes section配置的p2p_port、rpc_port、channel_port端口, 后续的节点端口依次进行端口递增。
  • 工具构建安装包过程中会涉及到从github上面拉取FISCO BCOS、编译FISCO BCOS流程, 规则:a、检查/usr/local/bin是否已经存在已经编译的fisco-bcos。

b、若存在则查看fisco-bcos的版本号与配置fisco_bcos_version字段的版本号是否一致, 一致则说明fisco-bcos是需要的版本, 该流程退出。

c、判断配置文件中fisco_bcos_src_local配置的路径是否存在名为FISCO-BCOS的文件夹, 存在说明FISCO-BCOS源码已经存在, 否则开始从github上面拉取FISCO BCOS源码, 接下来进入FISCO-BCOS目录切换tag到自己需要的分支, 然后进行编译、安装流程, 成功则fisco-bcos会安装在/usr/local/bin目录下。

  • [docker] section与docker节点搭链相关的配置, 参考FISCO BCOS docker

  • [web3sdk] section与私钥跟证书文件的加解密相关。生成web3sdk证书时使用的keystore与clientcert的密码, 也是生成的web3sdk配置文件applicationContext.xml中keystorePassWord与clientCertPassWord的值, 建议用户修改这两个值

  • [expand] section扩容操作, 使用参考 ( 扩容流程 )

  • [nodes] section

  1. 需要部署FISCO BCOS服务器上的节点配置信息。
  2. [nodes]
  3. ; 格式为 : nodeIDX=p2p_ip listen_ip num agent
  4. ; IDX为索引, 0开始增加.
  5. ; p2p_ip => 服务器上用于p2p通信的网段的ip.
  6. ; listen_ip => 服务器上的监听端口, 用来接收rpcchannel的链接请求, 建议默认值为"0.0.0.0".
  7. ; num => 在服务器上需要启动的节点的数目.
  8. ; agent => 机构名称, 若是不关心机构信息, 值可以随意, 但是不可以为空.
  9. node0=127.0.0.1 0.0.0.0 4 agent
  • [ports] section
  1. ;端口配置, 一般不用做修改, 使用默认值即可.
  2. [ports]
  3. ; p2p端口
  4. p2p_port=30303
  5. ; rpc端口
  6. rpc_port=8545
  7. ; channel端口
  8. channel_port=8821

fisco-bcos的每个节点需要使用3个端口,p2pport、rpcport、channelport, [ports]配置的端口是服务器上面的第一个节点使用的端口,其他节点依次递增

  1. node0=127.0.0.1 0.0.0.0 4 agent

上面的配置说明要启动四个节点, 按照默认的配置:

  • 第1个节点的端口:p2p 30303、rpc 8545、channel 8821
  • 第2个节点的端口:p2p 30304、rpc 8546、channel 8822
  • 第3个节点的端口:p2p 30305、rpc 8547、channel 8823
  • 第4个节点的端口:p2p 30306、rpc 8548、channel 8824下面以在三台服务器上部署区块链为例构建一条新链:
  1. 服务器ip 172.20.245.42 172.20.245.43 172.20.245.44
  2. 机构分别为: agent_0 agent_1 agent_2
  3. 节点数目 每台服务器搭建两个节点

修改[nodes] section字段为:

  1. [nodes]
  2. node0=172.20.245.42 0.0.0.0 2 agent_0
  3. node1=172.20.245.43 0.0.0.0 2 agent_1
  4. node2=172.20.245.44 0.0.0.0 2 agent_2

创建安装包

  1. $ ./generate_installation_packages.sh build

执行成功之后会生成build目录, 目录下有生成的对应服务器的安装包:

  1. build/
  2. ├── 172.20.245.42_agent_0_genesis //172.20.245.42服务器的安装包
  3. ├── 172.20.245.43_agent_1 //172.20.245.43服务器的安装包
  4. ├── 172.20.245.44_agent_2 //172.20.245.44服务器的安装包
  5. ├── stderr.log //标准错误的重定向文件
  6. └── temp //temp节点安装目录, 用户不用关心不用关心
  • 其中带有genesis字样的为创世节点所在服务器的安装包。

上传

  • 将安装包上传到对应的服务器, 注意上传的安装包必须与服务器相对应, 否则部署过程会出错。
  • 一定要确认各个服务器之间的网络可连通, p2p网段的端口网络策略已经放开。

安装

进入安装目录, 执行

  1. $ ./install_node.sh

正确执行在当前目录会多一个build目录, 目录结构如下:

  1. build
  2. ├── check.sh #检查脚本, 可以检查节点是否启动
  3. ├── fisco-bcos #fisco-bcos二进制程序
  4. ├── node0 #节点0的目录
  5. ├── node1 #节点1的目录
  6. ├── nodejs #nodejs相关安装目录
  7. ├── node_manager.sh #节点管理脚本
  8. ├── node.sh #nodejs相关环境变量
  9. ├── register.sh #注册节点入网脚本, 扩容使用
  10. ├── start.sh #启动脚本
  11. ├── stop.sh #停止脚本
  12. ├── systemcontract #nodejs系统合约工具
  13. ├── tool #nodejs工具
  14. ├── unregister.sh #从节点管理合约删除某个节点
  15. ├── web3lib #nodejs基础库
  16. └── web3sdk #web3sdk环境

说明:

  • nodeIDX节点IDX的目录, 示例中每台服务器启动两个节点, 所以有node0, node1两个目录

nodeIDX的目录结构如下:

  1. build/node0/
  2. ├── check.sh #检查当前节点是否启动
  3. ├── config.json #配置文件
  4. ├── data #数据目录
  5. ├── genesis.json #创世块文件
  6. ├── keystore
  7. ├── log #log日志目录
  8. ├── log.conf #log配置文件
  9. ├── start.sh #启动当前节点
  10. └── stop.sh #停止当前节点
  • node.sh记录nodejs相关依赖的环境变量

  • start.sh节点启动脚本, 使用方式:

  1. ./start.sh 启动所有的节点
  2. 或者
  3. ./start.sh IDX 启动指定的节点, IDX为节点的索引, 0开始, 比如: start.sh 0表示启动第0个节点
  • stop.sh节点停止脚本, 使用方式:
  1. ./stop.sh 停止所有的节点
  2. 或者
  3. ./stop.sh IDX 停止指定的节点, IDX为节点的索引, 0开始, 比如: stop.sh 0表示停止第0个节点
  • register.sh注册指定节点信息到节点管理合约, 扩容时使用
  1. ./register.sh IDX
  • unregister.sh将指定节点从节点管理合约中删除
  1. ./unregister.sh IDX
  • node_manager.sh查看当前节点管理合约中的节点信息
  1. ./node_manager.sh all

[web3sdk使用说明链接]

[web3lib、systemcontract、tool目录作用参考用户手册]

启动节点

在build目录执行start.sh脚本.注意:要先启动创世块节点所在的服务器上的节点!!!

  1. $ ./start.sh
  2. start all node ...
  3. start node0 ...
  4. start node1 ...
  5. check all node status ...
  6. node is running.
  7. node is running.

验证

  • 一定要所有服务器上的节点正常启动之后.

日志

  1. tail -f node0/log/log_*.log | egrep "Generating seal"
  2. INFO|2018-08-03 14:16:42:588|+++++++++++++++++++++++++++ Generating seal on8e5add00c337398ac5e9058432037aa646c20fb0d1d0fb7ddb4c6092c9d654fe#1tx:0,maxtx:1000,tq.num=0time:1522736202588
  3. INFO|2018-08-03 14:16:43:595|+++++++++++++++++++++++++++ Generating seal ona98781aaa737b483c0eb24e845d7f352a943b9a5de77491c0cb6fd212c2fa7a4#1tx:0,maxtx:1000,tq.num=0time:1522736203595

可看到周期性的出现上面的日志,表示节点间在周期性的进行共识,整个链正常。

部署合约

每个服务器执行install_node时, 都会在安装目录下安装nodejs、babel-node、ethconsole, 其环境变量会写入当前安装用户的.bashrc文件,使用这些工具之前需要使环境变量生效,有两种使环境变量生效的方式,选择其中一种即可:

  • 方式1:退出当前登录, 重新登录一次
  • 方式2:执行node.sh脚本中的内容, 首先cat node.sh, 将显示的内容执行一遍
  1. $ cat node.sh
  2. export NODE_HOME=/root/octo/fisco-bcos/build/nodejs* export PATH=$PATH:$NODE_HOME/bin* export NODE_PATH=$NODE_HOME/lib/node_modules:$NODE_HOME/lib/node_modules/ethereum-console/node_modules;
  3. $ export NODE_HOME=/root/octo/fisco-bcos/build/nodejs* export PATH=$PATH:$NODE_HOME/bin* export NODE_PATH=$NODE_HOME/lib/node_modules:$NODE_HOME/lib/node_modules/ethereum-console/node_modules;

部署合约验证, 进入tool目录:

  1. $ cd tool
  2. $ babel-node deploy.js HelloWorld
  3. RPC=http://127.0.0.1:8546
  4. Ouputpath=./output/
  5. deploy.js ........................Start........................
  6. Soc File :HelloWorld
  7. HelloWorldcomplie success
  8. send transaction success: 0xfb6237b0dab940e697e0d3a4d25dcbfd68a8e164e0897651fe4da6a83d180ccd
  9. HelloWorldcontract address 0x61dba250334e0fd5804c71e7cbe79eabecef8abe
  10. HelloWorld deploy success!
  11. cns add operation => cns_name = HelloWorld
  12. cns_name =>HelloWorld
  13. contract =>HelloWorld
  14. version =>
  15. address =>0x61dba250334e0fd5804c71e7cbe79eabecef8abe
  16. abi =>[{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]
  17. send transaction success: 0x769e4ea7742b451e33cbb0d2a7d3126af8f277a52137624b3d4ae41681d58687

合约部署成功。

问题排查

参考附录FAQ。