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 ハッシュ。この値は、全体の Ion ハッシュを使用して計算されます。transactionInfo構造。

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

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

transactionInfo

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

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

  • documents - ステートメントによって更新されたドキュメント ID。各ドキュメントにはtableNameそしてtableIdそのエントリと、およびそのステートメントを更新した各ステートメントのインデックス。

revisions

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

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

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

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

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

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

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

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

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