一、环境部署
1.1、准备工作,需要如下依赖:
curl
git
Java
Golang
Docker
Docker Compose
安装之前需要更新系统资源列表
sudo apt update -y --fix-missiog
1.1.1安装curl:
sudo apt install -y curl
查看安装结果:
curl -V
1.1.2 安装git:
sudo apt install -y git
查看安装结果:
git version
1.1.3 安装java
解压到/usr/local/tools/
vim ~/.bashrc
export JAVA_HOME=/usr/local/tools/jdk1.8.0_261
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc
1.1.4 安装golang
go1.14.2.linux-amd64.tar.gz解压到/usr/local
创建Go的工作目录:
sudo mkdir -p /opt/goworkspace/bin
sudo mkdir -p /opt/goworkspace/src
sudo mkdir -p /opt/goworkspace/pkg
设置环境变量
vim ~/.bashrc
export GOROOT=/usr/local/go
export GOPATH=/opt/goworkspace
export PATH=$GOROOT/bin:$PATH
source ~/.bashrc
Go设置代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
查看安装结果:
go version
1.1.5安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0xtiq62z.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1.1.6安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
1.2.1安装fabric二进制文件
https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh
chmod +x bootstrap.sh
set ff = unix
./bootstrap.sh 2.2.0 指定版本
需要将fabric/bin的目录配置到环境变量
vim ~/.bashrc
export PATH=/data/fabric/bin:$PATH
source ~/.bashrc
如果是国内服务器,下载速度很慢,需要FQ
或者上传二进制包,这里fabric版本是2.0.0,ca版本是1.4.6
查看安装结果:
orderer version
1.2.2 下载fabric docker镜像
curl -sSL https://bit.ly/2ysbOFE | bash -s -b -- 2.0.0 1.4.6 0.4.18
二、搭建多机多节点fabric环境
计划为:
116.62.103.72--172.18.56.235--order.hua.com
116.62.11.57--172.18.56.237--peer0.org1.hua.com 锚节点
118.178.84.119--172.18.56.238--peer1.org1.hua.com
2.1.1 为每台主机创建相同的工作目录:
踩过的坑:目录一定要相同,docker-compse容器启动会创建虚拟网络名称是根据所在文件夹来的,不同集群网络找不到
2.1.2 生成证书模板文件
cryptogen showtemplate > crypto-config.yaml
生成证书模板文件,执行如下命令:
cryptogen generate --config=crypto-config.yaml
生成目录结构如下:
2.1.3 创世块生成、通道文件生成、锚节点更新文件
生成创世块:
configtxgen -profile SampleMultiNodeEtcdRaft -outputBlock ./channel-artifacts/genesis.block -channelID orderer-system-channel
生成通道文件:
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
生成org1锚节点更新文件:
生成的文件结构如下:
2.1.3 编写docker-compose-order.yaml,启动orderer节点
启动orderer:docker-compose -f docker-compose-order.yaml up -d
证书文件以及通道文件打包
tar -cvf hua.tar channel-artifacts/ crypto-config
2.2启动peer0.org1.hua.com
切换到116.62.11.57--172.18.56.237--peer0服务器,上传hua.tar并解压缩
启动peer0:
进入客户端:
docker exec -it cli bash
根据通道文件创建通道:
peer channel create -o orderer.hua.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem
Peer0加入通道:
peer channel join -b mychannel.block
验证是否成功接入通道
打包链码
peer lifecycle chaincode package mycc.tar.gz --path /opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/test1 --lang java --label mycc_1
安装链码
peer lifecycle chaincode install mycc.tar.gz
查询链码是否安装成功
peer lifecycle chaincode queryinstalled
组织审批链码
peer lifecycle chaincode approveformyorg -o orderer.hua.com:7050 --channelID mychannel --name mycc --version 1.0 --init-required --package-id mycc_1:e5dac5f28763979455306e40579a0edbf31f881f90a65e43f9172cde03281acd --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem
检查链码审批情况
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem --output json
说明组织1已同意
向指定通道提交链码定义
peer lifecycle chaincode commit -o orderer.hua.com:7050 --channelID mychannel --name mycc --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem --peerAddresses peer0.org1.hua.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/peerOrganizations/org1.hua.com/peers/peer0.org1.hua.com/tls/ca.crt
查询指定通道链码提交情况
peer lifecycle chaincode querycommitted --channelID mychannel
初始化链码
peer chaincode invoke -o orderer.hua.com:7050 --isInit --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem -C mychannel -n mycc -c '{"Args":["init"]}'
执行链码调用
peer chaincode invoke -o orderer.hua.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","bb"]}'
查询链码:
到此处peer0已经部署完成
2.3启动peer1
将peer0中的文件(这两个文件只用生成一次) mycc.tar.gz 链码安装包,mychannel.block通道文件拷贝,因为做了文件挂载,我们拷贝到chaincode目录,并上传到peer1的chaincode目录,这样peer1的客户端可以直接使用
Peer1文件目录如下:
启动peer1并进入客户端容器:
Peer1加入通道
peer channel join -b mychannel.block
Peer1安装链码
peer lifecycle chaincode install mycc.tar.gz
Peer1至此已安装完成
Peer1查询链码数据
peer chaincode invoke -o orderer.hua.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/hua.com/orderers/orderer.hua.com/msp/tlscacerts/tlsca.hua.com-cert.pem -C mychannel -n mycc -c '{"Args":["query","a"]}'