天天看點

Writing, Building, and Running Chaincode in a Development Environment

Chaincode的開發者需要通過建立一個完善的peer network等一些方式去測試或者debug他們的chaincode。當你想要chaincode來運作,你首先需要通過CLI,REST API,gRPC API或者SDK來部署它。根據接收到的請求,peer節點将要對等節點的docker來使chaincode運作起來。這個debug chaincode的下面環境的配置部署的步驟很簡單并不是很複雜,是由于這些步驟的循環:launch chaincode - debug docker container - fix problem - launch chaincode - lather - rinse - repeat.比如說:fabric peer 有一個--peer-chaincodedev 的标志。這個标志可以不通過decker容器來部署chaincode而被啟動指令來建立peer節點。

下列指令允許去通過JAVA或者GO來開發chaincode。他們不被允許運作在生産環境中。然而,如果使用JAVA來開發chaincode,請看https://github.com/hyperledger/fabric/blob/master/docs/Setup/JAVAChaincode.md 這個網址的介紹來首先确定你的環境已經正确的配置好了

注意: 我們需要增加System chaincode的支援

Choices

開始之後,你可以選擇下面的其中一個步驟進行:

1:使用Vagrant的開發環境,這個環境被用來開發fabric

2:在windows或者Mac上面使用docker

3:使用docker的toolbox

如果通過步驟2或者步驟3,再進行之前,你需要保證一切都是從頭開始進行的,并且也不需要保持一個克隆的fabric的Github導出目前的資料。反而,你可以簡單的拉取并且運作fabric-peer和fabric-membersrvc從DockerHub來進行鏡像引導

你需要多個指令行視窗--基本上每個終端視窗對應了每個不同的元件。比如:其中一個來運作validating peer(驗證節點),再有一個來運作chaincode,另外的一個來運作CLI或者REST API指令去運作事務(交易).最後,當可以安全運作的時候,一個附加的(第四個)視窗被需要用來運作Certificate Authority(CA)服務.更詳細的說明在下面的章節中講到

Option 1 Vagrant開發環境

安全設定(可選)

從devenv的子目錄設定成為你的工作環境(workspace),然後ssh到Vagrant環境中:

cd $GOPATH/src/github.com/hyperledger/fabric/devenv

vagrant ssh

設定好了本地的安全開發環境之後,你必須首先建立并且運作Certificate Authority (CA)服務:

cd $GOPATH/src/github.com/hyperledger/fabric

make membersrvc && membersrvc

在指令行的基礎上運作CA服務來預設設定,它被定義在了membersrvc.yaml這個配置檔案中.預設的配置包括了已經注冊了CA服務的多個使用者,這些使用者被列舉在了配置檔案中的eca.users節點目錄中。去注冊其他的使用者使用CA進行測試,你可以修改eca.users節點目錄中的内容,這個目錄中包括了enrollmentID和enrollmentPW的鍵值對,修改它們即可。注意一下enrollmentPW之前的整數.

那個整數标志了使用者的一些規則:1代表客戶,2代表非驗證節點,4代表驗證節點,8代表auditor

運作驗證節點

注意:去安全運作,在peer執行之前,首先要修改core.yaml這個配置檔案去設定security.enabled的值為true。或者,你可以啟用安全來運作peer并且設定環境變量:CORE_SECURITY_ENABLED = true。啟用隐私和保密的交易(這也需要安全啟用),修改core.yaml配置檔案中,設定security.privacy的值為true。或者,你可以通過設定下面的環境變量來啟用隐私保護:CORE_SECURITY_PRIVACY=true,如果你通過修改環境變量來進行隐私保護措施,那麼當運作所有的peer操作的子請求的時候,就需要去包括了這些環境變量在指令中。(比如:deploy,invoke或者query)

在一個新的指令行視窗中,從devenv的子目錄中

運作chaincode

開啟一個新的終端視窗

使用ssh指令進入到虛拟機中

cd $GOPATH/src/github.com/hyperledger/fabric/devenv

vagrant ssh

接下來,我們将建立chaincode_example02項目的代碼,它被Hyperledger fabric源代碼項目來提供。如果你使用的是方法1,那麼你可以複制下面的指令到你的指令行中

cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

go build

當你準備開始建立你自己的chaincode程式,建立一個新的子目錄在$GOPATH/src目錄下面。你可以複制chaincode_example02檔案到你的新目錄下面并且進行修改的操作.

開始注冊一個新的chaincode

運作下面的chaincode指令去開啟并且注冊chaincode到驗證節點中:

CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:30303 ./chaincode_example02

chaincode的控制台将會顯示出資訊“Received REGISTERED, ready for invocations”,這表明了chaincode已經準備去接受請求了。按着步驟進行chaincode的部署,invoke或者query的事務。如果“Received REGISTERED”資訊沒有顯示出來的話,是因為可能在你部署的時候發生了一些錯誤。

運作CLI或者REST API

通過CLI和REST部署chaincode

通過CLI和REST調用chaincode

通過CLI和REST查詢chaincode

如果你要通過安全模式運作,你可以去看”當安全模式時移除臨時檔案”去學習如何去清除臨時檔案。

看到日志控制參考資訊對等和chaincodes控制日志輸出。

終端3(CLI或者REST API)

記錄REST API端口

預設的REST接口的端口号是7050.它可以在檔案core.yaml中的rest.address屬性進行修改配置。如果使用Vagrant,那麼REST端口映射被定義在Vagrantfile

記錄安全功能

目前安全實作的基礎,是假設終端使用者身份驗證發生在應用程式層和不處理的fabric.身份驗證可以通過任何方式被認為是适合目标應用程式.使用者一經成功的實驗,這個應用将會執行使用者曾經正确注冊的CA.如果登記是嘗試一秒對于同一個使用者,将會産生一個錯誤的結果.在注冊期間,應用将會發送一個請求給權威的證書去驗證使用者的注冊是否成功,CA響應使用者的證書和key.登記和交易收到CA的驗證将會被儲存在本地的/var/hyperledger/production/crypto/client/目錄中.這個目錄存在于一個特殊的peer節點,這個目錄允許使用者去交易僅僅通過這個特殊的peer節點當使用存儲加密材料的時候.如果使用者最終需要超過一個peer節點去執行交易,應用程式負責複制其他對等節點進行加密操作......

啟用了安全,CLI指令和REST有效負荷必須去修改包含在其中的enrollmentID 來判斷哪個注冊的使用者登入了進去。否則将會産生一個錯誤的而結果。一個注冊的使用者可以通過CLI或者REST API來記錄(依循本頁下面的說明)。通過CLI來記錄,出現下面的指令,username是enrollmentID其中的一個值在membersrvc.yarm檔案中的eca.users部分中。

從你的指令行終端中,移動到devenv你的工作環境子目錄中。登陸進去Vagrant終端中通過執行下面的指令:

Vagrant ssh

注冊使用者通過CLI,恰當地取代<username>

    cd $GOPATH/src/github.com/hyperledger/fabric/peer

    peer network login <username>

這個指令将會提示輸入密碼,密碼必須比對enrollmentPW 清單中對于目标使用者的membersrvc.yaml檔案中的eca.users部分。如果密碼不比對将會報錯。

通過REST API去登陸,發送一個POST請求到/registrar的終端,包含的enrollmentID和enrollmentPW條目在membersrvc.yaml檔案中的eca.users部分中

REST請求:

POST localhost:5000/registrar

{

  "enrollId": "jim",

  "enrollSecret": "6avZQLwcUe9b"

}

REST響應:

200 OK

{

    "OK": "Login successful for user 'jim'."

}

Chaincode通過CLI和REST進行部署

首先,發送一個部署chaincode交易,這一次,去到驗證性的peer節點中。CLI連接配接到可驗證的peer節點中,屬性定義在core.yaml檔案中。注意:部署交易通常需要一個路徑參數來定位,build,并且部署chaincode。然而,因為這些指令是特定于本地開發模式和手動chaincode部署,使用name參數來進行代替

peer chaincode deploy -n mycc -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

或者說,你可以通過REST API來運作、部署chaincode交易

REST請求:

POST host:port/chaincode

{

  "jsonrpc": "2.0",

  "method": "deploy",

  "params": {

    "type": 1,

    "chaincodeID":{

        "name": "mycc"

    },

    "ctorMsg": {

        "function":"init",

        "args":["a", "100", "b", "200"]

    }

  },

  "id": 1

}

REST 響應:

{

    "jsonrpc": "2.0",

    "result": {

        "status": "OK",

        "message": "mycc"

    },

    "id": 1

}

注意:當啟用安全性,修改CLI指令和REST API通過enrollmentID來登陸到使用者中。去登入到注冊的使用者中通過CLI或者REST API,根據下面的說明:“note on security functionality”。在CLI裡面,enrollmentID通過使用-u的參數;而在REST API中,enrollmentID則是通過secureContext元素。如果你啟用安全性并且保證變量環境peer程序的隐私性,那麼當運作所有的子請求peer操作(比如:deploy,invoke或者query)的時候,那麼在指令中包含這些環境變量就顯得特别重要。

  CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -n mycc -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

REST請求:

POST host:port/chaincode

{

  "jsonrpc": "2.0",

  "method": "deploy",

  "params": {

    "type": 1,

    "chaincodeID":{

        "name": "mycc"

    },

    "ctorMsg": {

        "function":"init",

        "args":["a", "100", "b", "200"]

    },

    "secureContext": "jim"

  },

  "id": 1

}

通過運作目标初始化的方法來部署chaincode的交易初始化。通過标明是“init”方法的例子,名字可以被chaincode開發者任意地選擇。你将會看到chaincode視窗中,下面的輸出内容:

  2015/11/15 15:19:31 Received INIT(uuid:005dea42-d57f-4983-803e-3232e551bf61), initializing chaincode

    Aval = 100, Bval = 200

通過CLI和REST來調用chaincode

通過CLI來調用chaincode交易并且多次運作。- n參數應與chaincode視窗提供的值比對(打開Vagrant終端2):

peer chaincode invoke -l golang -n mycc -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'

或者,通過REST API 來調用chaincode交易

REST請求:

POST host:port/chaincode

{

  "jsonrpc": "2.0",

  "method": "invoke",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"invoke",

         "args":["a", "b", "10"]

      }

  },

  "id": 3

}

REST響應:

{

    "jsonrpc": "2.0",

    "result": {

        "status": "OK",

        "message": "5a4540e5-902b-422d-a6ab-e70ab36a2e6d"

    },

    "id": 3

}

注意:當啟用安全性,修改CLI指令和REST API通過enrollmentID來登陸到使用者中。去登入到注冊的使用者中通過CLI或者REST API,根據下面的說明:“note on security functionality”。在CLI裡面,enrollmentID通過使用-u的參數;而在REST API中,enrollmentID則是通過secureContext元素。如果你啟用安全性并且保證變量環境peer程序的隐私性,那麼當運作所有的子請求peer操作(比如:deploy,invoke或者query)的時候,那麼在指令中包含這些環境變量就顯得特别重要。

 CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'

REST 請求:

POST host:port/chaincode

{

  "jsonrpc": "2.0",

  "method": "invoke",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"invoke",

         "args":["a", "b", "10"]

      },

      "secureContext": "jim"

  },

  "id": 3

}

通過“invoke”指定的參數來調用chaincode指定的交易方法。這個交易将會從A到B轉移10個機關。你将會看到chaincode視窗中,下面的輸出内容:

  2015/11/15 15:39:11 Received RESPONSE. Payload 200, Uuid 075d72a4-4d1f-4a1d-a735-4f6f60d597a9

Aval = 90, Bval = 210

通過CLI和REST來查詢chaincode

在chaincode上面運作一個查詢來得到期望得到的結果。-n參數應該和在chaincode視窗中提供的值比對(打開Vagrant終端2)

   peer chaincode query -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'

響應的内容應該和下面的内容差不多:

 {"Name":"b","Amount":"210"}

如果這個查詢的名字不存在a或者b 就會發送給chaincode_example02

你會看要像是如下的報錯資訊:

  {"Error":"Nil amount for c"}

或者,通過REST API來運作查詢chaincode

REST 請求:

POST host:port/chaincode

{

  "jsonrpc": "2.0",

  "method": "query",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"query",

         "args":["a"]

      }

  },

  "id": 5

}

REST 響應:

{

    "jsonrpc": "2.0",

    "result": {

        "status": "OK",

        "message": "90"

    },

    "id": 5

}

注意:當啟用安全性,修改CLI指令和REST API通過enrollmentID來登陸到使用者中。去登入到注冊的使用者中通過CLI或者REST API,根據下面的說明:“note on security functionality”。在CLI裡面,enrollmentID通過使用-u的參數;而在REST API中,enrollmentID則是通過secureContext元素。如果你啟用安全性并且保證變量環境peer程序的隐私性,那麼當運作所有的子請求peer操作(比如:deploy,invoke或者query)的時候,那麼在指令中包含這些環境變量就顯得特别重要。

   CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u jim -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'

REST請求:

POST host:port/chaincode

{

  "jsonrpc": "2.0",

  "method": "query",

  "params": {

      "type": 1,

      "chaincodeID":{

          "name":"mycc"

      },

      "ctorMsg": {

         "function":"query",

         "args":["a"]

      },

      "secureContext": "jim"

  },

  "id": 5

}

當進行安全認證的時候要移除臨時檔案

注意:這一步僅僅适用于基于在option1的步驟後面。而對于選項2或3,就需要通過docker來進行清理的操作了。

在安全模式下完成了了chaincode的測試之後,要移除被CA服務程序來建立的臨時檔案。去移除用戶端注冊的認證憑證,注冊的key,交易憑證鍊,等等...

運作,運作下面的指令。注意,如果你想去注冊一個先前已經注冊好了的使用者的話,你就必須運作這些指令

ssh進去你的Vagrant,然後粘貼下面的指令:

cd $GOPATH/src/github.com/hyperledger/fabric/devenv

vagrant ssh

然後運作:

rm -rf /var/hyperledger/production

繼續閱讀