天天看點

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Building Your First Network

BYFN提供了一個示例Hyperledger Fabric網絡,該網絡由兩個組織組成,每個組織維護兩個Peer節點。

本文目錄

  • Building Your First Network
    • 安裝先決條件
    • 生成證書密鑰、創世區塊、通道配置等
    • 啟動網絡
    • Crypto Generator
    • Configuration Transaction Generator
    • 工具使用
    • 通道配置
    • Start the network
    • 建立和加入通道
    • 更新錨節點(Update the anchor peers)
    • 安裝與執行個體化鍊碼
    • Query
    • Invoke
    • 再次query
    • Install
    • 再次query
    • 腳本深入了解
    • 啟用CouchDB
    • 總結

安裝先決條件

作業系統:CentOS 7

1.clone源碼

  git clone https://github.com/hyperledger/fabric-samples.git

  切換到1.4.1分支 git checkout -b v1.4.1

2.已安裝二進制工具

   linux版本

   其它系統版本:Mac版本 Windows版本

3.已安裝docker(推薦docker18.06及以上)和docker-compose

   docker-compose安裝:官方位址

  進入fabric-samples目錄:

   cd fabric-samples/first-network

  first-network目錄下面有個byfn.sh的腳本

  ./byfn.sh up 即可全自動建構hyperledger網絡(預設鍊碼go,通道名mychannel,資料存儲為leveldb,共識使用solo)

Usage:
byfn.sh <mode> [-c <channel name>] [-t <timeout>] [-d <delay>] [-f <docker-compose-file>] [-s <dbtype>] [-l <language>] [-o <consensus-type>] [-i <imagetag>] [-v]"
  <mode> - one of 'up', 'down', 'restart', 'generate' or 'upgrade'"
    - 'up' - bring up the network with docker-compose up"
    - 'down' - clear the network with docker-compose down"
    - 'restart' - restart the network"
    - 'generate' - generate required certificates and genesis block"
    - 'upgrade'  - upgrade the network from version 1.3.x to 1.4.0"
  -c <channel name> - channel name to use (defaults to \"mychannel\")"
  -t <timeout> - CLI timeout duration in seconds (defaults to 10)"
  -d <delay> - delay duration in seconds (defaults to 3)"
  -f <docker-compose-file> - specify which docker-compose file use (defaults to docker-compose-cli.yaml)"
  -s <dbtype> - the database backend to use: goleveldb (default) or couchdb"
  -l <language> - the chaincode language: golang (default), node, or java"
  -o <consensus-type> - the consensus-type of the ordering service: solo (default), kafka, or etcdraft"
  -i <imagetag> - the tag to be used to launch the network (defaults to \"latest\")"
  -v - verbose mode"
byfn.sh -h (print this message)"

Typically, one would first generate the required certificates and
genesis block, then bring up the network. e.g.:"

  byfn.sh generate -c mychannel"
  byfn.sh up -c mychannel -s couchdb"
  byfn.sh up -c mychannel -s couchdb -i 1.4.0"
  byfn.sh up -l node"
  byfn.sh down -c mychannel"
  byfn.sh upgrade -c mychannel"

Taking all defaults:"
      byfn.sh generate"
      byfn.sh up"
      byfn.sh down"
           

生成證書密鑰、創世區塊、通道配置等

執行以下指令: ./byfn.sh generate

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network
Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

啟動網絡

執行指令: ./byfn.sh up

上面的指令将編譯安裝go語言鍊碼(Go是預設的鍊代碼語言,但是也支援Node.js和Java鍊代碼)

./byfn.sh up -l node (node版本鍊碼啟動指令)

./byfn.sh up -l java (java版本鍊碼指令)

注意隻能啟用一個版本的鍊碼,可先關閉網絡

./byfn.sh down ,然後再嘗試其它語言鍊碼

  除了支援多種鍊碼語言外,還可以通過-o标志指定Ordering Service(預設solo),如啟用Raft ordering service可執行以下指令:

  ./byfn.sh up -o etcdraft

  啟用Kafka ordering service

  ./byfn.sh up -o kafka

接下來将介紹底層工具及引導機制的資訊.

Crypto Generator

使用cryptogen tool為我們的各種網絡實體生成加密材料(x509證書和簽名密鑰)。 這些證書代表身份,它們允許在我們的實體進行通信和交易時進行簽名/驗證身份驗證。

在first-network目錄下有一個 crypto-config.yaml 檔案, 它包含網絡拓撲,并允許我們為組織和屬于這些組織的元件生成一組證書和密鑰。 每個組織都配置了一個唯一的根證書(ca-cert),用于将特定元件(peers and orderers)綁定到該組織。 通過為每個組織配置設定唯一的CA憑證。 Hyperledger Fabric中的事務和通信由實體的私鑰(密鑰庫)簽名,然後通過公鑰(signcerts)進行驗證。

crypto-config.yaml檔案中有個計數變量count。 它指定每個組織的peers數量.

運作cryptogen工具後,生成的證書和密鑰将儲存到名為crypto-config的檔案夾中。

請注意,crypto-config.yaml檔案列出了與五個orderer節點。 雖然加密工具将為所有這五個orderer節點建立證書,但除非使用Raft或Kafka,否則這些orderer節點中隻有一個将用于Solo訂購服務實施,并用于建立系統通道。

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Configuration Transaction Generator

configtxgen将用來:

1.生成創世區塊

2.通道配置

3.錨節點配置,此例中有兩個組織,每個組織各一個錨節點

configtx.yaml - 它包含示例網絡的定義。 有三個成員 - 一個Orderer Org(OrdererOrg)和兩個Peer Orgs(Org1和Org2),每個成員管理和維護兩個peer節點。 該檔案還指定了一個聯盟 - SampleConsortium - 由我們的兩個Peer Orgs組成。

工具使用

可以使用configtxgen和cryptogen指令手動生成證書/密鑰和各種配置工件。

byfn.sh腳本中引用generateCerts函數,以擷取生成将用于網絡配置的證書所需的指令

在fabric-samples/bin下面,我們可以看到configtxgen和cryptogen

在first-network目錄下執行指令:

…/bin/cryptogen generate --config=./crypto-config.yaml

會看到控制台輸出:

org1.example.com

org2.example.com

同時會在first-network目錄下生成crypto-config檔案夾,裡面存放了證書及密鑰檔案

接下來,我們需要告訴configtxgen工具在哪裡查找它需要的configtx.yaml檔案:

export FABRIC_CFG_PATH=$PWD

執行以下指令生成創世區塊

…/bin/configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

(Raft ordering service指令:

…/bin/configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

Kafka ordering service指令:

…/bin/configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block)

視窗會出現以下輸出:

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

通道配置

執行指令:

export CHANNEL_NAME=mychannel && …/bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

這裡我們采用預設的通道名 mychannel

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Raft或Kafka ordering service指令同上

接下來進行錨節點配置

org1:

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

org2:

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

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Start the network

接下來,手動啟動網絡:

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

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

如果要檢視網絡的實時日志,請不要提供-d标志

建立和加入通道

前文我們使用configtxgen工具建立了通道配置事務。 您可以使用configtx.yaml中傳遞給configtxgen工具的相同或不同的配置檔案重複該過程以建立其他通道配置事務。

使用docker exec指令進入cli容器:

docker exec -it cli bash

如果進入成功,會看到類似于:

[email protected]:/opt/gopath/src/github.com/hyperledger/fabric/peer#

為了操作友善,配置以下四個環境變量:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
           

接下來就之前生成的channel.tx傳遞給order節點

(使用-c标志指定通道名稱,使用-f标志指定通道配置事務。 在這種情況下,它是channel.tx,但是您可以使用不同的名稱裝入自己的配置事務。 我們将再次在CLI容器中設定CHANNEL_NAME環境變量,以便我們不必顯式傳遞此參數。 通道名稱必須全部小寫,長度小于250個字元,并且與正規表達式[a-z] [a-z0-9 .-] *比對)

export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
           

(注意我們作為此指令中–cafile,它是orderer的根證書的本地路徑,允許我們驗證TLS握手,預設啟用TLS,當然也可以關閉TLS)

此指令傳回一個創世塊 - <CHANNEL_NAME.block> 我們将其加入通道

如果全部按照本文的指令,配置通道名為mychannel,會得到mychannel.block

peer0.org1.example.com加入通道:

peer channel join -b mychannel.block

您可以根據需要通過對上文配置的四個環境變量進行适當更改來使其他Peer節點加入通道。

将peer0.org2.example.com加入通道,以便我們可以正确更新通道中的錨節點。 由于我們将覆寫CLI容器中的預設環境變量,是以這個完整指令将如下所示:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel join -b mychannel.block
           

或者,您可以選擇單獨設定這些環境變量,而不是傳入整個字元串。 一旦設定完畢,您隻需再次發出peer channel join指令(cli容器将會代表peer0.org2.example.com注意)

更新錨節點(Update the anchor peers)

以下指令是通道更新,它們将傳播到通道的定義。 實質上,我們在通道的創世塊之上添加了額外的配置資訊。 請注意,我們不是修改genesis塊,而是簡單地将增量添加到将定義錨點對等體的鍊中。

更新通道定義以将Org1的錨點對等體定義為peer0.org1.example.com執行以下指令:

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
           

更新通道定義以将Org2的錨點對等體定義為peer0.org2.example.com執行以下指令:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
           
Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

安裝與執行個體化鍊碼

應用程式通過鍊代碼與區塊鍊分類帳進行互動。 是以,我們需要在每個将執行和支援我們的事務的對等體上安裝鍊代碼,然後在通道上執行個體化鍊代碼。 首先,将示例Go,Node.js或Java鍊代碼安裝到Org1中的peer0節點上。

Golang:

peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
           

Node.js

peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node/
           

Java

peer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
           

當我們在channel上執行個體化鍊碼時,背書政策将被設定為要求Org1和Org2中的對等方的認可。 是以,我們還需要在Org2中的對等體上安裝鍊碼。

修改以下四個環境變量以在Org2中針對peer0發出install指令:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
           

繼續安裝鍊碼(以golang為例,node,java不再贅述,同上)

peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
           

接下來,在通道上執行個體化鍊碼。 這将初始化通道上的鍊代碼,設定鍊代碼的背書政策,并為目标對等方啟動鍊代碼容器。 記下-P參數。 這是我們的政策,我們指定針對要驗證的此鍊碼的交易所需的認可級别。

在下面的指令中,您會注意到我們将政策指定為-P

“AND(‘Org1MSP.peer’,‘Org2MSP.peer’)”。 這意味着我們需要來自屬于Org1 AND Org2的對等方的“認可”(即兩個認可)。 如果我們将文法更改為OR,那麼我們隻需要一個認可。

以golang為例:

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
           

Node.js

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l node -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
           

Java

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l java -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
           

如果希望其他Peer節點與賬本進行互動,則需要将它們加入到對應通道,安裝對應的鍊碼。 一旦安裝完鍊碼,會生成對應的鍊碼容器。

通過-l參數指定鍊碼語言,node和java相對golang會比較慢,耐心等待即可.

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Query

執行指令:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{“Args”:[“query”,“a”]}'

Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Invoke

現在讓我們從a到b轉賬10。 此事務将剪切新塊并更新狀态DB。 調用的文法如下:

peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
           

再次query

執行指令:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
           
Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

如上圖所示,資産變為90

Install

現在我們将在Org2中的第三個對等體peer1上安裝鍊代碼。 修改以下四個環境變量,以便在Org2中針對peer1發出install指令:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
           

以golang為例,node,java不再贅述,請翻閱本文上述指令

peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
           

再次query

讓我們确認我們可以在Org2中向Peer1發出查詢。 我們使用值100初始化了鍵a,并在之前的調用中删除了10。 是以,對a的查詢仍應傳回90。

org2中的peer1必須首先加入該通道才能響應查詢。 可以通過發出以下指令來連接配接通道并查詢:

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.example.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt peer channel join -b mychannel.block
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
           
Fabric hyperledger 1.4 first-network 測試及手動執行Building Your First Network

Chaincode必須安裝在對等體上,以便它能夠成功地對分類帳執行讀/寫操作。 此外,在針對該鍊代碼執行init或傳統事務(讀/寫)之前,不會為對等啟動鍊代碼容器(例如,查詢“a”的值)。 該事務導緻容器啟動。 此外,通道中的所有對等體都保持分類帳的精确副本,其包括用于以塊的形式存儲不可變的有序記錄的區塊鍊,以及用于維護目前狀态的快照的狀态資料庫。 這包括那些沒有安裝鍊代碼的對等體(如上例中的peer1.org1.example.com)。 最後,鍊代碼在安裝後可以通路(如上例中的peer1.org2.example.com),因為它已經被執行個體化了。

腳本深入了解

BYFN示例為我們提供了兩種Docker Compose檔案,這兩種檔案都是從docker-compose-base.yaml(位于基本檔案夾中)擴充而來的。 我們的第一個版本docker-compose-cli.yaml為我們提供了一個CLI容器,以及一個order,四個peer。 本文操作使用的是此檔案.

第二種風格docker-compose-e2e.yaml建構為使用Node.js SDK運作端到端測試。 除了使用SDK之外,它的主要差別在于Fabric-ca伺服器還有容器。 是以,我們能夠将REST調用發送到組織CA以進行使用者注冊和注冊。

如果你想在沒有先運作byfn.sh腳本的情況下使用docker-compose-e2e.yaml,那麼我們需要進行四次略微修改。 我們需要指向組織CA的私鑰。 您可以在crypto-config檔案夾中找到這些值。 例如,要找到Org1的私鑰,我們将遵循此路徑 - crypto-config / peerOrganizations / org1.example.com / ca /。 私鑰是一個長哈希值,字尾_sk。 Org2的路徑是 - crypto-config / peerOrganizations / org2.example.com / ca /。

在docker-compose-e2e.yaml中更新ca0和ca1的FABRIC_CA_SERVER_TLS_KEYFILE變量。 您還需要編輯指令中提供的路徑以啟動ca伺服器。 您為每個CA容器提供兩次相同的私鑰。

啟用CouchDB

狀态資料庫可以從預設(goleveldb)切換到CouchDB。 CouchDB提供了相同的鍊代碼功能,但是,根據鍊代碼資料被模組化為JSON,還可以對狀态資料庫資料内容執行豐富而複雜的查詢。 要使用CouchDB而不是預設資料庫(goleveldb),請按照前面概述的相同步驟生成工件,除非在啟動網絡時也傳遞docker-compose-couch.yaml:

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

chaincode_example02現在可以使用下面的CouchDB工作。

在peer0.org1.example.com上安裝并執行個體化鍊代碼:

peer chaincode install -n marbles -v 1.0 -p github.com/chaincode/marbles02/go
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
           
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'
           

如果您選擇在docker-compose中映射CouchDB端口,現在可以通過打開浏覽器并導航到以下URL,通過CouchDB Web界面(Fauxton)檢視狀态資料庫:

http://localhost:5984/_utils

您應該看到名為mychannel(或您的唯一通道名稱)的資料庫及其中的文檔。

您可以從CLI運作正常查詢:

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}'
           

也可以通過以下指令檢索曆史:

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}'
           

也可以執行以下指令進行富查詢:

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["queryMarblesByOwner","jerry"]}'
           

總結

本文基于Fabric 1.4 介紹了first-network的搭建,及手動配置運作first-network網絡,希望能夠對大家有所幫助,遇到問題歡迎在評論區留言!

繼續閱讀