部署区块链¶
- 本章节会通过一个示例说明如何使用物料包工具, 也会介绍使用物料包构建好的环境中比较重要的一些目录
- 如果你希望快速搭建fisco bcos测试环境,请转至部署区块链sample
下载物料包¶
$ git clone https://github.com/FISCO-BCOS/fisco-package-build-tool.git
目录结构以及主要配置文件作用:
fisco-package-build-tool
├── Changelog.md 更新记录
├── config.ini 配置文件
├── ext 拓展目录
├── generate_installation_packages.sh 启动shell文件
├── installation_dependencies 依赖目录
├── LICENSE license文件
├── README.md 使用手册
└── release_note.txt 版本号
使用¶
bash generate_installation_packages.sh -h
Usage:
Optional:
-p <path> The fisco-bcos path.
-d Download the specified fisco-bcos version from github.
-c Clone and build fisco-bcos if /usr/local/bin/fisco-bcos is not exist or not the specified version.
-b Build opration, working with -d,-p,-c
-e Expand operation, working with -d,-p,-c
build Build operation.
expand Expand operation.
-v Version info.
-h Help.
Example:
bash generate_installation_packages.sh build
bash generate_installation_packages.sh expand
bash generate_installation_packages.sh -b -p ../../fisco-bcos
bash generate_installation_packages.sh -b -d
bash generate_installation_packages.sh -b -c
bash generate_installation_packages.sh -e -p ../../fisco-bcos
bash generate_installation_packages.sh -e -d
bash generate_installation_packages.sh -e -c
- 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 : 帮助信息
配置¶
$ cd fisco-package-build-tool
$ vim config.ini
配置文件config.ini
[common]
; 物料包拉取FISCO-BCOS源码的github地址.
github_url=https://github.com/FISCO-BCOS/FISCO-BCOS.git
; 物料包拉取FISCO-BCOS源码之后, 会将源码保存在本地的目录, 保存的目录名称为FISCO-BCOS.
fisco_bcos_src_local=../
; 需要使用FISCO-BCOS的版本号, 使用物料包时需要将该值改为需要使用的版本号.
; 版本号可以是FISCO-BCOS已经发布的版本之一, 链接: https://github.com/FISCO-BCOS/FISCO-BCOS/releases
fisco_bcos_version=v1.3.8
; 节点信息
[nodes]
; 格式为 : nodeIDX=p2p_ip listen_ip num agent
; IDX为索引, 从0开始增加.
; p2p_ip => 服务器上用于p2p通信的网段的ip.
; listen_ip => 服务器上的监听端口, 用来接收rpc、channel的链接请求, 建议默认值为"0.0.0.0".
; num => 在服务器上需要启动的节点的数目.
; agent => 机构名称, 若是不关心机构信息, 值可以随意, 但是不可以为空.
node0=127.0.0.1 0.0.0.0 4 agent
;端口配置, 一般不用做修改, 使用默认值即可.
[ports]
; p2p端口
p2p_port=30303
; rpc端口
rpc_port=8545
; channel端口
channel_port=8821
; 扩容使用的一些参数
[expand]
genesis_follow_dir=/follow/
[docker]
; 当前是否构建docker节点的安装包. 0: 否 1:是
docker_toggle=0
; docker仓库地址.
docker_repository=fiscoorg/fisco-octo
; docker版本号.
docker_version=v1.3.x-latest
; 生成web3sdk证书时使用的keystore与clientcert的密码.
; 也是生成的web3sdk配置文件applicationContext.xml中keystorePassWord与clientCertPassWord的值.
[web3sdk]
keystore_pwd=123456
clientcert_pwd=123456
[other]
; CA拓展, 目前不需要关心
ca_ext=0
配置详解¶
- [common] section
[common]
; 物料包拉取FISCO-BCOS源码的github地址.
github_url=https://github.com/FISCO-BCOS/FISCO-BCOS.git
; 物料包拉取FISCO-BCOS源码之后, 会将源码保存在本地的目录, 保存的目录名称为FISCO-BCOS.
fisco_bcos_src_local=../
; 需要使用FISCO-BCOS的版本号, 使用物料包时需要将该值改为需要使用的版本号.
; 版本号可以是FISCO-BCOS已经发布的版本之一, 链接: https://github.com/FISCO-BCOS/FISCO-BCOS/releases
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
需要部署FISCO BCOS服务器上的节点配置信息。
[nodes]
; 格式为 : nodeIDX=p2p_ip listen_ip num agent
; IDX为索引, 从0开始增加.
; p2p_ip => 服务器上用于p2p通信的网段的ip.
; listen_ip => 服务器上的监听端口, 用来接收rpc、channel的链接请求, 建议默认值为"0.0.0.0".
; num => 在服务器上需要启动的节点的数目.
; agent => 机构名称, 若是不关心机构信息, 值可以随意, 但是不可以为空.
node0=127.0.0.1 0.0.0.0 4 agent
- [ports] section
;端口配置, 一般不用做修改, 使用默认值即可.
[ports]
; p2p端口
p2p_port=30303
; rpc端口
rpc_port=8545
; channel端口
channel_port=8821
fisco-bcos的每个节点需要使用3个端口,p2pport、rpcport、channelport, [ports]配置的端口是服务器上面的第一个节点使用的端口,其他节点依次递增
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
下面以在三台服务器上部署区块链为例构建一条新链:
服务器ip : 192.168.1.42 192.168.1.43 192.168.1.44
机构分别为: agent_0 agent_1 agent_2
节点数目 : 每台服务器搭建两个节点
修改[nodes] section字段为:
[nodes]
node0=192.168.1.42 0.0.0.0 2 agent_0
node1=192.168.1.43 0.0.0.0 2 agent_1
node2=192.168.1.44 0.0.0.0 2 agent_2
创建安装包¶
$ ./generate_installation_packages.sh build
执行成功之后会生成build目录, 目录下有生成的对应服务器的安装包:
build/
├── 192.168.1.42_agent_0_genesis //192.168.1.42服务器的安装包
├── 192.168.1.43_agent_1 //192.168.1.43服务器的安装包
├── 192.168.1.44_agent_2 //192.168.1.44服务器的安装包
├── stderr.log //标准错误的重定向文件
└── temp //temp节点安装目录, 用户不用关心不用关心
- 其中带有genesis字样的为创世节点所在服务器的安装包。
上传¶
- 将安装包上传到对应的服务器, 注意上传的安装包必须与服务器相对应, 否则部署过程会出错。
- 一定要确认各个服务器之间的网络可连通, p2p网段的端口网络策略已经放开。
安装¶
进入安装目录, 执行
$ ./install_node.sh
正确执行在当前目录会多一个build目录, 目录结构如下:
build
├── check.sh #检查脚本, 可以检查节点是否启动
├── fisco-bcos #fisco-bcos二进制程序
├── node0 #节点0的目录
├── node1 #节点1的目录
├── nodejs #nodejs相关安装目录
├── node_manager.sh #节点管理脚本
├── node.sh #nodejs相关环境变量
├── register.sh #注册节点入网脚本, 扩容使用
├── start.sh #启动脚本
├── stop.sh #停止脚本
├── systemcontract #nodejs系统合约工具
├── tool #nodejs工具
├── unregister.sh #从节点管理合约删除某个节点
├── web3lib #nodejs基础库
└── web3sdk #web3sdk环境
说明:
- nodeIDX
节点IDX的目录, 示例中每台服务器启动两个节点, 所以有node0, node1两个目录
nodeIDX的目录结构如下:
build/node0/
├── check.sh #检查当前节点是否启动
├── config.json #配置文件
├── data #数据目录
├── genesis.json #创世块文件
├── keystore
├── log #log日志目录
├── log.conf #log配置文件
├── start.sh #启动当前节点
└── stop.sh #停止当前节点
- node.sh
记录nodejs相关依赖的环境变量
- start.sh
节点启动脚本, 使用方式:
./start.sh 启动所有的节点
或者
./start.sh IDX 启动指定的节点, IDX为节点的索引, 从0开始, 比如: start.sh 0表示启动第0个节点
- stop.sh 节点停止脚本, 使用方式:
./stop.sh 停止所有的节点
或者
./stop.sh IDX 停止指定的节点, IDX为节点的索引, 从0开始, 比如: stop.sh 0表示停止第0个节点
- register.sh 注册指定节点信息到节点管理合约, 扩容时使用
./register.sh IDX
- unregister.sh 将指定节点从节点管理合约中删除
./unregister.sh IDX
- node_manager.sh 查看当前节点管理合约中的节点信息
./node_manager.sh all
启动节点¶
在build目录执行start.sh脚本.
注意:要先启动创世块节点所在的服务器上的节点!!!
$ ./start.sh
start all node ...
start node0 ...
start node1 ...
check all node status ...
node is running.
node is running.
验证¶
- 一定要所有服务器上的节点正常启动之后.
日志¶
tail -f node0/log/log_*.log | egrep "Generating seal"
INFO|2018-08-03 14:16:42:588|+++++++++++++++++++++++++++ Generating seal on8e5add00c337398ac5e9058432037aa646c20fb0d1d0fb7ddb4c6092c9d654fe#1tx:0,maxtx:1000,tq.num=0time:1522736202588
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, 将显示的内容执行一遍
$ cat node.sh
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;
$ 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目录:
$ cd tool
$ babel-node deploy.js HelloWorld
RPC=http://127.0.0.1:8546
Ouputpath=./output/
deploy.js ........................Start........................
Soc File :HelloWorld
HelloWorldcomplie success!
send transaction success: 0xfb6237b0dab940e697e0d3a4d25dcbfd68a8e164e0897651fe4da6a83d180ccd
HelloWorldcontract address 0x61dba250334e0fd5804c71e7cbe79eabecef8abe
HelloWorld deploy success!
cns add operation => cns_name = HelloWorld
cns_name =>HelloWorld
contract =>HelloWorld
version =>
address =>0x61dba250334e0fd5804c71e7cbe79eabecef8abe
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"}]
send transaction success: 0x769e4ea7742b451e33cbb0d2a7d3126af8f277a52137624b3d4ae41681d58687
合约部署成功。
问题排查¶
参考附录FAQ。