Hyperledger Fabricでアプリケーション設計するのに参考にした情報


Hyperledger Fabricでアプリケーション設計するのにデータ設計するのに参考にした情報をまとめてみました。

Hyperledger Fabricの特性を抑えた上で設計しておかないといろいろと落とし穴にハマれそうな感じです。

OCHaCafe #4 Hyperledger Fabric アプリケーション設計入門ガイドでしゃべった内容+おまけ資料

いくつか抜粋。

データ設計のポイント

台帳

  • 他組織と共有したいデータ
    • アセットの基本情報(ID、カテゴリなど)
    • アセットのステート(所有者、現在位置、数量、残高など)
    • ステート変更の条件評価に必要な情報
  • 証跡として残したいデータ
注意点
  • 個人情報は書き込まない
    • 個人情報保護法、GDPRなどの法規制
    • 台帳に書いてしまうと削除できない
  • サイズに注意
    • 大きいデータの保管には向かない
    • 台帳への書き込み内容はネットワークを伝播するのでパフォーマンスに影響
  • チャネル分割はデメリットを考慮
    • 複数台帳をアトミックに更新できない
    • チェネルまたぎのトランザクションはクライアント側で整合性保護が必要
    • 複数台帳のデータをクライアント側で統合
  • Private Data利用の検討
    • 一部データのみ秘匿したい
    • 手動削除可能
    • Auto Purge利用可
    • nブロック後に自動削除
    • Chaincodeが複雑になりがち

個別データストア

  • 共有不可/不要だが、台帳と組合せて使うデータ
    • アセットの詳細情報、集計情報
    • 整理、分析のための台帳データ
    • 個別アプリケーションのデータ(認証情報など)

トランザクション履歴

  • ステート更新履歴はトランザクション履歴として残ってる
  • トランザクション履歴は検索性が低い
    • Key History→Transaction Detailとたどる
  • トランザクション履歴を冗長にステートとして残すこともあり得る
    • レコード量増加とのトレードオフ

Hyperledger Fabricでの開発段階でハマりがちな落とし穴とは? 〜オラクルの技術者向け勉強会「Blockchain GIG #2」より - 仮想通貨 Watch

登壇資料) Blockchain GIG #2 - 資料一覧 - connpass
https://oracle-code-tokyo-dev.connpass.com/event/122653/presentation/

「大量書き込み時に参照が遅くなる」問題

 この「大量書き込み時に参照が遅くなる」問題は、いくつかの要因がある。問題の発生時、CouchDBとChaincodeの接続部分がシングルスレッドになっており、トランザクションが終了しない限り次のトランザクションが確立しない。要はノード1つあたり1個ずつしかトランザクションを送り出せないため、詰まっている状態だ。もう1つは、CouchDB上のIndex深度が深くなった際、IndexリビルドによってChaincodeとCouchDB間の通信が低速化するという。

ほしいデータを全量取り出せない問題

 次にぶつかったのは、一定期間内のデータをすべて抽出しようとすると失敗する問題だという。Chaincodeを経由して、ブロックチェーンやCouchDBから大量のデータを取り出すことができないという問題だ。

 HLFのネットワーク保護機能が要因となる。HLFは保全のためネットワーク上の転送量に100MBという制限がある。一度に大量のデータを取り出そうとすると、この保護機能が障害となってしまうわけだ。同時に、この問題においてはノード側の負荷も検証する必要があるという。

まとめ

 ここまでの実際に衝突し、乗り換えた問題から、山田氏は設計開発手法のコツとして4点をまとめる。

  • ブロックチェーンに記録するデータは最小限にする
  • データの物理設計は1バイトでも可能な限り小さくする
  • CouchDBのIndexは必要最小限とし、Index共有を前提に設計する
  • コンソーシアム内の共有データ以外はChaincodeを経由せず、HLFのデータ同期機能を活用してCouchDBから直接取得してもよい

利用しようとしているAmazon Managed Blockchainだとどうなるのか別途調査が必要っぽい。

【プライベートブロックチェーンが未来を作る】ワールドステートのデータ設計|Yamada Masatsugu|note

ワールドステート設計で難しいのは、このデータ結合である。
データ結合が難しいゆえに、データを分離することが難しくなる。

ワールドステートの設計でも、このトレードオフをちょうどよいところでバランスさせなければならない。

僕は、データ駆動設計とクエリ駆動設計を組み合わせて設計するのがよいと考えている。

具体的には、まずは第三正規化まで正規化を行い、データのまとまりを整理する。
次に、各項目ごとに参照頻度を検討する。
例えば、Aというデータを参照する際に、高頻度でBというデータを一緒に参照しているなと当たりをつける。
そこまで当たりをつけたら、Bの情報をAのデータの中にコピーして、意図的に冗長化を崩していく。

「ブロックチェーンはデータベースではない」件について | さくらのナレッジ

ブロックチェーンは「利害が対立する当事者どうしが信頼できる記録台帳」

プライベートブロックチェーンはサイバー攻撃、内部不正に強い

データベース管理システムとは「使いどころ」が大きく異なる

複雑なデータモデルの表現はRDBMSの独壇場

| Ethereum と Hyperledger のアーキテクチャ比較


Hyperledger入門 : Hyperledger(ハイパーレッジャー)の開発環境について | BlockChain Online ブロックチェーンオンライン

PythonもSDKあった。

現在、v1.0が最新環境として公開されており、
・Go(fabric-sdk-go)
・Java(fabric-sdk-java)
・Python(fabric-sdk-py)
・Node.js(fabric-sdk-node)
を利用したSDKが開発されています。

Hyperledger Fabric 入門, 第 6 回: Hyperledger Fabric v1.4 のプログラミングモデル

v1.4つかいたい。

※利用しようとしているのがAmazon Managed Blockchainでv1.2に対応。

Writing Your First Application — hyperledger-fabricdocs master documentation

ステート構成が参考になる。

Wallet path: ...fabric-samples/fabcar/javascript/wallet
Transaction has been evaluated, result 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"}}]

今後参考にしようとしている

~ブロックチェーンの革新技術~Hyperledger Fabricによるアプリケーション開発 | 清水 智則, 田町 京子, 上ノ原 勇人, 佐藤 卓由, 齋藤 新, 近藤 仁, 平山 毅, 笠原 章弘, 岩崎 竜矢, 小笠原 万値, 早川 勝 |本 | 通販 | Amazon
https://www.amazon.co.jp/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AE%E9%9D%A9%E6%96%B0%E6%8A%80%E8%A1%93-Hyperledger-Fabric%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%B8%85%E6%B0%B4-%E6%99%BA%E5%89%87/dp/4865941460
レビューをみると物足りなさそうな。

IBM ブロックチェーンの基礎: 開発者向けクイック・スタート・ガイド
https://www.ibm.com/developerworks/jp/cloud/library/cl-ibm-blockchain-101-quick-start-guide-for-developers-bluemix-trs/index.html

Hyperledger Fabric 入門, 第 5 回: チェーンコードの書き方
https://www.ibm.com/developerworks/jp/cloud/library/cl-hyperledger-fabric-basic-5/index.htm