Fabric--区块链应用开发
區(qū)塊鏈應用開發(fā)
簡介
數字貨幣曾是區(qū)塊鏈技術的唯一應用場景
對智能合約的支持突破了場景限制, 豐富了區(qū)塊鏈應用的適用范圍, 可以支持多行業(yè)、大規(guī)模的商業(yè)應用
區(qū)塊鏈應用
區(qū)塊鏈應用: 一般由若干部署在區(qū)塊鏈網絡中的智能合約, 以及調用這些智能合約的應用程序組成
用戶專注于與業(yè)務本身相關的應用程序
智能合約則封裝了與區(qū)塊鏈賬本直接交互的相關過程, 被應用程序調用
智能合約開發(fā)
智能合約本質上是為了對上層業(yè)務邏輯進行支持且直接與賬本結構打交道, 處于核心位置.
所以設計得當可以簡化上層應用開發(fā)的過程
應用程序開發(fā)
應用程序通過調用智能合約提供的方法接口實現業(yè)務邏輯, 可以使用JavaScript、Python、Go、Java等主流語言進行開發(fā)
鏈碼的原理
鏈碼延伸自智能合約的概念, 支持使用主流高級編程語言實現
區(qū)塊鏈網絡中的成員商定業(yè)務邏輯后, 可將業(yè)務邏輯編程到鏈碼中, 所有人遵守合約執(zhí)行
鏈碼會創(chuàng)建一些狀態(tài)(state)并寫入賬本中。狀態(tài)帶有綁定到鏈碼的命名空間,僅限于創(chuàng)建他的鏈碼使用,不能被其他鏈碼直接訪問。不過,在合適的范圍內,一個鏈碼也可以調用另一個鏈碼,間接訪問其狀態(tài)
鏈碼在Fabric節(jié)點上的隔離沙盒(目前為Docker容器)中運行, 并通過gRPC協(xié)議與節(jié)點進行交互
- 調用鏈碼
- 讀寫賬本
- 返回響應
- ……
Fabric中支持多種語言實現鏈碼,包括Golang、JavaScript、Java等
基本工作原理
鏈碼接口與結構
依賴包
鏈碼實現需要引入如下依賴包
“github.com/hyperledger/fabric/core/chaincode/shim”
- shim包提供了鏈碼與賬本交互的中間層
- 鏈碼通過shim.ChaincodeStub提供的方法來讀取和修改賬本狀態(tài)
“github.com/hyperledger/fabric/protos/peer”
- peer.Response: 響應信息
鏈碼接口
每個鏈碼都需要實現chaincode接口:
type Chaincode interface{Init(stub ChaincodeStubInterface) peer.ResponseInvoke(stub ChaincodeStubInterface) peer.Response }Init與Invoke方法
編寫鏈碼, 關鍵是實現Init與Invoke兩個方法
Init方法在鏈碼部署或升級時被調用, 完成初始化工作
對數據進行操作時, Invoke方法被調用, 因此響應調用或查詢的業(yè)務邏輯都需要在此方法中實現
必要結構
一個鏈碼的必要結構如下
package main//引入必要的包 import("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer" )//聲明一個結構體 type SimpleChaincode struct {}//為結構體添加Init方法 func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{//在該方法中實現鏈碼初始化或升級時的處理邏輯//編寫時可靈活使用stub中的API }//為結構體添加Invoke方法 func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{//在該方法中實現鏈碼運行中被調用或查詢時的處理邏輯//編寫時可靈活使用stub中的API }//主函數,需要調用shim.Start( )方法 func main() {err := shim.Start(new(SimpleChaincode))if err != nil {fmt.Printf("Error starting Simple chaincode: %s", err)} }鏈碼API
賬本狀態(tài)交互API
鏈碼需要將數據記錄在分布式賬本中.需要記錄的數據稱為狀態(tài), 以K-V對的形式存儲
賬本狀態(tài)交互API可以對賬本狀態(tài)進行操作
GetState(key string) ([]byte, error) 通過Key來返回數組的特定值
PutState(key string, value []byte) error 賬本中寫入特定的鍵和值
DelState(key string) error 從賬本中移除指定的鍵和值
GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error) 根據指定的范圍內的健值
GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error) 返回指定健的所有歷史值
GetQueryResult(query string) (StateQueryIteratorInterface, error) 對(支持富查詢功能的)狀態(tài)數據庫進行富查詢
交易信息相關API
GetTxID() string 返回交易提案中指定的交易ID
GetTxTimestamp() (*timestamp.Timestamp, error) 返回交易創(chuàng)建的時間戳,這個時間戳是peer收到交易的當前時間
GetBinding() ([]byte, error) 返回交易的binding信息
GetSignedProposal() (*pb.SignedProposal, error) 返回與交易提案相關的所有數據
GetCreator() ([]byte, error) 返回該交易的提交者的身份信息
GetTransient() (map[string][]byte, error) 返回交易中不會被寫至賬本中的一些臨時信息
參數API
GetArgs() [][]byte 返回調用鏈碼時交易提案中指定的參數
GetArgsSlice() ([]byte, error) 返回調用鏈碼時交易提案中指定的參數
GetFunctionAndParameters() (function string, params []string) 返回調用鏈碼時交易提案中指定的被調用的函數名稱及其參數
GetStringArgs() []string 返回調用鏈碼時指定的參數
-c ‘{“Args”:[“fn”, “param1”, “param2”, “paramN”]}’
示例(HelloWorld)
Init方法
- 獲取參數并判斷參數長度是否為2
- 參數: Key, Value
- 調用PutState方法將狀態(tài)寫入賬本中
- 如果有錯誤, 則返回
- 打印輸出提示信息
- 返回成功
Invoke方法
- 獲取參數并判斷長度是否為1
- 利用第1個參數獲取對應狀態(tài)GetState(key)
- 如果有錯誤則返回
- 如果返回值為空則返回錯誤
- 返回成功狀態(tài)
總結
以上是生活随笔為你收集整理的Fabric--区块链应用开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric--node测试
- 下一篇: Fabric--简单的资产Chainco