HyperLedger Fabric-スーパー帳簿(10)簡単な資産チェーンコード(chaincode)

10889 ワード

アプリケーションは、元帳に資産を作成するための基本サンプルチェーンコードです.
GoおよびDocker,Docker-composeをインストールし、Goに対応する環境変数を設定します.
ディレクトリの作成
chaincodeアプリケーションのサブディレクトリとしてディレクトリを作成
$ mkdir -p $GOPATH/src/test 
$ cd $GOPATH/src/test

新規ファイル
Goコードを記述するファイルを新規作成
$ touch test.go
$ vim test.go

コードの作成
ChaincodeインタフェースのInitおよびInvoke関数を実装する必要がある.したがって、チェーンコードの依存性を取得するには、ファイルにgo import文を追加する必要があります.
chaincode shimパッケージとpeer protobufパッケージをインポートします.次に、構造SimpleChaincdoeをChaincode関数の受信機として追加する
package main

import (
    "fmt"

    "github.com/hyperledger/fabric/core/chaincode/shim"
    "github.com/hyperledger/fabric/protos/peer"
)

type SimpleChaincdoe struct {
}

初期化Chaincode
Initメソッド
  • パラメータを取得し、GetStringArgs関数を使用して呼び出されたパラメータ
  • を取得する.
  • 正当性を検査し、パラメータ数が2個であるかどうかを検査し、そうでない場合、エラー情報
  • を返す.
  • は2つのパラメータを利用してPutStateメソッドを呼び出して帳簿に状態を書き込み、エラーがあれば(shim.Error()を返し、そうでなければnil(shim.Success)
  • を返す.
    func (t *SimpleChaincdoe) Init(stub shim.ChaincodeStubInterface) peer.Response {
    
    }

    呼び出しインプリメンテーション
    Invokeメソッド
    検証関数名はsetまたはgetであり、shim.Successまたはshim.Errorの関数を呼び出して応答を返します.
  • 関数名とパラメータ
  • を取得する
  • は取得するパラメータ名を判断し、setであればsetメソッドを呼び出し、逆にget
  • を呼び出す.
  • set/get関数は、2つの値(result,err)
  • を返します.
  • errが空でない場合はエラー
  • を返す.
  • errが空の場合[]byte(result)
  • を返す
    func (t *SimpleChaincdoe) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    
    }

    Chaincode応用を実現する
    chaincodeアプリケーションはInvoke関数で呼び出すことができる2つの関数(set/get)を実現した.
    元帳のステータスにアクセスするには、chaincode shim APIのChaincodeStubInterface.PutStateとChaincodeStubInterface.GetState関数を使用します.
    set関数、2つの値を返します
  • パラメータ個数が2
  • かどうかをチェック
  • PutStateメソッドによりステータスを
  • に書き込む.
  • 成功した場合、書き込みたい状態を返し、失敗した場合はエラーを返します:fmt.Errorf("...")
  • func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {
    
    }
    
    

    get関数、2つの値を返します
  • パラメータを受信、個数が1個であるか否かを判定する
  • .
  • GetStateメソッドを呼び出して2つの戻り値(value,err)
  • を返す受信する.
  • errおよびvalueが空return"であるか否かを判断し、fmt.Errorf("……")
  • 戻り値return string(value)、nil
  • func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {
    
    }

    mainメソッド
    func main() {
        if err := shim.Start(new(SimpleChaincdoe)); err != nil {
                fmt.Printf("Error starting SimpleAsset chaincode: %s", err)
        }
    }

    Chaincodeの構築
    コンパイルchaincode
    $ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim
    $ go build --tags nopkcs11

    開発モードテストの使用
    通常、chaincodeはピアによって起動およびメンテナンスされます.しかしながら、「開発モード」では、チェーンコードはユーザによって構築され、起動される
    Hyperledger Fabric Samplesがインストールされていない場合は、先にインストールしてください
    Docker imagesをダウンロードしていない場合は、先にダウンロードしてくださいfabric-sampleschaincode-docker-devmodeディレクトリにジャンプ
    $ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/
    docker imagesを使用してDockerミラー情報を表示(ローカルDocker Registryを表示)
    $ sudo docker images

    次のような出力が表示されます.
    REPOSITORY                     TAG                  IMAGE ID            CREATED             SIZE
    hyperledger/fabric-tools       latest             b7bfddf508bc        About an hour ago   1.46GB
    hyperledger/fabric-tools       x86_64-1.1.0       b7bfddf508bc        About an hour ago   1.46GB
    hyperledger/fabric-orderer     latest             ce0c810df36a        About an hour ago   180MB
    hyperledger/fabric-orderer     x86_64-1.1.0       ce0c810df36a        About an hour ago   180MB
    hyperledger/fabric-peer        latest             b023f9be0771        About an hour ago   187MB
    hyperledger/fabric-peer        x86_64-1.1.0       b023f9be0771        About an hour ago   187MB
    hyperledger/fabric-javaenv     latest             82098abb1a17        About an hour ago   1.52GB
    hyperledger/fabric-javaenv     x86_64-1.1.0       82098abb1a17        About an hour ago   1.52GB
    hyperledger/fabric-ccenv       latest             c8b4909d8d46        About an hour ago   1.39GB
    hyperledger/fabric-ccenv       x86_64-1.1.0       c8b4909d8d46        About an hour ago   1.39GB
    ......

    3つの端末を使用
    端末1はネットワークを起動する
    ネットワークの起動
    $ sudo docker-compose -f docker-compose-simple.yaml up -d

    上記のコマンドは、SingleSampleMSPSolo ordererプロファイルでネットワークを起動し、「devモード」でピアを起動します.また、2つの追加のコンテナも起動しました.1つはchaincode環境、1つはchaincodeと対話するためのCLIです.チャネルの作成と追加のコマンドはCLIコンテナに埋め込まれているため、すぐにチェーンコード呼び出しにジャンプできます.
    端末2はチェーンコードを確立して起動する
    2番目の端末を開き、chaincode-docker-devmodeディレクトリに入ります.
    $ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/

    に入る
    $ sudo docker exec -it chaincode bash

    コマンドプロンプトが次のようになります.root@858726aed16e:/opt/gopath/src/chaincode#
    コンパイル
    testディレクトリコンパイルchaincodeに入ります
    root@858726aed16e:/opt/gopath/src/chaincode#  cd test
    root@858726aed16e:/opt/gopath/src/chaincode/test#  go build

    chaincodeの実行
    CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=test:0 ./test

    端末3はチェーンコードを用いる
    $ sudo docker exec -it cli bash

    インストールとインスタンス化
    CLI容器に入った後、以下のコマンドを実行してchaincodeをインストールおよびインスタンス化します.
    peer chaincode install -p chaincodedev/chaincode/test -n test -v 0
    peer chaincode instantiate -n test -v 0 -c '{"Args":["init","a","10"]}' -C myc

    よびだし
    呼び出しを行い、aの値を20に変更します.
    peer chaincode invoke -n test -c '{"Args":["set", "a", "20"]}' -C myc

    実行に成功し、次のように出力されます.
    ......
    ...... Chaincode invoke successful. result: status:200 payload:"20"
    ......

    検索
    クエリaの値
    peer chaincode query -n test -c '{"Args":["query","a"]}' -C myc

    実行成功、出力:Query Result: 20