hyperledger fabric chaincode開発例
24308 ワード
本論文の参考
http://hyperledger-fabric.readthedocs.io/en/latest/chaincode4ade.html
コード作成
実現するインターフェース
私たちのクラス名はSimpleAsssetです。
PutStateはkeyとvalueを先にfabricの書き込み集に入れます。すぐに帳簿を更新することはありません。
テスト
まずメール関数を書きます。
環境に依存する
主にdockerのイメージをいっぱい入れます。もうインストールしました。
http://hyperledger-fabric.readthedocs.io/en/latest/samples.html
でも、文書の中に実際のテストができないところがあるので、修正します。
go buildコマンドは主にテストコンパイルに使われます。カバンのコンパイル中に必要があれば、関連のあるカバンを同時にコンパイルします。
実行に成功すると、saccディレクトリの下に同名のsacc実行ファイルが生成されます。
開発者モードでテスト
生産環境のfabric配置は、テストがかなり面倒ですが、fabricは開発者モードを提供してくれました。
まず三つの端末を起動して、全部目次に切り替えます。
$GOPATH/src/githb.com/hyperledger/fabric-samples/chaincode-docker-devmode
Terminal 1-Start the network
起動後、私達はdocker ps命令で確認できます。4つの容器が見えます。
chaincodeの容器に入り、
インタラクティブコンテナを起動して、私たちのchaincodeをテストします。
[a]「10」は私たちのパラメータkey-valueです。
まずaの値を調べます。
次にaの値を修正します。
終了
Terminal 2とTerminal 3はexit命令でdockerを脱退します。
Terminal 1直接ctrl+cは退出してから実行します。
http://hyperledger-fabric.readthedocs.io/en/latest/chaincode4ade.html
コード作成
実現するインターフェース
type Chaincode interface {
// Init is called during Instantiate transaction after the chaincode container
// has been established for the first time, allowing the chaincode to
// initialize its internal data
Init(stub ChaincodeStubInterface) pb.Response
// Invoke is called to update or query the ledger in a proposal transaction.
// Updated state variables are not committed to the ledger until the
// transaction is committed.
Invoke(stub ChaincodeStubInterface) pb.Response
}
Initメソッドは、chaincodeが作成またはアップグレードされた取引の際に呼び出しられ、Invode方法は、chaincodeがinvoke動作を実行するときに呼び出す。私たちのクラス名はSimpleAsssetです。
type SimpleAsset struct {
}
それから私たちはその方法を書きます。func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Reponse {
// ,
args := stub.GetStringArgs()
if len(args) != 2 {
return shim.Error("Incorrect arguments. expecting a key and a value")
}
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)
}
Get StrigArgsはInitとInvoke伝達のstringタイプのパラメータを取得して、string配列の形で戻ります。私達の入力パラメータはkey-valueデータですので、args[0]はkeyで、args[1]はvalueです。PutStateはkeyとvalueを先にfabricの書き込み集に入れます。すぐに帳簿を更新することはありません。
func (stub *ChaincodeStub) PutState(key string, value []byte) error
shim.Successとshim.Errorは2つの共通関数で、それらはいずれもpeer.Reponseオブジェクトに戻ります。func Success(payload []byte) pb.Response {
return pb.Response{
Status: OK,
Payload: payload,
}
}
func Error(msg string) pb.Response {
return pb.Response{
Status: ERROR,
Message: msg,
}
}
次にInvoの方法を実現します。func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
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))
}
/ GetFunctionAndParameters returns the first argument as the function
// name and the rest of the arguments as parameters in a string array.
// Only use GetFunctionAndParameters if the client passes arguments intended
// to be used as strings.
GetFunctionAndParameters() (string, []string)
Invodeの方法は実行の入り口を提供していますが、具体的にはsetとget方法で、彼らの実現を見にきます。//set (key-value)
func set(stub shim.ChaincodeStubInterface, args []string) {
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])
}
// value nil
return args[1], nil
}
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])
}
// string key value
return string(value), nil
}
コードは簡単です。多くは言いません。テスト
まずメール関数を書きます。
func main() {
if err := shim.Start(new(SimpleAsset)); err != nil {
fmt.Printf("Error starting SimpleAsset chaincode: %s", err)
}
}
上のコードはコンテナでchaincodeを起動します。環境に依存する
主にdockerのイメージをいっぱい入れます。もうインストールしました。
hyperledger/fabric-ca latest 17f38f1c8e80 3 weeks ago 238MB
hyperledger/fabric-ca x86_64-1.0.3 17f38f1c8e80 3 weeks ago 238MB
hyperledger/fabric-tools latest ac1f4a1e58a6 3 weeks ago 1.33GB
hyperledger/fabric-tools x86_64-1.0.3 ac1f4a1e58a6 3 weeks ago 1.33GB
hyperledger/fabric-couchdb latest b2188fa55138 3 weeks ago 1.47GB
hyperledger/fabric-couchdb x86_64-1.0.3 b2188fa55138 3 weeks ago 1.47GB
hyperledger/fabric-kafka latest 9e2a425c9dd6 3 weeks ago 1.29GB
hyperledger/fabric-kafka x86_64-1.0.3 9e2a425c9dd6 3 weeks ago 1.29GB
hyperledger/fabric-zookeeper latest 3b50cfad9af3 3 weeks ago 1.3GB
hyperledger/fabric-zookeeper x86_64-1.0.3 3b50cfad9af3 3 weeks ago 1.3GB
hyperledger/fabric-orderer latest fd1055ee597a 3 weeks ago 151MB
hyperledger/fabric-orderer x86_64-1.0.3 fd1055ee597a 3 weeks ago 151MB
hyperledger/fabric-peer latest b7f253e87c0c 3 weeks ago 154MB
hyperledger/fabric-peer x86_64-1.0.3 b7f253e87c0c 3 weeks ago 154MB
hyperledger/fabric-javaenv latest 1d778fcc14c0 3 weeks ago 1.41GB
hyperledger/fabric-javaenv x86_64-1.0.3 1d778fcc14c0 3 weeks ago 1.41GB
hyperledger/fabric-ccenv latest 2e5898d8b21b 3 weeks ago 1.28GB
hyperledger/fabric-ccenv x86_64-1.0.3 2e5898d8b21b 3 weeks ago 1.28GB
hyperledger/fabric-ca x86_64-1.0.1 5f30bda5f7ee 2 months ago 238MB
ここでは具体的なプロセスを説明しません。下記のURLを参照できます。http://hyperledger-fabric.readthedocs.io/en/latest/samples.html
でも、文書の中に実際のテストができないところがあるので、修正します。
curl -sSL https://goo.gl/Q3YRTi | bash
に変更するcurl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap-1.0.3.sh | bash
chaincodeをコンパイルするgo get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim
go build --tags nopkcs11
go getは、要求と実際の状況に応じて、インターネットから指定されたコードパケットとその依存パケットをダウンロードまたは更新し、それらをコンパイルし、インストールすることができます。go buildコマンドは主にテストコンパイルに使われます。カバンのコンパイル中に必要があれば、関連のあるカバンを同時にコンパイルします。
実行に成功すると、saccディレクトリの下に同名のsacc実行ファイルが生成されます。
開発者モードでテスト
生産環境のfabric配置は、テストがかなり面倒ですが、fabricは開発者モードを提供してくれました。
まず三つの端末を起動して、全部目次に切り替えます。
$GOPATH/src/githb.com/hyperledger/fabric-samples/chaincode-docker-devmode
Terminal 1-Start the network
docker-compose -f docker-compose-simple.yaml up
最初の端末はfabricのネットワーク環境全体を起動しました。peerとorderを含めて、もう一つはchaincode環境で、もう一つはCLIで、chaincodeと相互作用するために使用されます。起動後、私達はdocker ps命令で確認できます。4つの容器が見えます。
NAMES
a0d8ca1db66d hyperledger/fabric-ccenv "/bin/bash -c 'sle..." 6 minutes ago Up 6 minutes chaincode
a75d777aab06 hyperledger/fabric-tools "/bin/bash -c ./sc..." 6 minutes ago Up 6 minutes cli
5ed1678b9feb hyperledger/fabric-peer "peer node start -..." 6 minutes ago Up 6 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer
2b665817027e hyperledger/fabric-orderer "orderer" 6 minutes ago Up 6 minutes 0.0.0.0:7050->7050/tcp orderer
Terminal 2-Build&start the chaincodechaincodeの容器に入り、
docker exec -it chaincode bash
root@d2629980e76b:/opt/gopath/src/chaincode#
cd sacc
go build
chaincodeを実行しますCORE_PEER_ADDRESS=peer:7051 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
Terminal 3-Use the chaincodeインタラクティブコンテナを起動して、私たちのchaincodeをテストします。
docker exec -it cli bash
次の二つの命令は私たちのchaincodeをチェーンします。root@76d41baa160b:/opt/gopath/src/chaincodedev# peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
root@76d41baa160b:/opt/gopath/src/chaincodedev# peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
日誌は長いですが、貼り付けません。[a]「10」は私たちのパラメータkey-valueです。
まずaの値を調べます。
root@76d41baa160b:/opt/gopath/src/chaincodedev# peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
2017-10-31 08:25:45.249 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2017-10-31 08:25:45.249 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2017-10-31 08:25:45.249 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2017-10-31 08:25:45.249 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2017-10-31 08:25:45.250 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0AA8080A6008031A0B0889E7E0CF0510...6D7963631A0A0A0571756572790A0161
2017-10-31 08:25:45.250 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: BEE337BA8316D79449B12B892A1B1FD0EFAA3678B1474CF42CF96B6952C655DA
Query Result: 10
結果は10で、正しいです。次にaの値を修正します。
root@76d41baa160b:/opt/gopath/src/chaincodedev# peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc
再度検索したら、aの値は確かに20になりました。日誌はもう貼りません。終了
Terminal 2とTerminal 3はexit命令でdockerを脱退します。
Terminal 1直接ctrl+cは退出してから実行します。
docker-compose -f docker-compose-simple.yaml down