1. 程式人生 > >Hyperledger Fabric1.1 網路啟動與鏈碼呼叫

Hyperledger Fabric1.1 網路啟動與鏈碼呼叫

環境:macOS High Sierra(Version 10.13.3)
參考:Hyperledger Fabric Samples

Fabric官方提供了一個示例專案,本文通過執行該專案來展示fabric的搭建與鏈碼的安裝呼叫。

1. 克隆專案

克隆hyperledger提供的fabric-samples專案

git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples
git checkout v1.1.0 #切至1.1版本,以便跟後續安裝的fabric版本相匹配

2. 下載fabric相關映象和二進位制檔案

執行如下命令,下載fabric相關映象和二進位制檔案(版本1.1.0)

curl -sSL https://goo.gl/6wtTN5 | bash -s 1.1.0

執行完成後生成的檔案
注意命令執行完成之後生成的bin目錄以及其下的二進位制檔案,後面步驟中我們需要這些檔案來進行fabrc區塊鏈網路搭建。為了方便後續使用,這裡我們將bin目錄的路徑加入到環境變數中

export PATH=$PWD/bin:$PATH

或者將export PATH=<path to download location>/bin:$PAT加入~/.bash_profile,使其永久生效。

指令碼從docker hub拉去fabric相關映象並將其標註為‘last’,後面我們會用這些映象生成的容器來組成fabric區塊鏈網路。
下載的fabric相關映象

3. 啟動fabric網路並完成chaincode測試

fabric-samples專案下有多個示例網路,這裡我們參考教程Building Your First Network來執行first-network資料夾下的fabric網路並完成chaincode測試。
- 進入first-network目錄

cd first-network
  • 生成公私鑰和證書資訊、創世區塊和通道相關資訊
./byfn.sh -m generate 

公私鑰和證書資訊基於crypto-config.yaml生成,儲存在crypto-config資料夾中。
創世區塊和通道相關資訊基於configtx.yaml生成,儲存在channel-artifacts資料夾中。

 ./byfn.sh -m generate                                                                                                                *[1252c7a][ruby-2.3.0]
Generating certs and genesis block for with channel 'mychannel' and CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
/Users/lisa/work-station/fabric-samples/first-network/../bin/cryptogen

##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
+ cryptogen generate --config=./crypto-config.yaml
org1.example.com
org2.example.com
+ res=0
+ set +x

/Users/lisa/work-station/fabric-samples/first-network/../bin/configtxgen
##########################################################
#########  Generating Orderer Genesis block ##############
##########################################################
+ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
2018-03-23 21:03:32.746 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-03-23 21:03:32.759 CST [msp] getMspConfig -> INFO 002 Loading NodeOUs
2018-03-23 21:03:32.760 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs
2018-03-23 21:03:32.760 CST [common/tools/configtxgen] doOutputBlock -> INFO 004 Generating genesis block
2018-03-23 21:03:32.761 CST [common/tools/configtxgen] doOutputBlock -> INFO 005 Writing genesis block
+ res=0
+ set +x

#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
2018-03-23 21:03:32.783 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-03-23 21:03:32.795 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2018-03-23 21:03:32.795 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs
2018-03-23 21:03:32.796 CST [msp] getMspConfig -> INFO 004 Loading NodeOUs
2018-03-23 21:03:32.821 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 005 Writing new channel tx
+ res=0
+ set +x

#################################################################
#######    Generating anchor peer update for Org1MSP   ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
2018-03-23 21:03:32.841 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-03-23 21:03:32.851 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-03-23 21:03:32.851 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
+ res=0
+ set +x

#################################################################
#######    Generating anchor peer update for Org2MSP   ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
2018-03-23 21:03:32.872 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-03-23 21:03:32.880 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-03-23 21:03:32.880 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
+ res=0
+ set +x

至此,在這一步我們生成了所有網路實體需要的證書和私鑰,啟動排序服務所需要的“創世區塊”和用來配置通道所需要的一系列檔案。
- 啟動網路

./byfn.sh -m up #預設部署go語言編寫的chaincode

./byfn.sh -m up -l node #可以通過指定-l node部署node版本的chaincode

看到這樣的log時代表fabric網路啟動成功。

CORE_PEER_ID=cli
CORE_LOGGING_LEVEL=INFO
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
===================== Querying on peer1.org2 on channel 'mychannel'... =====================
Attempting to Query peer1.org2 ...3 secs
+ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
+ res=0
+ set +x

2018-03-23 13:38:04.649 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2018-03-23 13:38:04.649 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
Query Result: 90
2018-03-23 13:38:15.427 UTC [main] main -> INFO 003 Exiting.....
===================== Query on peer1.org2 on channel 'mychannel' is successful =====================

========= All GOOD, BYFN execution completed ===========


 _____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/

該命令執行成功之後會基於docker-compose-cli.yaml啟動1Orderer+4Peer+1CLI的Fabric網路容器和相關的chaincode容器。

啟動fabric網路後的容器列表

  • chaincode測試
    進入cli容器
docker exec -it cli bash

執行以下命令可以查詢a賬戶的餘額:

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

可以看到餘額是90

查詢a賬戶的餘額
執行命令呼叫chaincode,將a賬戶的餘額轉10元給b賬戶

# be sure to set the -C and -n flags appropriately
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 mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'

將a賬戶的餘額轉10元給b賬戶
返回的結果說明chaincode呼叫成功,此時a賬戶餘額應為90-10=80,b賬戶餘額應為210+10=120(b賬戶轉賬之前餘額210)
執行下列命令驗證如下

 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'

驗證結果

測試成功!可以關閉fabric網路了

./byfn.sh -m down

接下來就是根據自己的需要確定fabric網路架構(ca,peer,orderer,org個數等),使用go語言或者node編寫chaincode,並將chaincode安裝到fabric網路中即可。