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つのカテゴリに分類されます。
- パラメータ分析API:パラメータを取得するために使用されます
- 元帳データステータス操作API:アカウントデータの照会と更新など。
- トランザクション情報取得API:送信されたトランザクション情報を取得します
- イベント処理API:イベント処理に関連
- プライベートデータ操作用のAPI:特にプライベートデータ操作用
APIの数はまだ比較的多く、そのほとんどは関連情報を取得するためのものです。時間があれば、詳しく調べることができます。初期段階で使用される主なもの:
- GetFunctionAndParameters()(function string、params [] string)は、呼び出された関数の名前とパラメーターのリストを返します
- GetStringArgs()[] stringは、パラメーターリストを直接返します
- GetState(key string)([] byte、error)指定されたキー値に従ってデータ状態を照会します
- PutState(key string、value [] byte)error指定されたキーに従って、対応する値を元帳に保存します
3.チェーンコードはHelloWorldを実装します
3.1チェーンコードの開発
まず、手を練習するためにハローワールドを書きます。
- チェーンコードディレクトリに移動し、helloという名前のフォルダを作成してから、チェーンコードファイルを作成および編集します。
sudo mkdir hello && cd hello
sudo vim hello.go
- チェーンコード依存関係パッケージをインポートします。
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/peer"
)
- main関数を記述します。
func main() {
err := shim.Start(new(HelloChaincode))
if err != nil {
fmt.Printf("链码启动失败: %v", err)
}
}
- カスタム構造:
type HelloChaincode struct{
}
- 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()関数に置き換えて、次のパラメーターを直接取得することもできます。
- 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キー割り当てのコンテンツ)を取得できる必要があります。