Fabric学习笔记-智能合约
生活随笔
收集整理的這篇文章主要介紹了
Fabric学习笔记-智能合约
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文介紹了什么是智能合約,以及如何在Fabric下編寫一個簡單的智能合約Demo。
什么是智能合約?
智能合約是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議。智能合約允許在沒有第三方的情況下進行可信交易。這些交易可追蹤且不可逆轉,Fabric為智能合約提供了一個可信的執行環境。
Fabric下的智能合約
Chaincode是Fabric下智能合約的代碼實現,是一段在區塊鏈上驗證,存儲和執行的代碼,只有通過Chaincode才能與Fabric網絡進行交互。
在Fabric下又分為系統Chaincode和普通Chaincode。
- 系統Chaincode運行于peer節點內而非一個隔離的容器中,沒有生命周期的概念,用于實現一些系統行為。
- 普通Chaincode運行在一個單獨的容器中,對外提供操作Fabric網絡的接口,有打包、安裝、實例化和升級四個生命周期并且有相應的函數提供調用,操作更加的靈活也是我們通常所指Chaincode。
Chaincode的運行過程
- Channel負責連接不同的Peer,同步連接到的Peer對Chaincode的執行結果,相當于將一些節點劃分為一個子集同時同步Chaincode的執行結果。
- Endorser負責執行Chaincode。
- Orderer負責對Chaincode的執行結果進行共識,目前支持solo/kafka/sBFT三種共識方式。
- Committer負責將Chaincode經過共識后的結果寫入Ledger。
編寫Chaincode
Chaincode必須實現兩個接口。
type Chaincode interface { // 初始化?作,?般情況下僅被調??次,升級時也會調用該函數Init(stub ChaincodeStubInterface) pb.Response// 查詢或更新world state,可多次被調?Invoke(stub ChaincodeStubInterface) pb.Response }下面是一個最小智能合約所需要的結構。
package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" )type SimpleAsset struct {}func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {} func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {}func main() {if err := shim.Start(new(SimpleAsset)); err != nil {fmt.Printf("Error starting SimpleAsset chaincode: %s", err)} }具體的業務邏輯都在Invoke這個函數里面進行編寫。
首先,我們完善一下Init函數
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {args := stub.GetStringArgs()if len(args) != 2 {return shim.Error("Incorrect arguments. Expecting a key and a value")}// 實例化的時候初始化一下狀態err := stub.PutState(args[0], []byte(args[1]))if err != nil {return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0]))}return shim.Success(nil) }接著在Invoke里編寫業務邏輯
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {fn, args := stub.GetFunctionAndParameters()var result stringvar err errorif fn == "set" {result, err = set(stub, args)} else {result, err = get(stub, args)}if err != nil {return shim.Error(err.Error())}return shim.Success([]byte(result)) }Invoke根據不同的參數決定調用查詢或者是設置狀態。
編寫set和get函數
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {if len(args) != 2 {return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value")}err := stub.PutState(args[0], []byte(args[1]))if err != nil {return "", fmt.Errorf("Failed to set asset: %s", args[0])}return args[1], nil }func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {if len(args) != 1 {return "", fmt.Errorf("Incorrect arguments. Expecting a key")}value, err := stub.GetState(args[0])if err != nil {return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err)}if value == nil {return "", fmt.Errorf("Asset not found: %s", args[0])}return string(value), nil }github上有完整代碼,代碼非常簡單就是根據命令查詢或者設置世界狀態。
執行效果如下圖:
這樣就在Fabric上實現了一個簡單的智能合約。
https://zhuanlan.zhihu.com/p/33750599
總結
以上是生活随笔為你收集整理的Fabric学习笔记-智能合约的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric学习笔记-PBFT算法
- 下一篇: Fabric 学习笔记-架构初探