見出し画像

Hyperledger Fabricを学ぶ(19回目)Fabcarのチェーンコード③

こんにちは。

このブログでは、ブロックチェーン関連を中心としたテック系の情報の紹介をしております。

この連載では、オープンソースのブロックチェーンプラットフォーム「Hyperledger Fabric」について、少しずつ勉強を進めてゆきます。

自分なりに公式のドキュメントを噛み砕きながら、分かり易くまとめて行きたいと思います。

前回では、サンプルネットワーク「Fabcar」に登録されているチェーンコードを見てきました。

今回は、サンプルアプリケーションで使われていなかったチェーンコードを実際に動かしてみようと思います。

changeCarOwner() 自動車の所有者の更新

changeCarOwner() のコードは以下から確認することができます。

https://github.com/hyperledger/fabric-samples/blob/master/chaincode/fabcar/javascript/lib/fabcar.js

コードは以下の様になっています。

async changeCarOwner(ctx, carNumber, newOwner) {
   console.info('============= START : changeCarOwner ===========');
   const carAsBytes = await ctx.stub.getState(carNumber); // get the car from chaincode state
   if (!carAsBytes || carAsBytes.length === 0) {
       throw new Error(`${carNumber} does not exist`);
   }
   const car = JSON.parse(carAsBytes.toString());
   car.owner = newOwner;
   await ctx.stub.putState(carNumber, Buffer.from(JSON.stringify(car)));
   console.info('============= END : changeCarOwner ===========');
}

パラメータに指定した自動車番号(carNumber)の所有者を指定した所有者(newOwner)に変更するプログラムになっています。

では、実際に実行してみましょう。

changeCarOwner() は、台帳情報を更新するチェーンコードです。

前回、queryCar() を実行する時には「query.js」を編集して実行しましたが、台帳を更新する場合は、invoke.js を使用する必要があります。

invoke.js のチェーンコード呼び出しと、パラメータを指定している部分をchangeCarOwner() に変更します。

(変更前)

// createCar chaincode function - requires 5 args, ex: args: ['CAR12', 'Honda', 'Accord', 'Black', 'Tom'],
// changeCarOwner chaincode function - requires 2 args , ex: args: ['CAR10', 'Barry'],
// must send the proposal to endorsing peers
var request = {
	chaincodeId: 'fabcar',
	fcn: 'createCar',
	args: ['CAR10', 'Toyota', 'Purius', 'White', 'MasaAndTomo'],
	chainId: 'mychannel',
	txId: tx_id
}

(変更後)

// createCar chaincode function - requires 5 args, ex: args: ['CAR12', 'Honda', 'Accord', 'Black', 'Tom'],
// changeCarOwner chaincode function - requires 2 args , ex: args: ['CAR10', 'Barry'],
// must send the proposal to endorsing peers
var request = {
	chaincodeId: 'fabcar',
	fcn: 'changeCarOwner',
	args: ['CAR10', 'Marie'],
	chainId: 'mychannel',
	txId: tx_id
}

実行するチェーンコードプログラム名を指定する「fnc:」に「changeCarOwner」を、パラメータを指定する「args:」に自動車番号「CAR10」と「Marie」を指定します。

CAR10の自動車の所有者をMarieに変更します。

編集したinvoke.js を実行すると以下のような実行結果が得られます。

fabcar $ node invoke_edit2.js 
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Assigning transaction_id:  77c9477513e248ed55994460a77a6aac9a905f29d7c3c82cd9d7270daccfb669
Transaction proposal was good
Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK"
info: [EventHub.js]: _connect - options {"grpc.max_receive_message_length":-1,"grpc.max_send_message_length":-1}
The transaction has been committed on peer localhost:7053
Send transaction promise and event listener promise have completed
Successfully sent transaction to the orderer.
Successfully committed the change to the ledger by the peer

台帳の更新を確認するため、query.jsを実行します。

fabcar $ node query.js 
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Query has completed, checking results
Response is  [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR10", "Record":{"colour":"White","make":"Toyota","model":"Purius","owner":"Marie"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

このままでは結果がみにくいので、レスポンスの部分を、Json解析のツールにかけて見てみます。

{
	"Key": "CAR10",
	"Record": {
		"colour": "White",
		"make": "Toyota",
		"model": "Purius",
		"owner": "Marie"
	}
},

自動車の所有者(owner)がMarieになっていることが確認できます。

今回は自動車の所有者情報を更新するchangeCarOwner() というチェーンコードを実行してみました。

おわり。

この記事が気に入ったらサポートをしてみませんか?