FISCO BCOS 多服务器分布式部署

最近在搭建FISCO BCOS 多服务器平台上花了些许时间,写篇博客记录一下,方便项目里的其他小伙伴借鉴。官方文档上是在一台服务器上模拟多服务器进行搭建的,要在实际生成环境中进行部署,有些许不同。接下来我将在两台服务器上进行搭建。以下部分内容摘自官方文档,不再赘述:

FISCO BCOS官方文档:使用企业级部署工具

下载安装

下载

cd ~/ && git clone https://github.com/FISCO-BCOS/generator.git

安装

cd ~/generator && bash ./scripts/install.sh

获取二进制节点

拉取最新fisco-bcos二进制文件到meta中

./generator --download_fisco ./meta

错误解决

这一步有可能出现两个问题,一个是网络错误,如下面这样

这个问题是因为github由于众所周知的原因,网络不是很稳定,所以下载失败,但是其实应该也不至于这么稳定,总之可以在后面加上--cdn指令,从国内的镜像进行下载。

还有一个问题则是由--cdn导致的,从cdn下载的压缩文件似乎损坏了,导致解压会出问题,如下图:

解决这个问题的办法是用直接浏览器在github下载二进制文件,也可以直接在服务器使用wget下载,地址如下:

https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.4.0/fisco-bcos.tar.gz

然后使用winrar等解压软件,或直接在linux使用如下命令进行解压:

tar -xzvf fisco-bcos.tar.gz

然后会得到一个fisco-bcos文件,移动到generator目录下,并赋予运行权限:

chmod +x fisco-bcos

即可跳过./generator --download_fisco ./meta这一步

检查二进制版本

./meta/fisco-bcos -v

若看到版本号信息则说明二进制文件已经生效可用

初始化链证书

这里我就直接用机构A来初始化证书了,首先进入到generator目录下

cd ~/generator

执行命令:

./generator --generate_chain_certificate ./dir_chain_ca

不出问题的话,在dir_chain_ca目录下应该出现了证书文件:

root@blockchain-1:~/plumk/generator# ls dir_chain_ca/
ca.crt  ca.key

ca.crt为链证书,ca.key为链私钥

机构A、B构建群组1

初始化机构A

教程中为了简化操作直接生成了机构证书和私钥,实际应用时应该由机构本地生成私钥agency.key,再生成证书请求文件,向证书签发机构获取机构证书agency.crt。 ————官方文档如是说到

由于我直接在机构A生成证书了,那就直接在机构A的generator目录下进行操作

生成机构A的证书:

./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyA

执行完命令后机构A证书应该就生成到dir_agency_ca/agencyA/目录下了,我们查看一下:

root@blockchain-1:~/plumk/generator# ls dir_agency_ca/agencyA/
agency.crt  agency.key  ca.crt

然后将这些文件移动到机构A的meta目录下,这里我就直接移动到本机目录下

 cp ./dir_agency_ca/agencyA/* ./meta/

初始化机构B

同样的操作,生成证书,并移动到机构B目录下,我这里直接用scp传送过去了

./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyB
scp ./dir_agency_ca/agencyB/* root@10.13.1.12:~/generator/meta/

一条联盟链中只能用到一个根证书ca.crt,多服务器部署时不要生成多个根证书和私钥。一个群组只能有一个群组创世区块group.x.genesis ———— 官方文档如是提醒

机构A修改配置文件

编辑机构A下generator/conf/node_deployment.ini文件:

这里并不全是填一样的ip,一般来讲P2P填的是外网ip,而RPC填的是内网ip,这里由于分配到的服务器只有内网ip,我就全填内网了,也只有内网的机子能访问,实际开发过程中RPC切记不能填外网ip,关于配置文件中的3个接口的详细资料,具体可看这篇文章

[group]
group_id=1

[node0]
; Host IP for the communication among peers.
; Please use your ssh login IP.
p2p_ip=[机构A ip]
; Listening IP for the communication between SDK clients.
; This IP is the same as p2p_ip for the physical host.
; But for virtual host e.g., VPS servers, it is usually different from p2p_ip.
; You can check accessible addresses of your network card.
; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
; for more instructions.
rpc_ip=[机构A ip]
channel_ip=0.0.0.0
p2p_listen_port=30300
channel_listen_port=20200
jsonrpc_listen_port=8545

[node1]
p2p_ip=[机构A ip]
rpc_ip=[机构A ip]
channel_ip=0.0.0.0
p2p_listen_port=30301
channel_listen_port=20201
jsonrpc_listen_port=8546

机构B修改配置文件

机构B同上

机构A生成并发送节点信息

以下为在机构A上generator目录下的操作

./generator --generate_all_certificates ./agencyA_node_info

命令操作完可以在agencyA_node_info目录下发现以下文件:

# 从左至右分别为需要交互给机构A的节点证书,节点P2P连接地址文件(根据node_deployment.ini生成的本机构节点信息)摘自官方
root@blockchain-1:~/plumk/generator# ls agencyA_node_info
cert_10.13.1.11_30300.crt  cert_10.13.1.11_30301.crt  peers.txt

机构生成节点,需要指定其他节点的P2P连接地址,这里我是用scp将P2P地址连接文件发送给机构B

scp ./agencyA_node_info/peers.txt root@10.13.1.12:~/generator/meta/peersA.txt

机构B生成并发送节点信息

与上一步一样,这里不过多赘述,放上命令

./generator --generate_all_certificates ./agencyB_node_info

生成创世区块的机构需要节点证书,示例中由A机构生成创世区块,因此B机构除了发送节点P2P连接地址文件外,还需发送节点证书至机构A

scp ./agencyB_node_info/cert*.crt root@10.13.1.11:~/generator/meta/

同样的,发送节点P2P连接地址文件:

scp ./agencyB_node_info/peers.txt root@10.13.1.11:~/generator/meta/peersB.txt

机构A生成群组1创世区块

修改机构A的conf文件夹下的group_genesis.ini,初始内容如下:

[group]
group_id=1

[nodes]
node0=127.0.0.1:30300
node1=127.0.0.1:30301
node2=127.0.0.1:30302
node3=127.0.0.1:30303

修改为如下,这里要结合个人主机的ip地址来看,注意端口要对上,与前面node_deployment.ini文件中端口的对应:

;命令解释
[group]
;群组id
group_id=1

[nodes]
;机构A节点p2p地址
node0=10.13.1.11:30300
;机构A节点p2p地址
node1=10.13.1.11:30301
;机构B节点p2p地址
node2=10.13.1.12:30300
;机构B节点p2p地址
node3=10.13.1.12:30301

教程中选择机构A生成群组创世区块,实际生产中可以通过联盟链委员会协商选择。 ————摘自官方文档

接下来就是用命令生成群组创世区块,这步会用到A机构meta文件下面的节点证书,包括A和B

./generator --create_group_genesis ./group

然后我们将这个群组创世区块分发至机构B

scp ./group/group.1.genesis root@10.13.1.12:~/generator/meta

机构A生成所属节点

此命令在机构A上操作,会根据node_deployment.ini文件生成节点配置文件:

./generator --build_install_package ./meta/peersB.txt ./nodeA

注意,此步指定的节点P2P连接信息peers.txt为群组内其他节点的链接信息,多个机构组网的情况下需要将其合并。 ————摘自官方

此时nodeA文件夹下应该已经有文件了

root@blockchain-1:~/plumk/generator# ls nodeA/
monitor  node_10.13.1.11_30300  node_10.13.1.11_30301  scripts  start_all.sh  stop_all.sh

机构A启动节点:

bash ./nodeA/start_all.sh

启动成功:

try to start node_10.13.1.11_30300
try to start node_10.13.1.11_30301
 node_10.13.1.11_30301 start successfully
 node_10.13.1.11_30300 start successfully

机构B生成所属节点

与机构A类似,不赘述,放代码:

./generator --build_install_package ./meta/peersA.txt ./nodeB

启动

bash ./nodeB/start_all.sh

查看群组1节点运行状态

查看节点log:

tail -f ./node*/node*/log/log*  | grep +++

出现下面这样的字符串说明成功了

info|2020-05-19 22:40:46.229945|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=5d19a569...
info|2020-05-19 22:40:47.237060|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=b95fc203...
info|2020-05-19 22:40:50.255719|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=8f9eb369...
info|2020-05-19 22:40:51.260244|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=2c82cb3f...
info|2020-05-19 22:40:54.276552|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=f1f629d9...

搭建控制台

首先安装一下JAVA JDK

sudo apt install -y default-jdk

输入java -version出现类似一下版本信息就是成功了

openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

机构A、B下载控制台程序

我们先下载控制台程序,这个命令会自动为我们配置好控制台的配置文件

./generator --download_console ./   

错误解决

这里可能会出现之前下安装二进制文件的错误,处理起来比较麻烦,需要手动操作,首先从下面链接下载:

https://github.com/FISCO-BCOS/console/releases/download/v1.0.9/console.tar.gz

然后直接解压可得console文件夹,如果说文件格式错误,多半是下载的时候文件出错了,多下几次即可

配置A机构控制台(B机构同理):生成sdk证书

./generator --generate_sdk_certificate ./dir_sdk_ca ./dir_agency_ca/agencyA

执行完命令后,在dir_sdk_ca/sdk目录下可以看到如下文件:

root@blockchain-1:~/plumk/generator# ls dir_sdk_ca/sdk
ca.crt  node.crt  node.key  sdk.crt  sdk.key

将文件复制至console目录下的conf文件夹:

cp -rf dir_sdk_ca/sdk/* console/conf/

然后复制样例文件applicationContext-sample.xml为新文件:

cp applicationContext-sample.xml applicationContext.xml

applicationContext.xml中应该可以看到一个value标签,修改value标签为两个:

<value>[你的ip]:20200</value>
<value>[你的ip]:20201</value>

这样就配置完了

启动控制台

回到console目录,执行:

./start.sh

过一会就能看见控制台了

=============================================================================================
Welcome to FISCO BCOS console(1.0.9)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
 ________ ______  ______   ______   ______       _______   ______   ______   ______
|        |      \/      \ /      \ /      \     |       \ /      \ /      \ /      \
| $$$$$$$$\$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\    | $$$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\
| $$__     | $$ | $$___\$| $$   \$| $$  | $$    | $$__/ $| $$   \$| $$  | $| $$___\$$
| $$  \    | $$  \$$    \| $$     | $$  | $$    | $$    $| $$     | $$  | $$\$$    \
| $$$$$    | $$  _\$$$$$$| $$   __| $$  | $$    | $$$$$$$| $$   __| $$  | $$_\$$$$$$\
| $$      _| $$_|  \__| $| $$__/  | $$__/ $$    | $$__/ $| $$__/  | $$__/ $|  \__| $$
| $$     |   $$ \\$$    $$\$$    $$\$$    $$    | $$    $$\$$    $$\$$    $$\$$    $$
 \$$      \$$$$$$ \$$$$$$  \$$$$$$  \$$$$$$      \$$$$$$$  \$$$$$$  \$$$$$$  \$$$$$$

=============================================================================================
[group:1]>

尝试deploy一个HelloWorld,应该可以看到类似如下内容:

[group:1]> deploy HelloWorld
contract address: 0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
posted @ 2020-05-20 08:37  PlumK  阅读(1497)  评论(0编辑  收藏  举报