多机搭建

  1. 网络结构

​ 搭建一个多节点网络,网络中有两个组织org1、org2,每个组织各有一个节点,同时有一个orderer节点

名称 IP host 组织
Orderer 192.168.31.236 orderer.example.com orderer
Org1peer0 192.168.31.236 peer0.org1.example.com org1
Org2peer0 192.168.31.130 peer0.org2.example.com org2
  1. 设置网络host

    ​ 打开终端后,输入ifconfig,查看当前ip,然后输入vi /etc/hosts,插入以下数据

    1
    2
    3
    192.168.31.236 orderer.example.com
    192.168.31.236 peer0.org1.example.com
    192.168.31.130 peer0.org2.example.com
  2. 生成Fabric证书

    • 创建项目目录并进入

      在两台虚拟机相同的项目目录下

      1
      cd /home/user && mkdir more && cd more
    • 编写证书文件

      使用 cryptogen 生成模板文件到当前文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      cryptogen showtemplate > crypto-config.yaml

      # 将配置修改如下
      OrdererOrgs:

      - Name: Orderer
      Domain: example.com
      EnableNodeOUs: true

      Specs:
      - Hostname: orderer
      PeerOrgs:

      - Name: org1
      Domain: org1.example.com
      EnableNodeOUs: true
      Template:
      Count: 1
      Users:
      Count: 1

      - Name: org2
      Domain: org2.example.com
      EnableNodeOUs: true
      Template:
      Count: 1
      Users:
      Count: 1
    • 生成证书文件

      1
      cryptogen generate --config=crypto-config.yaml
    • 将生成的证书文件复制到另一个虚拟机

      1
      scp -r ./crypto-config user@192.168.31.130:/home/user/more/
    • 生成通道文件

      • 创世块文件的编写

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        128
        129
        130
        131
        132
        133
        134
        135
        136
        137
        138
        139
        140
        141
        142
        143
        144
        145
        146
        147
        148
        149
        150
        151
        152
        153
        154
        155
        156
        157
        158
        159
        160
        161
        162
        163
        164
        165
        166
        167
        168
        169
        170
        171
        172
        173
        174
        175
        176
        177
        178
        179
        180
        181
        182
        183
        184
        185
        186
        ---
        Organizations:

        - &OrdererOrg

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

        - &Org1

        Name: Org1MSP
        ID: Org1MSP
        MSPDir: ./crypto-config/peerOrganizations/org1.example.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')"
        AnchorPeers:
        - Host: peer0.org1.example.com
        Port: 7051

        - &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')"
        Endorsement:
        Type: Signature
        Rule: "OR('Org2MSP.peer')"

        AnchorPeers:
        - Host: peer0.org2.example.com
        Port: 9051


        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: "MAJORITY Admins"
        LifecycleEndorsement:
        Type: ImplicitMeta
        Rule: "MAJORITY Endorsement"
        Endorsement:
        Type: ImplicitMeta
        Rule: "MAJORITY Endorsement"

        Capabilities:
        <<: *ApplicationCapabilities

        Orderer: &OrdererDefaults

        OrdererType: solo

        Addresses:
        - orderer.example.com:7050

        EtcdRaft:
        Consenters:
        - Host: orderer.example.com
        Port: 7050
        ClientTLSCert: ../organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
        ServerTLSCert: ../organizations/ordererOrganizations/example.com/orderers/orderer.example.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: "MAJORITY 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: "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
        • 生成创世块文件和通道文件

          • 生成创世区块

            1
            configtxgen -profile TwoOrgsOrdererGenesis -channelID fabric-channel -outputBlock ./channel-artifacts/genesis.block
          • 生成通道文件

            1
            configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
          • 定义Org1锚节点

            1
            configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
          • 定义Org2锚节点

            1
            configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
          • 将文件复制到另一台虚拟机

            1
            scp -r ./channel-artifacts user@192.168.31.130:/home/user/more/
    • 编写docker-compose文件

      • orderer节点

        • 创建orderer目录并进入

          1
          mkdir orderer && cd orderer
        • 创建docker-compose.yaml

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          version: '2'

          services:
          orderer.example.com:
          container_name: orderer.example.com
          image: hyperledger/fabric-orderer:latest
          environment:
          - FABRIC_LOGGING_SPEC=INFO
          - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
          - ORDERER_GENERAL_LISTENPORT=7050
          - ORDERER_GENERAL_GENESISMETHOD=file
          - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
          - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
          - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
          - 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]
          - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
          - 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
          volumes:
          - /home/user/more/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
          - /home/user/more/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
          - /home/user/more/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
          ports:
          - 7050:7050
          extra_hosts:
          - "orderer.example.com:192.168.31.236"
          - "peer0.org1.example.com:192.168.31.236"
          - "peer0.org2.example.com:192.168.31.130"
      • org1

        • 创建org1目录并进入

          1
          mkdir org1 && cd org1
        • 创建docker-compose.yaml

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          73
          74
          75
          76
          77
          78
          79
          80
          81
          82
          version: '2'

          services:
          couchdb0.org1.example.com:
          container_name: couchdb0.org1.example.com
          image: couchdb:3.1
          environment:
          - COUCHDB_USER=admin
          - COUCHDB_PASSWORD=adminpw
          ports:
          - 5984:5984

          peer0.org1.example.com:
          container_name: peer0.org1.example.com
          image: hyperledger/fabric-peer:latest
          environment:
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          - CORE_PEER_ID=peer0.org1.example.com
          - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
          - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
          - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
          - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
          - CORE_PEER_LOCALMSPID=Org1MSP
          - FABRIC_LOGGING_SPEC=INFO
          - CORE_PEER_TLS_ENABLED=true
          - CORE_PEER_GOSSIP_USELEADERELECTION=true
          - CORE_PEER_GOSSIP_ORGLEADER=false
          - CORE_PEER_PROFILE_ENABLED=true
          - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
          - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
          - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
          - CORE_CHAINCODE_EXECUTETIMEOUT=300s
          - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
          - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0.org1.example.com:5984
          - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin
          - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw
          depends_on:
          - couchdb0.org1.example.com

          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: peer node start
          volumes:
          - /var/run/:/host/var/run/
          - /home/user/more/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
          - /home/user/more/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
          ports:
          - 7051:7051
          - 7052:7052
          - 7053:7053
          extra_hosts:
          - "orderer.example.com:192.168.31.236"
          - "peer0.org1.example.com:192.168.31.236"
          - "peer0.org2.example.com:192.168.31.130"
          cli:
          container_name: cli
          image: hyperledger/fabric-tools:latest
          tty: true
          stdin_open: true
          environment:
          - GOPATH=/opt/gopath
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          - FABRIC_LOGGING_SPEC=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/
          - /home/user/more/crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
          - /home/user/more/channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
          extra_hosts:
          - "orderer.example.com:192.168.31.236"
          - "peer0.org1.example.com:192.168.31.236"
          - "peer0.org2.example.com:192.168.31.130"
      • org2

        • 在另一个虚拟机创建org2并进入

          1
          mkdir org2 && cd org2
        • 创建docker-compose.yaml

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          73
          74
          75
          76
          77
          78
          79
          80
          services:
          couchdb0.org2.example.com:
          container_name: couchdb0.org2.example.com
          image: couchdb:3.1
          environment:
          - COUCHDB_USER=admin
          - COUCHDB_PASSWORD=adminpw
          ports:
          - 5984:5984

          peer0.org2.example.com:
          container_name: peer0.org2.example.com
          image: hyperledger/fabric-peer:latest
          environment:
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          - CORE_PEER_ID=peer0.org2.example.com
          - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
          - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
          - CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:7052
          - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
          - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
          - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
          - CORE_PEER_LOCALMSPID=Org2MSP
          - FABRIC_LOGGING_SPEC=INFO
          - CORE_PEER_TLS_ENABLED=true
          - CORE_PEER_GOSSIP_USELEADERELECTION=true
          - CORE_PEER_GOSSIP_ORGLEADER=false
          - CORE_PEER_PROFILE_ENABLED=true
          - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
          - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
          - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
          - CORE_CHAINCODE_EXECUTETIMEOUT=300s
          - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
          - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0.org2.example.com:5984
          - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin
          - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw
          depends_on:
          - couchdb0.org2.example.com

          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: peer node start
          volumes:
          - /var/run/:/host/var/run/
          - /home/user/more/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
          - /home/user/more/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
          ports:
          - 7051:7051
          - 7052:7052
          - 7053:7053
          extra_hosts:
          - "orderer.example.com:192.168.31.236"
          - "peer0.org1.example.com:192.168.31.236"
          - "peer0.org2.example.com:192.168.31.130"
          cli:
          container_name: cli
          image: hyperledger/fabric-tools:latest
          tty: true
          stdin_open: true
          environment:
          - GOPATH=/opt/gopath
          - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
          - FABRIC_LOGGING_SPEC=INFO
          - CORE_PEER_ID=cli
          - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
          - CORE_PEER_LOCALMSPID=Org2MSP
          - CORE_PEER_TLS_ENABLED=true
          - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt
          - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key
          - 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
          - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: /bin/bash
          volumes:
          - /var/run/:/host/var/run/
          - /home/user/more/crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
          - /home/user/more/channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
          extra_hosts:
          - "orderer.example.com:192.168.31.236"
          - "peer0.org1.example.com:192.168.31.236"
          - "peer0.org2.example.com:192.168.31.130"
    • 在各台虚拟机启动docker

      1
      docker-compose up -d && docker ps -a	
  3. 通道操作

    • 创建通道(Org1)

      • 进入客户端容器

        1
        docker exec -it cli bash
      • 创建通道

        1
        peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
      • 将生成的mychannel.block复制到宿主机

        1
        docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./
      • 将mychannel.blcok复制到另一台虚拟机

        1
        scp mychannel.block user@192.168.31.130:/home/user/more/org2/
      • 将通道文件拷贝到容器中(Org2)

        1
        docker cp mychannel.block cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/
    • 加入通道

      • 节点加入通道(在Org1和Org2中操作)

        1
        peer channel join -b mychannel.block
      • 更新Org1锚节点

        1
        peer channel update -o orderer.example.com:7050 -c mychannel -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锚节点

        1
        peer channel update -o orderer.example.com:7050 -c mychannel -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
  4. 安装智能合约

    • 在Org1中创建chaincode目录并进入

      1
      mkdir chaincode && cd chaincode
    • 将编辑好的智能合约代码放在该目录下后进行打包源码

      1
      2
      3
      4
      mvn compile package -DskipTests -Dmaven.test.skip=true
      mv target/chaincode.jar $PWD
      # 删除编译后产生的 target 目录; src 源代码目录; pom.xml
      rm -rf target/ src pom.xml
    • 将jar包复制到容器内

      1
      docker cp ./ cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/
    • 在容器内进行打包操作

      1
      peer lifecycle chaincode package chaincode.tar.gz --path ./my-fabric-chaincode-java/ --lang java --label chaincode_1
    • 安装链码

      1
      peer lifecycle chaincode install chaincode.tar.gz
    • 将打包好后的链码复制到宿主机后并传输到另一台虚拟机

      1
      2
      docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/chaincode.tar.gz ./
      scp ./chaincode.tar.gz user@192.168.31.130:/home/user/more/chaincode/
    • 在另一台虚拟机(Org2)中,将打包好的链码复制到容器中

      1
      docker cp ./chaincode.tar.gz cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/
    • 安装链码

      1
      peer lifecycle chaincode install chaincode.tar.gz 
    • 查询链码ID

      1
      2
      3
      4
      peer lifecycle chaincode queryinstalled

      # Installed chaincodes on peer:
      # Package ID: chaincode_1:ec15e83eeeb47bcdedb27b659c677b587a91f8b2b7c837a39c5fae66842fb2f9, Label: chaincode_1
    • 批准链码(Org1和Org2均进行)

      1
      peer lifecycle chaincode approveformyorg --channelID mychannel --name chaincode --version 1.0 --init-required --package-id chaincode_1:ec15e83eeeb47bcdedb27b659c677b587a91f8b2b7c837a39c5fae66842fb2f9 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    • 查看链码是否就绪(Org1和Org2均进行)

      1
      peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name chaincode --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
    • 提交链码(Org1或Org2)

      1
      peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID mychannel --name chaincode --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    • 链码初始化

      1
      peer chaincode invoke -o orderer.example.com:7050 --isInit --ordererTLSHostnameOverride orderer.example.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n chaincode --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["init"]}'
  5. 验证

    • 打开couchdb图形化界面: http://localhost:5984/_utils/

    • 发现已有数据存储image-20240429152158612

    • 在另一台虚拟机上对链码进行操作效果相同