日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fabric学习笔记-智能合约

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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学习笔记-智能合约的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。