HyperledgerFabricチェーンコード開発実践ログ

1.チェーンコード構造の概要

ここでは、チェーンコードの開発にGo言語を使用しているため、Go言語を簡単に習得する必要があります。これは軽量な言語です。興味深いのは、独自のチャネルがあり、同時実行できることです。これは、大規模な分散システムに非常に適しています。開発。
チェーンコードを開始するには、shimパッケージのStart関数を呼び出す必要があります。この関数のパラメーターはChaincodeインターフェイスタイプです。Chaincodeインターフェイスタイプには、InitとInvokeの2つのメソッドがあります。これらは、チェーンコード開発で非常に重要な2つのメソッドです。

  • Init:チェーンコードがインスタンス化またはアップグレードされてデータの初期化が完了すると呼び出されます。
  • 呼び出し:プロポーザルトランザクションで元帳データのステータスを更新または照会するときに呼び出されます。

実際の開発では、構造を定義し、InitメソッドとInvokeメソッドを書き直して、関連する関数を完成させる必要があります。チェーンコードの必要な構造を具体的に見てみましょう。

package main //所写的包的名称

import (
        "fmt"
        "github.com/hyperledger/fabric/core/chaincode/shim"
        "github.com/hyperledger/fabric/protos/peer"
)//引入必要的包

type HelloChaincode struct{
    
    }//定义一个结构体

func main() {
    
    
        err := shim.Start(new(HelloChaincode))
        if err != nil {
    
    
                fmt.Printf("链码启动失败: %v", err)
        }
}//主函数,调用shim.Start方发启动链码

func (t *HelloChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{
    
    
       
}

func (t *HelloChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{
    
            fun, args := stub.GetFunctionAndParameters()
       
}

2.チェーンコード関連のAPIに精通している

主にshimパッケージによって提供されるAPIで、5つのカテゴリに分類されます。

  1. パラメータ分析API:パラメータを取得するために使用されます
  2. 元帳データステータス操作API:アカウントデータの照会と更新など。
  3. トランザクション情報取得API:送信されたトランザクション情報を取得します
  4. イベント処理API:イベント処理に関連
  5. プライベートデータ操作用のAPI:特にプライベートデータ操作用

APIの数はまだ比較的多く、そのほとんどは関連情報を取得するためのものです。時間があれば、詳しく調べることができます。初期段階で使用される主なもの:

  • GetFunctionAndParameters()(function string、params [] string)は、呼び出された関数の名前とパラメーターのリストを返します
  • GetStringArgs()[] stringは、パラメーターリストを直接返します
  • GetState(key string)([] byte、error)指定されたキー値に従ってデータ状態を照会します
  • PutState(key string、value [] byte)error指定されたキーに従って、対応する値を元帳に保存します

3.チェーンコードはHelloWorldを実装します

3.1チェーンコードの開発

まず、手を練習するためにハローワールドを書きます。

  1. チェーンコードディレクトリに移動し、helloという名前のフォルダを作成してから、チェーンコードファイルを作成および編集します。
sudo mkdir hello && cd hello
sudo vim hello.go
  1. チェーンコード依存関係パッケージをインポートします。
package main

import (
			"fmt"
			"github.com/hyperledger/fabric/core/chaincode/shim"
			"github.com/hyperledger/fabric/protos/peer"
		)
  1. main関数を記述します。
func main() {
    
    
			err := shim.Start(new(HelloChaincode))
			if err != nil {
    
    
				fmt.Printf("链码启动失败: %v", err)
			}
}
  1. カスタム構造:
type HelloChaincode struct{
    
    }
  1. Initメソッドを書き直します。その機能はデータ状態を初期化することです。簡単な論理ステップは次のとおりです。
  • パラメータを取得し、パラメータが有効かどうかを判断します。
  • PutState関数を呼び出して、状態を元帳に書き込みます。
  • 書き込みエラーがあるかどうか。
  • 最後に、Success関数を呼び出して、成功ステータスを返します。
func (t *HelloChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{
    
    
		    fmt.Println("开始实例化链码")
			_, args := stub.GetFunctionAndParameters()
			if len(args) != 2 {
    
    
				return shim.Error("指定了错误的参数个数")
			}
			fmt.Println("保存数据")
			err := stub.PutState(args[0],[]byte(args[1]))
			if err !=nil{
    
    
				return shim.Error("保存数据时发生错误")
			}
			fmt.Println("实例化成功")
			return shim.Success(nil)
}

GetFunctionAndParameters()関数に注意を払うことができます。ここで、パラメーター形式は "Args":["init"、 "Hello"、 "Wzh"]で、関数は呼び出された関数 "init"と渡されたパラメーター "Hello"を取得します。 _、argsの形式で記述された "、" Wzh "は、GetStringArgs()関数に置き換えて、次のパラメーターを直接取得することもできます。

  1. Invokeメソッドを書き直してください。その単純なロジックは次のとおりです。
  • パラメータを取得し、パラメータが有効かどうかを判断します。
  • キー値を使用してステータスを取得します。
  • 呼び出された関数の関数を完了します。
  • データステータスまたは成功ステータスを返します。
func (t *HelloChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{
    
    	fun, args := stub.GetFunctionAndParameters()
			if fun == "query"{
    
    
				return query(stub,args)
			}
			return shim.Error("非法操作,指定功能不能实现")
}

func query(stub shim.ChaincodeStubInterface,args  []string) peer.Response{
    
    
			if len(args) !=1{
    
    
				return shim.Error("指定的参数错误,必须且只能指定相应的Key")
			}
			result,err :=stub.GetState(args[0])
			if err !=nil {
    
    
				return shim.Error("根据指定的" +args[0] +"查询数据时发生错误")
			}
			if result ==nil {
    
    
				return shim.Error("根据指定的" +args[0] +"没有查询到相应的数据")
			}
			return shim.Success(result)
}

このコードは非常に単純で明確なので、繰り返しません。

3.2チェーンコードテスト

これはチェーンコードテストのリンクです。特定のプロセスは前のログにあります。コードのみが以下に添付されています。

cd chaincode-docker-devmode
sudo docker-compose -f docker-compose-simple.yaml up -d

ターミナル2ウィンドウを開きます。

sudo docker exec -it chaincode bash
cd hello
go build
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=hellocc:0 ./hello

ターミナル3ウィンドウを開きます。

sudo docker exec -it cli bash、
peer chaincode install -p chaincodedev/chaincode/hello -n hellocc -v 0
peer chaincode instantiate -n hellocc -v 0 -c '{"Args":["init","Hello","Wzh"]}' -C myc
peer chaincode query -n hellocc  -c '{"Args":["query","Hello"]}' -C myc

最後のクエリは、Wzh(つまり、Helloキー割り当てのコンテンツ)を取得できる必要があります。

おすすめ

転載: blog.csdn.net/weixin_43107949/article/details/109350623