Hyperledger Fabricを学ぶ(10回目) サンプルネットワークの構築⑤「台帳の参照」
こんにちは。
このブログでは、ブロックチェーン関連を中心としたテック系の情報の紹介をしております。
この連載では、オープンソースのブロックチェーンプラットフォーム「Hyperledger Fabric」について、少しずつ勉強を進めてゆきます。
自分なりに公式のドキュメントを噛み砕きながら、分かり易くまとめて行きたいと思います。
前回実際に動かしたサンプルネットワーク「fabcar」について、今回はチェーンコードを実行し、ブロックチェーンの参照を行っていこうと思います。
チェーンコード
ネットワーク上のブロックチェーンに情報を書き込むためには、チェーンコードというプログラムを実行する必要があります。
Peerの紹介の時(こちら)にお話しましたが、チェーンコードは予めPeerの中に登録されています。
チェーンコードに特定の決められた処理だけを記述しておくことで、台帳への不正な処理を防げるようになっています。
サンプルネットワークの起動
サンプルネットワーク「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"と表示されていれば成功です。
このプログラムでは、管理ユーザー”admin”が作成されます。
次に、一般ユーザーを作成するプログラムの実行です。
同じく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" ”と表示されていれば成功です。
このプログラムでは「user1」という一般ユーザーの登録を行っています。
これで、ブロックチェーン上の台帳にアクセスする準備が整いました。
チェーンコードの実行
それでは台帳へのアクセスを行って行きます。
fabcarディレクトリに「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":"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」は、車をやり取りするためのネットワークです。
サンプルネットワークを起動した状態で予め登録された車の情報をこのチェーンコードプログラムの実行により、取得することができました。
車情報の参照
返ってきた車情報はそのままでは見にくいです。
JSON文字列の形式になっているので、JSON文字列のビューワー等で見るとみ易く表示されます。
※今回はこちらを利用させていただきました。
返ってきたメッセージの↓の部分を。
[{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"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": "CAR0",
"Record": {
"colour": "blue",
"make": "Toyota",
"model": "Prius",
"owner": "Tomoko"
}
},
{
"Key": "CAR1",
"Record": {
"colour": "red",
"make": "Ford",
"model": "Mustang",
"owner": "Brad"
}
},
{
"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"
}
}
]
今回は、ブロックチェーン上の台帳を、チェーンコードを使って参照してみました。
今回は参照するだけでしたが、次回では、台帳へ新しいデータを書き込んでみようと思います。
おわり。