Hyperledger Fabric - 自定义network.sh脚本

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

该系列参考:https://blog.csdn.net/ling1998?type=blog

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

创建自己的网络目录

进入fabric-samples目录

bash 复制代码
cd $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples

创建文件夹test-network-myself

bash 复制代码
mkdir test-network-myself

进入test-network-myself目录

bash 复制代码
cd test-network-myself

创建并编辑crypto-config.yaml

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

创建crypto-config.yaml文件

bash 复制代码
touch crypto-config.yaml

编辑crypto-config.yaml文件

bash 复制代码
vim crypto-config.yaml

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

yaml 复制代码
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

生成组织及证书

bash 复制代码
cryptogen generate --config=./crypto-config.yaml --output="organizations"

解释:

cryptogen generate命令中的参数:

--output="organizations" 用来存放构建的输出目录

--config=./crypto-config.yaml 使用的配置文件,即第2步中创建的文件

查看organization目录
bash 复制代码
[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    #组织成员目录
│           └── [email protected] #至少有一个管理员
│               ├── msp
│               │   ├── admincerts
│               │   ├── cacerts
│               │   │   └── ca.example.com-cert.pem
│               │   ├── config.yaml
│               │   ├── keystore  #账号的私钥
│               │   │   └── priv_sk 
│               │   ├── signcerts #符合X.509的节点或者账户证书文件
│               │   │   └── [email protected]   
│               │   └── 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
    │       ├── [email protected]
    │       │   ├── msp
    │       │   │   ├── admincerts
    │       │   │   ├── cacerts
    │       │   │   │   └── ca.org1.example.com-cert.pem
    │       │   │   ├── config.yaml
    │       │   │   ├── keystore
    │       │   │   │   └── priv_sk
    │       │   │   ├── signcerts
    │       │   │   │   └── [email protected]
    │       │   │   └── tlscacerts
    │       │   │       └── tlsca.org1.example.com-cert.pem
    │       │   └── tls
    │       │       ├── ca.crt
    │       │       ├── client.crt
    │       │       └── client.key
    │       └── [email protected]
    │           ├── msp
    │           │   ├── admincerts
    │           │   ├── cacerts
    │           │   │   └── ca.org1.example.com-cert.pem
    │           │   ├── config.yaml
    │           │   ├── keystore
    │           │   │   └── priv_sk
    │           │   ├── signcerts
    │           │   │   └── [email protected]
    │           │   └── 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
            ├── [email protected]
            │   ├── msp
            │   │   ├── admincerts
            │   │   ├── cacerts
            │   │   │   └── ca.org2.example.com-cert.pem
            │   │   ├── config.yaml
            │   │   ├── keystore
            │   │   │   └── priv_sk
            │   │   ├── signcerts
            │   │   │   └── [email protected]
            │   │   └── tlscacerts
            │   │       └── tlsca.org2.example.com-cert.pem
            │   └── tls
            │       ├── ca.crt
            │       ├── client.crt
            │       └── client.key
            └── [email protected]
                ├── msp
                │   ├── admincerts
                │   ├── cacerts
                │   │   └── ca.org2.example.com-cert.pem
                │   ├── config.yaml
                │   ├── keystore
                │   │   └── priv_sk
                │   ├── signcerts
                │   │   └── [email protected]
                │   └── 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文件,因此一起拷贝

bash 复制代码
cp ../test-network/organizations/ccp-* ./organizations/

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

执行ccp-generate.sh脚本

bash 复制代码
./organizations/ccp-generate.sh 

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

启动网络

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

bash 复制代码
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

bash 复制代码
export DOCKER_SOCK=/var/run/docker.sock #设置环境变量

使用docker-compose启动网络

bash 复制代码
docker-compose -f docker/docker-compose-test-net.yaml up -d

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

bash 复制代码
docker ps -a

关闭自己搭建的网络

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

bash 复制代码
docker-compose -f docker/docker-compose-test-net.yaml down --volumes --remove-orphans

删除节点目录

bash 复制代码
rm -rf ./organizations/*Organizations

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

提前条件:

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

bash 复制代码
[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

bash 复制代码
touch network-myself.sh 

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

bash 复制代码
chmod +x network-myself.sh 

编写启动/关闭网络脚本

bash 复制代码
vi network-myself.sh 

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

bash 复制代码
#!/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

bash 复制代码
./network-myself.sh up

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

bash 复制代码
./network-myself.sh down