Hyperledger Fabricを学ぶ(11回目) サンプルネットワークの構築⑥「台帳の更新」
こんにちは。
このブログでは、ブロックチェーン関連を中心としたテック系の情報の紹介をしております。
この連載では、オープンソースのブロックチェーンプラットフォーム「Hyperledger Fabric」について、少しずつ勉強を進めてゆきます。
自分なりに公式のドキュメントを噛み砕きながら、分かり易くまとめて行きたいと思います。
前回はチェーンコードを使用してブロックチェーン台帳にアクセスし、台帳の情報を取得してみました。
今回は、台帳の情報を更新(追加)してみようと思います。
サンプルネットワークの起動
台帳の情報の更新も、サンプルネットワークにあらかじめ用意されたチェーンコードを使用します。
まずは、前回(こちら)と同様にサンプルネットワーク「fabcar」を起動、管理者の登録、一般ユーザーの登録まで進めて行きます。
サンプルネットワーク「fabcar」を起動します。
fabcarディレクトリにある、起動用のスクリプトを実行します。
fabcar$ ./startFabric.sh
すこし待つと、ネットワークが起動状態になります。
# don't rewrite paths for Windows Git Bash users
export MSYS_NO_PATHCONV=1
docker-compose -f docker-compose.yml down
Removing network net_basic
WARNING: Network net_basic not found.
docker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb
Creating network "net_basic" with the default driver
Creating couchdb ... done
Creating orderer.example.com ... done
Creating ca.example.com ... done
Creating peer0.org1.example.com ... done
(中略)
2019-12-01 04:29:49.400 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00a Chaincode invoke successful. result: status:200
2019-12-01 04:29:49.401 UTC [main] main -> INFO 00b Exiting.....
Total setup execution time : 67 secs ...
Start by installing required packages run 'npm install'
Then run 'node enrollAdmin.js', then 'node registerUser'
The 'node invoke.js' will fail until it has been updated with valid arguments
The 'node query.js' may be run at anytime once the user has been registered
「管理ユーザー」と「一般ユーザー」をネットワーク上に登録するためのコマンドを発行します。
fabcar ディレクトリに「enrollAdmin.js」というプログラムがありますので、それを実行します。
fabcar $ node enrollAdmin.js
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded admin from persistence
Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"7f188366eee70d776a91ee6f22035cfbc7e3c1592f5788f2788bd7be1428b82b","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB8DCCAZegAwIBAgIULjnfFsEL0IoXePQ4Ri7B0seaO+0wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTkxMTEwMDQwMTAwWhcNMjAxMTA5MDQw\nMTAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBHmvNJrD1a19Bk54yGQFANNvzOs0tyn1IIW2dmtAMSHv7l05VeTuqfVQdAgQpTrP\n2SiHl63HVHyKCK9yZRT6rRqjbDBqMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E\nAjAAMB0GA1UdDgQWBBSXmXp9hApmVqMvp6BMn0HB3zzwMDArBgNVHSMEJDAigCBC\nOaoNzXba7ri6DNpwGFHRRQTTGq0bLd3brGpXNl5JfDAKBggqhkjOPQQDAgNHADBE\nAiAThjjPHsbQJc8HqfaMLHOMqLN1zfI5lnNuXTjT4dMrQAIgLa9uQmJNYfFlw3pI\nsL/bEr369dKoF8lKgm0jsv3aQdk=\n-----END CERTIFICATE-----\n"}}}
"Successfully loaded admin from persistence"と表示されていれば成功です。
次に、一般ユーザーを作成するプログラムの実行です。
同じくfabcarディレクトリに「registerUser.js」がありますのでこちらを実行します。
fabcar $ node registerUser.js
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded admin from persistence
Successfully registered user1 - secret:hfpOftpYatDl
Successfully enrolled member user "user1"
User1 was successfully registered and enrolled and is ready to intreact with the fabric network
”Successfully enrolled member user "user1" ”と表示されていれば成功です。
チェーンコードの修正
台帳の情報更新用のチェーンコードはfabcarディレクトリにある"invoke.js"です。
ですがこの"invoke.js"は演習用になっていて、このままでは実行することができません。
実行するとエラーになってしまいます。↓が実行結果です。
fabcar $ node registerUser.js
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded admin from persistence
Successfully registered user1 - secret:KtrXBACWnHaZ
Successfully enrolled member user "user1"
User1 was successfully registered and enrolled and is ready to intreact with the fabric network
fabcar $ node invoke.js
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Assigning transaction_id: 9485b59bb2a3bcd4fae2c1ec1f9f8b38e5038007b4d46ca45cf39e803ab6b737
error: [client-utils.js]: sendPeersProposal - Promise is rejected: Error: 2 UNKNOWN: chaincode error (status: 500, message: Invalid Smart Contract function name.)
at new createStatusError (/Users/masatomo/fabric/fabric-samples/fabcar/node_modules/fabric-client/node_modules/grpc/src/client.js:64:15)
at /Users/masatomo/fabric/fabric-samples/fabcar/node_modules/fabric-client/node_modules/grpc/src/client.js:583:15
Transaction proposal was bad
Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...
Failed to invoke successfully :: Error: Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...
"invoke.js"の中身を見てみると、台帳へ書き込むデータの内容が空っぽになっています。
61行目のリクエスト内容のコードで”fcn”と”args”が空になっているので、ここに必要なコードを記述する必要があります。
var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: '',
args: [''],
chainId: 'mychannel',
txId: tx_id
};
以下の様にコードを書き直します。
var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: 'createCar',
args: ['CAR10', 'Toyota', 'Purius', 'White', 'MasaAndTomo'],
chainId: 'mychannel',
txId: tx_id
};
台帳の更新
書き直した後、”invoke.js”を保存して、もう一度”invoke.js”を再度実行します。(ここでは、”invoke_edit.js”に名前変更して実行しています。)
今度はエラーが発生せずに、実行されました。
fabcar $ node invoke_edit.js
Store path:/Users/masatomo/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Assigning transaction_id: a0ef59d3ff45bcc85aa7067a76a1efbd84d48a228989b583e60a3f4a44f9818a
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
fabcar $
更新結果の確認
”invoke.js”の実行後、きちんと台帳の情報が更新されているか確認するため、前回(こちら)実行した”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":"MasaAndTomo"}},{"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"}}]
fabcar $
実行結果の「 [{"Key":"CAR0"〜 」の部分をJSON解析ツール(例えばこちら)を使って整形すると以下の様になります。
[
{
"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": "MasaAndTomo"
}
},
{
"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"
}
}
]
3個目のブロックに、先ほど”invoke.js”で書き換えた「['CAR10', 'Toyota', 'Purius', 'White', 'MasaAndTomo']」の情報が登録されていれば、台帳の情報の更新(追加)に成功しています。
チェーンコード”invoke.js”を使って、台帳方法の更新を行うことができました。
今回までは、サンプルのネットワークを起動して、取り敢えず台帳の参照・更新を行うところまで説明してきました。
次回以降で、このサンプルネットワークのシステム構成や、ユーザーの登録や台帳の更新に使ったチェーンコードの中身について、もう少し詳細に説明して行きたいと思います。
おわり。
この記事が気に入ったらサポートをしてみませんか?