QLDB

【AWS】Amazon QLDBのデータ整合性検証の仕組みと検証機能の動作確認

どうも、AWS勉強中のとがみんです。

完全で正確なデータ管理が求められるような仕組みを構築していく必要があり、最近はAmazon QLDBというサービスについて勉強しています。

下記の記事では、Amazon QLDBの仕組みや、利用メリットについて整理してきました。

また、下記の記事では、とりあえずQLDBを作成して、テーブルとレコードを作成して確認する操作を整理してきました。

この記事では、Amazon QLDBの一番の特徴である、データが改竄されていないことを検証できるという機能に関して、その仕組みの整理と実際に検証をして確認を行なっていこうかと思います。

Amazon QLDBでのデータ検証の仕組みについて

まずは、Amazon QLDBがどのような仕組みで、データが改竄されていないことを検証しているかについて整理していこうかと思います。

Amazon QLDBの検証の仕組み概要

Amazon QLDBの検証の仕組みの概要について、QLDBはSHA-256のハッシュ関数をマークルツリーをベースにしたモデルを活用して、ダイジェストを作成します。

ダイジェストは、ある時点におけるデータの変更履歴全体に対して一意の著名として機能するハッシュ値です。

対象のデータを元にハッシュ値の再計算を行い、ダイジェストの結果と一致した場合に、ダイジェストを取得したタイミングから再計算するまでの期間、データが改竄されていないことを証明することができます。

QLDBでは、個々のドキュメントや、ジャーナルブロック全体を検証することができます。

SHA-256:256ビット長のハッシュ値を出力するハッシュ関数。

ハッシュ関数とハッシュ値

QLDB内のデータが改竄されていないことを検証する仕組みとして、ハッシュ関数の仕組みが活用されています。

ハッシュ関数は、任意長のビット列から規則性のない固定長のビット列を生成する関数で、その関数によって出力された値をハッシュ値と言います。

入力データが同じであれば、同じハッシュ値が出力され、入力データが異なれば全く異なるハッシュ値が出力されるという性質があります。

データが改竄されていた場合、改竄前のハッシュ値とは全く異なる値が出力されてしまうため、計算したハッシュ値が事前に確認したハッシュ値と同一であることから、ハッシュ関数にインプットしたデータは変更されていないことを確認することができます。

QLDBでは、SHA-256のハッシュ関数を使用してジャーナル(Jounal)内のブロック(Block)がハッシュ化され、出力されたハッシュ値と新たなデータを用いて、次のブロックを作成していくため、後続のブロックに順次チェーンされ前後のブロックに依存関係が発生します。

Amazon Quantum Ledger Database (Amazon QLDB) デベロッパーガイド

ダイジェスト(digest)は、ある時点における台帳の変更履歴全体に対して一意の著名として機能するハッシュ値で、この値を用いて、検証したいドキュメントリビジョンからダイジェスト(digest)を出力したブロックまで順次ハッシュ値を再計算をし、ダイジェストの値と一致することを確認することで、その間のデータが改竄されていないことを検証することができます。

マークルツリー

QLDBではハッシュチェーンの計算を効率化するために、マークルツリーモデルが使用されています。

台帳のサイズが大きくなるにつれて、ハッシュチェーンの再計算がどんどん非効率になっていくため、マークルツリーモデルを活用することで、改竄されていないことを検証する計算を効率化しています。

2つのブロックのハッシュを足し合わせたものをハッシュ化するということを繰り返し、ツリー上にハッシュ値を計算します。

ノードAのブロックが含むデータの検証をしたい場合は下記のような計算を行い、再計算した値が、Digestのハッシュ値と一致すれば、検証したいドキュメントが改竄されていないことが確認できます。

Data verification in Amazon QLDB

  1. D = H(A + B) :ハッシュ値Aとハッシュ値Bを連結して、そのハッシュ値Dを計算。
  2. F = H(D + E):ハッシュ値Dとハッシュ値Eを連結して、そのハッシュ値Fを計算。
  3. root(Digest) = H(F + G):ハッシュ値Fとハッシュ値Gを連結して、rootのハッシュ値を計算。

B、E、GはノードAのブロックが含むデータを検証するために必要なハッシュセットで、この仕組みを活用することで、台帳の履歴全体ではなく、一部の小さなサブセットのみを用いて、対象のドキュメントのデータの検証ができ、計算回数はブロック数をnとするとlog(n)回の計算量になります。

マークルツリーに関しては、下記記事がわかりやすかったです。
ゼロ知識でふんわり理解するマークルツリー
図解マークルツリーについて理解しよう!〜ブロックチェーンに絡めながらわかりやすく解説〜
Verifiable data structures

このように、QLDBでは、あらかじめダイジェストを取得しておき、ハッシュ関数やマークルツリーモデルを活用した検証の仕組みを利用して、ハッシュ値を再計算し、あらかじめ取得しておいたダイジェストと値が一致することを確認することで、ダイジェストを取得した時点から、検証を実施する時点までの間にドキュメントが改変されていないことを証明することができます。

あらかじめダイジェストを取得しておく必要があるため、定期的にダイジェストを取得し保存しておくことが推奨されています。

QLDBの検証を試して動作確認をする

次に実際にAWSのマネジメントコンソールから検証を行い、その動作を確認してみます。

ダイジェストの取得

{“digest”:”WETcLJXYaVbsrmnkMo2C9gKmP2Ti7qiYbSc9iyHwE9c=”,”digestTipAddress”:”{strandId:\”1iSc85kjuFsCkGOpsy6TrB\”,sequenceNo:21}”,”ledger”:”qldb-verification-test”,”date”:”2022-05-30T02:55:54.454Z”}

digest
「digest」は、ある時点におけるデータの変更履歴全体に対して一意の著名として機能するハッシュ値です。
再計算した結果とこのハッシュ値が一致するかどうかで改竄されていないことを検証します。

digestTipAddress
「digestTipAddress」は、digest取得時の最新のブロックの位置情報です。
ブロックの位置情報は「strandId」と「sequenceNo」で指定することができ、「strandId」はジャーナル内のどのブロックチェーンかを指定し、「sequenceNo」は何個目のブロックかを指定します。

ledger
「ledger」は、ダイジェストを要求した台帳名です。

date
「date」はダイジェストを取得したときのタイムスタンプ。

検証

検証したいドキュメントの指定と、事前に取得したダイジェストのデータを入力します。
入力後検証ボタンを押下すると再計算が開始されます。

ドキュメントIDや、ブロックアドレスは下記クエリで確認することができます。

SELECT metadata.id, blockAddress FROM _ql_committed_QLDB_TEST_TABLE WHERE 条件

再計算後下記のような結果が出力されます。
事前に取得したダイジェストと再計算した結果が一致したため、データが改竄されていないことが検証されました。

リビジョンハッシュ
「リビジョンハッシュ」は、一意のドキュメントIDによって識別される一連のドキュメントのあるバージョンにおけるハッシュ値です。
証明ハッシュ
データの検証のために必要なハッシュリストです。
算出されたダイジェスト
再計算した結果出力されるハッシュ値です。
ダイジェスト
事前に取得した、ある時点におけるデータの変更履歴全体に対して一意の著名として機能するハッシュ値です。

検証対象のブロックのデータも確認することができます。

まとめ

QLDBにおけるデータが改竄されていないことを検証する仕組みと、AWSのコンソール上から実際にそれを試してみました。

参考

Amazon QLDB:An engineer’s deep dive
Data verification in Amazon QLDB
レポート DAT380: Amazon QLDB An engineer’s deep dive -なぜこれがゲームチェンジャーなのか- #reinvent