美文网首页
009 hyperledger-fabric 手动启动网络全过程

009 hyperledger-fabric 手动启动网络全过程

作者: 唐僧取经 | 来源:发表于2018-08-07 14:09 被阅读0次

    6 启动网络(手动)

    前提条件:

      1. 生成组织结构及身份证书
      1. 创建Orderer的初始区块
        启动Orderer服务
      1. 生成应用通道配置交易文件
        用来生成应用通道, 指定通道内的成员及访问策略
      1. 生成锚节点更新配置文件
        用来配置锚节点

    TLS: 用来保证对数据传输的完整性和安全性

    启动网络:

      1. 启动Docker容器
      1. 进入容器中
      1. 创建应用通道
      1. 将对应的节点加入到应用通道中
      1. 更新锚节点

    实现步骤

    生成组织关系和身份证书====

    确定是在 fabric-samples/first-network 路径下

    手动实现网络:

    1. 生成组织结构及身份证书
      $ sudo ../bin/cryptogen showtemplate

    查看模版:

    组织结构:
    OrdererOrgs:
      - Name: Orderer    order节点名称
        Domain: example.com    域名
        Specs:
          - Hostname: orderer 主机名称
                主机名称:域名
          
          
    组织结构:
    PeerOrgs:
      - Name: Org1     peer节点
        Domain: org1.example.com     域名
        EnableNodeOUs: true
        Template:   # 指定Org1组织下的peer节点数量
          Count: 1 
        Users:  # 指定Org1组织下的管理员用户数量
          Count: 2
          Admin(默认)
          User1
          User2
    
          节点名称:peer0.org1.example.com
     
      - Name: Org2   组织二
        Domain: org2.example.com
        EnableNodeOUs: true
        Template:   # 指定Org2组织下的peer节点数量
          Count: 1
        Users:
          Count: 1
    
    peer0.org2.example.com
    
    $ cd hyfa/fabric-samples/first-network/
    

    为fabric网络生成指定拓扑结构的组织关系和身份证书
    指定使用的配置文件

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

    此命令依赖 crypto-config.yaml 配置文件

    会有如下输出:

    org1.example.com
    org2.example.com
    

    证书和密钥(即MSP材料)将被输出到目录 first-network/crypto-config 的目录中

    ordererOrganizations子目录下包括构成Orderer组织(1个Orderer节点)的身份信息

    peerOrganizations子目录下为所有的Peer节点组织(2个组织, 4个节点)的相关身份信息. 其中最关键的是MSP目录, 代表了实体的身份信息

    crypto-config文件目录结构如下:

    crypto-config
    ├── ordererOrganizations
    │   └── example.com
    │       ├── ca     当前orderer的私钥文件
    │       │   ├── ca.example.com-cert.pem     ca根证书
    │       │   └── df69b6d2aea8038270c5340d358bfe34eee039a8e16d4a849e67ec27a8ed53bd_sk    私钥
    │       ├── msp     成员服务提供者
    │       │   ├── admincerts   管理员
    │       │   │   └── Admin@example.com-cert.pem
    │       │   ├── cacerts      ca证书
    │       │   │   └── ca.example.com-cert.pem同根证书
    │       │   └── tlscacerts      tls的证书
    │       │       └── tlsca.example.com-cert.pem
    │       ├── orderers
    │       │   └── orderer.example.com     当前orderer相应的组织(有的业务场景会需要多个order的时候)
    │       │       ├── msp
    │       │       │   ├── admincerts    管理员证书
    │       │       │   ├── cacerts       ca证书
    │       │       │   ├── keystore      sk私钥
    │       │       │   ├── signcerts    orderer证书
    │       │       │   └── tlscacerts    tls证书
    │       │       └── tls
    │       │           ├── ca.crt
    │       │           ├── server.crt
    │       │           └── server.key
    │       ├── tlsca   保证传输数据的完整性和安全性
    │       │   ├── 138f1cfd2708bca1e9e525773af410d46cef12736c3673ed787d7bbc38f013a4_sk
    │       │   └── tlsca.example.com-cert.pem
    │       └── users
    │           └── Admin@example.com      admin管理员
    │               ├── msp
    │               │   ├── admincerts
    │               │   ├── cacerts
    │               │   ├── keystore
    │               │   ├── signcerts
    │               │   └── tlscacerts
    │               └── tls
    │                   ├── ca.crt
    │                   ├── client.crt
    │                   └── client.key
    └── peerOrganizations
        ├── org1.example.com            # 第一个组织的相关材料,每个组织会生成单独的根证书
        │   ├── ca  #存放组织的根证书和对应的私钥文件,默认采用EC 算法,证书为自签名。组织内的实体将基于该根证书作为证书根。
        │   │   ├── 9b78dd1cc0570c9ef3f3fa31a1b343e7a6c0f157a2cc17f75412e12f2936898c_sk
        │   │   └── ca.org1.example.com-cert.pem
        │   ├── msp                 # 存放代表该组织的身份信息
        │   │   ├── admincerts          # 组织管理员的身份验证证书,被根证书签名
        │   │   │   └── Admin@org1.example.com-cert.pem
        │   │   ├── cacerts             # 组织的根证书,同ca 目录下文件
        │   │   │   └── ca.org1.example.com-cert.pem
        │   │   ├── config.yaml
        │   │   └── tlscacerts          # :用于TLS 的CA 证书,自签名
        │   │       └── tlsca.org1.example.com-cert.pem
        │   ├── peers           # 存放属于该组织的所有Peer 节点
        │   │   ├── peer0.org1.example.com    # 第一个peer 的信息,包括其msp 证书和tls 证书两类
        │   │   │   ├── msp     
        │   │   │   │   ├── admincerts              # 组织管理员的身份验证证书。Peer 将基于这些证书来认证交易签署者是否为管理员身份     
        │   │   │   │   ├── cacerts             # 存放组织的根证书
        │   │   │   │   ├── config.yaml         
        │   │   │   │   ├── keystore                # 本节点的身份私钥,用来签名
        │   │   │   │   ├── signcerts               # 验证本节点签名的证书,被组织根证书签名
        │   │   │   │   └── tlscacerts              # TLS 连接用的身份证书,即组织TLS 证书
        │   │   │   └── tls     # 存放tls 相关的证书和私钥
        │   │   │       ├── ca.crt          # 组织的根证书
        │   │   │       ├── server.crt      # 验证本节点签名的证书,被组织根证书签名
        │   │   │       └── server.key      # 本节点的身份私钥,用来签名
        │   │   └── peer1.org1.example.com      # 第二个peer 的信息,与peer0.org1.example.com结构类似
        │   │       ├── msp
        │   │       │   ├── admincerts
        │   │       │   ├── cacerts
        │   │       │   ├── config.yaml
        │   │       │   ├── keystore
        │   │       │   ├── signcerts
        │   │       │   └── tlscacerts
        │   │       └── tls
        │   │           ├── ca.crt
        │   │           ├── server.crt
        │   │           └── server.key
        │   ├── tlsca
        │   │   ├── cf4587814bc05f9f81ac3d990c365660dedf1479e60f737c7e9e707727a27168_sk
        │   │   └── tlsca.org1.example.com-cert.pem
        │   └── users       # 存放属于该组织的用户的实体
        │       ├── Admin@org1.example.com      # 管理员用户的信息,包括其msp 证书和tls 证书两类
        │       │   ├── msp
        │       │   │   ├── admincerts          # 管理身份验证证书
        │       │   │   ├── cacerts             # 存放组织的根证书
        │       │   │   ├── keystore            # 本用户的身份私钥,用来签名
        │       │   │   ├── signcerts           # 管理员用户的身份验证证书,被组织根证书签名。要被某个Peer认可,则必须放到该Peer 的msp/admincerts 下
        │       │   │   └── tlscacerts          # TLS 连接用的身份证书,即组织TLS 证书
        │       │   └── tls     # 存放tls 相关的证书和私钥
        │       │       ├── ca.crt      # 组织的根证书
        │       │       ├── client.crt      # 管理员的用户身份验证证书,被组织根证书签名
        │       │       └── client.key  # 管理员用户的身份私钥,用来签名
        │       └── User1@org1.example.com      # 第一个用户的信息,包括msp 证书和tls 证书两类
        │           ├── msp
        │           │   ├── admincerts      # 管理身份验证证书
        │           │   ├── cacerts         # 存放组织的根证书
        │           │   ├── keystore            # 本用户的身份私钥,用来签名
        │           │   ├── signcerts       # 验证本用户签名的身份证书,被组织根证书签名
        │           │   └── tlscacerts      # TLS 连接用的身份证书,即组织TLS 证书
        │           └── tls         # 存放tls 相关的证书和私钥
        │               ├── ca.crt      # 组织的根证书
        │               ├── client.crt      # 验证用户签名的身份证书,被组织根证书签名
        │               └── client.key      # 用户的身份私钥,用来签名
        └── org2.example.com                # 第二个组织的信息,与org1.example.com结构类似
            ├── ca
            │   ├── 91fd76daf883a57066303fb6842ff4fb07c6793dbc8fbbca6303efea455884b2_sk
            │   └── ca.org2.example.com-cert.pem
            ├── msp
            │   ├── admincerts
            │   │   └── Admin@org2.example.com-cert.pem
            │   ├── cacerts
            │   │   └── ca.org2.example.com-cert.pem
            │   ├── config.yaml
            │   └── tlscacerts
            │       └── tlsca.org2.example.com-cert.pem
            ├── peers
            │   ├── peer0.org2.example.com
            │   │   ├── msp
            │   │   │   ├── admincerts
            │   │   │   ├── cacerts
            │   │   │   ├── config.yaml
            │   │   │   ├── keystore
            │   │   │   ├── signcerts
            │   │   │   └── tlscacerts
            │   │   └── tls
            │   │       ├── ca.crt
            │   │       ├── server.crt
            │   │       └── server.key
            │   └── peer1.org2.example.com
            │       ├── msp
            │       │   ├── admincerts
            │       │   ├── cacerts
            │       │   ├── config.yaml
            │       │   ├── keystore
            │       │   ├── signcerts
            │       │   └── tlscacerts
            │       └── tls
            │           ├── ca.crt
            │           ├── server.crt
            │           └── server.key
            ├── tlsca
            │   ├── d3c3e6e37d306992bc9fb826415ed77971031418db48c195d5a24521916f32f3_sk
            │   └── tlsca.org2.example.com-cert.pem
            └── users
                ├── Admin@org2.example.com
                │   ├── msp
                │   │   ├── admincerts
                │   │   ├── cacerts
                │   │   ├── keystore
                │   │   ├── signcerts
                │   │   └── tlscacerts
                │   └── tls
                │       ├── ca.crt
                │       ├── client.crt
                │       └── client.key
                └── User1@org2.example.com
                    ├── msp
                    │   ├── admincerts
                    │   ├── cacerts
                    │   ├── keystore
                    │   ├── signcerts
                    │   └── tlscacerts
                    └── tls
                        ├── ca.crt
                        ├── client.crt
                        └── client.key
    
    Cryptogen 按照配置文件中指定的结构生成了对应的组织和密钥、证书文件
    
    其中最关键的是各个资源下的msp 目录内容,存储了生成的代表MSP 身份的各种证书文件,一般包括:
    
    - admincerts :管理员的身份证书文件
    - cacerts :信任的根证书文件
    - key store :节点的签名私钥文件
    - signcerts :节点的签名身份证书文件
    - tlscacerts: TLS 连接用的证书
    - intermediatecerts (可选):信任的中间证书
    - crls (可选):证书撤销列表
    - config.yaml (可选):记录OrganizationalUnitldentifiers 信息,包括根证书位置和ID信息
    
    这些身份文件随后可以分发到对应的Orderer 节点和Peer 节点上,并放到对应的MSP路径下,用于签名使用
    
    

    配置环境变量

    告诉configtxgen工具在哪里寻找configtx.yaml 文件

    $ export FABRIC_CFG_PATH=$PWD
    
    

    创建Ordering服务启动初始区块

    指定使用 configtx.yaml 文件中定义的 TwoOrgsOrdererGenesis 模板, 生成Ordering服务系统通道的初始区块文件

    $ sudo ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    

    模版内容configtx.yaml:

    # configtx.yaml
    Profiles:
    
        TwoOrgsOrdererGenesis:生成orderer初始区块的配置
            Capabilities:
                <<: *ChannelCapabilities
            Orderer:
                <<: *OrdererDefaults
                Organizations:
                    - *OrdererOrg 指定orderer的组织名称
                Capabilities:
                    <<: *OrdererCapabilities
            Consortiums:指定联盟成员
                SampleConsortium:                Organizations:
                        - *Org1
                        - *Org2
        TwoOrgsChannel:指定通道配置
            Consortium: SampleConsortium
            Application:
                <<: *ApplicationDefaults
                Organizations:指定当前通道加入的组织
                    - *Org1
                    - *Org2
                Capabilities:
                    <<: *ApplicationCapabilities
    
    
    Organizations:
        - &OrdererOrg
            Name: OrdererOrg
            ID: OrdererMSP指定orderer的MSP本地路径
            MSPDir: crypto-config/ordererOrganizations/example.com/msp
        - &Org1
            Name: Org1MSP
            ID: Org1MSP
            MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
            AnchorPeers:指定锚节点,固定的指定
                 - Host: peer0.org1.example.com
                  Port: 7051
        - &Org2
            Name: Org2MSP
            ID: Org2MSP
            MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
            AnchorPeers:
                - Host: peer0.org2.example.com
                  Port: 7051
    
    Orderer: &OrdererDefaults
        OrdererType: solo或者Kafka
        Addresses:
            - orderer.example.com:7050
        BatchTimeout: 2s处理一批消息的超时时间
        BatchSize:指定区块大小
            MaxMessageCount: 10指定最大的处理消息个数
            AbsoluteMaxBytes: 99 MB不管在什么情况下,区块的最大的大小不能超出这个大小
            PreferredMaxBytes: 512 KB建议区块大小,在单个消息不超过指定值的时候,如果超过了512k指定的值(不能超过指定的最大值,即上面的99M大小),也可以生成区块
        Kafka:
            Brokers:
                - 127.0.0.1:9092 kafaka地址端口号
           Organizations:
    Application: &ApplicationDefaults
        Organizations:
    
    Capabilities:
        Global: &ChannelCapabilities
            V1_1: true
        Orderer: &OrdererCapabilities
            V1_1: true
        Application: &ApplicationCapabilities
            V1_1: true
    
    
    
    

    命令执行后输出如下:

    10:49:21.181 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
    10:49:21.207 CST [msp] getMspConfig -> INFO 002 Loading NodeOUs
    10:49:21.208 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs
    10:49:21.210 CST [common/tools/configtxgen] doOutputBlock -> INFO 004 Generating genesis block
    10:49:21.211 CST [common/tools/configtxgen] doOutputBlock -> INFO 005 Writing genesis block
    
    

    创建一个应用通道的配置交易

    务必替换$CHANNEL_NAME或设置CHANNEL_NAME为可在整个说明中使用的环境变量

    $ export CHANNEL_NAME=mychannel
    

    指定使用 configtx.yaml 配置文件中的 TwoOrgsChannel 模板, 来生成新建通道的配置交易文件, TwoOrgsChannel 模板指定了Org1和Org2都属于后面新建的应用通道

    $ sudo ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
    

    输出如下

    11:13:24.984 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
    11:13:24.992 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
    11:13:24.993 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs
    11:13:24.994 CST [msp] getMspConfig -> INFO 004 Loading NodeOUs
    11:13:25.016 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 005 Writing new channel tx
    

    生成锚节点配置更新文件

    锚节点配置更新文件用来对组织的锚节点进行配置

    同样基于 configtx.yaml 配置文件生成新建通道文件, 每个组织都需要分别生成且注意指定对应的组织名称

    $ sudo ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
    
    $ sudo ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
    

    -profile 后面的模版文件目录,/fabric-samples/first-network

    启动网络

    启动docker容器之前,先启动一系列服务,orderer,peers节点,
    要启动多个容器,使用docker-compose来一条命令全部启动,在配置文件中,配置信息

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

    -f: 指定docker-compose文件(指定启动网络时所使用的配置文件)
    -- 该配置文件中描述了启动网络对应该有哪些容器被启动
    -- 指定容器中所挂载的内容

    -d: 在启动过程中不显示详细的启动内容

    注:

    如果想查看网络的实时日志,则不需要提供 -d 参数

    CLI容器将闲置1000秒。如果在需要时它消失了,可以用一个简单的命令重新启动它:

    ​ $ sudo docker start cli

    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:
    
    services:服务
    
      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
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          #- CORE_LOGGING_LEVEL=DEBUG
          - CORE_LOGGING_LEVEL=INFO
          - CORE_PEER_ID=cli
          - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
          - 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
          - 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
          - 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
          - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
        working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
        command: /bin/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
    
    
    

    网络启动顺序: 首先启动Orderer节点, 然后启动Peer节点, 日志输出如下:

    ......
    orderer.example.com       | 02:48:25.080 UTC [orderer/common/server] initializeServerConfig -> INFO 002 Starting orderer with TLS enabled
    orderer.example.com       | 02:48:25.101 UTC [fsblkstorage] newBlockfileMgr -> INFO 003 Getting block information from block storage
    orderer.example.com       | 02:48:25.138 UTC [orderer/commmon/multichannel] NewRegistrar -> INFO 004 Starting system channel 'testchainid' with genesis block hash 67662e918ab76b4a8863cc625d67fcc31e9cb3a7c3c4f9f707af1c05ba5be686 and orderer type solo
    orderer.example.com       | 02:48:25.138 UTC [orderer/common/server] Start -> INFO 005 Starting orderer:
    ......
    
    

    Peer节点启动后, 默认情况下没有加入网络中的任何应用通道, 也不会与Orderer服务建立连接.需要通过客户端对其进行操作, 让它加入网络和指定的应用通道中

    docker-compose-base.yaml文件内容

    version: '2'
    
    services:
    
      orderer.example.com:
        container_name: orderer.example.com
        image: hyperledger/fabric-orderer:$IMAGE_TAG
        environment:对环境变量的声明
          - ORDERER_GENERAL_LOGLEVEL=INFO
          - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
          - ORDERER_GENERAL_GENESISMETHOD=file
          - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
          - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
          - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
          # enabled TLS
          - ORDERER_GENERAL_TLS_ENABLED=true
          - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
          - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
          - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
        working_dir: /opt/gopath/src/github.com/hyperledger/fabric
        command: orderer
        volumes:卷,挂载,
        - ../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:
        container_name: peer0.org1.example.com
        extends:
          file: peer-base.yaml
          service: peer-base
        environment:
          - CORE_PEER_ID=peer0.org1.example.com
          - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
          - 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
          - 7053:7053
    
      peer1.org1.example.com:
        container_name: peer1.org1.example.com
        extends:
          file: peer-base.yaml
          service: peer-base
        environment:对环境变量的声明
          - CORE_PEER_ID=peer1.org1.example.com      peer节点的ID
          - CORE_PEER_ADDRESS=peer1.org1.example.com:7051   
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
          - CORE_PEER_LOCALMSPID=Org1MSP     每个节点都必须指定msp的ID
        volumes:卷,挂载,冒号隔开,主机对容器之间的映射。挂载一般指定msp,tls跟认证有关的
            - /var/run/:/host/var/run/
            - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
            - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
            - peer1.org1.example.com:/var/hyperledger/production
    
        ports:
          - 8051:7051
          - 8053:7053
    
      peer0.org2.example.com:
        container_name: peer0.org2.example.com
        extends:
          file: peer-base.yaml
          service: peer-base
        environment:
          - CORE_PEER_ID=peer0.org2.example.com
          - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:7051
          - CORE_PEER_LOCALMSPID=Org2MSP
        volumes:
            - /var/run/:/host/var/run/
            - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
            - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
            - peer0.org2.example.com:/var/hyperledger/production
        ports:
          - 9051:7051
          - 9053:7053
    
      peer1.org2.example.com:
        container_name: peer1.org2.example.com
        extends:
          file: peer-base.yaml
          service: peer-base
        environment:
          - CORE_PEER_ID=peer1.org2.example.com
          - CORE_PEER_ADDRESS=peer1.org2.example.com:7051
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
          - CORE_PEER_LOCALMSPID=Org2MSP
        volumes:
            - /var/run/:/host/var/run/
            - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
            - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
            - peer1.org2.example.com:/var/hyperledger/production
        ports:
          - 10051:7051
          - 10053:7053
    
    
    

    进入Docker容器

    执行如下命令进入到CLI容器中(后继操作都在容器中执行)

    $ sudo docker exec -it cli bash
    

    如果成功, 命令提示符会变为如下内容:

    root@b240e1643244:/opt/gopath/src/github.com/hyperledger/fabric/peer#
    ​ 接下来,真正在fabric网络环境中创建真正的通道,之前只是创建配置文件,指定访问成员策略的

    创建通道

    检查环境变量是否正确设置

    echo $CHANNEL_NAME
    

    设置环境变量

    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
    

    -o: orderer服务的地址(每一个通道首先都要链接orderer 服务)(因为在配置文件中指定过peer节点的配置,所以无需再次指定)
    -c:指定创建通道的名称
    -f:指定通道的配置交易文件所在路径
    --tls:指定是否开启tls验证,保证收据的完整性,安全性
    --cafile:指定mspd的ca证书。orderer组织里面的ca证书所属路径,属于msp成员管理服务里面的

    该命令自动在本地生成与该应用通道同名的初始区块 mychannel.block, 只有拥有该文件才可以加入创建的应用通道中

    查看:

    root@086adb802655:/opt/gopath/src/github.com/hyperledger/fabric/peer# ll
    total 36
    drwxr-xr-x 5 root root  4096 Apr 29 03:34 ./
    drwxr-xr-x 3 root root  4096 Apr 29 02:48 ../
    drwxr-xr-x 2 root root  4096 Apr 29 02:47 channel-artifacts/
    drwxr-xr-x 4 root root  4096 Apr 29 02:35 crypto/
    -rw-r--r-- 1 root root 15660 Apr 29 03:34 mychannel.block
    drwxr-xr-x 2 root root  4096 Apr 29 02:13 scripts/
    

    加入通道

    应用通道所包含组织的成员节点可以加入通道中

    peer channel join -b mychannel.block
    

    join命令: 将本Peer节点加入到某个应用通道中

    参数含义

    -b: 初始区块文件的路径信息

    执行成功后, Peer连接到该应用通道的Ordering服务上, 开始接收区块信息

    更新锚点

    使用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_LOCALMSPID="Org2MSP"切换身份
    CORE_PEER_ADDRESS=peer0.org2.example.com:7051 
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    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
    

    手动配置网络完成, 可以测试Chaincode


    测试链码:

      1. 安装链码
    • 2.实例化链码
    • 3.调用链码
      • 3.1 query
      • 3.2 invoke

    _sk:是私钥文件
    .pem:是证书文件

    相关文章

      网友评论

          本文标题:009 hyperledger-fabric 手动启动网络全过程

          本文链接:https://www.haomeiwen.com/subject/hepovftx.html