PHP:Laravel-admin api-tester 安裝配置及問題
阿新 • • 發佈:2021-01-19
鏈碼是什麼
鏈碼是一個程式,可以使用 Go 、node.js 、 或者 Java 來實現預定義的介面。鏈碼執行在一個和背書節點程序相 隔離的安全的容器中。通過應用程式提交交易來初始化鏈碼和管理賬本狀態。
一個鏈碼一般用來處理由網路中成員一致認可的商業邏輯,所以可以認為它就是一個“智慧合約”。 鏈碼建立的狀態僅限於該鏈碼範圍內,其他鏈碼不能直接訪問。但是在同一個網路中,通過合理 的授權,鏈碼可以讓其他鏈碼訪問的它狀態資料。
下面以go語言進行實驗:
引入鏈碼必要的依賴
package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) // SimpleAsset implements a simple chaincode to manage an asset type SimpleAsset struct { }
初始化鏈碼
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") } // 將kv更新到世界狀態 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) }
呼叫鏈碼
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response { // Invoke 函式的引數是將要呼叫的鏈碼應用程式的函式名。 fn, args := stub.GetFunctionAndParameters() var result string var err error if fn == "set" { result, err = set(stub, args) } else { result, err = get(stub, args) } if err != nil { return shim.Error(err.Error()) } // Return the result as success payload return shim.Success([]byte(result)) }
實現鏈碼應用程式
// Set stores the asset (both key and value) on the ledger. If the key exists,
// it will override the value with the new one
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
}
// Get returns the value of the specified asset key
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
}