主頁 > 區塊鏈 > Hyperledger Fabric 2.x 生產環境的分布式部署、性能測驗與應用

Hyperledger Fabric 2.x 生產環境的分布式部署、性能測驗與應用

2021-02-03 11:25:32 區塊鏈

1.Hyperledger Fabric 2.x 生產環境的分布式部署

安裝Go

sudo wget -P /usr/local https://studygolang.com/dl/golang/go1.15.linux-amd64.tar.gz
cd /usr/local
sudo tar -zxvf go1.15.linux-amd64.tar.gz

添加環境變數

vim ~/.bashrc

將以下內容復制到bashrc檔案中,按I插入,插入完成后按ESC退出插入,輸出:wq!保存退出,如下圖所示

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=$HOME/go
export PATH=$PATH:/home/yujialing/go/src/github.com/hyperledger/amops/bin
export FABRIC_CFG_PATH=/home/yujialing/go/src/github.com/hyperledger/amops/multiple-deployment

更新環境變數

source ~/.bashrc

查看Go是否安裝成功,成功則顯示版本號

go version

在這里插入圖片描述

安裝docker

wget https://download.docker.com/linux/ubuntu/gpg
sudo apt-key add gpg
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

使docker加入用戶組

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart

退出當前用戶重登一下

sudo wget -P /usr/local/bin https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
cd /usr/local/bin/
sudo mv docker-compose-Linux-x86_64 docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

下載Fabric

cd /home/yujialing
mkdir go
mkdir go/src
mkdir go/src/github.com
mkdir go/src/github.com/hyperledger
cd go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout v2.0.0

下載二進制可執行檔案和關于Fabric的docker鏡像

cd scripts/
./bootstrap.sh

在這里插入圖片描述

建立多機部署檔案夾

cd /home/yujialing/go/src/github.com/hyperledger
mkdir amops
cd amops
mkdir multiple-deployment
cd /home/yujialing/go/src/github.com/hyperledger/fabric/scripts
cp -r fabric-samples/bin /home/yujialing/go/src/github.com/hyperledger/amops

設定Fabric服務的地址映射

sudo vim /etc/hosts

把以下內容填充至hosts檔案中,IP需要按實際情況更改

106.xxx.xxx.xxx agridepartorderer.amops.com
120.xxx.xxx.xxx agrimacownerorderer.amops.com
42.xxx.xxx.xxx financedepartorderer.amops.com
106.xxx.xxx.xxx peer0.agridepart.amops.com
106.xxx.xxx.xxx peer1.agridepart.amops.com
120.xxx.xxx.xxx peer0.agrimacowner.amops.com
120.xxx.xxx.xxx peer1.agrimacowner.amops.com
42.xxx.xxx.xxx peer0.financedepart.amops.com
42.xxx.xxx.xxx peer1.financedepart.amops.com

開放Fabric服務所需的埠,6060、7050、7051、7052、7053、7054、8051、8052、8053、3000、8443、9443、10443、9090
在這里插入圖片描述

重啟服務器網路,但我不清楚Xshell重啟服務器網路的指令,所以我采用的是重啟服務器的方式來達到重啟網路的目的,發出指令后重啟連接即可

sudo shutdown -r now

建立鏈碼檔案夾,我要部署兩個鏈碼

cd /home/yujialing/go/src/github.com/hyperledger/amops/multiple-deployment
mkdir chaincode
mkdir chaincode/agrimacadmin
mkdir chaincode/agrimacadmin/go
mkdir chaincode/cultivatedsubsidy
mkdir chaincode/cultivatedsubsidy/go

可以通過FileZilla上傳鏈碼至agrimacadmincultivatedsubsidygo檔案夾中,或者通過touch命令新建鏈碼,并通過vim編輯鏈碼
在這里插入圖片描述
到鏈碼檔案夾下,下載鏈碼的依賴檔案

cd chaincode/agrimacadmin/go
cd chaincode/cultivatedsubsidy/go
go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on
go mod init
go mod vendor

服務器1multiple-deployment檔案夾下新建crypto-config.yaml檔案和configtx.yaml檔案(證書密鑰和交易組態檔),用于生產證書、密鑰、創世區塊等檔案,注:服務器2、3不用建這兩個檔案

cd /home/yujialing/go/src/github.com/hyperledger/amops/multiple-deployment
touch crypto-config.yaml
touch configtx.yaml

將以下內容寫進crypto-config.yaml檔案中

OrdererOrgs:
  - Name: Orderer
    Domain: amops.com
    Specs:
      - Hostname: agridepartorderer
      - Hostname: agrimacownerorderer
      - Hostname: financedepartorderer

PeerOrgs:
  - Name: Agridepart
    Domain: agridepart.amops.com
    EnableNodeOUs: true
    Template:
      Count: 2 #生成證書的數量
    Users:
      Count: 1 #生成用戶證書個數
  - Name: Agrimacowner
    Domain: agrimacowner.amops.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Financedepart
    Domain: financedepart.amops.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

將以下內容寫進configtx.yaml檔案中

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

    - &Agridepart
        Name: AgridepartMSP
        ID: AgridepartMSP
        MSPDir: crypto-config/peerOrganizations/agridepart.amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('AgridepartMSP.admin', 'AgridepartMSP.peer', 'AgridepartMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('AgridepartMSP.admin', 'AgridepartMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('AgridepartMSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('AgridepartMSP.peer')"

        AnchorPeers:
            - Host: peer0.agridepart.amops.com
              Port: 7051

    - &Agrimacowner
        Name: AgrimacownerMSP
        ID: AgrimacownerMSP
        MSPDir: crypto-config/peerOrganizations/agrimacowner.amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.admin', 'AgrimacownerMSP.peer', 'AgrimacownerMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.admin', 'AgrimacownerMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.peer')"

        AnchorPeers:
            - Host: peer0.agrimacowner.amops.com
              Port: 7051

    - &Financedepart
        Name: FinancedepartMSP
        ID: FinancedepartMSP
        MSPDir: crypto-config/peerOrganizations/financedepart.amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('FinancedepartMSP.admin', 'FinancedepartMSP.peer', 'FinancedepartMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('FinancedepartMSP.admin', 'FinancedepartMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('FinancedepartMSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('FinancedepartMSP.peer')"

        AnchorPeers:
            - Host: peer0.financedepart.amops.com
              Port: 7051

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: etcdraft

    Addresses: # orderer 集群節點
        - agridepartorderer.amops.com:7050
        - agrimacownerorderer.amops.com:7050
        - financedepartorderer.amops.com:7050
    # Batch Timeout: The amount of time to wait before creating a batch
    BatchTimeout: 2s

    # Batch Size: Controls the number of messages batched into a block
    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 specifies what signatures must be included in the block
        # from the orderer for the peer to validate it.
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"

Channel: &ChannelDefaults

    Policies:
        # Who may invoke the 'Deliver' API
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        # Who may invoke the 'Broadcast' API
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        # By default, who may modify elements at this config level
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"

    Capabilities:
        <<: *ChannelCapabilities

Profiles:

    ThreeOrgsChannel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Agridepart
                - *Agrimacowner
                - *Financedepart
            Capabilities:
                <<: *ApplicationCapabilities

    SampleMultiNodeEtcdRaft:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: etcdraft
            EtcdRaft:
                Consenters:
                - Host: agridepartorderer.amops.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/server.crt
                - Host: agrimacownerorderer.amops.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agrimacownerorderer.amops.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agrimacownerorderer.amops.com/tls/server.crt
                - Host: financedepartorderer.amops.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/financedepartorderer.amops.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/financedepartorderer.amops.com/tls/server.crt
            Addresses:
                - agridepartorderer.amops.com:7050
                - agrimacownerorderer.amops.com:7050
                - financedepartorderer.amops.com:7050
            Organizations:
            - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
            - <<: *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                - *Agridepart
                - *Agrimacowner
                - *Financedepart

服務器1的操作:生成證書、密鑰、創世區塊、各組織的交易組態檔等

cryptogen generate --config=./crypto-config.yaml
configtxgen -profile SampleMultiNodeEtcdRaft -channelID amopsdeploy -outputBlock ./channel-artifacts/genesis.block
configtxgen -profile ThreeOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID amops
configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/AgridepartMSPanchors.tx -channelID amops -asOrg AgridepartMSP
configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/AgrimacownerMSPanchors.tx -channelID amops -asOrg AgrimacownerMSP
configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/FinancedepartMSPanchors.tx -channelID amops -asOrg FinancedepartMSP

生成的檔案需要拷貝至 服務器2、3 中,通過FileZilla傳輸即可

撰寫三個組織的Fabric啟動代碼

同樣在multiple-deployment檔案夾下創建并編輯各個組織的Fabric啟動代碼

touch docker-compose-up.yaml

撰寫Fabric啟動的yaml檔案,這里只展現其中一個組織,其他兩個組織的Fabric啟動代碼照葫蘆畫瓢即可

version: '2'

services:
  ca.agridepart.amops.com:
    container_name: ca.agridepart.amops.com
    image: hyperledger/fabric-ca
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca.agridepart.amops.com
      - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.agridepart.amops.com-cert.pem
      - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/priv_sk
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-tls/tlsca.agridepart.amops.com-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-tls/priv_sk
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/ca
    command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/agridepart.amops.com/ca/:/etc/hyperledger/fabric-ca-server-config
      - ./crypto-config/peerOrganizations/agridepart.amops.com/tlsca/:/etc/hyperledger/fabric-ca-server-tls
    ports:
      - "7054:7054"

  agridepartorderer.amops.com:
    container_name: agridepartorderer.amops.com
    image: hyperledger/fabric-orderer
    environment:
      - FABRIC_LOGGING_SPEC=DEBUG
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file
      - ORDERER_GENERAL_BOOTSTRAPFILE=/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]
      - 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]
      - ORDERER_OPERATIONS_LISTENADDRESS=0.0.0.0:8443
      - ORDERER_METRICS_PROVIDER=prometheus
    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/amops.com/orderers/agridepartorderer.amops.com/msp:/var/hyperledger/orderer/msp
        - ./crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/:/var/hyperledger/orderer/tls
    ports:
      - 7050:7050
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"

  peer0.agridepart.amops.com:
    container_name: peer0.agridepart.amops.com
    image: hyperledger/fabric-peer
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.agridepart.amops.com
      - CORE_PEER_ADDRESS=peer0.agridepart.amops.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0.agridepart.amops.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.agridepart.amops.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.agridepart.amops.com:7051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - 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
      # Allow more time for chaincode container to build on install.
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
      - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9443
      - CORE_METRICS_PROVIDER=prometheus
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
       - /var/run/:/host/var/run/
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/msp:/etc/hyperledger/fabric/msp
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"

  peer1.agridepart.amops.com:
    container_name: peer1.agridepart.amops.com
    image: hyperledger/fabric-peer
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer1.agridepart.amops.com
      - CORE_PEER_ADDRESS=peer1.agridepart.amops.com:8051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:8051
      - CORE_PEER_CHAINCODEADDRESS=peer1.agridepart.amops.com:8052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.agridepart.amops.com:8051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.agridepart.amops.com:8051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - 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
      # Allow more time for chaincode container to build on install.
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
      - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:10443
      - CORE_METRICS_PROVIDER=prometheus
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
       - /var/run/:/host/var/run/
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/msp:/etc/hyperledger/fabric/msp
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 8051:8051
      - 8052:8052
      - 8053:8053
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"

  cli1:
    container_name: cli1
    image: hyperledger/fabric-tools
    tty: true
    stdin_open: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli1
      - CORE_PEER_ADDRESS=peer0.agridepart.amops.com:7051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/users/Admin@agridepart.amops.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./chaincode/agrimacadmin/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/agrimacadmin/go
        - ./chaincode/cultivatedsubsidy/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/cultivatedsubsidy/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"
      - "peer0.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer1.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer0.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer1.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer0.financedepart.amops.com:42.xxx.xxx.xxx"
      - "peer1.financedepart.amops.com:42.xxx.xxx.xxx"

  cli2:
    container_name: cli2
    image: hyperledger/fabric-tools
    tty: true
    stdin_open: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli2
      - CORE_PEER_ADDRESS=peer1.agridepart.amops.com:8051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/users/Admin@agridepart.amops.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./chaincode/agrimacadmin/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/agrimacadmin/go
        - ./chaincode/cultivatedsubsidy/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/cultivatedsubsidy/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"
      - "peer0.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer1.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer0.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer1.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer0.financedepart.amops.com:42.xxx.xxx.xxx"
      - "peer1.financedepart.amops.com:42.xxx.xxx.xxx"

服務器1、2、3的操作:啟動Fabric網路

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

在這里插入圖片描述

服務器1的操作:創建通道與更新組織1錨節點

docker exec -it cli1 bash
peer channel create -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem
peer channel join -b amops.block
peer channel update -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/AgridepartMSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

退出cli1容器,將區塊檔案amops.block從容器中拷貝出來,拷貝至cli2容器中,使peer1也加入區塊中

exit
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/amops.block ./
docker cp amops.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli2 bash
peer channel join -b amops.block

amops.block拷貝至服務器2、3,例如通過FileZilla的方式
在這里插入圖片描述

服務器2的操作:節點0、1加入通道,并更新組織2的錨節點

docker cp amops.block cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp amops.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli1 bash
peer channel join -b amops.block
peer channel update -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/AgrimacownerMSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

exit
docker exec -it cli2 bash
peer channel join -b amops.block

服務器3的操作:節點0、1加入通道,并更新組織3的錨節點

docker cp amops.block cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp amops.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli1 bash
peer channel join -b amops.block
peer channel update -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/FinancedepartMSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

exit
docker exec -it cli2 bash
peer channel join -b amops.block

服務器1、2、3的操作peer0peer1打包并安裝鏈碼

exit
docker exec -it cli1 bash
peer lifecycle chaincode package cultivatedsubsidy.tar.gz --path github.com/hyperledger/multiple-deployment/chaincode/cultivatedsubsidy/go --lang golang --label cultivatedsubsidy_1
peer lifecycle chaincode package agrimacadmin.tar.gz --path github.com/hyperledger/multiple-deployment/chaincode/agrimacadmin/go --lang golang --label agrimacadmin_1
peer lifecycle chaincode install cultivatedsubsidy.tar.gz
peer lifecycle chaincode install agrimacadmin.tar.gz

exit
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/cultivatedsubsidy.tar.gz ./
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/agrimacadmin.tar.gz ./
docker cp cultivatedsubsidy.tar.gz cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp agrimacadmin.tar.gz cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli2 bash
peer lifecycle chaincode install cultivatedsubsidy.tar.gz
peer lifecycle chaincode install agrimacadmin.tar.gz

服務器1、2、3的操作:錨節點同意提交鏈碼

exit
docker exec -it cli1 bash
peer lifecycle chaincode approveformyorg --channelID amops --name cultivatedsubsidy --version 1.0 --init-required --package-id cultivatedsubsidy_1:c90b208f62638ee5dcd88d82bac2888215a718147a965f084d7d831a94b1a347 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem
peer lifecycle chaincode approveformyorg --channelID amops --name agrimacadmin --version 1.0 --init-required --package-id agrimacadmin_1:1bf978795e1a2786aee6b0e675f9e494c3c97ec0154339731e8be56eb2d8ec74 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

使用任一服務器操作都可:查看鏈碼狀態是否就緒

peer lifecycle chaincode checkcommitreadiness --channelID amops --name cultivatedsubsidy --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --output json
peer lifecycle chaincode checkcommitreadiness --channelID amops --name agrimacadmin --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --output json

使用任一服務器的錨節點操作都可:提交鏈碼

peer lifecycle chaincode commit -o agridepartorderer.amops.com:7050 --channelID amops --name cultivatedsubsidy --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt
peer lifecycle chaincode commit -o agridepartorderer.amops.com:7050 --channelID amops --name agrimacadmin --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt

使用任一服務器的錨節點操作都可:初始化鏈碼

peer chaincode invoke -o agridepartorderer.amops.com:7050 --isInit --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem -C amops -n cultivatedsubsidy --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt -c '{"Args":["Init"]}' –waitForEvent
peer chaincode invoke -o agridepartorderer.amops.com:7050 --isInit --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem -C amops -n agrimacadmin --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt -c '{"Args":["Init"]}' –waitForEvent

使用任一服務器操作都可:與鏈碼進行互動

peer chaincode query -C amops -n cultivatedsubsidy -c '{"Args":["QueryCulSubsidyByKey","0"]}'
peer chaincode query -C amops -n agrimacadmin -c '{"Args":["QueryAgriMachineByKey","0"]}'

在這里插入圖片描述

2.外部服務-與Java專案的結合

首先配置靜態資源,包括證書密鑰和連接檔案
將服務器1生成的crypto-config復制到SpringBoot專案的resources目錄下,并在該目錄下新建名為connection.json的連接檔案

將以下內容復制到connection.json檔案中(IP地址記得修改)

{
  "name": "amops",
  "version": "1.0.0",
  "client": {
    "organization": "Agridepart",
    "connection": {
      "timeout": {
        "peer": {
          "endorser": "300"
        },
        "orderer": "300"
      }
    }
  },
  "channels": {
    "amops": {
      "orderers": [
        "agridepartorderer.amops.com",
        "agrimacownerorderer.amops.com",
        "financedepartorderer.amops.com"
      ],
      "peers": {
        "peer0.agridepart.amops.com": {
          "endorsingPeer": true,
          "chaincodeQuery": true,
          "ledgerQuery": true,
          "eventSource": true
        },
        "peer0.agrimacowner.amops.com": {
          "endorsingPeer": true,
          "chaincodeQuery": true,
          "ledgerQuery": true,
          "eventSource": true
        },
        "peer0.financedepart.amops.com": {
          "endorsingPeer": true,
          "chaincodeQuery": true,
          "ledgerQuery": true,
          "eventSource": true
        }
      }
    }
  },
  "organizations": {
    "Agridepart": {
      "mspid": "AgridepartMSP",
      "peers": [
        "peer0.agridepart.amops.com"
      ],
      "certificateAuthorities": [
        "ca.agridepart.amops.com"
      ],
      "adminPrivateKeyPEM": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/users/Admin@agridepart.amops.com/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/users/Admin@agridepart.amops.com/msp/signcerts/Admin@agridepart.example.com-cert.pem"
      }
    },
    "Agrimacowner": {
      "mspid": "AgrimacownerMSP",
      "peers": [
        "peer0.agrimacowner.amops.com"
      ],
      "certificateAuthorities": [
        "ca.agrimacowner.amops.com"
      ],
      "adminPrivateKeyPEM": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/users/Admin@agrimacowner.amops.com/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/users/Admin@agrimacowner.amops.com/msp/signcerts/Admin@agrimacowner.amops.com-cert.pem"
      }
    },
    "Financedepart": {
      "mspid": "FinancedepartMSP",
      "peers": [
        "peer0.financedepart.amops.com"
      ],
      "certificateAuthorities": [
        "ca.financedepart.amops.com"
      ],
      "adminPrivateKeyPEM": {
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/users/Admin@financedepart.amops.com/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/users/Admin@financedepart.amops.com/msp/signcerts/Admin@financedepart.amops.com-cert.pem"
      }
    }
  },
  "orderers": {
    "agridepartorderer.amops.com": {
      "url": "grpcs://106.xxx.xxx.xxx:7050",
      "mspid": "OrdererMSP",
      "grpcOptions": {
        "ssl-target-name-override": "agridepartorderer.amops.com",
        "hostnameOverride": "agridepartorderer.amops.com"
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/ca.crt"
      },
      "adminPrivateKeyPEM": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/Admin@amops.com/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/Admin@amops.com/msp/signcerts/Admin@amops.com-cert.pem"
      }
    },
    "agrimacownerorderer.amops.com": {
      "url": "grpcs://120.xxx.xxx.xxx:7050",
      "mspid": "OrdererMSP",
      "grpcOptions": {
        "ssl-target-name-override": "agrimacownerorderer.amops.com",
        "hostnameOverride": "agrimacownerorderer.amops.com"
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/orderers/agrimacownerorderer.amops.com/tls/ca.crt"
      },
      "adminPrivateKeyPEM": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/Admin@amops.com/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/Admin@amops.com/msp/signcerts/Admin@amops.com-cert.pem"
      }
    },
    "financedepartorderer.amops.com": {
      "url": "grpcs://42.xxx.xxx.xxx:7050",
      "mspid": "OrdererMSP",
      "grpcOptions": {
        "ssl-target-name-override": "financedepartorderer.amops.com",
        "hostnameOverride": "agrimacownerorderer.amops.com"
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/orderers/financedepartorderer.amops.com/tls/ca.crt"
      },
      "adminPrivateKeyPEM": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/Admin@amops.com/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/Admin@amops.com/msp/signcerts/Admin@amops.com-cert.pem"
      }
    }
  },
  "peers": {
    "peer0.agridepart.amops.com": {
      "url": "grpcs://106.xxx.xxx.xxx:7051",
      "grpcOptions": {
        "ssl-target-name-override": "peer0.agridepart.amops.com",
        "hostnameOverride": "peer0.agridepart.amops.com",
        "request-timeout": 120001
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt"
      }
    },
    "peer0.agrimacowner.amops.com": {
      "url": "grpcs://120.xxx.xxx.xxx:7051",
      "grpcOptions": {
        "ssl-target-name-override": "peer0.agrimacowner.amops.com",
        "hostnameOverride": "peer0.agrimacowner.amops.com",
        "request-timeout": 120001
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt"
      }
    },
    "peer0.financedepart.amops.com": {
      "url": "grpcs://42.xxx.xxx.xxx:7051",
      "grpcOptions": {
        "ssl-target-name-override": "peer0.financedepart.amops.com",
        "hostnameOverride": "peer0.financedepart.amops.com",
        "request-timeout": 120001
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt"
      }
    }
  },
  "certificateAuthorities": {
    "ca.agridepart.amops.com": {
      "url": "https://106.xxx.xxx.xxx:7054",
      "httpOptions": {
        "verify": true
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/ca/ca.agridepart.amops.com-cert.pem"
      },
      "registrar": [
        {
          "enrollId": "admin",
          "enrollSecret": "adminpw"
        }
      ]
    },
    "ca.agrimacowner.amops.com": {
      "url": "https://120.xxx.xxx.xxx:7054",
      "httpOptions": {
        "verify": true
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/ca/ca.agrimacowner.amops.com-cert.pem"
      },
      "registrar": [
        {
          "enrollId": "admin",
          "enrollSecret": "adminpw"
        }
      ]
    },
    "ca.financedepart.amops.com": {
      "url": "https://42.xxx.xxx.xxx:7054",
      "httpOptions": {
        "verify": true
      },
      "tlsCACerts": {
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/ca/ca.financedepart.amops.com-cert.pem"
      },
      "registrar": [
        {
          "enrollId": "admin",
          "enrollSecret": "adminpw"
        }
      ]
    }
  }
}

這是Java專案與Fabric互動的一個demo,運行main函式即可進行與Fabric的互動測驗,參考此處代碼可在Java專案的業務邏輯層實作專案與Fabric的互動

package com.scau.amops.hyperledger;

import lombok.extern.slf4j.Slf4j;
import org.hyperledger.fabric.gateway.*;
import org.hyperledger.fabric.gateway.impl.GatewayImpl;

import java.io.IOException;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

@Slf4j
public class fabricdemo {
    private Gateway gateway;
    private Network network;
    private static final Path NETWORK_CONFIG_PATH = Paths.get("src", "main", "resources", "connection.json");
    private static final Path credentialPath = Paths.get("src", "main","resources", "crypto-config",
            "peerOrganizations", "agridepart.amops.com", "users", "User1@agridepart.amops.com", "msp");

    public static void main(String[] args) {

        X509Certificate certificate = null;
        PrivateKey privateKey = null;
        Gateway gateway = null;
        try {
            //使用agridepart中的user1初始化一個網關wallet賬戶用于連接網路
            Wallet wallet = Wallets.newInMemoryWallet();
            Path certificatePath = credentialPath.resolve(Paths.get("signcerts", "User1@agridepart.amops.com-cert.pem"));
            certificate = readX509Certificate(certificatePath);

            Path privateKeyPath = credentialPath.resolve(Paths.get("keystore", "priv_sk"));
            privateKey = getPrivateKey(privateKeyPath);

            wallet.put("user",Identities.newX509Identity("AgridepartMSP",certificate,privateKey));

            //根據connection.json 獲取Fabric網路連接物件
            GatewayImpl.Builder builder = (GatewayImpl.Builder) Gateway.createBuilder();

            builder.identity(wallet, "user").networkConfig(NETWORK_CONFIG_PATH);
            //連接網關
            gateway = builder.connect();
            //獲取amops通道
            Network network = gateway.getNetwork("amops");
            //獲取合約物件
            Contract contract = network.getContract("cultivatedsubsidy");

            //查詢合約物件evaluateTransaction
            byte[] queryCulSubsidyResultBefore = contract.evaluateTransaction("QueryCulSubsidyByKey","0");
            System.out.println("查詢key=0結果:"+new String(queryCulSubsidyResultBefore, StandardCharsets.UTF_8));

            //創建補貼記錄
            byte[] createCarResult = contract.createTransaction("CreateSubsidy")
                    .submit("10","325","1","yujialing","3000","2020-12-07","23.165767499024923","113.35528715035957","10");
            System.out.println("創建交易的結果"+new String(createCarResult, StandardCharsets.UTF_8));

            //查詢合約物件evaluateTransaction
            byte[] queryCulSubsidyResultAfter = contract.evaluateTransaction("QueryCulSubsidyByKey","10");
            System.out.println("查詢key=10結果:"+new String(queryCulSubsidyResultAfter, StandardCharsets.UTF_8));



        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private static X509Certificate readX509Certificate(final Path certificatePath) throws IOException, CertificateException {
        try (Reader certificateReader = Files.newBufferedReader(certificatePath, StandardCharsets.UTF_8)) {
            return Identities.readX509Certificate(certificateReader);
        }
    }

    private static PrivateKey getPrivateKey(final Path privateKeyPath) throws IOException, InvalidKeyException {
        try (Reader privateKeyReader = Files.newBufferedReader(privateKeyPath, StandardCharsets.UTF_8)) {
            return Identities.readPrivateKey(privateKeyReader);
        }
    }

}

運行main函式,查詢key為0的資料,嘗試插入并查詢key為10的資料
在這里插入圖片描述
在Fabric的命令列界面查看是否成功插入,發現成功插入key為10的資料
在這里插入圖片描述
在生產環境中的示例如下所示:

資料上鏈:

資料校驗:

3.Hyperledger Fabric可視化監控的實作

在任一服務器配置PrometheusGrafana即可

配置Prometheus

拉取Prometheus鏡像

配置一下鏡像目的域名的ip映射,有vpn的小伙伴可以直接pull鏡像

ping github-production-release-asset-2e65be.s3.amazonaws.com

在這里插入圖片描述

hosts檔案處配置一下ip地址映射

sudo vim /etc/hosts

按照以下格式寫進hosts檔案

52.xxx.xxx.xxx github-production-release-asset-2e65be.s3.amazonaws.com

重啟網路或者重啟服務器后拉取docker鏡像

docker pull prom/prometheus

下載Prometheus到Hyperledger檔案夾下

cd /home/ubuntu/go/src/github.com/hyperledger
wget https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz
tar -xvzf prometheus-2.23.0.linux-amd64.tar.gz
cd prometheus-2.23.0.linux-amd64
vim prometheus.yml

將以下內容復制到prometheus.ymlscrape_configs選項下

- job_name: 'hyperledger_metrics'
  scrape_interval: 10s
  static_configs:
  - targets: ['agridepartorderer.amops.com:8443','agrimacownerorderer.amops.com:8443','financedepartorderer.amops.com:8443','peer0.agridepart.amops.com:9443','peer1.agridepart.amops.com:10443','peer0.agrimacowner.amops.com:9443','peer1.agrimacowner.amops.com:10443','peer0.financedepart.amops.com:9443','peer1.financedepart.amops.com:10443']

在這里插入圖片描述

啟動prometheus服務

docker run -d --name prometheus-server -p 9090:9090 \
  --restart always \
  -v /home/ubuntu/go/src/github.com/hyperledger/prometheus-2.23.0.linux-amd64/prometheus.yml:/prometheus.yml \
  prom/prometheus \
  --config.file=/prometheus.yml

查看FabricNetworkMode

docker inspect agridepartorderer.amops.com

查看prometheus容器id

docker ps

在這里插入圖片描述

prometheus容器加入Fabric網路,格式docker network connect <NetworkMode> <prometheus的容器id>

docker network connect multiple-deployment_default bef8a8743005

配置可視化工具Grafana

下載并運行Grafana

wget https://dl.grafana.com/oss/release/grafana-7.3.5.linux-amd64.tar.gz
tar -zxvf grafana-7.3.5.linux-amd64.tar.gz
cd grafana-7.3.5/bin
nohup ./grafana-server > grafana-server-run.log 2>&1 &

打開瀏覽器,通過Grafana所在主機的IP:3000的形式訪問控制面板(3000是埠號),默認賬號和密碼均為admin

登陸進來界面如下所示:

選擇配置選單,點擊增加資料源

選擇Prometheus作為資料源

輸入部署Prometheus所在的主機IP9090埠號,例如http://106xxx.xxx.xxx:9090,輸入完成后拉到最下面點擊Save and Test

訪問Grafana官網,下載Fabric模板的JSON檔案

https://grafana.com/

選擇Grafana選單進入Dashboards界面

在搜索框中輸入Fabric后選擇Hyperledger Fabric Monitoring for 1.4

把Json檔案下載下來

下載完成后回到Grafana面板,匯入剛剛下載完成的Json檔案

點擊Upload JSON file選擇檔案
在這里插入圖片描述
點擊import匯入

匯入完成后界面長這個樣子,但有一些沒資料,那么我們測驗一下是否有資料

比如通過Fabric Version查看指標是什么,點擊下拉框,選擇編輯按鈕

采用的是fabric_version

那我們增添新的儀表板測驗一下

設定指標

其實是有資料的,只是資料引數設定不對

我們回傳主界面,把新建的儀表板移除

再次編輯Fabric Version

Options看到Field確實是version,但顯示的是version的名稱,我們將Name改為Current(當前值),注意:Fabric Version展現的是當前值,但其他的像交易提案成功次數應該設定為Total

版本號就出來了,隨后點擊應用回到主界面

主界面的Fabric Version就顯示正常

各位小伙伴按需設計與分配可達到自己滿意的效果(這里Fabric版本號變成2.0.0是因為在服務器的Fabric版本是2.0.0,虛擬機的版本為2.2.0

4.Fabric生產網路性能測驗

除錯中…

歡迎小伙伴討論,文章內容如有錯誤請在評論區評論或發私聊訊息,謝謝你,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/255944.html

標籤:區塊鏈

上一篇:USDT TRC20 支付通道系統TRC20

下一篇:參加Chainlink中國開發者社區ETHDenver #BUIDLathon專案提交,贏取Chainlink專案提交獎勵!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more