Fabric hyperledger 1.4 first-network 測試及手動執行

Building Your First Network

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

安裝先決條件

操作系統: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
在這裏插入圖片描述在這裏插入圖片描述

啓動網絡

執行命令: ./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訂購服務實施,並用於創建系統通道。
在這裏插入圖片描述

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)
窗口會出現以下輸出:
在這裏插入圖片描述

通道配置

執行命令:
export CHANNEL_NAME=mychannel && …/bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
這裏我們採用默認的通道名 mychannel
在這裏插入圖片描述
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

在這裏插入圖片描述

Start the network

接下來,手動啓動網絡:
docker-compose -f docker-compose-cli.yaml up -d
在這裏插入圖片描述
如果要查看網絡的實時日誌,請不要提供-d標誌

創建和加入通道

回想一下,我們使用configtxgen工具創建了通道配置事務。 您可以使用configtx.yaml中傳遞給configtxgen工具的相同或不同的配置文件重複該過程以創建其他通道配置事務。 然後,您可以重複本節中定義的過程,以在您的網絡中建立其他通道。
使用docker exec命令進入CLI容器:
docker exec -it cli bash
如果進入成功,會看到類似於:
root@0d78bb69300d:/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
您可以根據需要通過對上文配置的四個環境變量進行適當更改來使其他對等方加入通道。
將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

在這裏插入圖片描述

安裝與實例化鏈碼

應用程序通過鏈代碼與區塊鏈分類帳進行交互。 因此,我們需要在每個將執行和支持我們的事務的對等體上安裝鏈代碼,然後在通道上實例化鏈代碼。 首先,將示例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會比較慢,耐心等待即可.
在這裏插入圖片描述

Query

執行命令:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{“Args”:[“query”,“a”]}'
在這裏插入圖片描述

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"]}'

在這裏插入圖片描述
如上圖所示,資產變爲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"]}'

在這裏插入圖片描述
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網絡,希望能夠對大家有所幫助,遇到問題歡迎在評論區留言!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章