arm架构设备上搭建多机区块链网络
零、 准备
本文章使用设备为一个orin、一个nano、两个nx,均为arm64架构。
搭建多机区块链网络要求多机之间网络互通(相互之间能够ping通,即处于同一个子网下),这里我使用的是1wan口4lan口路由器进行连接,如下图所示。
同时在路由器中设置静态ip,即将各设备的有线网口的mac地址和路由器分配的子网中的ip地址进行绑定,这样就不会导致每次连上路由器都会被分配新的ip。

这里我采用的是有线网进行连接,原因是一方面有线网连接比较稳定,另一方面是因为我的一个nx设备的无线模块有点问题,导致对无线网络信号的感知有问题,导致路由器放在旁边却只有一两格信号而且很容易断掉,于是我就把所有的设备都用网线接到了路由器的lan口。
在物理上连好线之后可以验证一下这些设备是否在同一子网内,我们尝试用一个设备去ping其他设备,看能否ping通。
我这里用192.168.1.100这台设备去ping192.168.1.104、192.168.1.105、192.168.1.106 这3台设备。
ping 192.168.104

ping 192.168.105

ping 192.168.106

看到上面192.168.1.100这台设备去ping其他几台设备都是可以ping通的,也就是说这些设备都是在同一个子网里。
下面我们尝试192.168.1.100这台设备是否能通过ssh命令登录到其他几台设备。
ssh node1@192.168.1.104

ssh node1@192.168.1.105

ssh node1@192.168.1.106

可以看到这里我在192.168.1.100这台设备上是可以通过ssh登陆到另外三台设备的,如果不能登陆的话,可以看一下是否是防火墙拦截的原因,如果也是unbuntu系统可以尝试关闭ufw防火墙,如果为了更安全,可以开放22号端口即可,如果遇到其他问题可以ai逐步排查,根据ai的提示去查看一些配置文件是不是把某些ip禁掉了导致不能ssh。
可以看到上面的图中,我们每次登陆都是需要输入密码,这个事情就很麻烦,这里就需要配置一下免密登陆,参考这篇文章进行免密登陆配置。
Linux服务器配置ssh免密登陆多台服务器、服务器别名配置
至此应该就可以开始搭建多机区块链网络了。
一、 搭建多机4节点区块链网络
检查每台机器的30300、20200 、8545端口,确保这几个端口没有被占用。
这里通过ss命令来检查是否这三个端口都是空闲的。
如果结果如下图所示没有任何输出则说明30300、20200 、8545这三个端口都是空闲的,没有被占用。
sudo ss -tulpn | grep -E "30300|20200|8545"
由于我也是第一次用这个ss命令,解释一下这个ss命令,这个ss的全称是socket statistics,主要的功能就是转储套接字信息,用于查看系统上网络连接、监听端口、路由表等各种网络信息,相较于nestat而言,ss是直接从内核中获取信息,执行速度非常快。
- tulpn这不是一个单独的参数,这个多个选项的组合:
- -t:–tcp的缩写,告诉ss显示tcp相关的套接字
- -u:–udp的缩写,告诉ss显示udp相关的套接字
- -l:–listening:只显示处于监听状态的套接字
- -p:–process:显示当前是那个进程正在使用这个套接字
- -n:–numeric:不解析服务名称,就比如80是http,443是https,这里要求不显示http、https,而是直接显示80和443
然后把这些信息通过管道传递给grep,grep去搜索看是否有30300、20200、8545这些端口,没有搜索到说明这些端口没有被占用
其中grep的-E选项是启用扩展正则表达式
话回正题,可以看到我们使用的这4台机器的这三个端口都是没有被占用的。




下面我们需要看一下是否这几台机器的22、20200、30300这几个端口是否具有网络权限,可以通过下面的命令来确认这件事。
我们可以在一台机器上去去验证另外几台机器用到的命令的是nc
首先查看一下你的linux上是否有nc,如果有nc的话,which命令会输出一个路径
which nc
然后通过nc命令去测试
nc是netcat简称,可以在TCP 或 UDP 协议下读取和写入网络连接,用来做端口扫描、文件传输、简单的聊天服务器、反向 shell,在这里使用的是端口扫描这一功能。
-z:是零I\O模式,也就是扫描模式,这个命令只是想知道能不能连接上,并不需要真的发送活接受任何内容
-v:是详情模式,也就是verbose的简写,这里就是不管成功与否都输出一个连接的详细结果。
nc -zv 192.168.1.104 22
nc -zv 192.168.1.104 20200
nc -zv 192.168.1.104 30300
nc -zv 192.168.1.105 22
nc -zv 192.168.1.105 20200
nc -zv 192.168.1.105 30300
nc -zv 192.168.1.106 22
nc -zv 192.168.1.106 20200
nc -zv 192.168.1.106 30300
由于有ssh服务运行并监听这22号端口所以返回succeeded,由于20200、30300端口上面没有运行任何服务,所以这里机器主动拒绝了connection,这里是正常的,说明这几个端口是具有网络权限的。
如果出现了connect time out | No route to host说明服务被防火墙拦截,这些端口没有网络权限,这时就需要关闭防火墙,或者让防火墙开启这两个端口了。
ssh到每台机器上,检查防火墙状态。
sudo ufw status verbose
给这些端口开通服务
# 开通 SSH (端口 22) - 通常已经开了
sudo ufw allow 22/tcp
# 开通 FISCO BCOS 端口
sudo ufw allow 20200/tcp
sudo ufw allow 30300/tcp
# (如果 FISCO BCOS 也使用 UDP)
# sudo ufw allow 20200/udp
# sudo ufw allow 30300/udp
# 重新加载防火墙规则使其生效
sudo ufw reload
再次查看防火墙状态,如果
sudo ufw status verbose
更夸张一点的方法是直接关闭防火墙,如果你只是为了学习不考虑安全的话就可以简单的这样操作,如果是生产环境不建议这样做。
再次执行nc命令就可以看到下图中和我类似的结果了



1、 生成区块链节点配置
类似于单机多节点的部署(单机多节点看这里 --arm架构上搭建第一个区块链网络FISCO BCOS)。
首先需要创建操作路径,并下载开发部署工具build_chain,这里使用的是fisco-bcos搭建区块链网络,所以创建工作目录即为fisco
mkdir -p ~/fisco && cd fisco
这是一条组合命令,mkdir的-p参数是如果要创建的目录的父目录不存在不要报错直接创建这个父目录&&是一个逻辑与操作符,表示只有左边命令成功执行才会去执行右边命令。
上面命令成功执行后我们现在应该在~/fisco路径下了,然后在这个路径下下载build_chain.sh这个脚本。
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.11.0/build_chain.sh && chmod u+x build_chain.sh
上面的命令也是一个组合命令分为下载命令 curl,修改权限命令chmod,组合起来就是下载这个脚本同时赋予这个用户可以执行脚本的权限。

生成区块链网络配置文件
cat >> ipconf << EOF
192.168.1.100 agencyA 1
192.168.1.104 agencyA 1
192.168.1.105 agencyA 1
192.168.1.106 agencyA 1
EOF
这是here document语法,是shell语言的一个有用的功能。
用于将多行文本重定向为命令的输入
cat命令会读取所有传递来的标准输出(standard input),然后将这些内容原封不动的输出的它的标准输出(standard output)
>> ipconf:这是一个输出重定向,就是将cat命令的输出定向到了ipconf中
<< EOF:这是here document的开始标记 <<告诉shell,cat需要的输入会从下一行开始,EOF即为停止标记,当cat读到定格的EOF的时候就是结束了,同时EOF不会被作为cat的输入他只是一个指示内容。

这里解释一下这个配置文件
这个ip很容易理解就是我们多机的网络ip,agency是机构的名称,最后一个数字是节点数量。
那么上面ipconf配置文件中的内容就是生成一个区块链网络,这个网络由机构agencyA的机构组成,这个机构一共有4个节点,并且这4个节点分别部署在这四台服务器上。
基于ipconf配置文件生成区块链节点配置
执行刚才我们下载的生成区块链节点脚本生成节点的配置,可以看到下图执行完命令后多出来了一个nodes文件,这个nodes文件就是对应的每个节点的配置文件。
bash build_chain.sh -f ipconf -p 30300,20200,8545

我们可以看一下nodes文件的结构,这里是通过tree命令查看
如果你没有安装tree命令可以安装一下,这是linux中非常好用的一个命令
sudo apt install tree
tree nodes
nodes
├── 192.168.1.100
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── channel_cert
│ │ │ │ ├── ca.crt
│ │ │ │ ├── cert.cnf
│ │ │ │ ├── node.crt
│ │ │ │ └── node.key
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── sdk
│ │ ├── ca.crt
│ │ ├── cert.cnf
│ │ ├── sdk.crt
│ │ └── sdk.key
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.1.104
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── channel_cert
│ │ │ │ ├── ca.crt
│ │ │ │ ├── cert.cnf
│ │ │ │ ├── node.crt
│ │ │ │ └── node.key
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── sdk
│ │ ├── ca.crt
│ │ ├── cert.cnf
│ │ ├── sdk.crt
│ │ └── sdk.key
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.1.105
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── channel_cert
│ │ │ │ ├── ca.crt
│ │ │ │ ├── cert.cnf
│ │ │ │ ├── node.crt
│ │ │ │ └── node.key
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── sdk
│ │ ├── ca.crt
│ │ ├── cert.cnf
│ │ ├── sdk.crt
│ │ └── sdk.key
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.1.106
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── channel_cert
│ │ │ │ ├── ca.crt
│ │ │ │ ├── cert.cnf
│ │ │ │ ├── node.crt
│ │ │ │ └── node.key
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── sdk
│ │ ├── ca.crt
│ │ ├── cert.cnf
│ │ ├── sdk.crt
│ │ └── sdk.key
│ ├── start_all.sh
│ └── stop_all.sh
├── cert
│ ├── agencyA
│ │ ├── agency.crt
│ │ ├── agency.key
│ │ ├── ca.crt
│ │ ├── cert.cnf
│ │ └── channel
│ │ ├── ca.crt
│ │ ├── ca.key
│ │ └── cert.cnf
│ ├── ca.crt
│ ├── ca.key
│ └── cert.cnf
└── cert.cnf
上面的内容看起来可能不那么直观,我们限制一下tree的层数
tree -L 2
这下结构就看起来清楚多了,nodes文件下一共是5个内容分别是192.168.1.100、192.168.1.104、192.168.1.105、192.168.1.106不同ip的节点配置文件,以及cert目录和cert.cnf。
总之这些目录中存放的就是各种配置文件。
直观上这个脚本就是创建了这些目录已经目录中的文件,更具体一点这个脚本干了哪些事
生成证书:为agencyA生成证书和4个节点创建所必需的CA证书和节点证书创建创世区块:成一个 genesis.json 文件生成节点配置:创建每个节点的 config.ini 文件,并正确填入 P2P 地址和端口号打包:它会在当前目录(~/fisco)下创建一个名为 nodes 的新目录。
nodes
├── 192.168.1.100
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ ├── sdk
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.1.104
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ ├── sdk
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.1.105
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ ├── sdk
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.1.106
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ ├── sdk
│ ├── start_all.sh
│ └── stop_all.sh
├── cert
│ ├── agencyA
│ ├── ca.crt
│ ├── ca.key
│ └── cert.cnf
└── cert.cnf
在生成了每个节点的配置之后就需要将分发节点配置到对应的机器上
由于我进行了别名配置,这里就直接把username@ip替换成了我配置的别名,不会配置别名的可以看这里Linux服务器配置ssh免密登陆多台服务器、服务器别名配置
ssh 104 "mkdir -p ~/fisco"
ssh 105 "mkdir -p ~/fisco"
ssh 106 "mkdir -p ~/fisco"

这里执行完命令后没有任何反馈我们可以通过别的命令查看是否我们的命令执行成功了
ssh 104 "ls ~/"
ssh 105 "ls ~/"
ssh 106 "ls ~/"
可以看到已经成功执行了上面的创建目录命令。



下一步就是分发节点配置到对应机器,这里scp也是可以用别名的,scp和ssh共享同一套配置文件
# 拷贝节点配置
# 拷贝节点配置到192.168.1.100的~/fisco路径
scp -r nodes/192.168.1.100/ localhost:~/fisco/192.168.1.100
# 拷贝节点配置到192.168.1.104的~/fisco路径
scp -r nodes/192.168.1.104/ 104:~/fisco/192.168.1.104
# 拷贝节点配置到192.168.1.105的~/fisco路径
scp -r nodes/192.168.1.105/ 105:~/fisco/192.168.1.105
# 拷贝节点配置到192.168.1.106的~/fisco路径
scp -r nodes/192.168.1.106/ 106:~/fisco/192.168.1.106
通过上面命令执行完之后可以进行验证
ssh 104 "ls ~/fisco"
ssh 105 "ls ~/fisco"
ssh 106 "ls ~/fisco"
如果看到下图结果那么就说明节点配置分发没有问题。




下面完成了节点配置文件的分发就可以启动多机4节点区块链系统了,这里我直接采用的ssh在其中一台机器上启动所有节点。
先启动本机所在的节点
bash ~/fisco/192.168.1.100/start_all.sh
这里看到在本机成功启动了节点

然后通过ssh去启动其他机器的节点
启动192.168.1.104设备
ssh 104 "bash ~/fisco/192.168.1.104/start_all.sh"
在启动104设备的时候出现了问题。
Exceed waiting time. Please try again to start node0
/home/node1/fisco/192.168.1.104/node0/../fisco-bcos: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /home/node1/fisco/192.168.1.104/node0/../fisco-bcos)
/home/node1/fisco/192.168.1.104/node0/../fisco-bcos: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/node1/fisco/192.168.1.104/node0/../fisco-bcos)
/home/node1/fisco/192.168.1.104/node0/../fisco-bcos: /lib/aarch64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.13' not found (required by /home/node1/fisco/192.168.1.104/node0/../fisco-bcos)
/home/node1/fisco/192.168.1.104/node0/../fisco-bcos: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/node1/fisco/192.168.1.104/node0/../fisco-bcos)
/home/node1/fisco/192.168.1.104/node0/../fisco-bcos: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /home/node1/fisco/192.168.1.104/node0/../fisco-bcos)
/home/node1/fisco/192.168.1.104/node0/../fisco-bcos: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /home/node1/fisco/192.168.1.104/node0/../fisco-bcos)
这是因为fisco二进制文件在orin上面编译的太新了,这台nx设备版本太久了,很多东西不兼容,这里可以手动编译一份代码,然后将编译后生成的可执行的二进制文件fisco-bcos放到~/fisco/192.168.1.104,即可正常启动节点。

可以看到这里节点0成功启动起来
将这个二进制分发到其他机器上面
scp ~/fisco-bcos 105:~/
scp ~/fisco-bcos 106:~/

启动192.168.1.105设备
ssh 105 "bash ~/fisco/192.168.1.105/start_all.sh"
这里105设备由于我用的是nano,nx上的版本又nano新,所以这里nano又重新编译了一遍
启动192.168.1.106设备
ssh 106 "bash ~/fisco/192.168.1.106/start_all.sh"

这里也可以直接ssh登陆到机器上面去操作,都是可以的,由于我需要对文件移动进行一些操作所以这后面启动节点的操作我都是ssh登陆到机器上面然后进行操作的。
检查每个节点是否都已经成功启动了
先检查本机的
ps aux | grep fisco | grep -v grep
可以看到本机已经成功启动了

这里我不选择ssh到机器上去检查了,我直接在192.168.1.100上去检查其他机器
ssh 104 "ps aux | grep fisco | grep -v grep"
ssh 105 "ps aux | grep fisco | grep -v grep"
ssh 106 "ps aux | grep fisco | grep -v grep"
可以看到类似下图中的内容就说明配置成功了

最后检查区块链网络中各个节点的连接情况
先检查本机
tail -f ~/fisco/*/node0/log/* |grep -i connected
可以看到下面的图片本机的网络连接是什么有问题的

然后登陆到各个设备去查看是否连接有问题,这里可以看到下面三张图中内容都表示连接是没有问题的。



最后再登陆每台机器去检查一下每个节点的共识是否正常
tail -f ~/fisco/*/node0/log/* |grep -i +++
可以看到下图内容,所有节点的共识都是正常的。




至此我们的多机区块链网络就已经搭建完成了,下面就是配置控制和使用控制台的内容了
二、 配置和使用控制台
最后
本文内容参考教程FISCO BCOS官方文档搭建多机区块链网络

572

被折叠的 条评论
为什么被折叠?



