#使用IBM Bluemix Blockchain Service在 Blockchain Network 開發 chaincode 作者:陳兆麟 Email:chenlin2@ms9.hinet.net 區塊鏈 (blockchain) 技術,最大特色在於[去集中化管理, no Server],所有決策由多數參與者達成[共識]後決定,好處是降低系統的營運成本,並透過密碼學的加解密,數字簽章及雜湊(hashing)確保系統交易的安全,IBM 整合 Bluemix 的Watson IoT (物聯網) & Blockchain service (參考文獻 2),此範例之貨物運輸合約要確保運送物品溫度處於攝氏0度C之下,若高於0度C則當時負責單位必須負責賠償貨物損失責任;溫度感應器可嵌入在貨物封裝;參與貨物運輸之不同行業 (工廠,海運,陸運,報關行,銀行,雜貨商)可以透過internet 接收貨物運輸時物品所處現況(如溫度,位置)執行相關業務;陸運公司可判斷何時派車至港口接收到達港口之貨櫃; 報關行可預知貨品到達目的地時間以便辦理報關動作,銀行透過報關行,雜貨商的確認付款給工廠。運送過程中若溫度超過 0度C之上,則啟動能智能合約 (chaincode) 將溫度記錄在block;除了監控溫度外,每一階段發生的事件必須多方達成共識才能將 block加入blockchain ,此一系統運作並無集中管理機構的參與,而是在各方參與者達成共識後運作系統。智能合約 (chaincode) 是由程式碼構成,IBM-blockchain是以Golang 撰寫 chaincode,事件發生則起動 block 內相對應 chaincode。以下範例是在 IBM Bluemix blockchain service 環境下,使用Swagger API page開發及執行chainocde。 開發環境:開發環境: Win7 (64 bit) ,Bluemix , Blockchain, Golang 1.win7 安裝 在 win7 安裝 Go (https://golang.org/dl/) 2. 安裝後將安裝路徑設定在系統變數
3. 建立工作目錄 D:\GoProjects,建立 GOPATH 變數 $ set GOPATH=D:\GoProjects $ go version
go version go1.7 windows/amd64 4. win7 安裝 nodejs, npm (https://nodejs.org/en/ ) $node -v
v6.5.0
$npm -v
2.15.9
win7 安裝 git (https://git-scm.com/download/win)
$git version
git version 2.9.3
win7 安裝 cygwin (https://cygwin.com/install.html)
將安裝之執行檔案目錄 (D:\cygwin64\bin) 設定在系統 path 變數
5. 安裝超級分類帳(Hyperledger)的墊片碼(shim code)
$cd D:\GoProjects
$ go get github.com/hyperledger/fabric/core/chaincode/shim
6. 建立 github帳號
登入github 建立帳號 (https://github.com/ 紀錄 username 及 password)
安裝 github desktop (https://desktop.github.com/) $ git config --global user.name “github username” (github username=帳號) $ git config user.name (顯示 github 帳號)
< github username>
7. 安裝範例 learn-chaincode
瀏覽器:https://github.com/IBM-Blockchain/learn-chaincode (點選 fork )
8. 確認learn-chaincode 已 clone 至你的 repository, 在Bluemix blockchain
service 環境必須使用安裝在 github 內之 chaincode.
9. 將 github 的 learn-chaincode repository clone 至 lcoal machine $cd :\GoProjects $mkdir -p src\github.com\< github username>\ $cd src\github.com\< github username>\ $git clone https://github.com/< github username>/learn-chaincode.git $ ls src\github.com\< github username>\
10. learn-chaincode 目錄下 chaincode 範例有 2 版本, start (只具有架構的 chaincode), finished (已經開發完畢的 chaincde);若要在 local開發 chaincode先要確定在 local 環境能夠編譯 chaincode_start.go $cd D:\GoProjects\src\github.com\< yourgithubid >\learn-chaincode\start $go build ./ (正常結束必須沒有任何 text or error 輸出至螢幕)
(若有誤修正) *shim.ChaincodeStub => shim.ChaincodeStubInterface 11.使用 bluemix blockchain service之 Swagger UI 介面執行測試 chaincode ; 登入IBM Bluemix:https://console.ng.bluemix.net/ 點選 Sign Up; 註冊後登入 (30天試用期免費) 將 username及 password 記錄。
建立 Organization 名稱
建立 Space 名稱 Organization, Space Region (US South)
12. 點選型錄 (CATALOG) =>選擇 [Blockchain IBM BETA] 服務
13. Service name: myblockchain => CREATE
14. 點選 Service Crendentials (顯示 Service Crendentials 內容)
15. 點選 launch
16. 點選 Logs 開啟 log 檔
顯示 log 檔案內容
17. 點選 Networks 顯示 chaincode ID (下圖顯示目前無 chaincode)
18. 點選 APIs 顯示 API interactive documentation (進入Swagger API page)
19. 展開 +Network’s Enroll IDs 記錄:ID=user_type1_736394e032, Secret=7a59adadco (有多項 ID 可供選擇)
20. 點選 Registrar -> POST/resgistrar
21. 以ID=user_type1_736394e032, Secret=7a59adadco 註冊 =>[Try is out]
{
“enrollId”: “user_type1_736394e032”,
“enrollSecret”: “7a59adadco”
}
22. 回應 [Login successful] 如下:顯示註冊成功
23. 點選 Chaincode => GET/chain
24. 透過 rest interface,使用者送出請求將github 之 chaincode deploy 至 blockchain network之節點 (peer),以下為請求格式,貼入DeploySpec 欄位
path: 步驟 9
secureContext: 步驟 21
{
“jsonrpc”: “2.0”,
“method”: “deploy”,
“params”: {
“type”: 1,
“chaincodeID”: {
“path”: “https://github.com/xxxxxxxxxxx/learn-chaincode/finished”
},
“ctorMsg”: {
“function”: “init”,
“args”: [
“hi there”
]
},
“secureContext”: “user_type1_xxxxxxxxxxxxxxxxxxxxx”
},
“id”: 1
}
25. 將chaincode deploy至 peer之結果,傳回 chaincode ID (128 character)
若要執行已安裝在 peer之 chaincode 則參考 chaincode ID 即可
26. 若要執行 chaincode 之 query 函式,將執行query 文稿,貼入QuerySpec 欄位
chaincodeId: 步驟 25
secureContext: 步驟 21
{
“jsonrpc”: “2.0”,
“method”: “query”,
“params”: {
“type”: 1,
“chaincodeID”: {
“name”: “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
},
“ctorMsg”: {
“function”: “read”,
“args”: [
“hello_world”
]
},
“secureContext”: “user_type1_xxxxxxxxx”
},
“id”: 2
}
27. chaincode之query函式執行後回應hi there是先前chaincode deploy的結果
28. 若要執行 chaincode 之invoke 函式,將執行invoke文稿,貼入InvokeSpec欄位
chaincodeId: 步驟 25secureContext: 步驟 21 { "jsonrpc": "2.0", "method": "invoke", "params": { "type": 1, "chaincodeID": { "name": "xxxxxxxxxxxxxxxxxxxxxx" }, "ctorMsg": { "function": "write", "args": [ "hello_world", "go away" ] }, "secureContext": "user_type1_xxxxxxxxx" }, "id": 3 }
29. chaincode之 invoke函式執行後響應如下,同時將 [key value of hello_world] 設定為 go away
30 重複執行步驟 26 (執行 chaincode query function),顯示 [key value of hello_world] 已被改為 go away
31. 使用 Swagger API page 的優點在於不必等到系統完工後再去測試 chaincode 是否正確,Blockchcin Service 目前為 Beta 版,會有不穩定的問題。 附錄:
1.bluemix 全球系統維護現況
2.Bluemix 可選擇 Region
api.ng.bluemix.net (US South)
api.eu-gb.bluemix.net (United Kingdom)
api.au-syd.bluemix.net (Sydney) 參考文獻:
1.https://github.com/IBM-Blockchain/learn-chaincode
2.https://www.ibm.com/internet-of-things/iot-news/announcements/private-blockchain/ 點選 [play]
3.https://console.ng.bluemix.net/docs/services/blockchain/ibmblockchain_tutorials.html
4.https://github.com/hyperledger
5.http://www.ibm.com/blockchain/for_developers.html
6.https://github.com/IBM-Blockchain/chaincode-investigator
7.https://console.ng.bluemix.net/docs/services/IoT/blockchain/dev_blockchain.html
8.https://console.ng.bluemix.net/docs/services/IoT/bl_blockchain_integration.html
9.https://console.ng.bluemix.net/docs/services/IoT/reference/extensions/index.html
10.http://bramwelt-fabric.readthedocs.io/en/latest/FAQ/chaincode_FAQ.html
11.http://www.multichain.com/blog/2016/04/beware-impossible-smart-contract/
12.https://github.com/ibm-watson-iot/blockchain-samples/tree/master/simple_contract_hyperledger
13.https://github.com/hyperledger/fabric/blob/master/docs/API/CoreAPI.md?cm_mc_uid=61030309207314713163325&cm_mc_sid_50200000=1473623034#chaincode
14.https://1drv.ms/f/s!AkBmzWP0h-Vxbr7h1uTNsTMcPWI
15.https://1drv.ms/b/s!AkBmzWP0h-VxazOBOsVz8nGMLpM
16.https://1drv.ms/b/s!AkBmzWP0h-VxbLK7FOjH9IL5HHc
17.https://www.youtube.com/watch?v=24JAF9Eu1mk&list=UUOTZe-b_jE_Ovy9K9UhZ4BA&index=74
18.https://www.youtube.com/watch?v=wSmJ-rwUo8I&list=UUOTZe-b_jE_Ovy9K9UhZ4BA&index=73
19.https://www.youtube.com/watch?v=SOsn6MvGH60&list=UUOTZe-b_jE_Ovy9K9UhZ4BA&index=72