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() というチェーンコードを実行してみました。
おわり。