Fabric 2.4.9 自动化构建脚本

写这篇文章的目的是为了简化繁琐的 Fabric 网络构建过程,在之前的教程中都是一步一步地复制粘贴来构建 Fabric 网络,特别是当网络节点数量很多时,这样使得每次重新启动网络都需要按照教程一步一步执行,变得特别麻烦,所以本文将以之前写的教程《Fabric 2.4.9 单机部署多节点网络(多通道---分片区块链网络)》为例,编写自动化构建脚本。经过测试,Fabric 区块链网络 docker 容器单机部署的节点数量的极限在40-50个左右(包括3个排序节点),节点数量再继续增加就需要多机部署。

1. Fabric 网络构建过程

Fabric 网络的构建过程主要包括以下几个步骤,(1)首先根据自己的需求,确定Fabric网络部署的根目录。(2)生成相关的证书文件,crypto-config.yaml(3)生成相关的通道配置文件,configtx.yaml(4)生成 docker-compose.yaml 的启动文件。(5)复制链码包,创建和加入通道,链码安装、批准、提交。(6)链码初始化(可选)。

1.1 确定 Fabric 网络的根目录

本文将 ~/go/src/github.com/hyperledger/myfabric/ 作为 Fabric 网络的根目录。后续操作中的所有配置文件crypto-config.yamlconfigtx.yamldocker-compose.yaml 都要存放在这个根目录下

1.2 生成相关的证书文件

对于 crypto-config.yaml 配置文件,可以编写 python 代码来自动化生成,generate_cryto_config.py

import yaml

def generate_crypto_config(orderer_orgs, orderers_per_org, peer_orgs, peers_per_org):
    config = {
        "OrdererOrgs": [],
        "PeerOrgs": []
    }

    # Generate Orderer Organizations
    for i in range(orderer_orgs):
        orderer_org = {
            "Name": f"Orderer",
            "Domain": f"idy.com",
            "EnableNodeOUs": True,
            "Specs": [{"Hostname": f"orderer{j}"} for j in range(orderers_per_org)]
        }
        config["OrdererOrgs"].append(orderer_org)

    # Generate Peer Organizations --- MainChain
    for i in range(1, peer_orgs+1):
        peer_org = {
            "Name": f"Org{i}",
            "Domain": f"org{i}.idy.com",
            "EnableNodeOUs": True,
            "Template": {
                "Count": peers_per_org
            },
            "Users": {
                "Count": 1
            }
        }
        config["PeerOrgs"].append(peer_org)

    return config

def save_to_yaml(config, filename):
    with open(filename, 'w') as file:
        yaml.dump(config, file, default_flow_style=False)

# Example usage
orderer_orgs = 1
orderers_per_org = 3
peer_orgs = 5
peers_per_org = 2
config = generate_crypto_config(orderer_orgs, orderers_per_org, peer_orgs, peers_per_org)
save_to_yaml(config, 'crypto-config.yaml')

将生成的配置文件复制到根目录。

生成相关的证书文件:

cryptogen generate --config=crypto-config.yaml

1.3 生成相关的通道配置文件

对于 configtx.yaml 配置文件,这里没有编写自动生成的 python 脚本,个人感觉手动改会快一些,不过节点数量特别多,有需要的话可以自己尝试编写(可以参考自动生成 docker-compose.yaml 的 python 脚本)。

configtx.yaml

Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/idy.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('OrdererMSP.admin')"

    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: crypto-config/peerOrganizations/org1.idy.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org1MSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('Org1MSP.peer')"

    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: crypto-config/peerOrganizations/org2.idy.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')"
            Endorsement:
                Type: Signature
                Rule: "OR('Org2MSP.peer')"

    - &Org3
        Name: Org3MSP
        ID: Org3MSP
        MSPDir: crypto-config/peerOrganizations/org3.idy.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org3MSP.admin', 'Org3MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org3MSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('Org3MSP.peer')"

    - &Org4
        Name: Org4MSP
        ID: Org4MSP
        MSPDir: crypto-config/peerOrganizations/org4.idy.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org4MSP.admin', 'Org4MSP.peer', 'Org4MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org4MSP.admin', 'Org4MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org4MSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('Org4MSP.peer')"

    - &Org5
        Name: Org5MSP
        ID: Org5MSP
        MSPDir: crypto-config/peerOrganizations/org5.idy.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org5MSP.admin', 'Org5MSP.peer', 'Org5MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org5MSP.admin', 'Org5MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org5MSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('Org5MSP.peer')"

Capabilities:
    Channel: &ChannelCapabilities
        V2_0: true
    Orderer: &OrdererCapabilities
        V2_0: true
    Application: &ApplicationCapabilities
        V2_0: true

Application: &ApplicationDefaults
    Organizations:
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "ANY Admins"
        LifecycleEndorsement:
            Type: ImplicitMeta
            Rule: "ANY Endorsement"
        Endorsement:
            Type: ImplicitMeta
            Rule: "ANY Endorsement"

    Capabilities:
        <<: *ApplicationCapabilities

Orderer: &OrdererDefaults
    OrdererType: etcdraft
    Addresses:
        - orderer0.idy.com:7050
        - orderer1.idy.com:8050
        - orderer2.idy.com:9050

    EtcdRaft:
        Consenters:
        - Host: orderer0.idy.com
          Port: 7050
          ClientTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer0.idy.com/tls/server.crt
          ServerTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer0.idy.com/tls/server.crt
          
        - Host: orderer1.idy.com
          Port: 8050
          ClientTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer1.idy.com/tls/server.crt
          ServerTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer1.idy.com/tls/server.crt
          
        - Host: orderer2.idy.com
          Port: 9050
          ClientTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer2.idy.com/tls/server.crt
          ServerTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer2.idy.com/tls/server.crt
          
    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: "ANY Admins"
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"

Channel: &ChannelDefaults
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "ANY Admins"
    Capabilities:
        <<: *ChannelCapabilities

Profiles:
    OrgsOrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
                    - *Org3
                    - *Org4
                    - *Org5

    shard1Channel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
            Capabilities:
                <<: *ApplicationCapabilities
    
    shard2Channel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities

    shard3Channel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org3
            Capabilities:
                <<: *ApplicationCapabilities

    shard4Channel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org4
            Capabilities:
                <<: *ApplicationCapabilities

    shard5Channel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org5
            Capabilities:
                <<: *ApplicationCapabilities

生成系统通道的创世区块文件:

configtxgen -profile OrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID system-channel

分别生成5个分片的应用通道创建文件

configtxgen -profile shard1Channel -outputCreateChannelTx ./channel-artifacts/shard1.tx -channelID shard1
configtxgen -profile shard2Channel -outputCreateChannelTx ./channel-artifacts/shard2.tx -channelID shard2
configtxgen -profile shard3Channel -outputCreateChannelTx ./channel-artifacts/shard3.tx -channelID shard3
configtxgen -profile shard4Channel -outputCreateChannelTx ./channel-artifacts/shard4.tx -channelID shard4
configtxgen -profile shard5Channel -outputCreateChannelTx ./channel-artifacts/shard5.tx -channelID shard5

1.4 生成 docker-compose.yaml 的启动文件

对于 docker-compose.yaml 配置文件,可以编写 python 代码来自动化生成,generate_docker_compose.py

# generate_docker_compose.py


def main(orgs, peers_per_org):
    with open('docker-compose.yaml', 'w') as f:
        f.write('version: \'2.4\'\n')

        f.write('\nvolumes:\n')
        f.write('  # orderer\n')
        for i in range(3):
            f.write(f'  orderer{i}.idy.com:\n')

        for i in range(orgs):
            f.write(f'  # org{i+1}\n')
            for j in range(peers_per_org):
                f.write(f'  peer{j}.org{i+1}.idy.com:\n')

        f.write('\nnetworks:\n')
        f.write('  test:\n')
        f.write('    name: Fabric_Sharding\n')

        f.write('\nservices:\n')
        f.write('  # ordererOrg\n')
        for i in range(3):
            commands = []
            commands.append(f'  orderer{i}.idy.com:')
            commands.append(f'    container_name: orderer{i}.idy.com')
            commands.append(f'    image: hyperledger/fabric-orderer:latest')
            commands.append(f'    labels:')
            commands.append(f'      service: hyperledger-fabric')
            commands.append(f'    environment:')
            commands.append(f'      - FABRIC_LOGGING_SPEC=INFO')
            commands.append(f'      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0')
            commands.append(f'      - ORDERER_GENERAL_LISTENPORT={7+i}050')
            commands.append(f'      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP')
            commands.append(f'      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp')
            commands.append(f'      # enabled TLS')
            commands.append(f'      - ORDERER_GENERAL_TLS_ENABLED=true')
            commands.append(f'      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key')
            commands.append(f'      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt')
            commands.append(f'      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
            commands.append(f'      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt')
            commands.append(f'      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key')
            commands.append(f'      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
            commands.append(f'      - ORDERER_GENERAL_GENESISMETHOD=file')
            commands.append(f'      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block')
            commands.append(f'      - ORDERER_CHANNELPARTICIPATION_ENABLED=true')
            commands.append(f'      - ORDERER_ADMIN_TLS_ENABLED=true')
            commands.append(f'      - ORDERER_ADMIN_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt')
            commands.append(f'      - ORDERER_ADMIN_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key')
            commands.append(f'      - ORDERER_ADMIN_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
            commands.append(f'      - ORDERER_ADMIN_TLS_CLIENTROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
            commands.append(f'      - ORDERER_ADMIN_LISTENADDRESS=0.0.0.0:7053')
            commands.append(f'    working_dir: /opt/gopath/src/github.com/hyperledger/fabric')
            commands.append(f'    command: orderer')
            commands.append(f'    volumes:')
            commands.append(f'      - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block')
            commands.append(f'      - ./crypto-config/ordererOrganizations/idy.com/orderers/orderer{i}.idy.com/msp:/var/hyperledger/orderer/msp')
            commands.append(f'      - ./crypto-config/ordererOrganizations/idy.com/orderers/orderer{i}.idy.com/tls:/var/hyperledger/orderer/tls')
            commands.append(f'    ports:')
            commands.append(f'      - {7+i}050:{7+i}050')
            commands.append(f'      - 705{3+i}:7053')
            commands.append(f'    networks:')
            commands.append(f'      - test\n')
            f.write('\n'.join(commands) + '\n')

            commands.append(f'')
            commands.append(f'')

        f.write('  # peerOrg\n')
        for i in range(orgs):
            f.write(f'  # org{i+1}, 1{i}051, 1{i}151\n')
            for j in range(peers_per_org):
                commands = []
                commands.append(f'  peer{j}.org{i+1}.idy.com:')
                commands.append(f'    container_name: peer{j}.org{i+1}.idy.com')
                commands.append(f'    image: hyperledger/fabric-peer:latest')
                commands.append(f'    labels:')
                commands.append(f'      service: hyperledger-fabric')
                commands.append(f'    environment:')
                commands.append(f'      #Generic peer variables')
                commands.append(f'      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock')
                commands.append(f'      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=Fabric_Sharding')
                commands.append(f'      - FABRIC_LOGGING_SPEC=INFO')
                commands.append(f'      #- FABRIC_LOGGING_SPEC=DEBUG')
                commands.append(f'      - CORE_PEER_TLS_ENABLED=true')
                commands.append(f'      - CORE_PEER_PROFILE_ENABLED=true')
                commands.append(f'      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt')
                commands.append(f'      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key')
                commands.append(f'      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt')
                commands.append(f'      # Peer specific variabes')
                commands.append(f'      - CORE_PEER_ID=peer{j}.org{i+1}.idy.com')
                commands.append(f'      - CORE_PEER_ADDRESS=peer{j}.org{i+1}.idy.com:1{i}{j}51')
                commands.append(f'      - CORE_PEER_LISTENADDRESS=0.0.0.0:1{i}{j}51')
                commands.append(f'      - CORE_PEER_CHAINCODEADDRESS=peer{j}.org{i+1}.idy.com:1{i}{j}52')
                commands.append(f'      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:1{i}{j}52')
                commands.append(f'      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer{j}.org{i+1}.idy.com:1{i}{j}51')
                commands.append(f'      - CORE_PEER_LOCALMSPID=Org{i+1}MSP')
                commands.append(f'    volumes:')
                commands.append(f'      - /var/run/docker.sock:/host/var/run/docker.sock')
                commands.append(f'      - ./crypto-config/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/msp:/etc/hyperledger/fabric/msp')
                commands.append(f'      - ./crypto-config/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls:/etc/hyperledger/fabric/tls')
                commands.append(f'      - /var/run/:/host/var/run/')
                commands.append(f'      - ./:/etc/hyperledger/channel/')
                commands.append(f'    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer')
                commands.append(f'    command: peer node start')
                commands.append(f'    ports:')
                commands.append(f'      - 1{i}{j}51:1{i}{j}51')
                commands.append(f'    networks:')
                commands.append(f'      - test\n')
                f.write('\n'.join(commands) + '\n')

        f.write('  # cli\n')
        for i in range(orgs):
            f.write(f'  # org{i+1}, cli{i+1}-0:1{i}051, cli{i+1}-1:1{i}151\n')
            for j in range(peers_per_org):
                commands = []
                commands.append(f'  cli{i+1}-{j}:')
                commands.append(f'    container_name: cli{i+1}-{j}')
                commands.append(f'    image: hyperledger/fabric-tools:latest')
                commands.append(f'    tty: true')
                commands.append(f'    stdin_open: true')
                commands.append(f'    environment:')
                commands.append(f'      - GOPATH=/opt/gopath')
                commands.append(f'      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock')
                commands.append(f'      - FABRIC_LOGGING_SPEC=INFO')
                commands.append(f'      - CORE_PEER_ID=cli{i+1}-{j}')
                commands.append(f'      - CORE_PEER_ADDRESS=peer{j}.org{i+1}.idy.com:1{i}{j}51')
                commands.append(f'      - CORE_PEER_LOCALMSPID=Org{i+1}MSP')
                commands.append(f'      - CORE_PEER_TLS_ENABLED=true')
                commands.append(f'      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls/server.crt')
                commands.append(f'      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls/server.key')
                commands.append(f'      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls/ca.crt')
                commands.append(f'      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/users/Admin@org{i+1}.idy.com/msp')
                commands.append(f'    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer')
                commands.append(f'    command: /bin/bash')
                commands.append(f'    volumes:')
                commands.append(f'      - /var/run/:/host/var/run/')
                commands.append(f'      - ./chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric-cluster/chaincode/go')
                commands.append(f'      - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/')
                commands.append(f'      - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts')
                commands.append(f'    networks:')
                commands.append(f'      - test\n')

                f.write('\n'.join(commands) + '\n')


if __name__ == "__main__":
    main(5, 2)

这里说明一下端口号的分配:

3个排序节点:每个排序节点会占用2个端口号,分别是以50和53结尾的端口号,orderer0:7050、7053,orderer1:8050、7054,orderer2:9050、7055。

10个 peer 节点:每个 peer 节点也会占用2个端口号,分别是以51和52结尾的端口号,52结尾的端口号是该 peer 节点的链码容器所占用的端口号。这里 peer 节点的端口号按组织编号来分配,端口号都是5位数,第一位都是1,组织编号为1-5,则第 i 个组织的第 j 个 peer 节点占用的端口号分别为:1{i-1}{j-1}51和1{i-1}{j-1}52,例如 peer0.org1:10051、10052,peer1.org1: 10151、10152。

注意:这里 cli 容器的命名和之前教程中的有些不同,第 i 个组织的第 j 个 peer 节点的 cli 容器名称为:cli{i}-{j-1},例如peer0.org1:cli1-0,peer1.org1:cli1-1。

将生成的配置文件复制到根目录。

启动网络:

docker-compose up -d

1.5 复制链码包,创建和加入通道,链码安装、批准、提交

1.5.1 复制链码包

在根目录下新建一个目录:scripts,在该目录下,创建脚本文件 copy-sacc.sh

docker cp sacc.tar.gz cli1-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli1-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

docker cp sacc.tar.gz cli2-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli2-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

docker cp sacc.tar.gz cli3-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli3-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

docker cp sacc.tar.gz cli4-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli4-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

docker cp sacc.tar.gz cli5-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli5-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

这里使用的链码包是之前教程中使用的链码包,后续会发布如何打包自己编写的链码的教程。

在根目录路径下,执行如下命令,复制链码包到每个 peer 节点对应的 cli 容器中:

bash scripts/copy-sacc.sh

后续步骤是在各个分片中,创建加入通道,链码安装批准提交

1.5.2 shard1

进入容器 cli1-0:

docker exec -it cli1-0 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel create -o orderer0.idy.com:7050 -c shard1 -f ./channel-artifacts/shard1.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard1.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt
exit

相比于之前的教程,这里将链码的名字改成了 sacc-1 ,是为了区分不同分片的链码。

复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard1_block.sh

docker cp cli1-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard1.block ./
docker cp ./shard1.block cli1-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

执行如下命令,复制 shard1 分片区块文件:

bash scripts/copy-shard1_block.sh

进入容器 cli1-1:

docker exec -it cli1-1 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel join -b shard1.block
peer lifecycle chaincode install sacc.tar.gz
exit

 1.5.3 shard2

进入容器 cli2-0:

docker exec -it cli2-0 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel create -o orderer0.idy.com:7050 -c shard2 -f ./channel-artifacts/shard2.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard2.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt
exit

复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard2_block.sh

docker cp cli2-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard2.block ./
docker cp ./shard2.block cli2-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

执行如下命令,复制 shard2 分片区块文件:

bash scripts/copy-shard2_block.sh

进入容器 cli2-1:

docker exec -it cli2-1 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel join -b shard2.block
peer lifecycle chaincode install sacc.tar.gz
exit

 1.5.4 shard3

进入容器 cli3-0:

docker exec -it cli3-0 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel create -o orderer0.idy.com:7050 -c shard3 -f ./channel-artifacts/shard3.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard3.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt
exit

复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard3_block.sh

docker cp cli3-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard3.block ./
docker cp ./shard3.block cli3-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

执行如下命令,复制 shard3 分片区块文件:

bash scripts/copy-shard3_block.sh

进入容器 cli3-1:

docker exec -it cli3-1 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel join -b shard3.block
peer lifecycle chaincode install sacc.tar.gz
exit

 1.5.5 shard4

进入容器 cli4-0:

docker exec -it cli4-0 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel create -o orderer0.idy.com:7050 -c shard4 -f ./channel-artifacts/shard4.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard4.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt
exit

复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard4_block.sh

docker cp cli4-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard4.block ./
docker cp ./shard4.block cli4-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

执行如下命令,复制 shard4 分片区块文件:

bash scripts/copy-shard4_block.sh

进入容器 cli4-1:

docker exec -it cli4-1 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel join -b shard4.block
peer lifecycle chaincode install sacc.tar.gz
exit

 1.5.6 shard5

进入容器 cli5-0:

docker exec -it cli5-0 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel create -o orderer0.idy.com:7050 -c shard5 -f ./channel-artifacts/shard5.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard5.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt
exit

复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard5_block.sh

docker cp cli5-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard5.block ./
docker cp ./shard5.block cli5-1:/opt/gopath/src/github.com/hyperledger/fabric/peer

执行如下命令,复制 shard5 分片区块文件:

bash scripts/copy-shard5_block.sh

进入容器 cli5-1:

docker exec -it cli5-1 bash

复制如下多行命令,并粘贴到终端中直接执行:

peer channel join -b shard5.block
peer lifecycle chaincode install sacc.tar.gz
exit

1.6 链码初始化(可选)

如果链码需要初始化,则需要执行这一步,比如我们这里使用的链码 sacc 就是需要初始化的。如果自定义的链码不需要初始化,则需要将批准 approveformyorg 和提交 commit 这2个命令中的 --init-required 删除。

 进入容器 cli1-0:

docker exec -it cli1-0 bash

链码初始化:

peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard1 -n sacc-1 --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-1"]}'

 进入容器 cli2-0:

docker exec -it cli2-0 bash

链码初始化:

peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard2 -n sacc-2 --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-2"]}'

 进入容器 cli3-0:

docker exec -it cli3-0 bash

链码初始化:

peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard3 -n sacc-3 --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-3"]}'

 进入容器 cli4-0:

docker exec -it cli4-0 bash

链码初始化:

peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard4 -n sacc-4 --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-4"]}'

 进入容器 cli5-0:

docker exec -it cli5-0 bash

链码初始化:

peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard5 -n sacc-5 --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-5"]}'

2. 自动化构建脚本

在完成一遍上面的 Fabric 网络构建过程之后,我们便可以将上面过程中的所有命令和操作都写入一个脚本文件中,以后就可以通过执行该脚本文件来自动化启动 Fabric 网络。

在根目录下,创建脚本文件 build-network.sh

echo "1. 生成相关的通道配置文件"
echo "1.1 生成系统通道的创世区块文件"
configtxgen -profile OrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID system-channel

echo "1.2 分别生成5个分片的应用通道创建交易"
configtxgen -profile shard1Channel -outputCreateChannelTx ./channel-artifacts/shard1.tx -channelID shard1
configtxgen -profile shard2Channel -outputCreateChannelTx ./channel-artifacts/shard2.tx -channelID shard2
configtxgen -profile shard3Channel -outputCreateChannelTx ./channel-artifacts/shard3.tx -channelID shard3
configtxgen -profile shard4Channel -outputCreateChannelTx ./channel-artifacts/shard4.tx -channelID shard4
configtxgen -profile shard5Channel -outputCreateChannelTx ./channel-artifacts/shard5.tx -channelID shard5

echo "1.3 启动 PCN 网络"
docker-compose up -d

echo "2. 复制链码包"
bash scripts/copy-sacc.sh

echo "3. 创建和加入通道,链码安装、批准、提交"
echo "----------shard-1----------"
echo "(1) 进入容器cli1-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli1-0 bash -c "
  peer channel create -o orderer0.idy.com:7050 -c shard1 -f ./channel-artifacts/shard1.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer channel join -b shard1.block; \
  peer lifecycle chaincode install sacc.tar.gz; \
  peer lifecycle chaincode approveformyorg --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt;
  "

echo "(2) 复制分片shard1的应用通道区块文件"
bash scripts/copy-shard1_block.sh

echo "(3) 进入容器cli1-1,加入通道、链码安装"
docker exec -it cli1-1 bash -c "
  peer channel join -b shard1.block; \
  peer lifecycle chaincode install sacc.tar.gz;
  "


echo "----------shard-2----------"
echo "(1) 进入容器cli2-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli2-0 bash -c "
  peer channel create -o orderer0.idy.com:7050 -c shard2 -f ./channel-artifacts/shard2.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer channel join -b shard2.block; \
  peer lifecycle chaincode install sacc.tar.gz; \
  peer lifecycle chaincode approveformyorg --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt;
  "

echo "(2) 复制分片shard2的应用通道区块文件"
bash scripts/copy-shard2_block.sh

echo "(3) 进入容器cli2-1,加入通道、链码安装"
docker exec -it cli2-1 bash -c "
  peer channel join -b shard2.block; \
  peer lifecycle chaincode install sacc.tar.gz;
  "

echo "----------shard-3----------"
echo "(1) 进入容器cli3-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli3-0 bash -c "
  peer channel create -o orderer0.idy.com:7050 -c shard3 -f ./channel-artifacts/shard3.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer channel join -b shard3.block; \
  peer lifecycle chaincode install sacc.tar.gz; \
  peer lifecycle chaincode approveformyorg --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt;
  "

echo "(2) 复制分片shard3的应用通道区块文件"
bash scripts/copy-shard3_block.sh

echo "(3) 进入容器cli3-1,加入通道、链码安装"
docker exec -it cli3-1 bash -c "
  peer channel join -b shard3.block; \
  peer lifecycle chaincode install sacc.tar.gz;
  "

echo "----------shard-4----------"
echo "(1) 进入容器cli4-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli4-0 bash -c "
  peer channel create -o orderer0.idy.com:7050 -c shard4 -f ./channel-artifacts/shard4.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer channel join -b shard4.block; \
  peer lifecycle chaincode install sacc.tar.gz; \
  peer lifecycle chaincode approveformyorg --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt;
  "

echo "(2) 复制分片shard4的应用通道区块文件"
bash scripts/copy-shard4_block.sh

echo "(3) 进入容器cli4-1,加入通道、链码安装"
docker exec -it cli4-1 bash -c "
  peer channel join -b shard4.block; \
  peer lifecycle chaincode install sacc.tar.gz;
  "

echo "----------shard-5----------"
echo "(1) 进入容器cli5-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli5-0 bash -c "
  peer channel create -o orderer0.idy.com:7050 -c shard5 -f ./channel-artifacts/shard5.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer channel join -b shard5.block; \
  peer lifecycle chaincode install sacc.tar.gz; \
  peer lifecycle chaincode approveformyorg --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
  peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt;
  "

echo "(2) 复制分片shard5的应用通道区块文件"
bash scripts/copy-shard5_block.sh

echo "(3) 进入容器cli5-1,加入通道、链码安装"
docker exec -it cli5-1 bash -c "
  peer channel join -b shard5.block; \
  peer lifecycle chaincode install sacc.tar.gz;
  "

echo "4. 链码初始化"
echo "shard1"
docker exec -it cli1-0 bash -c "
  peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard1 -n sacc-1 --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-1\"]}';
  "
echo "shard2"
docker exec -it cli2-0 bash -c "
  peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard2 -n sacc-2 --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-2\"]}';
  "
echo "shard3"
docker exec -it cli3-0 bash -c "
  peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard3 -n sacc-3 --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-3\"]}';
  "
echo "shard4"
docker exec -it cli4-0 bash -c "
  peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard4 -n sacc-4 --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-4\"]}';
  "
echo "shard5"
docker exec -it cli5-0 bash -c "
  peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard5 -n sacc-5 --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-5\"]}';
  "

启动网络

./build-network-PCN.sh

注意:使用脚本启动时,偶尔可能会出现一些错误,如果发生了错误,关闭网络,重新启动即可。如果经过多次尝试重启,仍存在错误,请仔细检查配置文件。

如果想要关闭网络,也可以编写脚本文件来实现。在根目录下,创建脚本文件 stop-network.sh

echo "关闭所有docker容器"
docker-compose down

echo "删除所有未被容器使用的卷"
docker volume prune

echo "删除所有容器"
docker rm -f $(docker ps -aq)

关闭网络

./stop-network.sh

3. 链码测试

 进入容器 cli1-0:

docker exec -it cli1-0 bash

查询操作:

peer chaincode query -C shard1 -n sacc-1 -c '{"Args":["query","IDY"]}'

 进入容器 cli2-0:

docker exec -it cli2-0 bash

查询操作:

peer chaincode query -C shard2 -n sacc-2 -c '{"Args":["query","IDY"]}'

 进入容器 cli3-0:

docker exec -it cli3-0 bash

查询操作:

peer chaincode query -C shard3 -n sacc-3 -c '{"Args":["query","IDY"]}'

 进入容器 cli4-0:

docker exec -it cli4-0 bash

查询操作:

peer chaincode query -C shard4 -n sacc-4 -c '{"Args":["query","IDY"]}'

 进入容器 cli5-0:

docker exec -it cli5-0 bash

查询操作:

peer chaincode query -C shard5 -n sacc-5 -c '{"Args":["query","IDY"]}'

4. 文件目录结构

~/go/src/github.com/hyperledger/myfabric/

scripts

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值