七、鏈碼


一、參考地址

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調用的參數,並檢查其有效性。在我們的例子中,我們期待着一個鍵值對。

  View Code

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

  View Code

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消息。

  View Code

5、實現鏈碼應用

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

  View Code

6、結合到一起

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

  View Code

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映像

  View Code

現在打開三個終端,並導航到每個的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM