IBM Bluemix (http://www.ibm.com/bluemix)是一個基於cloud的應用開發和部署平臺,提供包括多種服務和運行環境的支持。對Hyperledger應用開發者而言,IBM Bluemix提供免費的入門級區塊運行環境。本文介紹了在IBM Bluemix上部署Hyperledger應用的基本過程。git
登陸Bluemix後,在Catalog頁面中選擇Application Services下的Blochain服務。github
確認區塊服務的名稱,而後點擊Create按鈕以建立區塊服務。golang
在新建的區塊服務頁面上點擊LAUNCH按鈕以啓動區塊服務,並顯示其具體信息。json
首先在區塊服務頁面中選擇 APIs
, 而後展開Network's Enroll IDs
列表以獲取預置的用戶名和密碼列表 。app
而後向選定的區塊節點發送以下請求以註冊用戶測試
POST https://e1bb641577f249a88acca04da0272249-vp3.us.blockchain.ibm.com:444/registrar Content-Type: application/json { "enrollId": "admin", "enrollSecret": "19725f3d88" }
註冊成功的響應爲3d
{ "OK": "Login successful for user 'admin'." }
POST https://e1bb641577f249a88acca04da0272249-vp3.us.blockchain.ibm.com:444/chaincode Content-Type: application/json { "jsonrpc": "2.0", "method": "deploy", "params": { "type": 1, "chaincodeID": { "path": "https://github.com/huyouhengbc/Hyperledger/HelloWorld" }, "ctorMsg": { "function": "init", "args": [ ] }, "secureContext": "admin" }, "id": 1 }
發佈成功的響應爲code
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "e2623e76371a16ca86d97bfb90bdab95885939bf4f2fa40133d65bca4aace27eaf94d8cd10438b80de097442916f6bfef87fb45a6cd678e3cb6ec0bd8dd008c2" }, "id": 1 }
Query請求blog
POST https://e1bb641577f249a88acca04da0272249-vp3.us.blockchain.ibm.com:444/chaincode Content-Type: application/json { "jsonrpc": "2.0", "method": "query", "params": { "type": 1, "chaincodeID": { "name": "e2623e76371a16ca86d97bfb90bdab95885939bf4f2fa40133d65bca4aace27eaf94d8cd10438b80de097442916f6bfef87fb45a6cd678e3cb6ec0bd8dd008c2" }, "ctorMsg": { "function": "hello", "args": [ ] }, "secureContext": "admin" }, "id": 3 }
Query響應接口
200 OK access-control-allow-headers: accept, content-type Access-Control-Allow-Origin: * Content-Type: application/json Date: Sun, 30 Oct 2016 05:13:58 GMT Content-Length: 73 Server: nghttpx nghttp2/1.14.0-DEV Via: 1.1 nghttpx X-Firefox-Spdy: h2 {"jsonrpc":"2.0","result":{"status":"OK","message":"Hello World"},"id":3}
Invoke請求
POST https://e1bb641577f249a88acca04da0272249-vp3.us.blockchain.ibm.com:444/chaincode Content-Type: application/json { "jsonrpc": "2.0", "method": "invoke", "params": { "type": 1, "chaincodeID": { "name": "e2623e76371a16ca86d97bfb90bdab95885939bf4f2fa40133d65bca4aace27eaf94d8cd10438b80de097442916f6bfef87fb45a6cd678e3cb6ec0bd8dd008c2" }, "ctorMsg": { "function": "hello", "args": [ ] }, "secureContext": "admin" }, "id": 3 }
Invoke響應
200 OK access-control-allow-headers: accept, content-type Access-Control-Allow-Origin: * Content-Type: application/json Date: Sun, 30 Oct 2016 05:13:22 GMT Content-Length: 98 Server: nghttpx nghttp2/1.14.0-DEV Via: 1.1 nghttpx X-Firefox-Spdy: h2 {"jsonrpc":"2.0","result":{"status":"OK","message":"d74495ff-f3d3-44ba-acc6-5fbc767bbf21"},"id":3}
POST https://e1bb641577f249a88acca04da0272249-vp0.us.blockchain.ibm.com:444/chaincode Content-Type: application/json { "jsonrpc": "2.0", "method": "deploy", "params": { "type": 1, "chaincodeID": { "path": "https://github.com/huyouhengbc/Hyperledger/blob/master/HelloWorld/HelloWorld.go" }, "ctorMsg": { "function": "init", "args": [ ] }, "secureContext": "user_type8_0" }, "id": 1 } -- response -- 200 OK access-control-allow-headers: accept, content-type Access-Control-Allow-Origin: * Content-Type: application/json Date: Sun, 30 Oct 2016 04:00:14 GMT Content-Length: 721 Server: nghttpx nghttp2/1.14.0-DEV Via: 1.1 nghttpx X-Firefox-Spdy: h2 {"jsonrpc":"2.0","error":{"code":-32001,"message":"Deployment failure","data":"Error when deploying chaincode: Error getting chaincode package bytes: Error getting code 'go get' failed with error: 'exit status 1'\npackage github.com/huyouhengbc/Hyperledger/blob/master/HelloWorld/HelloWorld.go: cannot find package 'github.com/huyouhengbc/Hyperledger/blob/master/HelloWorld/HelloWorld.go' in any of:\n\t/usr/local/go/src/github.com/huyouhengbc/Hyperledger/blob/master/HelloWorld/HelloWorld.go (from $GOROOT)\n\t/go/_usercode_/234208637/src/github.com/huyouhengbc/Hyperledger/blob/master/HelloWorld/HelloWorld.go (from $GOPATH)\n\t/go/src/github.com/huyouhengbc/Hyperledger/blob/master/HelloWorld/HelloWorld.go\n"},"id":1}
{ "jsonrpc": "2.0", "error": { "code": -32001, "message": "Deployment failure", "data": "Error when deploying chaincode: Error getting chaincode package bytes: Error getting code 'go get' failed with error: 'exit status 2'\n# github.com/huyouhengbc/Hyperledger/HelloWorld\n/go/_usercode_/730749822/src/github.com/huyouhengbc/Hyperledger/HelloWorld/HelloWorld.go:15: undefined: shim.ChaincodeStubInterface\n/go/_usercode_/730749822/src/github.com/huyouhengbc/Hyperledger/HelloWorld/HelloWorld.go:21: undefined: shim.ChaincodeStubInterface\n/go/_usercode_/730749822/src/github.com/huyouhengbc/Hyperledger/HelloWorld/HelloWorld.go:27: undefined: shim.ChaincodeStubInterface\n" }, "id": 1 }
{ "jsonrpc": "2.0", "error": { "code": -32001, "message": "Deployment failure", "data": "Error when deploying chaincode: Failed loading TCerts from TCA" }, "id": 1 }
解決方法: 在 Demo Chaincoded
下發布示例應用,選擇Show API details
輸出中使用的節點。
本文介紹了在IBM Bluemix上部署Hyperledger應用的基本過程。