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上傳鏈碼至agrimacadmin和cultivatedsubsidy的go檔案夾中,或者通過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
在 服務器1 的multiple-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的操作:peer0、peer1打包并安裝鏈碼
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可視化監控的實作
在任一服務器配置Prometheus和Grafana即可
配置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.yml的scrape_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
查看Fabric的NetworkMode
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所在的主機IP加9090埠號,例如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
標籤:區塊鏈
下一篇:參加Chainlink中國開發者社區ETHDenver #BUIDLathon專案提交,贏取Chainlink專案提交獎勵!
