zoukankan      html  css  js  c++  java
  • Hyperledger Fabric相关文件解析

    1相关文件说明

    这一部分涉及相关配置文件的解析,
    网络的启动涉及到多个文件,本文按以下顺序进行分析:

    .
    ├── base
    │   ├── docker-compose-base.yaml   #1
    │   └── peer-base.yaml    #2
    ├── channel-artifacts   
    ├── configtx.yaml      #5
    ├── crypto-config.yaml
    ├── docker-compose-cli.yaml   #3
    ├── docker-compose-couch.yaml  #4
    ├── docker-compose-e2e-template.yaml    该文件中定义了fabric-ca的配置信息。我们这里用不到,会在讲解Fabric-Ca的文章中说明
    

    3.1 docker-compose-base.yaml文件详解

    先看一下文件内容:

    version: '2'     #docker版本
    
    services:        #服务,可以包括若干个容器实例
    
      orderer.example.com:     #定义一个名称为orderer.example.com的服务
        container_name: orderer.example.com    #当前容器名称
        extends:     #扩展,代表需要加载的文件或服务
          file: peer-base.yaml       
          service: orderer-base
        volumes:     #挂载的卷     [本机路径下的文件或目录]:[容器中所映射到的地址]
            #比如本机下的channel-artifacts/genesis.block文件可以在容器中/var/hyperledger/orderer/orderer.genesis.block访问
            - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
            - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
            - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
            - orderer.example.com:/var/hyperledger/production/orderer
        ports:  #所映射的端口  [本机端口]:[容器端口]
          - 7050:7050
    
      peer0.org1.example.com:        #定义一个名称为peer0.org1.example.com的服务
        container_name: peer0.org1.example.com    #当前容器名称
        extends:   #同上
          file: peer-base.yaml
          service: peer-base
        environment:         #定义环境变量
          - CORE_PEER_ID=peer0.org1.example.com    #peer节点的id
          - CORE_PEER_ADDRESS=peer0.org1.example.com:7051    #peer节点的访问地址
          - CORE_PEER_LISTENADDRESS=0.0.0.0:7051     #peer节点的监听地址
          - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052   #peer节点的链码访问地址
          - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052  #peer节点的链码监听地址 指定为0.0.0.0则自动进行探测
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051 #gossip为共识机制
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051  #gossip外部节点,表明为锚节点
          - CORE_PEER_LOCALMSPID=Org1MSP
        volumes:   #同上,挂载卷
            - /var/run/:/host/var/run/
            - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
            - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
            - peer0.org1.example.com:/var/hyperledger/production
        ports:   #同上,端口
          - 7051:7051
    
      peer1.org1.example.com:
        container_name: peer1.org1.example.com
        extends:
          file: peer-base.yaml
          service: peer-base
          ...
          ...
    

    3.2 peer-base.yaml文件详解

    version: '2'
    
    services:
      peer-base:    #定义一个名称为peer-base的服务
        image: hyperledger/fabric-peer:$IMAGE_TAG    #该服务所依赖的镜像
        environment:       #定义环境变量
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn     #定义网络工作模式,这里使用的是bridge方式
          - FABRIC_LOGGING_SPEC=INFO     #定义日志级别为INFO
          #- FABRIC_LOGGING_SPEC=DEBUG
          - CORE_PEER_TLS_ENABLED=true   #使用TLS
          - CORE_PEER_GOSSIP_USELEADERELECTION=true    #使用选举LEADER的方式
          - CORE_PEER_GOSSIP_ORGLEADER=false    #不指定LEADER
          - CORE_PEER_PROFILE_ENABLED=true     #使用profile
          - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt   #TLS证书路径
          - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key  #TLS密钥路径
          - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt #TLS根证书路径
        working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer   #工作目录,即进入容器所在的默认位置
        command: peer node start   #启动容器后所运行的第一条命令:启动Peer节点 
    
      orderer-base:      #定义一个名称为orderer-base的服务
        image: hyperledger/fabric-orderer:$IMAGE_TAG    #该服务所依赖的镜像
        environment:    #环境变量
          - FABRIC_LOGGING_SPEC=INFO  #日志级别
          - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0    #orderer的监听地址
          - ORDERER_GENERAL_GENESISMETHOD=file   # 创世区块文件的类型为file
          - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block   #创世区块在容器中的路径
          - ORDERER_GENERAL_LOCALMSPID=OrdererMSP   #Orderer的本地MSPid
          - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp  #本地Msp文件夹
          # enabled TLS
          - ORDERER_GENERAL_TLS_ENABLED=true   #使用TLS
          - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key   #TLS私钥路径
          - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt      #TLS证书路径
          - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]      #TLS根证书路径
          - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1   #以下为kafka集群的配置,本文中没有使用到
          - ORDERER_KAFKA_VERBOSE=true
          - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
          - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
          - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
        working_dir: /opt/gopath/src/github.com/hyperledger/fabric    #工作目录,即进入容器所在的默认位置
        command: orderer  #启动容器后所运行的第一条命令:启动orderer
    

    3.3 docker-compose-cli.yaml文件详解

    version: '2'
    
    volumes:   #声明挂载的卷
      orderer.example.com:
      peer0.org1.example.com:
      peer1.org1.example.com:
      peer0.org2.example.com:
      peer1.org2.example.com:
    
    networks:   #声明一个名称为byfn的网络
      byfn:
    
    services:
    
      orderer.example.com:   #定义一个名称为orderer.example.com的服务
        extends:    #扩展,代表需要加载的文件或服务  即使用了其中的配置信息
          file:   base/docker-compose-base.yaml      
          service: orderer.example.com   
        container_name: orderer.example.com   #当前容器名称
        networks:      #指定当前容器所加入的网络,如果需要加入多个网络,可以定义多个
          - byfn
    
        #以下同上
      peer0.org1.example.com:    
        container_name: peer0.org1.example.com
        extends:
          file:  base/docker-compose-base.yaml
          service: peer0.org1.example.com
        networks:
          - byfn
    
      peer1.org1.example.com:
        container_name: peer1.org1.example.com
        extends:
          file:  base/docker-compose-base.yaml
          service: peer1.org1.example.com
        networks:
          - byfn
    
      peer0.org2.example.com:
        container_name: peer0.org2.example.com
        extends:
          file:  base/docker-compose-base.yaml
          service: peer0.org2.example.com
        networks:
          - byfn
    
      peer1.org2.example.com:
        container_name: peer1.org2.example.com
        extends:
          file:  base/docker-compose-base.yaml
          service: peer1.org2.example.com
        networks:
          - byfn
    
      cli:    #定义一个客户端容器,方便与各节点进行交互
        container_name: cli    #客户端容器名称
        image: hyperledger/fabric-tools:$IMAGE_TAG   #该服务所依赖的镜像
        tty: true     #使用伪终端
        stdin_open: true    #标准输入
        environment:     #环境变量
          - GOPATH=/opt/gopath        #指定go的路径
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          #- FABRIC_LOGGING_SPEC=DEBUG
          - FABRIC_LOGGING_SPEC=INFO   #日志级别
          - CORE_PEER_ID=cli      #当前节点的Id
          - CORE_PEER_ADDRESS=peer0.org1.example.com:7051   #以下与peer-base.yaml相同,表示当前客户端容器默认与peer0.org1.example.com进行交互
          - CORE_PEER_LOCALMSPID=Org1MSP
          - CORE_PEER_TLS_ENABLED=true
          - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt    #TLS-peer0.org1.example.com的证书路径
          - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key  #TLS-peer0.org1.example.com的密钥路径
          - 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    #TLS-peer0.org1.example.com的根证书路径
          - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp  @#TLS-组织1中Admin的MSP路径
        working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer      #工作目录,即进入容器所在的默认位置
        command: /bin/bash     #启动容器后所运行的第一条命令:使用bash
        volumes:      #挂载卷
            - /var/run/:/host/var/run/
            - ./../chaincode/:/opt/gopath/src/github.com/chaincode
            - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
            - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
            - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
        depends_on:    #依赖,需要首先按顺序启动以下容器,但是不会等待以下容器完全启动才启动当前容器
          - orderer.example.com
          - peer0.org1.example.com
          - peer1.org1.example.com
          - peer0.org2.example.com
          - peer1.org2.example.com
        networks:      #指定当前容器所加入的网络
          - byfn
    

    3.4 docker-compose-couch.yaml文件详解

    在fabric网络中,可以使用默认的levelDb数据库,或者使用CouchDb,该文件主要是对CouchDb进行相关设置。

    version: '2'
    
    networks:  #声明一个名称为byfn的网络
      byfn:
    
    services:
      couchdb0:    #定义一个couchdb0的服务
        container_name: couchdb0    #指定该容器名称为couchdb0
        image: hyperledger/fabric-couchdb    #该容器所依赖的镜像
        environment:    #环境变量
          - COUCHDB_USER=        #couchdb0的用户名,这里设置为空,表明任何人都可登陆
          - COUCHDB_PASSWORD=     #couchdb0的登陆密码,这里设置为空
        ports:    #所映射的端口
          - "5984:5984"
        networks:    #使用的网络
          - byfn
    
      peer0.org1.example.com:    #定义一个peer0.org1.example.com的服务
        environment:
          - CORE_LEDGER_STATE_STATEDATABASE=CouchDB   #指定该服务使用的标准数据库为CouchDB
          - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984      #指定该服务使用的数据库访问地址
          - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME= #配置数据库用户名
          - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=#配置数据库密码
        depends_on:      #表明该服务依赖于couchdb0
          - couchdb0
    
      couchdb1:      #以下同上
        container_name: couchdb1
        image: hyperledger/fabric-couchdb
       ...
       ...
    

    3.5 configtx.yaml文件详解

    该文件中定义了fabric网络中的相关策略信息,内容相对比较多,这里只讲解所用到的部分。

    Organizations:    #组织信息
        - &OrdererOrg   #配置orderer的信息
            Name: OrdererOrg    #定义名称
            ID: OrdererMSP        #定义ID
            MSPDir: crypto-config/ordererOrganizations/example.com/msp   #指定MSP的文件目录
            Policies:   #定义相关策略
                Readers:    #可读
                    Type: Signature      
                    Rule: "OR('OrdererMSP.member')"   #具体策略:允许OrdererMSP中所有member读操作
                Writers:    #可写
                    Type: Signature
                    Rule: "OR('OrdererMSP.member')"
                Admins:    #admin
                    Type: Signature
                    Rule: "OR('OrdererMSP.admin')"
    
        - &Org1       #配置组织一的信息
            Name: Org1MSP    #定义组织一的名称
            ID: Org1MSP      #定义组织一的ID
            MSPDir: crypto-config/peerOrganizations/org1.example.com/msp  #指定MSP的文件目录
            Policies:    #定义相关策略
                Readers:    #可读
                    Type: Signature
                    Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"  #Org1MSP中的admin,peer,client均可进行读操作
                Writers:  #可写
                    Type: Signature
                    Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"    #Org1MSP中的admin,client均可进行读操作
                Admins:    #同上
                    Type: Signature
                    Rule: "OR('Org1MSP.admin')"
            AnchorPeers:    #指定Org1的锚节点,只有锚节点可以与另一个组织进行通信
                - Host: peer0.org1.example.com      #指定Org1的锚节点的地址 
                  Port: 7051      #指定Org1的锚节点的端口
        - &Org2      #同上
            Name: Org2MSP
            ID: Org2MSP
            MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
            Policies:
                Readers:
                    Type: Signature
                    Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
                Writers:
                    Type: Signature
                    Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
                Admins:
                    Type: Signature
                    Rule: "OR('Org2MSP.admin')"
            AnchorPeers:
                - Host: peer0.org2.example.com
                  Port: 9051
    Capabilities:      #这一区域主要是定义版本的兼容情况
        Channel: &ChannelCapabilities
            V1_3: true
        Orderer: &OrdererCapabilities
            V1_1: true
        Application: &ApplicationCapabilities
            V1_3: true
            V1_2: false
            V1_1: false
    Application: &ApplicationDefaults      #同上,定义具体的策略
        Organizations:
        Policies:
            Readers:
                Type: ImplicitMeta
                Rule: "ANY Readers"
            Writers:
                Type: ImplicitMeta
                Rule: "ANY Writers"
            Admins:
                Type: ImplicitMeta
                Rule: "MAJORITY Admins"
        Capabilities:
            <<: *ApplicationCapabilities
    ################################################################################
    #
    Orderer: &OrdererDefaults
        OrdererType: solo      #定义网络类型为solo
        Addresses:      #定义orderer的地址
            - orderer.example.com:7050
        BatchTimeout: 2s    #定义创建一个区块的超时时间
        BatchSize:
            MaxMessageCount: 10   #区块内最大消息数
            AbsoluteMaxBytes: 99 MB   #区块内消息所占的最大空间
            PreferredMaxBytes: 512 KB
        Organizations:
        Policies:
            Readers:
                Type: ImplicitMeta
                Rule: "ANY Readers"
            Writers:
                Type: ImplicitMeta
                Rule: "ANY Writers"
            Admins:
                Type: ImplicitMeta
                Rule: "MAJORITY Admins"
            BlockValidation:    #区块的验证策略
                Type: ImplicitMeta
                Rule: "ANY Writers"
    ################################################################################
    Channel: &ChannelDefaults
        Policies:
            Readers:   #定义谁可以调用交付区块的API
                Type: ImplicitMeta
                Rule: "ANY Readers"
            Writers:   #定义谁可以调用广播区块的API
                Type: ImplicitMeta
                Rule: "ANY Writers"
            Admins:  #定义谁可以修改配置信息
                Type: ImplicitMeta
                Rule: "MAJORITY Admins"
        Capabilities:
            <<: *ChannelCapabilities
    
    Profiles:
        TwoOrgsOrdererGenesis:
            <<: *ChannelDefaults
            Orderer:
                <<: *OrdererDefaults
                Organizations:
                    - *OrdererOrg
                Capabilities:
                    <<: *OrdererCapabilities
            Consortiums:
                SampleConsortium:
                    Organizations:
                        - *Org1
                        - *Org2
        TwoOrgsChannel:
            Consortium: SampleConsortium
            <<: *ChannelDefaults
            Application:
                <<: *ApplicationDefaults
                Organizations:
                    - *Org1
                    - *Org2
                Capabilities:
                    <<: *ApplicationCapabilities
    
  • 相关阅读:
    Python13_安装、解释器
    Python12_关于文件概念的讨论与序列化
    Python11_文件的读写
    which | whereis |locate |find
    tail命令 | head命令
    cat 命令|more命令|less命令
    数据库模型设计,第一范式、第二范式、第三范式简单例子理解
    json
    正则表达式
    SFTP相关命令
  • 原文地址:https://www.cnblogs.com/cbkj-xd/p/11153080.html
Copyright © 2011-2022 走看看