hyperledger fabric手动部署及核心模块解读

本文基于fabric1.1环境,实现手动部署网络,并浅略的解读其核心模块。fabric1.1的部署流程可以参考博客:https://blog.csdn.net/leehom__/article/details/81022151   中的一部分。

我们可以在  fabric-samples/first-network  目录下面,直接运行  ./byfn.sh -m up 来启动网络,所有的中间步骤都已经写在脚本中,运行网络成功后,即可以执行安装实例化链码。本文主要通过手动启动fabric1.1网络来理解每个步骤,及其核心模块的一些解读。

目录

1.生成公私钥和证书

2.生成创世块和通道配置事务

3.启动网络

4.创建和加入通道

5.更新锚节点

 

正文

一、生成公私钥和证书

首先进入到 fabric-samples/first-network 目录下执行下列命令

../bin/cryptogen generate --config=./crypto-config.yaml

会看到有下列返回

org1.example.com
org2.example.com

模块解读:

启动fabric网络之前需要使用cryptogen工具 生成相应的密钥和证书,密钥和证书(即MSP材料)被生成在first-network目录下的crypto-config文件夹下。cryptogen工具主要依靠配置文件 cryto-config.yaml,在配置文件中描述了生成的证书密钥的一些属性,例如,有多少个节点,有多少个组织等。我们先以first-network目录下的cryto-config.yaml为例,截取了它关键部分,我们来进行解读。如下所示:

OrdererOrgs:                          //定义orderer节点
  - Name: Orderer                     //orderer节点的名称
    Domain: example.com               //orderer节点的根域名
    Specs:
      - Hostname: orderer             //orderer节点主机名

PeerOrgs:
  - Name: Org1
    Domain: org1.example.com          //组织1的名称
    EnableNodeOUs: true               //组织1的根域名
    Template:
      Count: 2                        //组织1中的节点数目,2代表我们要生成2套公私钥和证书
    Users:
      Count: 1                        //组织1中的用户数目,Admin不包括在计数中
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

我们以org1.example.com文件目录下 tree 命令后显示的文件结构为例,解读一下各文件,如下


├── ca               //根节点的签名证书
│   ├── ca.org1.example.com-cert.pem
│   └── f517871a77a63a3385b3fd47227286969c18f6a14ebe1810efe7a9717ba3b5c4_sk
├── msp
│   ├── admincerts     //组织管理员证书
│   │   └── [email protected]
│   ├── cacerts        //组织的根证书(cacerts在官方文档中介绍也比较模糊,还没懂有什么用)
│   │   └── ca.org1.example.com-cert.pem
│   ├── config.yaml
│   └── tlscacerts     //TLS连接身份证书
│       └── tlsca.org1.example.com-cert.pem
├── peers
│   ├── peer0.org1.example.com
│   │   ├── msp
│   │   │   ├── admincerts  //组织的管理证书,只有这些证书才能进行创建通道等操作
│   │   │   │   └── [email protected]
│   │   │   ├── cacerts     //组织根证书
│   │   │   │   └── ca.org1.example.com-cert.pem
│   │   │   ├── config.yaml
│   │   │   ├── keystore    //当前节点私钥
│   │   │   │   └── 237ade394bea083945e8d9dd6bd9eb60b0e5ba09e277622df424f5bc8c98b92b_sk
│   │   │   ├── signcerts   //当前节点签名的数字证书
│   │   │   │   └── peer0.org1.example.com-cert.pem
│   │   │   └── tlscacerts  //TLS连接的身份证书
│   │   │       └── tlsca.org1.example.com-cert.pem
│   │   └── tls
│   │       ├── ca.crt      //组织的根证书
│   │       ├── server.crt  //验证本节点签名的证书
│   │       └── server.key  //当前节点的私钥文件用来签名的
│   └── peer1.org1.example.com
│       ├── msp
│       │   ├── admincerts
│       │   │   └── [email protected]
│       │   ├── cacerts
│       │   │   └── ca.org1.example.com-cert.pem
│       │   ├── config.yaml
│       │   ├── keystore
│       │   │   └── 0cb3ca5a6b4c30920b0792226a972ee9b50d8a1972c88ea67112a5498c842fe6_sk
│       │   ├── signcerts
│       │   │   └── peer1.org1.example.com-cert.pem
│       │   └── tlscacerts
│       │       └── tlsca.org1.example.com-cert.pem
│       └── tls
│           ├── ca.crt
│           ├── server.crt
│           └── server.key
├── tlsca
│   ├── a377e0984699f8d5922b308c81bd6267d907cec3aa5a9f95e1b90e3f31b63714_sk
│   └── tlsca.org1.example.com-cert.pem
└── users
    ├── [email protected]
    │   ├── msp
    │   │   ├── admincerts
    │   │   │   └── [email protected]
    │   │   ├── cacerts
    │   │   │   └── ca.org1.example.com-cert.pem
    │   │   ├── keystore
    │   │   │   └── 32c066ca255faf1ee3a2039b4f4a9dbd9f02c22ae8f658460bf85639c76d4e22_sk
    │   │   ├── signcerts
    │   │   │   └── [email protected]
    │   │   └── tlscacerts
    │   │       └── tlsca.org1.example.com-cert.pem
    │   └── tls
    │       ├── ca.crt
    │       ├── client.crt
    │       └── client.key
    └── [email protected]
        ├── msp
        │   ├── admincerts
        │   │   └── [email protected]
        │   ├── cacerts
        │   │   └── ca.org1.example.com-cert.pem
        │   ├── keystore
        │   │   └── 1b5688498e510a9d99099aa4adc18f0530c3d83e63df7b0717094356576ede19_sk
        │   ├── signcerts
        │   │   └── [email protected]
        │   └── tlscacerts
        │       └── tlsca.org1.example.com-cert.pem
        └── tls
            ├── ca.crt
            ├── client.crt
            └── client.key

二、生成创世块和通道配置事务

(1)生成创世块,使用configtxgen工具,依靠于configtx.yaml配置文件,在first-network目录下执行下列语句,将会生成orderer的创世区块,生成的orderer genesis block 将输出在channel-artifacts文件夹下。

# 使用configtxgen工具,我们需要将configtx,yaml文件的路径传递给它
# 所以我们将当前工作目录指定一下
export FABRIC_CFG_PATH=$PWD      
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

执行后将会在终端看到下面的输出:

2018-07-31 21:41:22.200 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-07-31 21:41:22.210 CST [msp] getMspConfig -> INFO 002 Loading NodeOUs
2018-07-31 21:41:22.211 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs
2018-07-31 21:41:22.211 CST [common/tools/configtxgen] doOutputBlock -> INFO 004 Generating genesis block
2018-07-31 21:41:22.211 CST [common/tools/configtxgen] doOutputBlock -> INFO 005 Writing genesis block

(2)通道配置事务,包括创建通道配置文件和相关锚节点文件,同样在first-network目录下执行下列命令

export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

到目前为止first-network目录下的 channel-artifacts文件夹下一句有了channel.tx 和 genesis.block两个配置文件。接着还要生成相关的锚点文件,执行下列命令。

# the anchor peer for Org1 on channel
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP    

# the anchor peer for Org2 on channel
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

解读:本节中所使用的configtxgen模块用来生成四个配置文件,orderer的genesis block, channel的配置文件channel.tx ,  以及锚节点配置文件Org1MSPanchors.txOrg2MSPanchors.tx (每一个对应一个Peer组织)。configtxgen工具确实需要用到configtx.yaml这个配置文件(但似乎在执行命令中并没有指向到其路径)。在该配置文件中,可以设定Orderer的共识算法、共识区块大小、超时时间等,本文截取了配置文件中的一段来解读,如下。

//节点的配置信息
Orderer: &OrdererDefaults
    OrdererType: solo                  //orderer节点共识方法
    Addresses:
        - orderer.example.com:7050     //orderer监听地址
    BatchTimeout: 2s                   //在创建批处理之前等待的时间
    BatchSize:
        MaxMessageCount: 10            //批处理的最大消息数量
        AbsoluteMaxBytes: 99 MB        //批处理中序列化消息允许的绝对最大字节数。
        PreferredMaxBytes: 512 KB      //首选最大字节数(还不是很能理解是什么意思)

三、启动网络

(1)我们将整个Fabric Docker环境的配置放在docker-compose-cli.yaml后,只需要使用以下命令即可

docker-compose -f docker-compose-cli.yaml up -d

或者你可以顺便启动一下状态数据库CouchDB,只需要将couchDB配置文件加入到命令中即可,couchDB访问路径为:

  • http://localhost:5984/_utils       (可以吧localhost换成自己的ip地址)

docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d

(2)环境变量的设置,由于在docker-compose-cli.yaml中,已经对四个环境变量指向了peer0.org1,所以我们可以直接对peer0.org1进行操作,如果想要向其他peer或者orderer发送请求,则需要修改想要的环境变量。如下

# Environment variables for peer0.org1

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

# Environment variables for peer1.org1
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp 
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 

# Environment variables for peer0.org2
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
CORE_PEER_LOCALMSPID="Org2MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

# Environment variables for peer1.org2
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp 
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
CORE_PEER_LOCALMSPID="Org2MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt 

四、创建和加入通道

回想一下,我们在 “二、生成创世块和通道配置事务创建通道 ”章节中 中使用configtxgen工具创建了通道配置交易。我们可以重复这个过程,以创建额外的通道配置事务,在configtx.yaml中使用相同或不同的配置文件传给configtxgen工具。然后你可以重复这个定义的过程来建立你网络中的其他通道。

但本文只做最简单的创建和加入通道。

(1)首先进入到CLI容器,在配置文件中环境变量设置的是指向peer0.org1,执行下列命令

docker exec -it cli bash

如果成功,将会看到下面的样子:

root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#

(2)接下来创建通道,我们将传入生成的channel configuration transaction artifact (也就是channel.txchannel.tx包含了简单通道的一个定义)

export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

(3)加入节点。如果想要其他节点加入通道,参考上面对其他节点环境变量的设置后,再执行下面语句。现在环境变量指向peer0.org1,所以我们加入peer0.org1直接执行下列语句

peer channel join -b mychannel.block

 五、更新锚节点

更新通道定义,以定义Org1的锚点,执行下列命令

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

更新通道定义,以定义Org2的锚点,首先要更改一下环境变量,再执行更新锚点命令

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

到此,网络已启动成功,可以进行安装、实例化链码及调用链码。

本文会继续更新,解读核心模块和配置文件。

你可能感兴趣的:(hyperledger fabric手动部署及核心模块解读)