安装与配置 Go
- 下载并解压 go
1
2wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.13.5.linux-amd64.tar.gz - 设置当前用户的环境变量:
1
2
3
4
5
6
7
8
9
10
11vi /etc/profile
//添加以下内容:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/gopath/bin
//编辑保存并退出vi后,记得把这些环境载入:
source /etc/profile
//我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建gopath文件夹
cd ~
mkdir gopath
安装 Docker
安装并启动 docker 服务
1
2
3sudo yum install docker-ce
docker version
sudo systemctl start docker将当前用户添加到 docker 用户组
1
2
3
4
5
6
7
8// 添加 docker 用户组
groupadd docker
// 把需要执行的 docker 用户添加进该组
gpasswd -a $USER docker
// 重启 docker
systemctl restart docker
// 设置 docker 服务开机自启动
systemctl enable docker若提示
get …… dial unix /var/run/docker.sock
权限不够,则修改 /var/run/docker.sock 权限即可:1
sudo chmod a+rw /var/run/docker.sock
安装 Docker-Compose
- 安装
1
2
3sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
下载&编译 fabic
创建下载目录,下载 fabric 源码:
1
2
3mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git编译 fabric 相关组件
1
make all
all
表明编译所有组件(包括镜像)
若想编译某个特定的组件:执行make {$component-name}
即可利用 byfn.sh 编译 fabric 相关组件,此脚本能起 1 orderer + 2 Organization 的 fabric 网络
1
./byfn.sh up
查看 fabric 网络
1 | docker images -a | grep fabric |
- 若出现如下几个镜像则表明 fabric 网络所需要的镜像准备完毕:
1
2
3
4
5
6hyperledger/fabric-orderer
hyperledger/fabric-ccenv
hyperledger/fabric-peer
hyperledger/fabric-tools
hyperledger/fabric-baseos
hyperledger/fabric-buildenv
手动部署 fabric 网络
1、通过
crypto-config.yaml
配置文件,生成所需要的证书文件:生成证书
1
./bin/cryptogen generate --config=./crypto-config.yaml
此时, 文件夹
crypto-config
里会有ordererOrganizations
与peerOrganizations
两个目录,分别存放orderer
节点证书和organization
节点证书。cryto-config.yaml 参数说明:
1
2
3
4
5
6
7- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1Name
和Domain
: 指定该组织的名字和域名,生成的证书内将包含该信息。Template.Count=2
: 表明生成 2 套证书,一套是peer0.org2
的,还有一套是peer1.org2
的Users.Count=1
: 指定该组织有多少普通User
(用户)(注:Admin 不计入count
中)
2、根据
configtx.yaml
生成创世区块1
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID sys-channel
命令生效后会在
channel-artifacts
此目录下生成genesis.block
文件(创世区块),同时将系统通道
命名为sys-channel
3、生成通道配置区块
1
./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
命令生效后,生成
mychannel.tx
配置交易文件,同时将应用通道
命名为mychannel
4、生成用于锚节点配置更新的交易文件
1
2
3
4// 更新 Org1 的锚节点
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
// 更新 Org2 的锚节点
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP锚节点作用是用于组织间的通信
- 最终在
channel-artifacts
文件夹下可以看到四个新生成的文件:1
2
3
4
5channel-artifacts/
├── channel.tx
├── genesis.block
├── Org1MSPanchors.tx
└── Org2MSPanchors.tx
4、启动
Fabric
网络- 部署 orderer 节点
1
docker-compose -f docker-compose-orderer.yaml up -d
- 部署 peer 节点
1
docker-compose -f docker-compose-peer.yaml up –d
- 部署 orderer 节点
5、进入 cli 容器里
1
docker exec –it cli bash 进去客户端 创建一个channel
6、创建应用通道
mychannel
1
2ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
peer channel create –o orderer.example.com:7050 –c mychannel –f ./channel-artifacts/mychannel.tx --tls true --cafile $ORDERER_CAORDERER_CA
是 orderer 的 tls 根证书,用于验证在开启 tls 下验证 orderer 的 TLS 证书。7、将各个组织的 peer 节点加入到
mychannel
通道中将 peer0.org1 加入通道:
1
2// 由于 cli 默认是充当是的 peer0.org1 的客户端(cli 的环境变量使用的是 peer0.org1 的)
peer channel join -b mychannel.block将 peer1.org1 加入通道:
1
2
3
4
5CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer channel join -b mychannel.block将 peer0.org2 加入通道:
1
2
3
4
5CORE_PEER_LOCALMSPID="Org2MSP"
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
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b mychannel.block将 peer1.org2 加入通道:
1
2
3
4
5CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b mychannel.block
8、更新锚节点
更新 Org1 的锚节点(这里指定的是 peer0.org1,在 configtx.yaml 中有定义)
1
2
3
4
5CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA更新 Org2 的锚节点
1
2
3
4
5CORE_PEER_LOCALMSPID="Org2MSP"
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
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
9、安装智能合约
在 peer0.org1 节点上,安装链码
1
2
3
4
5
6CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
// 使用 peer chaincode install 命令可以安装指定的 ChainCode 并对其命名 mychaincode:
peer chaincode install -n mychaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go/在 peer0.org2 节点上,安装链码
1
2
3
4
5CORE_PEER_LOCALMSPID="Org2MSP"
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
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer chaincode install -n mychaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go/
10、实例化合约
1
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mychaincode -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
11、查询链码
1
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
12、 调用链码
1
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
调用结束后可以查询是否转账成功。 当前都是在
peer0.org1
节点执行,如果需要在其他节点执行查询链码或者调用链码,只需切换环境变量即可(参考加入通道相关流程)。
ps: 本章节所介绍的 fabric 网络部署在单机中,后续章节将补充 fabric 多机部署。。。