Hyperledger Fabricを学ぶ(14回目) サンプルネットワーク「Fabcar」の解説③「台帳情報取得のチェーンコード」
こんにちは。
このブログでは、ブロックチェーン関連を中心としたテック系の情報の紹介をしております。
この連載では、オープンソースのブロックチェーンプラットフォーム「Hyperledger Fabric」について、少しずつ勉強を進めてゆきます。
自分なりに公式のドキュメントを噛み砕きながら、分かり易くまとめて行きたいと思います。
前回に引き続き、サンプルネットワーク「Fabcar」で実行しているプログラムの内容について説明していきます。
今回は台帳情報の取得のためのプログラム「query.js」です。
台帳情報の取得用のチェーンコード
Hyperledger Fabricのネットワーク上の台帳に、外部から直接アクセスすることはできません。
チェーンコードという、予めネットワーク上に登録されたプログラムのみが台帳にアクセスすることができます。
ネットワーク外のアプリケーションは、直接台帳にアクセスするのではなく、チェーンコードを呼び出すことで、間接的に台帳の情報にアクセスすることが可能です。
「query.js」の実行
台帳の情報にアクセスするために、「query.js」を実行します。
「query.js」の内容を見ていきましょう。
前半部分は前回(こちら)に説明したユーザー登録のコードと大体同じですがquery.jsでは、20行目でチャネルのインスタンスを生成しています。
// setup the fabric network
var channel = fabric_client.newChannel('mychannel');
var peer = fabric_client.newPeer('grpc://localhost:7051');
channel.addPeer(peer);
チャネルは、ネットワーク上のPeerへアクセスするための専用回線の様なものです。
チェーンコードはこのチャネルという専用回線を通じて呼び出しが行われます。
ここで追加したPeerに対して、チャネルを通じてチェーンコードの呼び出しが行われます。
31行目からのキーバリューストアの生成は前回(こちら)と同様です。
42行目で登録済みの"user1"の証明書を取得します。
「query.js」は「enrollAdmin.js」と「regsterUser.js」が既に実行されていることが前提なので、ここで"user1"の保存済みの証明書を取得することができます。
54行目からチェーンコードの呼び出しのコードが始まります。
// queryCar chaincode function - requires 1 argument, ex: args: ['CAR4'],
// queryAllCars chaincode function - requires no arguments , ex: args: [''],
const request = {
//targets : --- letting this default to the peers assigned to the channel
chaincodeId: 'fabcar',
fcn: 'queryAllCars',
args: ['']
};
// send the query proposal to the peer
return channel.queryByChaincode(request);
"request"に呼び出すチェーンコードのID(fabcarのチェーンコードを指定)と、実行するチェーンコードの名前(fnc)、チェーンコードの実行に必要な引数(args)を設定しています。
ここで呼び出している「queryAllCars」というチェーンコードは引数が不要なので、"request"にはチェーンコードIDとチェーンコードの名前だけが設定されています。
62行目でチェーンコードの呼び出しが行われます。
// send the query proposal to the peer
return channel.queryByChaincode(request);
冒頭に生成したチャネルのインスタンスに実行するチェーンコードの情報が設定された"request"を渡して、チェーンコードを呼び出しています。
65行目から、チェーンコードの実行により得られた結果の出力が行われています。
// query_responses could have more than one results if there multiple peers were used as targets
if (query_responses && query_responses.length == 1) {
if (query_responses[0] instanceof Error) {
console.error("error from query = ", query_responses[0]);
} else {
console.log("Response is ", query_responses[0].toString());
}
} else {
console.log("No payloads were returned from query");
}
実際に「query.js」が実行された結果は以下の様になります。(こちらの回も参考にしてください)
[
{
"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"
}
}
]
この様に、台帳へのアクセスはPeerに登録されているチェーンコードを必要な権限で実行することで、ネットワーク外のアプリケーションでも行える様になっています。
まとめ
今回のチェンコード「queryAllCars()」の呼び出しを図にするとこんな感じでしょうか。
あらかじめ登録済みの"user1"の証明書を使って、チャネルを経由してPeerのチェーンコード「queryAllCars()」を実行し、結果を取得しています。
ちなみにサンプルではPeerは一つですが、複数のPeerがネットワーク上に存在しチャネルに接続されていれば、チェーンコードの呼び出しはチャネル上の全てのPeerに実行されます。
次回は台帳情報の更新用プログラム「invoke.js」について説明していこうと思います。
おわり。