Fabric网络的搭建分为两个阶段:生成网络拓扑和启动网络。在这里,我们假设要搭建一个具有一个orderer节点和两个peer节点的Fabric网络。
在生成网络拓扑之前,需要准备好以下文件:
-
crypto-config.yaml:用于生成组织和节点的密钥和证书。
-
configtx.yaml:用于定义通道和配置块。
-
docker-compose.yaml:用于定义容器环境。
生成相关证书文件
启动Fabric需要生成相关的证书,通过cryptogen模块完成的,cryptogen模块会根据提供的配置文件生成需要的证书和数据文件。
cryptogen showtemplate
我们可以根据这个代码生成简单模板导入crypto-config.yaml文件,也可以参考官方案例文件。
这是上述命令生成的内容,修改一下如下代码
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
Crypto:
CertificateAuthorities:
- Name: ca-org1
CommonName: ca-org1.example.com
Country: CN
Province: Beijing
Locality: Beijing
OrganizationalUnit: org1
StreetAddress: Xizhimenwai
PostalCode: 100089
PeerOrg1:
Name: org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1](OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
Crypto:
CertificateAuthorities:
- Name: ca-org1
CommonName: ca-org1.example.com
Country: CN
Province: Beijing
Locality: Beijing
OrganizationalUnit: org1
StreetAddress: Xizhimenwai
PostalCode: 100089
PeerOrg1:
Name: org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
Crypto:
CertificateAuthorities:
- Name: ca-org1
CommonName: ca-org1.example.com
Country: CN
Province: Beijing
Locality: Beijing
OrganizationalUnit: org1
StreetAddress: Xizhimenwai
PostalCode: 100089
PeerOrg1:
Name: org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
OrdererOrgs: 指定Orderer组织的相关信息,包括名称、域名和节点信息。
Name: 组织名称,这里为Orderer。
Domain: 组织域名,这里为example.com。
Specs: Orderer节点信息。
Hostname: 节点主机名,这里为orderer。
PeerOrgs: 指定Peer组织的相关信息,包括名称、域名、节点数量、用户数量等。
Name: 组织名称,这里为Org1和Org2。
Domain: 组织域名,这里分别为org1.example.com和org2.example.com。
Template: Peer节点信息。
Count: 节点数量,这里为2。
Users: 用户数量,这里为1。
执行下面命令生成生成组织和节点的密钥和证书
cryptogen generate --config=crypto-config.yaml --output ./crypto-config
会新增加一个文件夹crypto-config,里面存放着本例的相关配置文件,可以通过tree命令查看生成证书文件的内容。
配置通道和创世区块
Fabric是基于区块链的分布式账本,每个账本都拥有自己的区块链,账本的区块链中会存储账本的交易数据,但账本区块链中的第一个区块是个例外,该区块不存储交易数据而是存储配置信息,通常将账本的第一个区块称为创始块。综上所述,Fabric中账本的第一个区块是需要手动生成的。configtxgen模块是专门负责生成系统的创始块和Channel。configtxgen模块也需要一个配置文件来定义相关的属性。
configtx.yaml
文件用于配置Fabric网络的通道、组织、节点等信息。configtx.yaml文件内容:
# 指定了一些全局的定义,如证书的默认失效时间、Genesis块的默认时间戳等等
Organizations:
# 定义了Orderer组织的参数
- &OrdererOrg
Name: OrdererOrg
ID: OrdererMSP
MSPDir: /etc/hyperledger/msp/orderer/msp
# 定义了两个Peer组织的参数
- &Org1
Name: Org1MSP
ID: Org1MSP
MSPDir: /etc/hyperledger/msp/org1/msp
AnchorPeers:
# 定义了Org1组织的Anchor节点
- Host: peer0.org1.example.com
Port: 7051
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: /etc/hyperledger/msp/org2/msp
AnchorPeers:
# 定义了Org2组织的Anchor节点
- Host: peer0.org2.example.com
Port: 7051
# 定义了Orderer节点的配置参数,包括Orderer组织、共识类型、batch size等等
Orderer: &OrdererDefaults
OrdererType: etcdraft
Addresses:
- orderer.example.com:7050
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
EtcdRaft:
Consenters:
- Host: orderer.example.com
Port: 7050
ClientTLSCert: /etc/hyperledger/orderer/tls/server.crt
ServerTLSCert: /etc/hyperledger/orderer/tls/server.crt
# 定义了Application节点的配置参数,包括Peer组织、背书策略、Anchor节点等等
Application: &ApplicationDefaults
Organizations:
# 定义了一个新的Genesis块,包括了Orderer组织和两个Peer组织
Profiles:
OneOrgOrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Capabilities:
<<: *OrdererCapabilities
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
# 定义了一个新的Channel,包括了两个Peer组织
TwoOrgChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
Capabilities:
<<: *ApplicationCapabilities
好的,继续说明:
-
Profiles:
-
TwoOrgsOrdererGenesis:这是Orderer节点的创世区块配置文件,包含了创世区块中需要的组织、Orderer节点信息和一些默认配置。
-
TwoOrgsChannel:这是通道的配置文件,包含了通道中需要的组织、Peer节点信息和一些默认配置。
-
-
Organizations:
-
Name:组织名称,这里定义了两个组织,一个为Orderer组织,一个为Peer组织。
-
ID:组织ID,这里定义了两个组织的ID。
-
MSPDir:MSP目录,这里定义了两个组织的MSP目录。
-
-
Orderer:
-
OrdererType:Orderer类型,这里定义了solo类型,即单节点Orderer。
-
Addresses:Orderer节点的地址列表,这里只有一个Orderer节点地址。
-
BatchTimeout:交易打包超时时间,单位为毫秒。
-
BatchSize:交易打包配置,包括最大交易数和最大字节数。
-
MaxChannels:最大通道数。
-
Organizations:Orderer组织的名称列表。
-
-
Application:
- Organizations:应用组织的名称列表。
-
Capabilities:所支持的功能,这里只支持V1_4_2版本的功能。
-
Profiles(TwoOrgsOrdererGenesis):
-
Capabilities:配置文件所支持的功能,这里只支持V1_4_2版本的功能。
-
Orderer:Orderer的配置信息。
-
Consortiums:联盟配置信息,这里只有一个联盟。
-
-
Profiles(TwoOrgsChannel):
-
Capabilities:配置文件所支持的功能,这里只支持V1_4_2版本的功能。
-
Consortium:联盟名称。
-
Application:应用的配置信息,包含了应用组织的信息和Anchor Peer的信息。
-
Orderer:Orderer的配置信息。
配置文件修改完成之后执行如下命令生成创始块文件。
-
configtxgen -profile TestTwoOrgsOrdererGenesis -outputBlock ./orderer. genesis.block
创建Channel的命令如下:
configtxgen -profile TestTwoOrgsChannel -outputCreateChannelTx ./roberttest channel.tx -channelID roberttestchannel
上述命令执行完成之后会在目录生成文件roberttestchannel.tx,该文件用来生成Channel。除此之外还需要生成相关的锚点文件,而生成锚点文件需要执行以下命令:
configtxgen -profile TestTwoOrgsChannel -outputAnchorPeersUpdate ./Org1MSPanchors. tx -channelID roberttestchannel -asOrg Org1MSP
configtxgen -profile TestTwoOrgsChannel -outputAnchorPeersUpdate ./Org2MSPanchors. tx -channelID roberttestchannel -asOrg Org2MSP
编写一个docker-compose.yaml其中定义了一个Orderer节点和两个Peer节点
version: '2'
networks:
my-network:
services:
orderer:
image: hyperledger/fabric-orderer
container_name: orderer.example.com
environment:
- ORDERER_GENERAL_LOGLEVEL=info
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_LISTENPORT=7050
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_TLS_ENABLED=false
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer
command: orderer
volumes:
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
ports:
- 7050:7050
networks:
- my-network
peer0.org1:
container_name: peer0.org1.example.com
image: hyperledger/fabric-peer
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_PEER=info
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: peer node start
ports:
- 7051:7051
volumes:
- /var/run/:/host/var/run/
- ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/msp/peer
- ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
depends_on:
- orderer
networks:
- my-network
peer1.org1:
container_name: peer1.org1.example.com
image: hyperledger/fabric-peer
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_PEER=info
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: peer node start
ports:
- 8051:7051
volumes:
- /var/run/:/host/var/run/
- ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/msp/peer
- ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
depends_on:
- orderer
networks:
- my-network
然后启动网络:docker-compose up -d
运行结果