引言:依据hyperledger fabric提供的测试网络脚本搭建自己的网络环境

执行./network.sh up 将调用脚本中networkUp()函数,函数解析如下图所示

img

创建自己的网络目录

进入fabric-samples目录

1
cd $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples

创建文件夹test-network-myself

1
mkdir test-network-myself

进入test-network-myself目录

1
cd test-network-myself

创建并编辑crypto-config.yaml

因hyperledger fabri是许可网络,任何节点的网络参与者都需要有证书才可以访问网络,证书是证明能够访问网络的通行证

创建crypto-config.yaml文件

1
touch crypto-config.yaml

编辑crypto-config.yaml文件

1
vim crypto-config.yaml

文件中创建2个peer节点,一个order排序节点,两个organization组织

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
OrdererOrgs: # 排序节点配置
- Name: Orderer # 组织名称
Domain: example.com # 组织域名
EnableNodeOUs: true # 设置为true,将会在msp目录下生成config.yaml文件
Specs:
- Hostname: orderer # 主机名称
SANS:
- localhost # 除主机名称外的别名
PeerOrgs: # peer节点配置
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: true
Template: # 使用模板,将自动生成hostname,以peer0到peerN-1的顺序生成
Count: 1 # peer节点个数
SANS:
- localhost
Users:
Count: 1 # peer节点中用户数量,除了管理员以外的用户数量
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 1
SANS:
- localhost
Users:
Count: 1

生成组织及证书

1
cryptogen generate --config=./crypto-config.yaml --output="organizations"

解释:
cryptogen generate命令中的参数:

–output=”organizations” 用来存放构建的输出目录
–config=./crypto-config.yaml 使用的配置文件,即第2步中创建的文件

查看organization目录
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
[root@localhost test-network-myself]# tree organizations
organizations
├── ordererOrganizations #排序组织
│ └── example.com #配置文件中的域名作为目录
│ ├── ca #证书文件目录
│ │ ├── ca.example.com-cert.pem #公钥
│ │ └── priv_sk #私钥
│ ├── msp #存放签名用的证书文件和加密用的私钥文件
│ │ ├── admincerts #超级管理员,管理排序节点
│ │ ├── cacerts #根CA证书,可颁发其它证书
│ │ │ └── ca.example.com-cert.pem #加密证书
│ │ ├── config.yaml
│ │ └── tlscacerts #TLS根CA证书,网络安全协议
│ │ └── tlsca.example.com-cert.pem #加密证书
│ ├── orderers #配置文件中的排序节点名称作为目录,
│ │ └── orderer.example.com #配置文件中的排序节点名称.域名作为目录
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ │ └── ca.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── orderer.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── priv_sk
│ │ └── tlsca.example.com-cert.pem
│ └── users #组织成员目录
│ └── Admin@example.com #至少有一个管理员
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore #账号的私钥
│ │ │ └── priv_sk
│ │ ├── signcerts #符合X.509的节点或者账户证书文件
│ │ │ └── Admin@example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── peerOrganizations #peer组织
├── org1.example.com #配置文件中的域名作为目录
│ ├── ca
│ │ ├── ca.org1.example.com-cert.pem
│ │ └── priv_sk
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ ├── peers
│ │ └── peer0.org1.example.com
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── priv_sk
│ │ └── tlsca.org1.example.com-cert.pem
│ └── users
│ ├── Admin@org1.example.com
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── Admin@org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ └── User1@org1.example.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── User1@org1.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── org2.example.com
├── ca
│ ├── ca.org2.example.com-cert.pem
│ └── priv_sk
├── msp
│ ├── admincerts
│ ├── cacerts
│ │ └── ca.org2.example.com-cert.pem
│ ├── config.yaml
│ └── tlscacerts
│ └── tlsca.org2.example.com-cert.pem
├── peers
│ └── peer0.org2.example.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org2.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── peer0.org2.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org2.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── server.crt
│ └── server.key
├── tlsca
│ ├── priv_sk
│ └── tlsca.org2.example.com-cert.pem
└── users
├── Admin@org2.example.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org2.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── Admin@org2.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org2.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── User1@org2.example.com
├── msp
│ ├── admincerts
│ ├── cacerts
│ │ └── ca.org2.example.com-cert.pem
│ ├── config.yaml
│ ├── keystore
│ │ └── priv_sk
│ ├── signcerts
│ │ └── User1@org2.example.com-cert.pem
│ └── tlscacerts
│ └── tlsca.org2.example.com-cert.pem
└── tls
├── ca.crt
├── client.crt
└── client.key

93 directories, 85 files

生成通用连接配置文件(json与yaml文件格式)

拷贝测试网络中的ccp-generate.sh脚本文件及ccp模板文件

因ccp-generate.sh脚本使用了ccp-template.yaml文件与ccp-template.json文件,因此一起拷贝

1
cp ../test-network/organizations/ccp-* ./organizations/

ccp-generate.sh ccp-template.json ccp-template.yaml ordererOrganizations peerOrganizations

执行ccp-generate.sh脚本

1
./organizations/ccp-generate.sh 

这会 在peer节点目录中生成json与yaml文件

启动网络

拷贝测试网络中的docker-compose-net.yaml文件

1
2
3
4
mkdir docker
cp ../test-network/docker/docker-compose-test-net.yaml docker/ #拷贝文件
[root@localhost test-network-myself]# ls docker #查看拷贝的文件
docker-compose-test-net.yaml

设置环境变量DOCKER_SOCK

1
export DOCKER_SOCK=/var/run/docker.sock #设置环境变量

使用docker-compose启动网络

1
docker-compose -f docker/docker-compose-test-net.yaml up -d

使用docker ps命令查看生成的容器

1
docker ps -a

关闭自己搭建的网络

停止并删除容器、网络、卷、镜像

1
docker-compose -f docker/docker-compose-test-net.yaml down --volumes --remove-orphans

删除节点目录

1
rm -rf ./organizations/*Organizations

生成执行启动/关闭网络脚本

提前条件:

执行完上面步骤将保留配置文件(5个),下面的脚本将基于这5个配置文件运行:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost test-network-myself]# tree 
.
├── crypto-config.yaml #生成组织节点加密配置文件
├── docker
│ └── docker-compose-test-net.yaml #启动网络配置文件
├── organizations
│ ├── ccp-generate.sh #生成通用连接配置文件脚本
│ ├── ccp-template.json #生成通用连接配置文件json格式模板
│ └── ccp-template.yaml #生成通用连接配置文件yaml格式模板
├── scripts
└── system-genesis-block
└── genesis.block

创建脚本文件network-myself.sh

1
touch network-myself.sh 

授权network-myself.sh为可执行文件

1
chmod +x network-myself.sh 

编写启动/关闭网络脚本

1
vi network-myself.sh 

回车,按键盘上的 i 键或 Insert 功能键,进入编辑状态,脚本内容如下:

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
#!/bin/bash


#开启自己的测试网络
function networkUpMyself() {
# 关闭自己的测试网络
networkDownMyself

set -x
# 生成组织及证书
cryptogen generate --config=./crypto-config.yaml --output="organizations"

# 执行ccp-generate.sh脚本,生成通用连通配置文件
./organizations/ccp-generate.sh

# 启动网络
export DOCKER_SOCK=/var/run/docker.sock
docker-compose -f $COMPOSE_FILE_BASE up -d

set +x
}

#关闭自己的测试网络
function networkDownMyself() {

set -x

#停止和删除容器、网络、卷、镜像
export DOCKER_SOCK=/var/run/docker.sock
docker-compose -f $COMPOSE_FILE_BASE down --volumes --remove-orphans

#删除节点目录
rm -rf ./organizations/*Organizations

set +x
}

# docker-compose yaml文件地址
COMPOSE_FILE_BASE=docker/docker-compose-test-net.yaml

#参数命令
MODE=$1


if [ "${MODE}" == "up" ]; then
echo "开启自己的测试网络"
networkUpMyself
elif [ "${MODE}" == "down" ]; then
echo "关闭自己的测试网络"
networkDownMyself
else
echo "up 开启自己的测试网络"
echo "down 关闭自己的测试网络"
exit 1
fi

测试开启网络network-myself.sh up

1
./network-myself.sh up

测试关闭网络network-myself.sh down

1
./network-myself.sh down