hyperledger-fabric 手动部署最小网络架构
环境准备
hyperledger-fabric 镜像,可参考 hyperledger-fabric 环境安装与源码编译 自己编译镜像,或者在 DockerHub 上拉取相关镜像
链码,完整的区块链中至少包含一个安装有链码的节点,可参考 hyperledger-fabric 区块链链码打包与安装 编译链码
DNS 服务,提供区块链域名解析功能,也可直接配置
hosts
文件及启动Docker
容器时指定IP:域名映射。DNS服务可参考 使用 docker 快速搭建 dnsmasq 服务
区块链部署
当前文档以 hyperledger fabric
区块链最小化网络架构来说明如何手动部署 fabric
区块链
区块链相关术语参考:术语表
以下内容参考自 fabric-samples 中 test-network
目录下脚本
新建区块链部署目录
/opt/product/blockchain
shell 1
2mkdir -p /opt/product/blockchain
cd /opt/product/blockchain以下所有非容器内操作均在此目录下进行
创建区块链部署 docker network
shell 1
2export BC_NET=blockchain
docker network ls | grep ${BC_NET} || docker network create ${BC_NET}通过
.env
文件,指定后面fabric
区块链使用的 docker 镜像版本shell 1
echo "IMAGE_TAG=2.2" > .env
启动 fabric-cli
使用 hyperledger/fabric-tools
作为 hyperledger-fabric
区块链的命令行工具镜像。
根据 fabric 仓库中 images/tools/Dockerfile
内容可知该镜像包含了 fabric
编译的各个命令行工具,位于镜像内 /usr/local/bin
目录下。
创建
docker-compose
脚本存放路径shell 1
mkdir docker
使用
docker-compose
作为编排工具,添加名为compose-cli.yml
的 compose 编排脚本,使用hyperledger/fabric-tools
作为镜像示例如下:
docker/compose-cli.yml 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22version: "3"
networks:
default:
external:
name: blockchain
services:
fabric-cli:
image: hyperledger/fabric-tools:${IMAGE_TAG}
container_name: fabric-cli
restart: always
tty: true
stdin_open: true
command: /bin/bash
environment:
- TZ=Asia/Shanghai
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_TLS_ENABLED=true
working_dir: /opt/blockchain/
volumes:
- $PWD/:/opt/blockchain/启动
fabric-cli
shell 1
docker-compose -p fabric-cli -f docker/compose-cli.yml up -d
MSP 证书
进入
fabric-cli
容器sehll 1
docker exec -it fabric-cli bash
创建生成证书的配置文件存放目录
shell 1
mkdir -p organizations/cryptogen
cryptogen 配置模板
具体配置项目可参考模板配置,生成默认配置文件命令
1 | cryptogen showtemplate > organizations/cryptogen/crypto-config.yaml |
说明:
crypto-config.yaml
是 MSP 和 TLS 相关文件的依赖配置文件。它将 Orderer 和 Peer 两种节点的 MSP 都定义到了同一个文件中。
该文件的主要作用:
指定网络的拓扑结构
通过配置模板信息,来定义组织成员对应的结构。
cryptogen
工具可以快速根据该配置文件自动批量生成所需要的密钥和证书文件。
crypto-config.yaml
指定了网络的拓扑结构,主要包括 OrdererOrgs
以及 PeerOrgs
两部分。
可参考该文件中各个配置项注释按需求修改
生成证书
使用 cryptogen
工具生成组织证书,可以如同 cryptogen 配置模板 把多个组织、节点写在同一文件中直接一次生成所需的 MSP 证书文件。不过我们先把 Peer
与 Orderer
组织拆分为如下两部分来生成,便于理解。
Orderer 节点
参考模板配置文件,编写
Orderer
节点证书配置文件crypto-orderer0.yml
,并存放于organizations/cryptogen/
目录下organizations/cryptogen/crypto-orderer0.yml 1
2
3
4
5
6
7
8
9
10OrdererOrgs:
- Name: Orderer
Domain: example.com # orderer 节点域名
EnableNodeOUs: true
CA:
Country: CN
Province: SiChuan
Locality: Chengdu
Specs:
- Hostname: orderer0 # 生成证书为 hostname.DomainPeer 节点
参考模板配置文件,编写
Peer
组织节点证书配置文件crypto-org1.yml
,并存放于organizations/cryptogen/
目录下organizations/cryptogen/crypto-org1.yml 1
2
3
4
5
6
7
8
9
10
11
12PeerOrgs:
- Name: Org1
Domain: org1.example.com # peer 节点域名
EnableNodeOUs: false
CA:
Country: CN
Province: SiChuan
Locality: Chengdu
Template:
Count: 1 # 根据 Count 有多少生成当前组织下多少个 peer 节点证书,例:peer*.Domain
Users:
Count: 1 # 除管理员外的用户数
在 fabric-cli
容器中使用 cryptogen
工具生成组织证书,生成的证书文件默认存放在 crypto-config
目录下,我们使用 --output
选项输出到 organizations
目录下:
1 | cryptogen generate --config=organizations/cryptogen/crypto-orderer0.yml --output=organizations |
生成证书后 organizations
目录如下所示:
1 | organizations/ |
通道配置文件
准备配置文件
- 进入
fabric-cli
容器
1 | docker exec -it fabric-cli bash |
- 新建
fabric
文件夹用于存放区块链相关配置,并复制一份生成通道配置文件需要的配置文件configtx.yaml
到该文件夹下
1 | mkdir fabric |
说明:
configtx.yaml
包含网络的定义,并给出了网络组件的拓扑结构还指出每个网络实体的加密材料的存储位置。用来编写、配置系统通道初始区块文件,新建应用通道配置文件,锚节点配置更新交易文件等。
该文件的主要作用:
配置一系列通道配置模板,包括
Orderer
系统通道模板和应用通道类型模板一系列组织结构定义,被其他部分引用。这里的组织结构,要和 crypto-config.yaml 中定义的组织结构一致。因为每一个组织都要靠前者生成一套证书和密钥文件
定义
Orderer
系统通道相关配置,包括 Orderer 服务配置和参与 Ordering 服务的组织信息定义应用通道相关配置,主要包括参与应用网络的可用组织信息
在 configtx.yaml
文件,主要以下个部分组成:
Organizationtions:定义了不同的组织标志,这些标志将在 Profile 部分被引用。
Capabilities:该部分用于定义区块链网络的功能。
Application:该部分定义了交易配置相关的值,以及包含和创世区块相关的值。
Orderer:定义了排序服务的相关参数,这些参数将用于创建创世区块。
Channel:该部分定义了交易配置相关的值,以及包含和创世区块相关的值。
Profile:不同配置的概要文件可以在这里进行编码,将 Profile 参数指定为
configtxgen
工具的参数。指定联盟的配置文件用于生成 orderer 创世块。
生成通道配置文件
configtx.yaml
中使用到的 yaml 语法如下:
符号 | 含义 |
---|---|
<< |
合并到当前数据 |
- |
数组 |
* |
别名 |
& |
锚点 |
修改
configtx.yaml
配置文件,示例如下:备注:详细内容请参考配置文件中注释进行修改,以下内容仅供参考
fabric/configtx.yaml >folded 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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# Organizations配置段用来定义组织机构实体,以便在后续配置中引用
Organizations:
-
# 组织名称
Name: OrdererOrg
# 组织ID,ID是引用组织的关键
ID: OrdererMSP
# 组织的MSP证书路径,对应 crypto-config.yaml 中 orderer 组织生成的 MSP 证书路径。按实际域名修改
MSPDir: ../organizations/ordererOrganizations/example.com/msp/
# 定义本层级的组织策略,保持默认即可
Policies:
Readers:
Type: Signature
Rule: "OR('OrdererMSP.member')"
Writers:
Type: Signature
Rule: "OR('OrdererMSP.member')"
Admins:
Type: Signature
Rule: "OR('OrdererMSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('OrdererMSP.peer')"
# 设置为 orderer,域名加访问端口
OrdererEndpoints:
- orderer0.example.com:7050
#### NAME 和 ID要保持一致, 创建通道配置时, 使用的是NAME字段, 在使用API时用的mspId, 也就是ID字段
#### 通过 configtxgen -inspectChannelCreateTx ./channel-artifacts/sample-channel.tx | jq
#### 命令可以查看通道配置
-
Name: SampleMSP
ID: SampleMSP
# 组织的MSP证书路径,对应 crypto-config.yaml 中 peer 组织生成的 MSP 证书路径。按实际域名修改
MSPDir: ../organizations/peerOrganizations/org1.example.com/msp/
Policies:
Readers:
Type: Signature
Rule: "OR('SampleMSP.admin', 'SampleMSP.peer', 'SampleMSP.client')"
Writers:
Type: Signature
Rule: "OR('SampleMSP.admin', 'SampleMSP.client')"
Admins:
Type: Signature
Rule: "OR('SampleMSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('SampleMSP.peer')"
# 定义组织的主节点
AnchorPeers:
# 主节点的host地址
- Host: peer0.org1.example.com
# 主节点开放的端口号
Port: 7051
# Capabilities 段用来定义区块链网络的能力
Capabilities:
# Channel配置同时应用于orderer节点与peer节点,并且必须被两种节点同时支持
# 将该配置项设置为ture表明要求节点具备该能力,false则不要求该节点具备该能力
Channel:
V2_0: true
# Orderer功能仅适用于orderers,可以安全地操作,而无需担心升级peers
# 将该配置项设置为ture表明要求节点具备该能力,false则不要求该节点具备该能力
Orderer:
V2_0: true
# 应用程序功能仅适用于Peer网络,可以安全地操作,而无需担心升级或更新orderers
# 将该配置项设置为ture表明要求节点具备该能力,false则不要求该节点具备该能力
Application:
V2_0: true
# Application配置段用来定义要写入创世区块或配置交易的应用参数
# 自定义被引用的地址
Application:
# Organizations配置列出参与到网络中的机构清单
Organizations:
# 定义本层级的应用控制策略
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
LifecycleEndorsement:
Type: ImplicitMeta
Rule: "MAJORITY Endorsement"
Endorsement:
Type: ImplicitMeta
Rule: "MAJORITY Endorsement"
# Capabilities配置描述应用层级的能力需求,这里直接引用
# 前面Capabilities配置段中的ApplicationCapabilities配置项
Capabilities:
<<:
# Orderer配置段用来定义要编码写入创世区块或通道交易的排序节点参数
Orderer:
# 排序节点类型用来指定要启用的排序节点实现,不同的实现对应不同的共识算法。
OrdererType: etcdraft
# 定义了EtcdRaft排序类型被选择时的配置
EtcdRaft:
Consenters:
- Host: orderer0.example.com
Port: 7050
ClientTLSCert: ../organizations/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt
ServerTLSCert: ../organizations/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt
BatchTimeout: 2s
BatchSize:
# 将多少个消息打包成一个区块
MaxMessageCount: 200
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 2048 KB
# 参与维护Orderer的组织,默认为空
Organizations:
# 定义本层级的排序节点策略
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
BlockValidation:
Type: ImplicitMeta
Rule: "ANY Writers"
# Channel配置段用来定义要写入创世区块或配置交易的通道参数
Channel:
# 定义本层级的通道访问策略
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
# Writes策略定义了调用Broadcast API提交交易的许可规则
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
# Admin策略定义了修改本层级配置的许可规则
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
# Capabilities配置描通道层级的能力需求,这里直接引用
# 前面Capabilities配置段中的ChannelCapabilities配置项
Capabilities:
<<:
Profiles:
# 用来生成orderer启动时所需的block,用于生成创世区块,名字可以任意
# 需要包含Orderer和Consortiums两部分
SampleOrdererGenesis:
# 通道为默认配置,这里直接引用上面channel配置段中的ChannelDefaults
<<:
Orderer:
# Orderer为默认配置,这里直接引用上面orderer配置段中的OrdererDefaults
<<:
Organizations:
# 这里直接引用上面Organizations配置段中的OrdererOrg
-
Capabilities:
# 这里直接引用上面Capabilities配置段中的OrdererCapabilities
<<:
# 联盟为默认的 sampleBC 联盟,添加了一个组织,表示orderer所服务的联盟列表
Consortiums:
# 创建更多应用通道时的联盟引用 SampleChannel 所示
sampleBC:
Organizations:
- *SampleOrg1 # 上面 Organizations 中 peer
# 用来生成channel配置信息,名字可以任意
# 需要包含Consortium和Applicatioon两部分
SampleChannel:
# 通道所关联的联盟名称
Consortium: sampleBC
# 通道为默认配置,这里直接引用上面channel配置段中的ChannelDefaults
<<:
Application:
# 这里直接引用上面Application配置段中的ApplicationDefaults
<<:
Organizations:
- *SampleOrg1 # 上面 Organizations 中 peer
Capabilities:
# 这里直接引用上面Capabilities配置段中的ApplicationCapabilities
<<:设置
FABRIC_CFG_PATH
环境变量,configtxgen
工具需要这个变量才能找到configtx.yaml
shell 1
export FABRIC_CFG_PATH=$PWD/fabric
生成创世区块
其中
SampleOrdererGenesis
可在configtx.yaml
配置文件中Profiles
下找到shell 1
2configtxgen -profile SampleOrdererGenesis -channelID system-channel \
-outputBlock channel-artifacts/genesis.block创建业务通道配置
其中
SampleChannel
可在configtx.yaml
配置文件中Profiles
下找到shell 1
2
3
4
5
6export MSP_CHANNEL_PROFILE=SampleChannel
# 业务通道名
export CHANNEL_NAME=sample-channel
# 创建业务通道
configtxgen -profile ${MSP_CHANNEL_PROFILE} -outputCreateChannelTx channel-artifacts/${CHANNEL_NAME}.tx \
-channelID ${CHANNEL_NAME}根据
configtx.yaml
配置文件中peer
组织生成该组织锚节点配置其中
SampleMSP
是configtx.yaml
中Organizations
下组织shell 1
2
3
4
5# peer MSP_NAME
export ORG_MSP=SampleMSP
# 生成锚节点配置
configtxgen -profile ${MSP_CHANNEL_PROFILE} -outputAnchorPeersUpdate channel-artifacts/${ORG_MSP}anchors.tx \
-channelID ${CHANNEL_NAME} -asOrg ${ORG_MSP}
上述三步均没报错的情况,则表明通道配置创建成功,可以看到 channel-artifacts
目录下有对应生成的三个文件
1 | channel-artifacts/ |
启动区块链节点服务
在 DNS 服务器上添加
Orderer
与Peer
节点的域名与部署所在宿主机的 IP 映射保留当前操作容器的终端,并新开一个终端进入部署区块链的目录
/opt/product/blockchain
Orderer
在
docker
目录下创建Orderer
节点的docker-compose
编排文件,参考如下:docker/compose-orderer0.yml 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
47version: "3"
networks:
default:
external:
name: blockchain
volumes:
orderer0.example.com: {}
services:
orderer0.example.com:
image: hyperledger/fabric-orderer:${IMAGE_TAG}
container_name: orderer0.example.com
restart: always
working_dir: /opt/orderer
command: orderer
environment:
- TZ=Asia/Shanghai
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_LISTENPORT=7050
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/orderer/msp
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/orderer/tls/ca.crt]
- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/etc/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/etc/hyperledger/orderer/tls/server.key
volumes:
# 创世块文件路径
- $PWD/channel-artifacts/genesis.block:/var/hyperledger/orderer/genesis.block
# orderer 节点证书路径
- $PWD/organizations/ordererOrganizations/example.com/orderers/orderer0.example.com/:/etc/hyperledger/orderer
# orderer 数据持久化存储
- orderer0.example.com:/var/hyperledger/production/
ports:
- "7050:7050"
logging:
driver: json-file
options:
max-size: "1024m"启动 Orderer 节点
shell 1
docker-compose -p orderer -f docker/compose-orderer0.yml up -d
开放 Orderer 节点防火墙端口
shell 1
2firewall-cmd --zone=public --permanent --add-port=7050/tcp
firewall-cmd --reload
Peer
在
docker
目录下创建Peer
节点的docker-compose
编排文件,参考如下:docker/compose-org1-peer0.yml 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
80version: '3'
networks:
default:
external:
name: blockchain
volumes:
peer0.org1.example.com: {}
# 数据库存储文件
couch.peer0.org1.example.com: {}
services:
couchdb:
image: couchdb:3.1
container_name: couch.peer0.org1.example.com
restart: always
environment:
- TZ=Asia/Shanghai
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=adminpw
volumes:
- couch.peer0.org1.example.com:/opt/couchdb/data
# 如需外部访问数据库,映射如下端口即可
# ports:
# - "5984:5984"
peer0.org1.example.com:
image: hyperledger/fabric-peer:${IMAGE_TAG}
container_name: peer0.org1.example.com
restart: always
working_dir: /opt/peer
command: peer node start
environment:
- TZ=Asia/Shanghai
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=host
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/peer/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/peer/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/peer/tls/ca.crt
- CORE_PEER_TLS_CLIENTROOTCAS_FILE=/etc/hyperledger/peer/tls/ca.crt
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
# 填写当前 peer 节点对应的域名
- CORE_PEER_ID=peer0.org1.example.com
- CORE_PEER_ADDRESS=0.0.0.0:7051
# 填写当前 peer 节点对应的域名
- CORE_PEER_LISTENADDRESS=peer0.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/msp
# 与 configtx.yaml 中一致
- CORE_PEER_LOCALMSPID=SampleMSP
- CORE_PEER_GOSSIP_BOOTSTRAP=127.0.0.1:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
# couchDB 数据库容器
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couch.peer0.org1.example.com:5984
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw
# 构建链码的镜像
- CORE_CHAINCODE_BULDER=hyperledger/fabric-ccenv:${IMAGE_TAG}
# GO 链码基础镜像
- CORE_CHAINCODE_GOLANG_RUNTIME=hyperledger/fabric-baseos:${IMAGE_TAG}
volumes:
# 为 peer 节点提供宿主机 docker api 构建并启动链码
- /var/run/docker.sock:/host/var/run/docker.sock
# 当前 peer 节点证书路径
- $PWD/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/peer/
# peer 节点数据持久化存储
- peer0.org1.example.com:/var/hyperledger/production
ports:
- "7051:7051"
logging:
driver: json-file
options:
max-size: "1024m"
depends_on:
- couchdb启动 Peer 节点
shell 1
docker-compose -p peer -f docker/compose-org1-peer0.yml up -d
开放 Peer 节点防火墙端口
shell 1
2firewall-cmd --zone=public --permanent --add-port=7051-7052/tcp
firewall-cmd --reload
通道设置
切换到
fabric-cli
容器终端,并设置FABRIC_CFG_PATH
环境变量,peer
工具需要这个变量才能找到core.yaml
shell 1
export FABRIC_CFG_PATH=/etc/hyperledger/fabric/
设置创建通道需要的环境变量
shell 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21export ORDERER_ORG_NODE=orderer0
export ORDERER_ORG_DOMAIN=example.com
export PEER_ORG_NODE=peer0
export PEER_ORG_DOMAIN=org1.example.com
# 业务通道名
export CHANNEL_NAME=sample-channel
# peer MSPID,与 configtx.conf 中配置一致
export CORE_PEER_LOCALMSPID=SampleMSP
# orderer 节点访问地址
export ORDERER_ENDPOINT=${ORDERER_ORG_NODE}.${ORDERER_ORG_DOMAIN}:7050
# orderer CA 证书
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/${ORDERER_ORG_DOMAIN}/tlsca/tlsca.${ORDERER_ORG_DOMAIN}-cert.pem
# 当前 peer 节点根证书
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/ca.crt
# peer 节点管理员 MSP 配置路径
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/users/Admin@${PEER_ORG_DOMAIN}/msp/
# 当前 peer 节点访问地址
export CORE_PEER_ADDRESS=${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}:7051
export CORE_PEER_TLS_CERT_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/server.crt
export CORE_PEER_TLS_KEY_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/server.key
export CORE_PEER_TLS_CLIENTROOTCAS_FILE=${PWD}/organizations/peerOrganizations/${PEER_ORG_DOMAIN}/peers/${PEER_ORG_NODE}.${PEER_ORG_DOMAIN}/tls/ca.crt创建通道
shell 1
2
3peer channel create -o ${ORDERER_ENDPOINT} -c ${CHANNEL_NAME} \
-f channel-artifacts/${CHANNEL_NAME}.tx \
--outputBlock channel-artifacts/${CHANNEL_NAME}.block --tls --cafile ${ORDERER_CA}当前 peer 节点加入通道
shell 1
peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block
验证 peer 节点是否加入通道中
shell 1
peer channel getinfo -c ${CHANNEL_NAME}
更新主节点信息
shell 1
2peer channel update -o ${ORDERER_ENDPOINT} -c ${CHANNEL_NAME} \
-f channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA
至此,Hyperledger Fabric
区块链最小化网络架构(单一组织、1 peer、1 Orderer)部署完毕。不过仅部署完节点还无法使用区块链,要想能够使数据上下链还得部署链码(chaincode)才行。
- 本文标题:hyperledger-fabric 手动部署最小网络架构
- 本文作者:akiya
- 本文链接:https://little-star.love/posts/ae361aeb/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!