HyperLedger Fabric-スーパー帳簿(10)簡単な資産チェーンコード(chaincode)
10889 ワード
アプリケーションは、元帳に資産を作成するための基本サンプルチェーンコードです.
GoおよびDocker,Docker-composeをインストールし、Goに対応する環境変数を設定します.
ディレクトリの作成
chaincodeアプリケーションのサブディレクトリとしてディレクトリを作成
新規ファイル
Goコードを記述するファイルを新規作成
コードの作成
Chaincodeインタフェースの
chaincode shimパッケージとpeer protobufパッケージをインポートします.次に、構造
初期化Chaincode
Initメソッドパラメータを取得し、GetStringArgs関数を使用して呼び出されたパラメータ を取得する.正当性を検査し、パラメータ数が2個であるかどうかを検査し、そうでない場合、エラー情報 を返す.は2つのパラメータを利用してPutStateメソッドを呼び出して帳簿に状態を書き込み、エラーがあれば(shim.Error()を返し、そうでなければnil(shim.Success) を返す.
呼び出しインプリメンテーション
Invokeメソッド
検証関数名は関数名とパラメータ を取得するは取得するパラメータ名を判断し、setであればsetメソッドを呼び出し、逆にget を呼び出す. set/get関数は、2つの値(result,err) を返します. errが空でない場合はエラー を返す. errが空の場合[]byte(result) を返す
Chaincode応用を実現する
chaincodeアプリケーションは
元帳のステータスにアクセスするには、chaincode shim APIのChaincodeStubInterface.PutStateとChaincodeStubInterface.GetState関数を使用します.
set関数、2つの値を返しますパラメータ個数が2 かどうかをチェック PutStateメソッドによりステータスを に書き込む.成功した場合、書き込みたい状態を返し、失敗した場合はエラーを返します:fmt.Errorf("...")
get関数、2つの値を返しますパラメータを受信、個数が1個であるか否かを判定する . GetStateメソッドを呼び出して2つの戻り値(value,err) を返す受信する. errおよびvalueが空return"であるか否かを判断し、fmt.Errorf("……") 戻り値return string(value)、nil
mainメソッド
Chaincodeの構築
コンパイルchaincode
開発モードテストの使用
通常、chaincodeはピアによって起動およびメンテナンスされます.しかしながら、「開発モード」では、チェーンコードはユーザによって構築され、起動される
Hyperledger Fabric Samplesがインストールされていない場合は、先にインストールしてください
Docker imagesをダウンロードしていない場合は、先にダウンロードしてください
次のような出力が表示されます.
3つの端末を使用
端末1はネットワークを起動する
ネットワークの起動
上記のコマンドは、
端末2はチェーンコードを確立して起動する
2番目の端末を開き、
に入る
コマンドプロンプトが次のようになります.
コンパイル
testディレクトリコンパイルchaincodeに入ります
chaincodeの実行
端末3はチェーンコードを用いる
インストールとインスタンス化
CLI容器に入った後、以下のコマンドを実行してchaincodeをインストールおよびインスタンス化します.
よびだし
呼び出しを行い、
実行に成功し、次のように出力されます.
検索
クエリ
実行成功、出力:
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メソッド
func (t *SimpleChaincdoe) Init(stub shim.ChaincodeStubInterface) peer.Response {
}
呼び出しインプリメンテーション
Invokeメソッド
検証関数名は
set
またはget
であり、shim.Success
またはshim.Error
の関数を呼び出して応答を返します.func (t *SimpleChaincdoe) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
}
Chaincode応用を実現する
chaincodeアプリケーションは
Invoke
関数で呼び出すことができる2つの関数(set/get)を実現した.元帳のステータスにアクセスするには、chaincode shim APIのChaincodeStubInterface.PutStateとChaincodeStubInterface.GetState関数を使用します.
set関数、2つの値を返します
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {
}
get関数、2つの値を返します
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-samples
のchaincode-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