本文的大致目录如下:
1、 版本解读
2、 Ubuntu16.0.4-amd64基础环境的搭建:go、docker、git、docker-compose
3、 树莓派基础环境搭建
4、 环境测试(amd64和arm64)
5、 Raft多机部署(fabric1.4)
6、踩过的坑
文中所需要的文档均打包一份,上传至Github
1、 版本解读
本文所述的Fabric1.4的安装部署环境主要有:
(1)Ubuntu16.0.4-amd64(也适用于高于此版本的);
(2)树莓派的Ubuntu-arm64。
需要考虑的问题:
(1) 树莓派的CPU核心是arm64,fabric官方没有发布arm64版本的docker镜像。也没有发布相对应的二进制文件(peer、orderer、configtxgen等),这个经过一次次测验,选定了合适的镜像和二进制文件;
(2) Fabric的版本v1.x—>v2.x,经过一次大版本的变迁,从而导致出现了很多问题,解决起来比较烧脑无厘头。相比较下,可查阅资料相对齐全,遇到问题网络可查,不会太烧脑的版本只有v1.4。所以本文的fabric版本以及相关的东西都对照这个版本。
重点说明
:本文中的所需的资料,大部分都上传至GoFS的公共账户中,有需要可以自行下载。其他游客,可以从邮件
1.1 软件环境
适用于Ubuntu版本,可以有小偏差。GOlang、docker、docker-compose、git可以下载最新的。
2、 Ubuntu16.0.4-amd64基础环境的搭建:go、docker、git、docker-compose
详情见此篇博客:https://blog.csdn.net/i_want_study/article/details/107593427
走过路过来个关注😄😄😄
3、 树莓派基础环境搭建
说明
:树莓派的CPU是arm64架构的,和我们日常使用的电脑采用的amd64架构不同,所以在版本安装的时候一定要注意。
主要介绍一个用脚本安装go的过程,其他的软件安装参考:参考地址
树莓派系统:ubuntu18.0.4
。
设备(还有一台设备是自己使用的笔记本host1,但是不是树莓派系统):
主机 | IP |
---|---|
host2 | 10.10.45.66 |
host3 | 10.10.45.67 |
host4 | 10.10.45.68 |
(仅以一台设备为例)
开始搭建环境====>
所需的基础环境:docker
、git
、golang
、fabric
。
其中部分环境,安装系统之后就有,不需要重复安装。
Go的安装:脚本实现。
(1)将所需安装脚本go_install.sh
通过scp
拷贝到树莓派host1
;
1. # 在自己的宿主机上执行此命令,根据实际情况将用户换成自己的。
2. # scp 文件路径 目标机用户@目标机地址:文件存储文件夹
3. ~$ scp /home/yjzhu/Downloads/go_install.sh ubuntu@10.10.45.66:/home/ubuntu/Downloads
(2)执行脚本;(安装脚本需要更改调整,根据自己的实际情况,调整其中的路径即可)
进入host1
中,在终端执行下述:
1. ~$ cd Downloads
2. ~$ chmod +x go_install.sh
3. ~$ sudo ./go_install
4. ~$ cd ..
5. ~$ sudo chown –R yjzhu gopath
(3)重启
1. ~$ source /etc/profile
2. ~$ sudo reboot
4、 镜像和二进制文件部署(arm64)
先在GoFS上下载所需的文件(1、bin文件夹中的二进制文件
;2、拉取fabric镜像的脚本
)。
通过scp
将文件传输到树莓派hostN
上。
1. # 在自己的宿主机上执行此命令,根据实际情况将用户换成自己的。
2. # scp 文件路径 目标机用户@目标机地址:文件存储文件夹
3. ~$ scp /home/yjzhu/Downloads/get-images.sh ubuntu@10.10.45.66:/home/ubuntu/Downloads
4. ~$ scp –r /home/yjzhu/Downloads/bin ubuntu@10.10.45.66:/home/ubuntu/Downloads
然后进入树莓派hostN
上(以host1
为例):
1. ~$ cd Downloads
2. # 镜像拉取
3. ~$ chmod +x get-images.sh
4. ~$ ./get-images.sh
5. # 二进制文件归位
6. ~$ cp ~/Downloads/bin/* ~/gopath/bin/
5、 Raft多机部署(fabric1.4)
节点部署示意:
主机 IP 节点
用户 | IP | 节点 |
---|---|---|
yjzhu(host1) | 10.10.39.70 | oderer、orderer5、peer0.org1 |
Ubuntu-arm64(host2) | 10.10.45.66 | orderer2、peer1.org1 |
Ubuntu-arm64(host3) | 10.10.45.67 | orderer3、peer0.org2 |
Ubuntu-arm64(host4) | 10.10.45.68 | orderer4、peer1.org2 |
环境配置文件:在GoFS上下载,位置如下所示:
同样,在宿主机上通过scp将文件传到树莓派hostN上。下面将详细介绍操作部署流程。
宿主机(开四个终端,分别命名host1
、host2
、host3
、host4
)
不会命名的小伙伴,就心中给四个终端排个顺序就行,因为后面的操作需要在四个终端中不停的切换。
为了让大家了解部署的原始流程,先用原始的流程大致介绍一下,然后再根据实际情况介绍一下怎么使用。
====================>
原始部署从此开始:
Host1:
1. # 将所需的文件通过scp发送到其他三个树莓派上
2. $ tar xzvf /home/ubuntu/Downloads/fabric-ectdraft.tar.gz -C /home/yjzhu/gopath/src/github.com/hyperledger/
3. # 现在在/home/yjzhu/gopath/src/github.com/hyperledger下有个文件夹名为fabric-etcdraft,进入该文件夹
4. $ cd /home/yjzhu/gopath/src/github.com/hyperledger/fabric-etcdraft
5. # 由于我上传的是一个拥有通道、创世区块和节点的文件,所以先删除其中的生成的东西然后再重新生成。
6. # 如何删除这个,简单点,直接打开你的文件管理器找到这个,把channel-artifacts和crypto-config下的所有东西都删除,使他们成为一个空的文件夹
7. # 删除之后,接下来就开始步入正题,开始一系列的流程=================================================================》
8. $ cd /home/yjzhu/gopath/src/github.com/hyperledger/fabric-etcdraft
9. $ cryptogen generate --config=./crypto-config.yaml
10. # 此处十分注意一个通道的名称配置,-channelID的参数本该是系统默认的,但是可能会因为某些原因需要自己输入,千万不要瞎起名字,就是这个byfn-sys-channel,如果写错,后面的处理过程中,出现错误,你都不知道错在哪。其实就是起始这个位置出的错。
11. $ configtxgen -profile SampleMultiNodeEtcdRaft -outputBlock ./channel-artifacts/genesis.block –channelID byfn-sys-channel
12. # 此处的-channelID可以随便起,可以这么理解,上面是一个系统通道,下面这个是链码通道,我们使用的是链码通道
13. $ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
14. $ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
15. $ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
16. # 到此,已经生成所有必须的密码学资料文件,下面开始将这个准备好资料的文件夹通过scp发送到host2,host3,host4
17. $ scp -r /home/yjzhu/gopath/src/github.com/hyperledger/fabric-ectdraft ubuntu@10.10.45.66:/home/ubuntu/gopath/src/github.com/hyperldger/
18. $ scp -r /home/yjzhu/gopath/src/github.com/hyperledger/fabric-ectdraft ubuntu@10.10.45.67:/home/ubuntu/gopath/src/github.com/hyperldger/
19. $ scp -r /home/yjzhu/gopath/src/github.com/hyperledger/fabric-ectdraft ubuntu@10.10.45.68:/home/ubuntu/gopath/src/github.com/hyperldger/
Host2:
1. $ ssh ubuntu@10.10.45.66
2. $ cd /home/ubuntu/gopath/src/github.com/hyperledger/fabric-etcdraft
Host3:
3. $ ssh ubuntu@10.10.45.67
4. $ cd /home/ubuntu/gopath/src/github.com/hyperledger/fabric-etcdraft
Host4:
5. $ ssh ubuntu@10.10.45.68
6. $ cd /home/ubuntu/gopath/src/github.com/hyperledger/fabric-etcdraft
下面开始构建网络运行,我们通过swarm来构建叠加网络
Host1:
1. # 为了不同机器之间实现通信,我们采用docker swarm来建立我们所需的网络
2. $ docker swarm init –-advertise-addr 10.10.39.70
3. $ docker swarm join-token manager
4. # 上面的命令返回一个值,如下所示:
5.
6. # 一会使用返回的这个值,将host2,host3,host4加入到网络中
7. $ docker network create --attachable --driver overlay first-network
8. $ docker network ls
9.
Host2:
7. $ docker swarm join --token SWMTKN-1-5siwc3ahrq16zezmhbkx514crogzw31lnvydveouag9kp28t2q-20fqbkigo1ib174n0n2fv8l57 10.10.39.70:2377 –advertise-addr 10.10.45.66
8. $ docker network ls
9. # 如果返回的结果包含first-network,那么就加入成功
10.
其他host3和host4和这个步骤一样
接下来开始启动网络,host1,host2,host3,host4启动命令大致相同
11. $ docker-compose –f hostN.yaml up -d
12. $ docker ps –a
13. # 可以看到相关节点都已经启动。
测试网络,尝试链码测试
Host1:
1. # 创建应用通道
2. $ docker exec –it cli bash
3. # 下面的操作都是在cli容器中执行
4. echo $CHANNEL_NAME
5. export CHANNEL_NAME=mychannel
6. export CAFILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
7. # 创建通道
8. peer channel create –o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $CAFILE
9. # 加入通道
10. peer channel join –b mychannel.block
11. # 更新锚节点
12. peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $CAFILE
13. CORE_PEER_LOCALMSPID="Org2MSP"
14. CORE_PEER_ADDRESS=peer0.org2.example.com:7051
15. CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/msp
16. CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
17. peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $CAFILE
18. peer channel join -b mychannel.block
19. # 接下来,先退出容器,ctrl+q+p
接下来测试一下链码:
14. $ docker exec –it cli bash
15. # 接下来的内容在cli容器中操作
16. peer channel list
17. # 返回结果会显示所在的通道mychannel
18. # 安装链码
19. peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
20. # 实例化链码
21. CAFILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
22. peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $CAFILE -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
23. # 查询链码
24. peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
25. # 返回结果为100
至此,我们的多机部署基本的流程大致完成。