不明なこと
- Hyperledger Fabric でバリデーションは行われているのか?
- Peer(チェーンコード)は、物理的にどのデータを参照しているのか?
この疑問が出てきた経緯を以下に記載します。
作業概要
fabric-samples.gitで公開されているfabcarを中心にHyperledger Fabricの環境構築やアプリケーションについて学習しています。
ふと、データのバリデーションはどうなっているのかと思い、fabcar環境構築後、couchDBを編集してみることにしました。
作業は以下の通りです。(※Dockerイメージやバイナリファイルなどはダウンロード済みのものとご理解ください。)
- 作業1~5 ・・・ 実験準備
- 作業6~13 ・・・ 実験
実験準備
1: fabcarの環境を構築するため、fabcar/startFabric.shを実行
→ "Start by changing into the "javascript" directory:"に従い、javascriptディレクトリで以下の作業を行う。
2: fabcar/javascriptディレクトリへ移動し、パッケージのインストール
npm install
node_modulesが存在することを確認。
3: 管理者とユーザを作成
$ node enrollAdmin.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Successfully enrolled admin user "admin" and imported it into the wallet $ node registerUser.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Successfully registered and enrolled admin user "appUser" and imported it into the wallet
4: クエリが実行できることを確認
$ node query.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
5: 4で実行したクエリは、全データの取得なので、query.jsをコピーして、特定のキーを取得するスクリプト(queryCar.js)を作成
javascript
1// 一部抜粋(query.jsから変更したところ(46行目)のみ) 2//const result = await contract.evaluateTransaction('queryAllCars'); // del 3const result = await contract.evaluateTransaction('queryCar', 'CAR4'); // add(CAR4のデータを取得)
$ node queryCar.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}
実験
6: couchDBのダッシュボードへアクセス(http://localhost:5984/_utils)し、CAR4のデータを探し出し編集しました。
colourのデータを"black"から"xxxxx"へ変更。
7: 5で作成したクエリを実行(バリデーションが働くなら、エラーなどが返ってくるのではないか?)
$ node queryCar.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}
→ エラーが返ってくるわけでもなく、"xxxxx"になっているわけでもなく、"black"が入っていて正常にレスポンスが返ってくる。(不明なこと1関連)
8: このサンプルでは、couchDBは二つ起動するので、もしかしてそのコンテナのDBを拾ってきているのかと思い、6と同様の作業をもう一つのcouchDB(http://localhost:7984/_utils)へ行う。
→ 接続プロファイルの観点から、そうではないはずとは思うのですが。。。
→ ここでは、xxxxxではなく、違いを明確にするため7984を付与しました。("xxxxx7984"を"colour"へセット)
9: 5で作成したクエリを実行
$ node queryCar.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}
デジャヴです。。。
→ 編集されてないことをチェックしないのでしょうか?
10: そもそもcouchDBを見てないということなのだろうか?と思い、couchDBのコンテナを停止してみます。
$ docker stop couchdb0 couchdb0 $ docker ps -f name=couchdb0 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # ちなみにcouchdb1(port:7984)は生きています・ $ docker ps -f name=couchdb1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a893b7964650 hyperledger/fabric-couchdb "tini -- /docker-ent…" About an hour ago Up About an hour 4369/tcp, 9100/tcp, 0.0.0.0:7984->5984/tcp couchdb1
11: 5で作成したクエリを実行
$ node queryCar.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}
返ってきました。。。
12: coudb1も止めてみます。
$ docker stop couchdb1 couchdb1 $ docker ps -f name=couchdb1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13: 5で作成したクエリを実行
$ node queryCar.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}
デジャヴです。。。
→ 物理的なデータはどこを参照しているのでしょうか?(不明なこと2関連)
補足
13まで終えたのち、couchdb0, couchdb1を起動し、キーを指定しての検索ではなく、範囲検索(query.js)を実行するとcolourに"xxxxx"がセットされていました。なぜ。。。
$ node query.js Wallet path: /home/vagrant/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"xxxxx","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
環境
fabric-samples v2.1.1
最後に
作業を大量に書いてしましたが、疑問点は、冒頭の不明なこと2点です。
お分かりになる方いましたら、ご教授ください。
あなたの回答
tips
プレビュー