Amazon QLDB のジャーナルコンテンツ - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon QLDB のジャーナルコンテンツ

Amazon QLDB の場合、ジャーナルは、データに対するすべての変更の完全かつ検証可能な履歴を保存するイミュータブルトランザクションログです。ジャーナルは追加専用であり、コミットされたデータやその他のシステムメタデータを含む、一連のシーケンスおよびハッシュチェーンされたブロックで構成されます。QLDB は、トランザクション内のジャーナルに 1 つの連鎖ブロックを書き込みます。

このセクションでは、サンプルデータを含むジャーナルブロックの例を示し、ブロックの内容について説明します。

ブロックの例

ジャーナルブロックには、トランザクションのメタデータ、トランザクションでコミットされたドキュメントリビジョンを表すエントリ、およびそれらをコミットした PartiQL ステートメントが含まれます。

以下に、サンプルデータを含むブロックの例を示します。

注記

このブロック例は、情報提供のみを目的として記載されています。示されているハッシュは、実際に計算されたハッシュ値ではありません。

{
  blockAddress:{
    strandId:"4o5UuzWSW5PIoOGm5jPA6J",
    sequenceNo:25
  },
  transactionId:"3gtB8Q8dfIMA8lQ5pzHAMo",
  blockTimestamp:2022-06-08T18:46:46.512Z,
  blockHash:{{QS5lJt8vRxT30L9OGL5oU1pxFTe+UlEwakYBCrvGQ4A=}},
  entriesHash:{{buYYc5kV4rrRtJAsrIQnfnhgkzfQ8BKjI0C2vFnYQEw=}},
  previousBlockHash:{{I1UKRIWUgkM1X6042kcoZ/eN1rn0uxhDTc08zw9kZ5I=}},
  entriesHashList:[
    {{BUCXP6oYgmug2AfPZcAZup2lKolJNTbTuV5RA1VaFpo=}},
    {{cTIRkjuULzp/4KaUEsb/S7+TG8FvpFiZHT4tEJGcANc=}},
    {{3aktJSMyJ3C5StZv4WIJLu/w3D8mGtduZvP0ldKUaUM=}},
    {{GPKIJ1+o8mMZmPj/35ZQXoca2z64MVYMCwqs/g080IM=}}
  ],
  transactionInfo:{
    statements:[
      {
        statement:"INSERT INTO VehicleRegistration VALUE ?",
        startTime:2022-06-08T18:46:46.063Z,
        statementDigest:{{KY2nL6UGUPs5lXCLVXcUaBxcEIop0Jvk4MEjcFVBfwI=}}
      },
      {
        statement:"SELECT p_id FROM Person p BY p_id WHERE p.FirstName = ? and p.LastName = ?",
        startTime:2022-06-08T18:46:46.173Z,
        statementDigest:{{QS2nfB8XBf2ozlDx0nvtsliOYDSmNHMYC3IRH4Uh690=}}
      },
      {
        statement:"UPDATE VehicleRegistration r SET r.Owners.PrimaryOwner.PersonId = ? WHERE r.VIN = ?",
        startTime:2022-06-08T18:46:46.278Z,
        statementDigest:{{nGtIA9Qh0/dwIplOR8J5CTeqyUVtNUQgXfltDUo2Aq4=}}
      },
      {
        statement:"DELETE FROM DriversLicense l WHERE l.LicenseNumber = ?",
        startTime:2022-06-08T18:46:46.385Z,
        statementDigest:{{ka783dcEP58Q9AVQ1m9NOJd3JAmEvXLjzl0OjN1BojQ=}}
      }
    ],
    documents:{
      HwVFkn8IMRa0xjze5xcgga:{
        tableName:"VehicleRegistration",
        tableId:"HQZ6cgIMUi204Lq1tT4oaJ",
        statements:[0,2]
      },
      IiPTRxLGJZa342zHFCFT15:{
        tableName:"DriversLicense",
        tableId:"BvtXEB1JxZg0lJlBAtbtSV",
        statements:[3]
      }
    }
  },
  revisions:[
    {
      hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}}
    },
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
      data:{
        VIN:"1N4AL11D75C109151",
        LicensePlateNumber:"LEWISR261LL",
        State:"WA",
        City:"Seattle",
        PendingPenaltyTicketAmount:90.25,
        ValidFromDate:2017-08-21,
        ValidToDate:2020-05-11,
        Owners:{
          PrimaryOwner:{
            PersonId:"3Ax20JIix5J2ulu2rCMvo2"
          },
          SecondaryOwners:[]
        }
      },
      metadata:{
        id:"HwVFkn8IMRa0xjze5xcgga",
        version:0,
        txTime:2022-06-08T18:46:46.492Z,
        txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
      }
    },
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      hash:{{ZVF/f1uSqd5DIMqzI04CCHaCGFK/J0Jf5AFzSEk0l90=}},
      metadata:{
        id:"IiPTRxLGJZa342zHFCFT15",
        version:1,
        txTime:2022-06-08T18:46:46.492Z,
        txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
      }
    }
  ]
}

revisions フィールドには、hash 値のみを含み、その他の属性を含まないリビジョンオブジェクトもあります。これらは、ユーザーデータを含まない内部のみのシステムリビジョンです。これらのリビジョンのハッシュは、ジャーナルの完全なハッシュチェーンの一部であり、暗号検証に必要です。

ブロックの内容

ジャーナルブロックには、次のフィールドがあります。

blockAddress

ジャーナル内のブロックの位置。アドレスは、strandIdsequenceNo という 2 つのフィールドを含む Amazon Ion 構造です。

例: {strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}

transactionId

ブロックをコミットしたトランザクションの一意の ID。

blockTimestamp

ブロックがジャーナルにコミットされた時刻を示すタイムスタンプ。

blockHash

ブロックを一意に表す 256 ビットのハッシュ値。これは、entriesHashpreviousBlockHash の連結のハッシュです。

entriesHash

ブロック内のすべてのエントリ (内部専用のシステムエントリを含む) を表すハッシュ。これは、Merkle ツリーのルートハッシュです。このツリーのリーフノードは、entriesHashList のすべてのハッシュで構成されます。

previousBlockHash

ジャーナル内の 1 つ前のチェーンされたブロックのハッシュ。

entriesHashList

ブロック内の各エントリを表すハッシュのリスト。このリストには、次のエントリハッシュが含まれる場合があります。

  • transactionInfo を表す Ion ハッシュ。この値は、transactionInfo 構造全体の Ion ハッシュを取得することによって計算されます。

  • リーフノードが revisions のすべてのハッシュで構成される Merkle ツリーのルートハッシュ。

  • redactionInfo を表す Ion ハッシュ。このハッシュは、秘匿化のトランザクションによってコミットされたブロックにのみ存在します。この値は、redactionInfo 構造全体の Ion ハッシュを取得することによって計算されます。

  • 内部専用のシステムメタデータを表すハッシュ。これらのハッシュは、すべてのブロックに存在するとは限りません。

transactionInfo

ブロックをコミットしたトランザクション内のステートメントに関する情報を含む Amazon Ion 構造。この構造には次のフィールドがあります。

  • statements - PartiQL ステートメントのリストと、ステートメントの実行が開始したときの startTime。各ステートメントには、transactionInfo 構造のハッシュを計算するために必要な statementDigest ハッシュがあります。

  • documents - ステートメントによって更新されたドキュメント ID。各ドキュメントには、そのドキュメントが所属する先の tableNametableId、およびそのドキュメントを更新した各ステートメントのインデックスが含まれます。

revisions

ブロック内でコミットされたドキュメントリビジョンのリスト。各リビジョン構造には、リビジョンのコミットされたビューのすべてのフィールドが含まれます。

これには、ジャーナルのハッシュチェーン全体の一部を構成する内部専用のシステムリビジョンを表すハッシュも含まれます。

秘匿化済みのリビジョン

Amazon QLDB では、DELETE ステートメントは、削除済みとしてマークする新しいリビジョンを作成することによってのみドキュメントを論理的に削除します。QLDB テーブルの履歴にある使用頻度の低いドキュメントリビジョンを完全に削除できるデータの秘匿化オペレーションもサポートしています。

秘匿化オペレーションでは、指定されたリビジョンのユーザーデータのみが削除され、ジャーナルシーケンスとドキュメントのメタデータは変更されません。これにより、台帳の全体的なデータの整合性が維持されます。詳細と秘匿化オペレーションの例については、「ドキュメントのリビジョンを秘匿化する」を参照してください。

秘匿化済みのリビジョンの例

先ほどのブロックの例を考えてみましょう。このブロックでは、秘匿化中のリビジョンのドキュメント ID が HwVFkn8IMRa0xjze5xcgga で、バージョン番号が 0 とします。

秘匿化が完了すると、リビジョン内の (data 構造で表される) dataHash ユーザーデータは新しいフィールドに置き換えられます。このフィールドの値は、削除された data 構造の Ion ハッシュです。その結果、台帳は全体的なデータ整合性を維持し、既存の検証 API オペレーションを通じて暗号的に検証できる状態を維持します。

次の改訂例は、この秘匿化の結果を示しています。新しい dataHash フィールドは赤色の斜体で強調表示されています。

注記

このリビジョンの例は、情報提供のみを目的として記載されています。示されているハッシュは、実際に計算されたハッシュ値ではありません。

...
{
  blockAddress:{
    strandId:"4o5UuzWSW5PIoOGm5jPA6J",
    sequenceNo:25
  },
  hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
  dataHash:{{s83jd7sfhsdfhksj7hskjdfjfpIPP/DP2hvionas2d4=}},
  metadata:{
    id:"HwVFkn8IMRa0xjze5xcgga",
    version:0,
    txTime:2022-06-08T18:46:46.492Z,
    txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
  }
}
...

また、QLDB は、完了した秘匿化のリクエストに対応する新しいブロックをジャーナルに追加します。このブロックには、次の例に示すように、トランザクション内で秘匿化済みのリビジョンのリストを含む追加 redactionInfo エントリが含まれます。

...
redactionInfo:{
  revisions:[
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      tableId:"HQZ6cgIMUi204Lq1tT4oaJ",
      documentId:"HwVFkn8IMRa0xjze5xcgga",
      version:0
    }
  ]
}
...

サンプルアプリケーション

エクスポートされたデータを使用してジャーナルのハッシュチェーンを検証する Java コード例については、GitHub リポジトリ aws-samples/amazon-qldb-dmv-sample-java を参照してください。このサンプルアプリケーションには、次のクラスファイルが含まれています。

  • ValidateQldbHashChain.java - 台帳からジャーナルブロックをエクスポートし、エクスポートされたデータを使用してブロック間のハッシュチェーンを検証するチュートリアルコードが含まれています。

  • JournalBlock.java - ブロック内の個々のハッシュコンポーネントを計算する方法を示す verifyBlockHash() という名前のメソッドが含まれています。このメソッドは、ValidateQldbHashChain.java のチュートリアルコードによって呼び出されます。

この完全なサンプルアプリケーションをダウンロードしてインストールする方法については、「Amazon QLDB Java サンプルアプリケーションのインストール」を参照してください。チュートリアルコードを実行する前に、「Java チュートリアル」のステップ 1~3 を実行し、サンプル台帳をセットアップして、サンプルデータを使用してロードしてください。

以下も参照してください。

QLDB におけるジャーナルの詳細については、以下のトピックを参照してください。