1. 程式人生 > >開發者快速入門以太坊代幣開發底層構架

開發者快速入門以太坊代幣開發底層構架

區塊鏈愛好者(QQ:53016353)  

部署一個開發者環境並執行一個簡單例子。文件包括建立和加入通道(賬本)、客戶端認證以及部署和呼叫智慧合約。CLI將用於建立和加入通道(賬本),NodeJS SDK將用於客戶端身份驗證和使用賬本的智慧合約功能。



以太坊代幣將用於建立包含三個Peer節點的聯盟鏈、一個獨立的Orderer和一個證書頒發機構(CA)。為了加快部署進度,預先生成了基於標準PKI實現的加密要素並打包進fabpre.tar.gz。證書頒發機構(CA)負責簽發、撤銷和維護代表一個企業的加密要素,這些要素提供給客戶端(Node SDK)用於身份認證。


Fabric網路將通過執行以太坊代幣自動生成,建立通道和加入通道的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
[email protected]



檢視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
· 安裝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






# 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


你可能看到類似的錯誤資訊如下:


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)