本文檔演示使用Hyperledger Fabric V1.0來部署一個開發者環境並運行一個簡單例子。文檔包括創建和加入通道(賬本)、客戶端認證以及部署和調用智能合約。CLI將用於創建和加入通道(賬本),NodeJS SDK將用於客戶端身份驗證和使用賬本的智能合約功能。
Docker Compose將用於創建包含三個Peer節點的聯盟鏈、一個獨立的Orderer和一個證書頒發機構(CA)。為了加快部署進度,預先生成了基於標准PKI實現的加密要素並打包進fabpre.tar.gz。證書頒發機構(CA)負責簽發、撤銷和維護代表一個企業的加密要素,這些要素提供給客戶端(Node SDK)用於身份認證。
Fabric網絡將通過執行docker-compose自動生成,創建通道和加入通道的API將會自動被調用;同時,開發者也可以通過手動步驟生成自己的Fabric網絡和通道(賬本)或直接使用開發者模式進行應用開發。
一、前置條件和系統配置
· Docker - v1.12 及更高版本
· Docker Compose - v1.8 及更高版本
· Node.js - v2.1.8 及更高版本
yum –y install docker.x86_64
yum –y install python-pip
pip install docker-compose
yum –y install npm
驗證npm安裝:
npm install npm@latest
查看npm版本:
npm -v
二、下載源代碼並創建Fabric網絡
· 下載並安裝 Curl 工具
· 創建 Fabric 工程和項目目錄.
mkdir -p <workspace>
cd <workspace>
然后, 執行如下代碼:
curl -L https://raw.githubusercontent.com/voodoo12345/polaris/master/fabpre.tar.gz -o fabpre.tar.gz 2> /dev/null; tar -xvf fabpre.tar.gz
執行完這條命令,會下載並解壓縮部署Fabric網絡的相關組件 ,包括Docker Compose 腳本, 通道創建/加入腳本, 認證使用的加密要素等.
你當前目錄看上去是這樣的:
ls
ccenv channel_test.sh docker-compose.yml fabpre.tar.gz src tmp
三、使用 Docker
你不需要手工拖取Docker鏡像,通過執行docker-compose命令, fabric-peer, fabric-orderer, fabric-ca和 cli 都會自動下載、解壓縮相關的鏡像。
通道相關的命令:
“create” –在 orderer上創建並命名一個通道,返回一個通道的創世區塊,生成的創世塊以通道的名字命名
“join” – 使用 create 命令生成的創世區塊向Peer節點發出加入通道的請求
四、使用Docker 創建Fabric網絡 & 創建/加入通道(賬本)
1)確保 hyperledger/fabric-ccenv 鏡像的標簽是 latest:
執行docker-compose build
2)創建Fabric網絡,創建通道(正本), 將Peer節點加入通道:
執行docker-compose up
3)查看你的容器:
docker ps
終端應該顯示有6個獨立運行的容器(3 個peer節點, 1個 獨立的 orderer, CLI 和 CA). 嵌入在docker-compose.yml里的channel_test.sh會在CLI容器里執行創建通道和加入通道命令。執行結束,應該只有一個Fabric網絡和一個通道(賬本),通道包含三個節點peer0,Peer1,Peer2。
4)確保通道已成功創建,並且節點都成功加入:
執行docker exec -it cli sh
5)查看通道創建/節點加入的結果:
cat results.txt
屏幕顯示的結果如下:

6)驗證成功創建了創世塊,執行如下命令:
ls -ltr myc1.block
五、下載演示程序和SDK 模塊
· 創建案例程序目錄:
mkdir –p test
curl -OOOOOO https://raw.githubusercontent.com/hyperledger/fabric-sdk-node/master/examples/balance-transfer/{config.json,deploy.js,helper.js,invoke.js,query.js,package.json}
這條命令會下載用於部署、調用和查詢案例智能合約的 javascript 代碼 ,同時,它也包含了node SDK 依賴的模塊
· 安裝node 模塊:
npm install
現在你已經擁有了全部Fabric網絡運行需要的組件.
六、使用 node SDK 注冊/登錄一個用戶並執行部署/調用/查詢操作
這個案例程序將通過Node SDK &APIs以及預先准備的CA認證所需的加密要素來實現客戶端的登記、注冊和登錄。一旦客戶端完成身份驗證,就可以執行程序包含的智能合約功能(部署、調用、查詢)。
1a)注冊/登錄 & 部署智能合約 (Linux or OSX):
GOPATH=$PWD node deploy.js
1b)注冊/登錄& 部署智能合約 (Windows):
SET GOPATH=%cd%
node deploy.js
2)執行一個調用操作. 從 “a” 轉移一定資產到 “b”:
node invoke.js
3)查詢鍵值 “a”:
node query.js
你會在終端上得到一個數值為200的結果
你可以瀏覽NodeJS SDK 和APIs的文檔來實現更多功能。
七、手工創建和加入通道
為了在CLI容器里手動執行創建通道和加入通道API,我們需要編輯Docker Compose文件。用任意文本編輯器打開docker-compose.yml注釋掉channel_test.sh腳本,編輯操作如下:
cli:
container_name: cli
<CONTENT REMOVED FOR BREVITY>
working_dir: /opt/gopath/src/http://github.com/hyperledger/fabric/peer
# command: sh -c './channel_test.sh; sleep 1000'
# command: /bin/sh
1)進入cli 容器:
docker exec -it cli sh
2)發送createChannel API 給 Orderer:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc1
3)發送joinchannel API 給 Peer0:
CreateChannel執行完畢將返回一個創世區塊(myc1.block),然后你可以執行加入通道的指令,把Genesis block作為參數發送joinchannel API給 peer0。
注:通道的定義都保存在創世塊內:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc1.block
4)如果想要加入其它節點,只需重新發送上述命令給peer1或Peer2即可
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer1:7051 peer channel join -b myc1.block
一旦全部Peer節點都加入了通道,你可以查詢賬本而無需在每個節點都部署智能合約。
八、使用命令行工具部署/調用/查詢智能合約
1)運行部署命令:這個命令是在通道myc1上的Peer節點0上部署一個名叫MYCC的智能合約。構造函數把A和B的值分別初始化為100和200。
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode deploy -C myc1 -n mycc -p http://github.com/hyperledger/fabric/examples -c '{"Args":["init","a","100","b","200"]}'
2)運行調用命令:這個命令是從A移動10個單位到B
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode invoke -C myc1 -n mycc -c '{"function":"invoke","Args":["move","a","b","10"]}'
3)運行查詢命令:按照預期,查詢a的返回值應該是90
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode query -C myc1 -n mycc -c '{"function":"invoke","Args":["query","a"]}'
你可以在任何時間發出exit命令退出CLI容器。
九、故障排除
1)如果已有容器在運行,執行docker-compose命令可能會收到報錯,顯示端口已被占用。如果發生這種情況,則需要殺死使用該端口的容器。
2)如果發現缺失部分文件,請確保Curl命令成功執行,並確保已經cd到了代碼下載的目錄。
3)如果你是用自動化步驟創建通道/加入通道的(即沒有在yml文件注釋channel_test.sh步驟),且通道myc1和創世區塊myc1.block已經成功創建。這時,如果你想在CLI容器中手工執行后續的步驟:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc1
你可能看到類似的錯誤信息如下:
<EXACT_TIMESTAMP> UTC [msp] Sign -> DEBU 064 Sign: digest: 5ABA6805B3CDBAF16C6D0DCD6DC439F92793D55C82DB130206E35791BCF18E5F
Error: Got unexpected status: BAD_REQUEST
Usage:
peer channel create [flags]
這是因為你正試圖創建一個重名的通道(myc1),這個通道已經存在!有兩種解決方法,1)我們可以使用一個不同的通道名稱來重新創建通道,例如:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc2
然后,執行加入通道指令:
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc2.block
如果您選擇創建一個新的通道,需要在config.json文件編輯“channelid”參數來匹配新的通道名稱,例如:
{
"chainName":"fabric-client1",
"chaincodeID":"mycc",
"channelID":"myc2",
"goPath":"../../test/fixtures",
"chaincodePath":"github.com/example_cc",
2)如果你想繼續使用原有的通道名稱(myc1),可以刪除所有的容器然后參照手動創建和加入通道部分的步驟繼續執行。
十、常用docker命令:
1)刪除一個容器
docker rm <containerID>
2)強制刪除一個容器
docker rm -f <containerID>
3)強制刪除全部容器
docker rm -f $(docker ps -aq)
4)刪除一個鏡像:
docker rmi <imageID>
5)強制刪除一個鏡像:
docker rmi -f <imageID>
6)強制刪除全部鏡像
docker rmi -f $(docker images -q)