Amazon のジャーナルコンテンツ QLDB - Amazon Quantum 台帳データベース (Amazon QLDB)

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

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

重要

サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL」を参照してください。

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 – ステートメントによってIDs更新されたドキュメント。各ドキュメントには、そのドキュメントが所属する先の tableNametableId、およびそのドキュメントを更新した各ステートメントのインデックスが含まれます。

revisions

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

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

秘匿化済みのリビジョン

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

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

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

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

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

次のリビジョンの例は、このリダクションの結果を示しています。新しいdataHashフィールドは で強調表示されています。red italics.

注記

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

...
{
  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/-java amazon-qldb-dmv-sampleを参照してください。このサンプルアプリケーションには、次のクラスファイルが含まれています。

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

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

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

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

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