一、參考地址
golang
nodejs:https://fabric-sdk-node.github.io/
java:https://github.com/hyperledger/fabric-sdk-java
https://hyperledger-fabric.readthedocs.io/en/latest/chaincode4ade.html
二、概述
2.1、概念
Chaincode是一個用Go編寫的程序,后期也將支持Java中實現了一個規定的接口。
鏈碼運行在與承認對等體進程隔離的安全Docker容器中。 Chaincode通過應用程序提交的交易來初始化和管理分類帳狀態。
鏈碼通常處理網絡成員所同意的業務邏輯,因此可被視為“智能合同”。 由鏈碼創建的狀態僅限於該鏈碼,不能被另一個鏈碼直接訪問。 然而,在同一個網絡中,給定適當的權限,鏈碼可以調用另一個鏈碼來訪問其狀態。
2.2、兩個角色
我們對鏈碼提供兩個不同的觀點。 一個,從應用程序開發人員的角度來看,開發一個名為Chaincode for Developers的塊鏈應用程序/解決方案,另一個是針對負責管理塊鏈網絡的塊鏈網絡運營商的運營商鏈碼,以及誰將利用Hyperledger Fabric API 鏈式代碼的安裝,實例化和升級,但可能不會涉及開發鏈碼應用程序。
2.3、api
每個鏈碼程序都必須實現Chaincode接口,其響應於接收到的事務調用其方法。 特別地,當鏈碼接收到instantiate
實例化或upgrade
升級事務時,調用Init方法,使得鏈碼可以執行任何必要的初始化,包括應用程序狀態的初始化。 調用Invoke方法響應於接收到一個調用事務來處理事務提議。
初始化:http://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#Chaincode
chaincode“shim”API中的另一個接口是ChaincodeStubInterface,用於訪問和修改分類帳,並在鏈碼之間進行調用。
api:http://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub
2.3.1、簡單資產鏈碼
基本鍵值對鏈碼
1、選擇代碼的位置
安裝go,並且配置了環境變量
現在,要為chaincode應用程序創建一個名為$ GOPATH / src /的子目錄的目錄。 以及創建源文件
mkdir -p $GOPATH/src/sacc && cd $GOPATH/src/sacc
touch sacc.go
2、必要的包
package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" )
3、初始化鏈碼
// Init is called during chaincode instantiation to initialize any data. func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response { }
注意,chaincode升級還會調用此功能。 當編寫一個將升級現有的鏈碼時,請確保適當地修改Init函數。 特別是,如果沒有“遷移”,或者沒有任何內容作為升級的一部分進行初始化,請提供一個空的“Init”方法。
接下來,我們將使用ChaincodeStubInterface.GetStringArgs函數檢索Init調用的參數,並檢查其有效性。在我們的例子中,我們期待着一個鍵值對。

接下來,現在我們已經確定了調用有效,我們將把初始狀態存儲在分類帳中。為此,我們將使用鍵和值作為參數傳遞給ChaincodeStubInterface.PutState。假設一切順利,返回一個指示初始化的peer.Response對象是成功的。

4、調用鏈碼
首先,我們添加Invoke函數的簽名。
// Invoke is called per transaction on the chaincode. Each transaction is // either a 'get' or a 'set' on the asset created by Init function. The 'set' // method may create a new asset by specifying a new key-value pair. func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response { }
與上面的Init函數一樣,我們需要從ChaincodeStubInterface中提取參數。
Invoke函數的參數將是要調用的chaincode應用程序函數的名稱。在例子中,我們的應用程序將只有兩個函數:set和get,它允許設置一個資產的值或者檢索它的當前狀態。
我們首先調用ChaincodeStubInterface.GetFunctionAndParameters來提取該代碼應用功能的函數名和參數。
// Invoke is called per transaction on the chaincode. Each transaction is // either a 'get' or a 'set' on the asset created by Init function. The Set // method may create a new asset by specifying a new key-value pair. func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response { // Extract the function and args from the transaction proposal fn, args := stub.GetFunctionAndParameters() }
接下來,我們將函數名稱設置為get或get,並調用這些鏈代碼應用程序函數,通過shim.Success或shim.Error函數返回一個適當的響應,該函數將響應序列化為gRPC protobuf消息。

5、實現鏈碼應用
如上所述,我們的chaincode應用程序實現了可以通過Invoke函數調用的兩個函數。現在我們來實現這些功能。請注意,如上所述,為了進入分類帳狀態,我們將利用chaincode shim API的ChaincodeStubInterface.PutState和ChaincodeStubInterface.GetState函數。

6、結合到一起
最后,我們需要添加main函數,這將調用shim.Start函數。這是整個chaincode程序源碼。

7、編譯鏈碼
go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim go build --tags nopkcs11
8、測試使用開發模式
通常鏈式代碼由對等體啟動和維護。然而,在“開發模式”中,鏈碼由用戶構建和啟動。在快速代碼/構建/運行/調試周期周轉期間的鏈碼開發階段,此模式非常有用。
我們通過利用樣例開發網絡的預生成的訂單和渠道工件來啟動“開發模式”。因此,用戶可以立即跳入編譯鏈碼和調用的過程。
9、安裝Hyperledger Fabric 示例
參看05/06中安裝https://hyperledger-fabric.readthedocs.io/en/latest/samples.html
轉到fabric-samples的chaincode-docker-devmode目錄:
cd chaincode-docker-devmode
10、下載Docker image
我們需要四個Docker圖像,以便“開發模式”針對提供的腳本運行。如果您安裝了fabric-samples repo克隆,並遵循下載指令 - 特定於二進制文件的說明,那么您應該在本地安裝必要的Docker映像

現在打開三個終端,並導航到每個的chaincode-docker-devmode目錄。
終端一、開啟網絡
docker-compose -f docker-compose-simple.yaml up
以上使用SingleSampleMSPSolo訂戶配置文件啟動網絡,並以“開發模式”啟動對等體。它還啟動兩個額外的容器 - 一個用於鏈碼環境和一個與鏈碼交互的CLI。用於創建和連接通道的命令嵌入在CLI容器中,因此我們可以立即跳轉到鏈碼調用。
終端二、構建並啟動鏈碼
docker exec -it chaincode bash
#后root@d2629980e76b:/opt/gopath/src/chaincode#
cd sacc
go build
運行鏈碼
CORE_PEER_ADDRESS=peer:7051 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
鏈碼從對等體和鏈碼日志開始,表示成功注冊對等體。請注意,在此階段,鏈碼與任何頻道都不相關。這在后續步驟中使用實例化命令完成。
終端三、使用鏈碼
即使您處於--peer-chaincodedev模式,您仍然必須安裝鏈碼,以便生命周期系統鏈碼可以正常檢查。在-peer-chaincodedev模式下,此要求可能會被刪除。
我們將利用CLI容器來驅動這些調用。
docker exec -it cli bash peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0 peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
使用
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc