Fabric网络搭建流程
Fabric网络搭建流程
本项目基于Fabric2.2进行搭建,暂时不使用CA二用crytogen生成证书文件。
假设我们项目的home是
/data/twonodes
。
目录
- 配置网络
- 通道配置
- 部署节点
- 节点与通道
- 链码的安装与执行
配置网络
配置网络主要是由CA负责,基于crypto-config.yaml文件生成orderer和peer节点的证书文件
由于本项目暂时还不采用CA搭建,所以使用官方给定的crytogen命令生成证书文件。
预备条件,参考Fabric测试网络的搭建。
使用
cryptogen showtemplate > crypto_config.yaml
生成生成密钥材料模板其内容如下:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113# ---------------------------------------------------------------------------
# "OrdererOrgs" - 管理orderer节点的组织的定义
# ---------------------------------------------------------------------------
OrdererOrgs:
# ---------------------------------------------------------------------------
# Orderer
# ---------------------------------------------------------------------------
- Name: Orderer
Domain: example.com # 域
EnableNodeOUs: true # 是否开启部门结构,如:组织-部门-节点
# ---------------------------------------------------------------------------
# "Specs" - See PeerOrgs below for complete description
# ---------------------------------------------------------------------------
Specs:
- Hostname: orderer
# ---------------------------------------------------------------------------
# "PeerOrgs" - 管理peer节点的组织的定义
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1
# ---------------------------------------------------------------------------
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: true
# ---------------------------------------------------------------------------
# "CA"
# ---------------------------------------------------------------------------
# Uncomment this section to enable the explicit definition of the CA for this
# organization. This entry is a Spec. See "Specs" section below for details.
# ---------------------------------------------------------------------------
# CA:
# Hostname: ca # implicitly ca.org1.example.com
# Country: US
# Province: California
# Locality: San Francisco
# OrganizationalUnit: Hyperledger Fabric
# StreetAddress: address for org # default nil
# PostalCode: postalCode for org # default nil
# ---------------------------------------------------------------------------
# "Specs"
# ---------------------------------------------------------------------------
# Uncomment this section to enable the explicit definition of hosts in your
# configuration. Most users will want to use Template, below
#
# Specs is an array of Spec entries. Each Spec entry consists of two fields:
# - Hostname: (Required) The desired hostname, sans the domain.
# - CommonName: (Optional) Specifies the template or explicit override for
# the CN. By default, this is the template:
#
# "{{.Hostname}}.{{.Domain}}"
#
# which obtains its values from the Spec.Hostname and
# Org.Domain, respectively.
# - SANS: (Optional) Specifies one or more Subject Alternative Names
# to be set in the resulting x509. Accepts template
# variables {{.Hostname}}, {{.Domain}}, {{.CommonName}}. IP
# addresses provided here will be properly recognized. Other
# values will be taken as DNS names.
# NOTE: Two implicit entries are created for you:
# - {{ .CommonName }}
# - {{ .Hostname }}
# ---------------------------------------------------------------------------
# Specs:
# - Hostname: foo # implicitly "foo.org1.example.com"
# CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
# SANS:
# - "bar.{{.Domain}}"
# - "altfoo.{{.Domain}}"
# - "{{.Hostname}}.org6.net"
# - 172.16.10.31
# - Hostname: bar
# - Hostname: baz
# -------------------------------------------------------------------------
# "Template"
# -------------------------------------------------------------------------
# 允许定义一个或多个按顺序创建的主机 (组织节点的生成模板)
# 默认情况下,这看起来像“peer%d”,从0到Count-1。
# 您可以覆盖节点数(Count)、起始索引(Start)
# 或用于构造名称(主机名)的模板。
# 注:模板和规范不是互斥的。你可以定义两者
# 将为您创建节和聚合节点。小心名称冲突
# -------------------------------------------------------------------------
Template:
Count: 1 #一个组织生成count个节点
# Start: 5
# Hostname: {{.Prefix}}{{.Index}} # default
# SANS:
# - "{{.Hostname}}.alt.{{.Domain}}"
# ---------------------------------------------------------------------------
# "Users"
# ---------------------------------------------------------------------------
# Count: 除Admin之外的用户帐户数
# ---------------------------------------------------------------------------
Users: # 组织中实际操作人员的个数
Count: 1
# ---------------------------------------------------------------------------
# Org2: 参考组织1的配置
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 1
Users:
Count: 1使用
cryptogen generate --config=crypto_config.yaml
指定使用自定义的配置文件在crypto-config
文件夹下生成order和peer的证书文件
通道配置
通过构建通道创建交易并将交易提交给排序服务来创建通道。通道创建交易指定通道的初始配置,并由排序服务用于写入通道创世块。使用configtxgen工具读取定义通道配置的
configtx.yaml
文件,然后将相关信息写入通道创建交易中来工作。
需要注意的是Fabric2.2和2.3的 configtx.yaml 的配置不同!!!详情参考
copy 官方实例的 configtx.yaml
修改为2.2版本的样子
修改证书路径为刚才生成的路径
1 | # Copyright IBM Corp. All Rights Reserved. |
使用
configtxgen
命令,基于configtx.yaml
创建和查看通道配置相关构件。输出初始区块: 将通道
orderer-system-channel
和轮廓(Profile)TwoOrgsOrdererGenesis
的创世区块写入genesis.block
。1
configtxgen -outputBlock ./channel-artifacts/genesis.block -profile TwoOrgsOrdererGenesis -channelID orderer-system-channel
输出创建通道的交易 将轮廓
TwoOrgsChannel
的通道创建交易写入channel.tx
。1
configtxgen -outputCreateChannelTx ./channel-artifacts/channel.tx -profile TwoOrgsChannel -channelID mychannel
输出组织1和2的锚节点
1
2
3
4
5
6
7
8
9
10
11
12configtxgen -outputAnchorPeersUpdate ./channel-artifacts/org1_anchor_peer.tx -profile TwoOrgsChannel -asOrg Org1MSP -channelID mychannel
configtxgen -outputAnchorPeersUpdate ./channel-artifacts/org2_anchor_peer.tx -profile TwoOrgsChannel -asOrg Org2MSP -channelID mychannel
若出错,Org1,即peer节点的配置少了下面的属性:
# 每个peer节点 配属一个锚节点
AnchorPeers:
# AnchorPeers defines the location of peers which can be used
# for cross org gossip communication. Note, this value is only
# encoded in the genesis block in the Application section context
- Host: peer0.org1.example.com
Port: 7051查看创世区块 将通道创建交易
create_chan_tx.pb
以 JSON 的格式打印到屏幕上。1
configtxgen -inspectBlock ./channel-artifacts/genesis.block
查看创建通道的交易 将创世区块
channel.tx
以 JSON 格式打印到屏幕上。1
configtxgen -inspectChannelCreateTx ./channel-artifacts/channel.tx
打印组织定义 基于
configtx.yaml
的配置项(比如 MSPdir)来构建组织并以 JSON 格式打印到屏幕。(常用于创建通道时的重新配置,例如添加成员)1
configtxgen -printOrg Org1MSP
部署节点
创建一个 peer 节点
在创建 peer 节点之前,你需要为 peer 节点定制配置文件core.yaml。
方法一:直接启动
方法二:启动docker容器(推荐)
创建一个orderer 节点
在创建 orderer 节点之前,你需要为 orderer 节点定制配置文件orderer.yaml。
启动docker容器(推荐)
基于docker-compose创建节点容器
参考Fabric-sample的官方配置
docker-compose.yaml文件如下:
1 | # Copyright IBM Corp. All Rights Reserved. |
运行docker-compose生成容器:
1 | docker-compose up -d |
节点与通道
peer节点需要创建、加入、更新channel
参考命令:peer channel
- 在cli1中创建新通道
使用 orderer.example.com:7050
创建新的通道 mychannel
,配置交易同样定义在 ./channel-artifacts/channel.tx
文件中,CA证书文件路径,注意尽量不要使用相对路径!注意此处的CA证书地址是order的msp证书地址!
1 | peer channel create -c mychannel --orderer orderer.example.com:7050 -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem |
将cli1创建的mychannel.block 分发给需要加入此通道的容器
在其他需要加入的容器中运行,如从cli1将block 复制到 cli2:
1 | docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./ |
节点加入channel
在每个需要加入的容器中运行:
1 | peer channel join -b mychannel.block |
链码的安装与运行
本次以Fabric sample中的 fabcar 为例
将fabcar的代码文件放到docker的映射文件夹中
1
cp fabcar.go /chaincode/go
进入peer节点容器
1
docker exec -it cli1 bash
为链码文件安装依赖
1
2
3
4
5
6
7cd /opt/gopath/src/github.com/hyperledger/fabric/fabric-cluster/chaincode/go
go env -w GOPROXY=https://goproxy.cn,direct
go mod init
go mod vendor打包链码,参考 peer lifecycle chaincode 命令
1
peer lifecycle chaincode package fabcar.tar.gz --path /opt/gopath/src/github.com/hyperledger/fabric/fabric-cluster/chaincode/go --label fabcar
同理,在需要安装的peer节点上打包此链码。
在每一个需要安装的节点上安装链码
1
peer lifecycle chaincode install fabcar.tar.gz
每一个需要安装的节点都批准该链码,只有每一个组织都批准过后,该链码才能被安装在通道上。注意此处的CA证书地址是order的msp证书地址!
1
2
3
4peer lifecycle chaincode approveformyorg --channelId mychannel --name fabcar --version 1.0 --init-required --package-id xxx由安装时系统产生 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
如:
peer lifecycle chaincode approveformyorg --channelID mychannel --name fabcar --version 1.0 --init-required --package-id fabcar:3c3ee1baf40bcc1dc01148a53b7ff5192daed0de4514729020668f826864a119 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem其中package-id是安装链码时产生的,相同的链码产生的id是相同的。如:
fabcar:5af17c1dfebb54dfd8f7a58f1a3a12283b39132ce4273c6ae3b6fbfb994eb9b6
查询是否已经批准
1
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
选择一个Peer节点提交链码即可
1
2
3
4
5peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID mychannel --name fabcar --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses peer0.org1.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses peer0.org2.example.com:9051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt注意此处的参数包括:order证书、各peer的地址和ca证书
测试链码
invoke 执行,会对区块数据产生影响,需要审核验证
1
2
3
4
5
6peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar --isInit --ordererTLSHostnameOverride orderer.example.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses peer0.org1.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses peer0.org2.example.com:9051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
-c '{"Args":["InitLedger"]}'
* query 查询,单纯查询,不对数据产生影响
1
2
3
peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryAllCars"]}'
peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR4"]}'
总结:
- Fabric基于配置文件
crypt_config.yaml
生成ca、orderer、peer等节点的公私钥和CA颁发的证书。 - Fabric基于配置文件
configtx.yaml
生成包含系统channel配置信息的区块和组织节点的交易记录。 - Docker基于环境变量生成相应容器
- CLI节点创建通道并加入通道中
- CLI节点打包、安装、批准、提交、运行链码
参考:
https://tinywell.com/2019/12/04/chaincode-lifecycle/
https://www.bilibili.com/video/BV1EK4y1o73U/?spm_id_from=trigger_reload
https://hyperledger-fabric.readthedocs.io/zh_CN/release-2.2/commands/peerlifecycle.html