0%

fabric-deploy

1. 先决条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
git clone git@github.com:hyperledger/fabric.git

# bootstrap.sh 初始化脚本
# -h 查看帮助
# 可以下载 Docker 镜像, 通过 -d 跳过
# 可以下载 fabric-samples 项目, 通过 -s 跳过
# 可以下载运行时的二进制文件, 通过 -b 跳过
# 1. 下载 Docker 镜像
fabric/scripts/bootstrap.sh -s -b
# 2. 下载 fabric-samples 项目到当前目录
fabric/scripts/bootstrap.sh -d -b
# 3. 下载运行时的二进制文件
# 下载比较慢, 可进入脚本修改 download 方法, 改用 axel 下载
fabric/scripts/bootstrap.sh -d -s
# axel -q -n 100 https://github.com/hyperledger/fabric/releases/download/v2.2.0/hyperledger-fabric-linux-amd64-2.2.0.tar.gz
# axel -q -n 100 https://github.com/hyperledger/fabric-ca/releases/download/v1.4.8/hyperledger-fabric-ca-linux-amd64-1.4.8.tar.gz

# 3.1. 将二进制文件下的 bin 目录配置到 PATH 环境变量
export FABRIC_BINARY_PATH=/home/raven/Workspace/ForkProjects/fabric-binary
export FABRIC_SAMPLES_PATH=/home/raven/Workspace/ForkProjects/fabric-samples
export FABRIC_CFG_PATH=$FABRIC_SAMPLES_PATH/config/
export PATH=$PATH:$FABRIC_SAMPLES_PATH/bin

# 3.2. 将运行时的二进制文件 `/bin`, `/config` 放在 fabric-samples 目录下, 可用软连接的方式
ln -sf $FABRIC_BINARY_PATH/bin $FABRIC_SAMPLES_PATH/bin
ln -sf $FABRIC_BINARY_PATH/config $FABRIC_SAMPLES_PATH/config

通过 bootstrap.sh 安装完 3 样东西后, 可以部署测试网络

2. 部署测试网络

1
2
3
4
5
6
7
8
9
10
11
12
13
# 必须到 test-network 目录下, 否则会报错:
# ERROR! Peer binary and configuration files not found..
cd fabric-samples/test-network

# 查看帮助
./network.sh -h

# 部署测试网络
./network.sh up
# ./network.sh up createChannel -ca -c mychannel -s couchdb -i 2.0.0
# ./network.sh createChannel -c channelName
# ./network.sh deployCC -ccn basic -ccl javascript
# ./network.sh deployCC -ccn mychaincode -ccp ./user/mychaincode -ccv 1 -ccl javascript

./network.sh up 做了以下事情:

  1. 读取 organizations/cryptogen 目录下的配置, 通过 cryptogen 工具为 2 个 peer (org1, org2) 和 1 个 orderer 节点生成身份验证材料.
    身份验证材料分别放在 ordererOrganizations 和 peerOrganizations 目录下.
  2. 读取 configtx/configtx.yaml 配置, 通过 configtxgen 工具创建系统通道创世区块
    系统通道创世区块放在 system-genesis-block 目录下
  3. 读取 docker/docker-compose-test-net.yaml, 通过 docker 建立网络

3. 创建通道

1
./network.sh createChannel

./network.sh 会调用 scripts/createChannel.sh 脚本创建通道:

  1. 读取 configtx/configtx.yaml 配置, 初始化事务
  2. 将 2 个 peer 节点加入通道, 并相互锚定.

4. 部署链码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 会在当前目录下生成链码包 basic.tar.gz
# --path 指定代码目录
# --lang 指定语言
# --label 创建链码标签, 用于安装后标识链码
# peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-java//build/install/basic --lang java --label basic_1.0

./network.sh deployCC

# 配置以下环境变量, 之后调用 peer 命令就可以以 org1 的身份查询
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

# 执行安装链码
# 过程有点慢
peer lifecycle chaincode install basic.tar.gz

# 查看已安装的链码
peer lifecycle chaincode queryinstalled

./network.sh 会调用 scripts/deployCC.sh 脚本部署链码:

  1. 构建打包链码项目
  2. 将链码包提交给通道
  3. 将初始数据提交到账本

5. 账本操作

5.1. 初始化

1
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'

5.2. 查询账本

1
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

5.3. 修改账本

1
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'

6. 关闭区块链网络

1
./network.sh down

7. Resource