空谷に吼える

ブロックチェーン/DLTまわりのなにかしらを書いていく所存

Oracle Blockchain Platformのリッチヒストリーデータベースの機能強化

Hyperledger Fabricベースのブロックチェーン基盤であるOracle Blockchain Platformには、独自の機能としてそのブロックチェーン台帳のデータをブロックチェーン外部のOracleデータベースに複製する機能(→リッチヒストリーデータベース機能)が備わっています。

で、このリッチヒストリーデータベース機能について、最近のアップデートで機能強化が入り、ブロックチェーン側から複製できるデータの種類が増え、業務的な観点だけでなく、Chaincodeの開発やらHyperledger Fabricのお勉強の観点からもさらに使い勝手がよくなりました。

このエントリではリッチヒストリーデータベース機能について、また、その機能強化について紹介していきます。

そもそもOracle Blockchain Platformとは

そもそもOracle Blockchain Platformってなによ?という方は、まずは以下の概要説明のスライドをざっと読むとわかりやすいと思います。なお、以下、記事中のスライド画像は、すべてこの概要説明のスライドからの引用です。

www2.slideshare.net

www2.slideshare.net

リッチヒストリーデータベース機能とは

前述の通り、リッチヒストリーデータベース機能は、ブロックチェーン台帳のデータをOracleデータベース上に複製する機能です。ブロックチェーンが苦手とする複雑な参照処理(集計、分析)をそれらを大得意とするリレーショナルデータベース側で 行えるようにすること、および②ブロックチェーン(からの複製)のデータとその他のシステムのデータとのデータ統合を容易にすることで、より高度なデータ活用を迅速に実現できるようにする、というのがこの機能の主な目的です。

f:id:gakumura:20210112222432p:plain
リッチヒストリーデータベース機能

仕組みとしては、まずHyperledger Fabricの台帳分割単位であるChannelごとにリッチヒストリーデータベースの対象とするかのON/OFFができるようになっています。複製対象としたChannelについてはデータベース側に複数の切り口のテーブルを作成し、それらテーブルにそのChannelのデータを複製していきます。

f:id:gakumura:20210112231518p:plain
対象のHLFチャネルごとにテーブルを作成し複製

この機能は、複製対象のChannelのBlockchain部(に保存されているBlockとその中のTransactions)を過去から最新まで読んでいき、その内容のトランザクションデータを順次データベース側に反映していくような動きになっています。したがって、機能を有効にした時点より以前に発生していたトランザクションデータについてもデータベース側に取り込まれます。また、どこまで複製してきたかのチェックポイントもデータベース上に保持しており、動き出して以降に発生したトランザクションについては差分のみが反映されていきます(いちいちgenesis blockから最新までの全量取ってきたりはしていないので安心してください)。

画像にあるように、以下State、History、Transaction Detailsの3つの切り口のデータがそれぞれのテーブルに格納されます。なお、作成されるテーブルは実はあともうひとつ、Latest Hightテーブルというものがあるんですが、これは上述のどこまで複製してきたかのチェックポイントを保持しているだけのテーブルで、通常気にしなくてよいので省略しています。

State

台帳の(というかHyperledger FabricのLedgerの)World State/State DBと対応するテーブルです。Keyおよび現在のValueから成る行を保持しています。

f:id:gakumura:20210112235416p:plain
Stateテーブル

History

台帳上のあるKeyに対してのValueの変遷という切り口での履歴、およびその際の更新トランザクションを保持しているテーブルです。

f:id:gakumura:20210112235628p:plain
Historyテーブル

過去バージョンの(あるBlock No./Transaction No.時点での)Stateを参照したいなどいった場合に使うことになります。

Transaction Details ←New!!

こちらが機能強化によって追加されたテーブルで、トランザクションの履歴を保持しています。HistoryのほうがStateの過去~現在バージョンという切り口の履歴だったのに対し、こちらは単純にそのChannle上で発生したトランザクションの記録を持っています。Hyperledger FabricのLedgerのうち、Blockchain部にあるTransactionsのデータをほぼそのまま取り込んだものと考えるとわかりやすいです。

f:id:gakumura:20210113000709p:plain
Transaction Detailsテーブル①

f:id:gakumura:20210113000738p:plain
Transaction Detailsテーブル②

トランザクションの発行者、Endorserの識別情報(証明書情報)が保持されている他、Chaincodeに渡した入力値とChaincodeからの返却値など、Chaincodeの開発、テストに際しとても有用な情報も利用可能です。また、Hyperledger Fabricの整合性保護のための独特なデータ項目であるRWSetが視えるようになっているのが、開発時に問題が発生した際のデバッグはもちろん、Hyperledger Fabricのお勉強観点でも非常に有用なポイントです。

まとめと次回予告

というわけでOracle Blockchain Platformの付加価値のひとつ、ちょう便利かつパワフルなリッチヒストリーデータベース機能をかんたんに紹介しました。

次回はリッチヒストリーデータベース機能を使うと実際こんな感じの情報がデータベース上で視えて面白い&わかりやすいよ、というエントリを予定しています。

その他参考情報