在这里我推荐两位大神的博客,可以参考或者直接跟着这两位大神学习,我是阅读这两位大神的博客和《深度探索区块链Hyperledger技术与应用》一书部署的
《深度探索区块链Hyperledger技术与应用》作者:张增骏、董宁、朱轩彤、陈剑雄 著。
深蓝大大:https://www.cnblogs.com/studyzy/category/1024666.html
Aberic大神:https://www.cnblogs.com/aberic/category/1148898.html
在前两篇文章中介绍了如何通过官方示例单机启动Farbic网络,这篇文章开始是以多机部署,做个笔记以防自己忘掉,也可以分享出来请大家帮我看看哪里有不对的地方,如果对你有帮助可以点个赞。
我用的是阿里云的服务器、docker版本:Docker version 18.06.0-ce-rc3, build cbfa3d9、Hyperledger Fabric是1.0.1,(这里用的虽然不是和前两篇的一样,但是影响不大,把对应的配置不要弄错就可以了),如果没有云服务器,也可以在本地建立多个虚拟机。
下一篇:Hyperledger Fabric 1.0 快速搭建 -------- 多机部署 核心共识节点Orderer
区块链系统由3类节点组成,核心共识节点(Orderer、Kafka、zookeeper)、CA节点、Peer节点
名称 | 个数 | 备注 |
共识节点 | 5 | 包含Orderer、Kafka、zookeeper |
CA节点 | 2 | 包含CA、postgres(数据库) |
Peer节点 | 5 | 包含peer、couchdb(数据库) |
核心共识节点确定以后不要轻易改变,Peer节点的数量可根据自己的需求增加或减少,CA节点的性能和容量的要求不高,所以一般不需要增加节点
阿里云服务器,以下IP地址不是真实IP地址,如果是服务器上的虚拟机,IP则替换成你的外网IP地址
名称 | IP | 节点Hostname | OrdererHostname | KafkaHostname | ZookeeperHostname |
node01 | 192.168.0.101 | peer0.ywhOrg1.example.com | orderer0.ywhExample.com | kafka1.ywhExample.com | zookeeper1.ywhExample.com |
node02 | 192.168.0.102 | peer0.ywhOrg2.example.com | orderer1.ywhExample.com | kafka2.ywhExample.com | zookeeper2.ywhExample.com |
node03 | 192.168.0.103 | peer0.ywhOrg3.example.com | orderer2.ywhExample.com | kafka3.ywhExample.com | zookeeper3.ywhExample.com |
node04 | 192.168.0.104 | peer0.ywhOrg4.example.com | orderer3.ywhExample.com | kafka4.ywhExample.com | zookeeper4.ywhExample.com |
node05 | 192.168.0.105 | peer0.ywhOrg5.example.com | orderer4.ywhExample.com | kafka5.ywhExample.com | zookeeper5.ywhExample.com |
node06 | 192.168.0.106 |
博主练习时的部署方案如下
在node01——node05:peer、kafka、zookeeper、orderer、微服务(可通过这个项目调用chaincode)
在node05——node06:CA1、CA2、tools容器
在node06:区块浏览器(可查看区块信息)
开放的端口有
CA:7054、Orderer:7050;Peer:7051-7053;Kafka:9092;Zookeeper:2181、12888、13888;微服务:443;区块浏览器:80;在云服务器上要对这些端口进行开放加入安全组,如果是本地虚拟机的话,把虚拟机的防火墙关掉即可,不关防火墙的话,在防火墙中开启这些端口也可以,网上的资料很多,在这里不做介绍。
1 生成MSP证书
使用cryptogen工具生成证书。MSP证书是超级账本网络实体的身份标识,实体在通信和交易时使用证书进行签名和验证。生成证书需要crypto-config.yaml配置文件。
cryptogen使用一个包含网络拓扑的crypto-config.yaml文件,为文中定义的组织和属于这些组织的实体生成一组证书和密钥。每个组织都配置了唯一的根证书(ca-cert),并包含了特定的实体(peers和orders),这就形成了一种典型的网络结构——每个成员都有所属的CA。Hyperledger Fabric 网络中的交易和通信都要使用实体的私钥签名,使用公钥验证。这个工具在我上一篇文章中提到过,用来生成一些密钥文件的,具体的下载方法在这里不做介绍,因为这篇博文开始用的是Hyperledger Fabric 1.0.1版本的所以这个工具也要下载1.0.1版本的。
1.1 创建配置文件存放目录,并下载相关工具
以下操作在任意peer节点上操作即可,生成文件以后在发送给其他节点相同目录下
//创建此目录并进入此目录下
[root@node1 /]# mkdir -p u01/chainConfig/
[root@node1 /]# cd u01/chainConfig/
[root@node1 chainConfig]# pwd
/u01/chainConfig
//下载cryptogen工具
[root@node1 chainConfig/]# wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.0.1/hyperledger-fabric-linux-amd64-1.0.1.tar.gz | tar xz
//下载以后会在当前目录下生成一个bin目录,bin目录下就是我们要用的工具了
1.2 cryptogen命令说明
cryptogen [
(1)超级账本密钥证书生成工具选项
-----help——显示帮助文档;
-----help-long——显示详细的帮助文档
(2)命令
1)显示帮助文档
help [
2)生成密钥文件
generate [
--config——指定配置文件,如果不指定,则使用默认配置(即cryptogen showtemplate中的内容)
--output——生成密钥证书的目录,默认为crypto-config
3)showtemplate——显示版本信息
4)version——显示版本信息
最常用的命令语法是:
cryptogen generate --config=./crypto-config.yaml(根据crypto-config.yaml文件的配置,生成组织信息及其密钥文件证书等,保存在crypto-config目录下)
1.3 生成证书文件及文件解析
编写crypto-config.yaml文件 chainConfig\crypto-config.yaml
[root@node5 chainConfig/]# vi crypto-config.yaml
#opyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
#./cryptogen generate --config=./crypto-config.yaml
# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# 定义排序服务节点的组织
# ---------------------------------------------------------------------------
OrdererOrgs:
# ---------------------------------------------------------------------------
# Orderer 排序服务节点的名称和域名
# ---------------------------------------------------------------------------
- Name: Orderer
Domain: ywhExample.com //全限定名,我理解的是跟java中的包名类似的性质
EnableNodeOUs: true // EnableNodeOUs 允许节点 OUS -> out of service暂停服务
Template: //按模板生成 Orderer节点的MSP证书
Count: 5 //生成五套 orderer0 - orderer4
Users:
Count: 1 //每一套证书有一个普通用户 member
# ---------------------------------------------------------------------------
# "Specs" - See PeerOrgs below for complete description
# 手动定义节点名称,命名规范是:{{.Hostname}}.{{.Domain}} 例如orderer.ywhExample.com
# 如果没有定义CommonName,自动生成的节点名称就是:orderer.ywhExample.com
# 如果定义了CommonName,就以CommonName为准
# Hostname可以定义多个
# ---------------------------------------------------------------------------
Specs:
- Hostname: orderer
#-Hostname:orderer1
#CommonName: order.example.net
# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes 定义peer节点的组织
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1 组织Org1的配置
# ---------------------------------------------------------------------------
- Name: ywhOrg1
Domain: ywhOrg1.example.com
EnableNodeOUs: true
#------------------------------------------------------------------------------
# Template——按模板生成Peer节点的MSP证书
# ——默认生成的Peer节点名称:peer{{.Index}}.{{Domain}}
# ——Index是从Start到Count-1,Start默认是0
# ——Hostname可以自定义节点名称的规则
# ——Prefix默认是peer
# Template 这个就是生成几套证书 是从start到count-1套 这里设置count为2 则生成
# peer0.ywhOrg1.example.com和peer1.ywhOrg1.example.com两个节点(ywhOrg这个组织中有两个peer)
# peer0和peer1都是可以部署的,后续我只部署了peer0的。每一个组织下有几个peer我认为是Template控制的,仅代表个人意见
#
#
#------------------------------------------------------------------------------
Template:
Count: 2
#Start:0
#Hostname:{{.Perfix}}{{.Index}}
#------------------------------------------------------------------------------
# Users——默认生成的用户数:User1@{{.Domain}}
# ——默认生成一个管理员:Admin@{{.Domain}}
#------------------------------------------------------------------------------
Users:
Count: 1
# ---------------------------------------------------------------------------
# Org2 组织Org2的配置
# ---------------------------------------------------------------------------
- Name: ywhOrg2
Domain: ywhOrg2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
# ---------------------------------------------------------------------------
# Org3 组织Org3的配置
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
- Name: ywhOrg3
Domain: ywhOrg3.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
# ---------------------------------------------------------------------------
# Org4 组织Org4的配置
# ---------------------------------------------------------------------------
- Name: ywhOrg4
Domain: ywhOrg4.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
# ---------------------------------------------------------------------------
# Org5 组织Org5的配置
# ---------------------------------------------------------------------------
- Name: ywhOrg5
Domain: ywhOrg5.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
编写好以后退出保存,使用命令:./bin/cryptogen generate --config=./crypto-config.yaml 会在当前目录生成crypto-config文件夹,文件夹下有两个生成好的目录,ordererOrganizations和peerOrganizations,它们分别代表排序服务节点和Peer节点的MSP配置信息,里面的文件就不一一详解了,如果有机会后续的博文中我会列出。
2.生成排序服务创世区块
有一位博主写的已经很详细了,介绍了配置生成工具configtxgen的使用,还有configtx.yaml文件的解析,来源是《深度探索区块链 Hyperledger技术与应用》---附录B
链接地址:http://www.blockchainbrother.com/article/1339 作者:李晓琼
在这里贴上我自己的configtx.yaml文件:
#######################################################################
#
# 可以编写不同的 profile 配置,作为参数给 configtxgen 工具使用
# 指定了Consortium(组合、集团、联盟)profile用来生成orderer的创世区块
# 带有正确联盟成员定义的orderer创世区块,其通道的创建请求必须带有组织成员名和联盟名
# 此配置文件主要分为3部分:profiles organizations 默认部分:此部分是orderer和Application的配置,如BatchTimeout和一般用作继承的基础值
################################################################################
Profiles:
FiveOrgsOrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
- *Org3
- *Org4
- *Org5
FiveOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
- *Org3
- *Org4
- *Org5
Organizations:
- &OrdererOrg
Name: OrdererOrg
ID: OrdererMSP
MSPDir: crypto-config/ordererOrganizations/ywhExample.com/msp //上面生成的msp路径
- &Org1
Name: Ywh1OrgMSP
ID: Ywh1OrgMSP
MSPDir: crypto-config/peerOrganizations/ywhOrg1.example.com/msp
AnchorPeers:
- Host: peer0.ywhOrg1.example.com
Port: 7051
- &Org2
Name: Ywh2OrgMSP
ID: Ywh2OrgMSP
MSPDir: crypto-config/peerOrganizations/ywhOrg2.example.com/msp
AnchorPeers:
- Host: peer0.ywhOrg2.example.com
Port: 7051
- &Org3
Name: Ywh3OrgMSP
ID: Ywh3OrgMSP
MSPDir: crypto-config/peerOrganizations/ywhOrg3.example.com/msp
AnchorPeers:
- Host: peer0.ywhOrg3.example.com
Port: 7051
- &Org4
Name: Ywh4OrgMSP
ID: Ywh4OrgMSP
MSPDir: crypto-config/peerOrganizations/ywhOrg4.example.com/msp
AnchorPeers:
- Host: peer0.ywhOrg4.example.com
Port: 7051
- &Org5
Name: Ywh5OrgMSP
ID: Ywh5OrgMSP
MSPDir: crypto-config/peerOrganizations/ywhOrg5.example.com/msp
AnchorPeers:
- Host: peer0.ywhOrg5.example.com
Port: 7051
Orderer: &OrdererDefaults
OrdererType: kafka //如果是kafka集群部署,这里要写kafka,单节点是solo
Addresses:
- orderer0.ywhExample.com:7050
- orderer1.ywhExample.com:7050
- orderer2.ywhExample.com:7050
- orderer3.ywhExample.com:7050
- orderer4.ywhExample.com:7050
#Bath Timeout:创建batch的超时时间
BatchTimeout: 2s
#控制batch到块中的消息数
BatchSize:
# Max Message Count: batch中允许的最大消息数量
MaxMessageCount: 100
#如果OrdererType 是kafka,则要设置Kafka brokers的'message.max.bytes'和'replica.fetch.max.bytes'的值大于该值
AbsoluteMaxBytes: 99 MB
#Preferred Max Bytes: batch中允许的首选绝对最大序列化消息字节数
#如果一个消息大于该值,会导致batch 大于该值
PreferredMaxBytes: 512 KB
Kafka:
Brokers:
- kafka1.ywhExample.com:9092
- kafka2.ywhExample.com:9092
- kafka3.ywhExample.com:9092
- kafka4.ywhExample.com:9092
- kafka5.ywhExample.com:9092
Organizations:
Application: &ApplicationDefaults
Organizations:
在上述配置文件中,根据需求的配置修改配置文件,例如配置需要5个Org,每个Org中需要注意的配置项有Org的名称,Org的MSPID,MSPdir是一个完整的配置目录。还有就是AnchorPeer的地址和端口。
创建以上配置文件生成的文件的目录以及生成创世区块等文件
[root@node1 ~]# mkdir channel-artifacts
[root@node1 ~]# cd /u01/chainConfig
//配置环境变量 设置FABRIC_CFG_PATH环境变量告诉configtxgen去哪个目录寻找configtx.yaml文件
[root@node1 ~]# export FABRIC_CFG_PATH=$(pwd)
//创建genesis.block 排序服务节点使用的创世区块
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
//创建onbchannel.tx 通道的名字或者ID -channelID 这个后面写的全部小写,不要带有特殊字符,要不到后面巨坑
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsChannel -outputCreateChannelTx ./channel-artifacts/ywhchannel.tx -channelID ywhchannel
//生成组织锚节点 通道中的组织锚节点 咱们有5个 所以要运行五次这个命令,把相应的改掉,这个跟上面的配置文件中配置是相对应的,应该不难看出
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Ywh1OrgMSPanchors.tx -channelID ywhchannel -asOrg Ywh1OrgMSP
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Ywh2OrgMSPanchors.tx -channelID ywhchannel -asOrg Ywh2OrgMSP
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Ywh3OrgMSPanchors.tx -channelID ywhchannel -asOrg Ywh3OrgMSP
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Ywh4OrgMSPanchors.tx -channelID ywhchannel -asOrg Ywh4OrgMSP
[root@node1 ~]# ./bin/configtxgen -profile FiveOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Ywh5OrgMSPanchors.tx -channelID ywhchannel -asOrg Ywh5OrgMSP
//执行完以上命令以后 在channel-artifacts文件目录
[root@node5 channel-artifacts]# pwd
/u01/chainConfig/channel-artifacts
[root@node5 channel-artifacts]# ll
-rw-r--r-- 1 root root 18290 Sep 10 18:02 genesis.block
-rw-r--r-- 1 root root 296 Sep 10 18:04 Ywh1OrgMSPanchors.tx
-rw-r--r-- 1 root root 296 Sep 10 18:05 Ywh2OrgMSPanchors.tx
-rw-r--r-- 1 root root 296 Sep 10 18:05 Ywh3OrgMSPanchors.tx
-rw-r--r-- 1 root root 296 Sep 10 18:05 Ywh4OrgMSPanchors.tx
-rw-r--r-- 1 root root 296 Sep 10 18:05 Ywh5OrgMSPanchors.tx
-rw-r--r-- 1 root root 505 Sep 10 18:02 ywhchannel.tx
到此多机部署的准备已经完成,把以上生成的文件及目录全部拷贝到每一个服务器上的相同目录下。
1.学会了MSP生成工具cryptogen的使用,Fabric网络中的实体之间交易和通信都是要使用私钥、公钥,根证书可以给其它签发证书,被称为中间证书。根证书是由配置文件中生成的,实现自签名证书。根证书有两种,一种是CA根证书,一种是TLS根证书。