Journalinhalte in Amazon QLDB - Amazon Quantum Ledger Database (Amazon QLDB)

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Journalinhalte in Amazon QLDB

In Amazon QLDB ist das Journal das unveränderliche Transaktionsprotokoll, in dem der vollständige und überprüfbare Verlauf aller Änderungen an Ihren Daten gespeichert wird. Das Journal ist nur für Anhänge bestimmt und besteht aus einer sequenzierten und mit Hash-Verkettung versehenen Gruppe von Blöcken, die Ihre übermittelten Daten und andere Systemmetadaten enthalten. QLDB schreibt in einer Transaktion einen verketteten Block in das Journal.

Dieser Abschnitt enthält ein Beispiel für einen Journalblock mit Beispieldaten und beschreibt den Inhalt eines Blocks.

Blockbeispiel

Ein Journalblock enthält Transaktionsmetadaten zusammen mit Einträgen, die die Dokumentrevisionen darstellen, die in der Transaktion festgeschrieben wurden, sowie die PartiQL-Anweisungen, die diese festgeschrieben haben.

Im Folgenden finden Sie ein Beispiel für einen Block mit Beispieldaten.

Anmerkung

Dieses Blockbeispiel dient nur zu Informationszwecken. Die angezeigten Hashes sind keine echten berechneten Hashwerte.

{
  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"
      }
    }
  ]
}

Im revisions-Feld enthalten einige Revisionsobjekte möglicherweise nur einen hash-Wert und keine anderen Attribute. Dabei handelt es sich um interne Systemrevisionen, die keine Benutzerdaten enthalten. Die Hashes dieser Revisionen sind Teil der vollständigen Hashkette des Journals, die für die kryptografische Überprüfung erforderlich ist.

Blockinhalte

Ein Journalblock verfügt über die folgenden Felder:

blockAddress

Die Position des Blocks im Journal. Ein Adresse ist eine Amazon Ion-Struktur, die über zwei Felder verfügt: strandId und sequenceNo.

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

transactionId

Die eindeutige ID der Transaktion, die die den Block festgeschrieben hat.

blockTimestamp

Der Zeitstempel, als der Block im Journal festgeschrieben wurde.

blockHash

Der 256-Bit-Hash-Wert, der den Block eindeutig darstellt. Dies ist der Hash der Verkettung von entriesHash und previousBlockHash.

entriesHash

Der Hash, der alle Einträge innerhalb des Blocks darstellt, einschließlich ausschließlich interner Systemeinträge. Dies ist der Wurzelhash des Merkle-Baums, in dem die Blattknoten aus allen Hashes in entriesHashList bestehen.

previousBlockHash

Der Hash des vorherigen verketteten Blocks im Journal.

entriesHashList

Die Liste der Hashes, die jeden Eintrag innerhalb des Blocks darstellen. Diese Liste kann die folgenden Eintrags-Hashes enthalten:

  • Der Ionen-Hash, der darstellttransactionInfo. Dieser Wert wird berechnet, indem der Ionen-Hash der gesamtentransactionInfo Struktur genommen wird.

  • Der Wurzelhash des Merkle-Baums, in dem die Blattknoten aus allen Hashes in revisions bestehen.

  • Der Ionen-Hash, der darstelltredactionInfo. Dieser Hash existiert nur in Blöcken, die durch eine Redaktionstransaktion festgeschrieben wurden. Sein Wert wird berechnet, indem der Ionen-Hash der gesamtenredactionInfo Struktur genommen wird.

  • Hashes, die nur interne Systemmetadaten darstellen. Diese Hashes sind möglicherweise nicht in allen Blöcken vorhanden.

transactionInfo

Eine Amazon Ion-Struktur, die Informationen zu den Anweisungen in der Transaktion enthält, die den Block festgeschrieben hat. Diese Struktur enthält die folgenden Felder:

  • statements— Die Liste der PartiQL-Anweisungen und derstartTime Zeitpunkt, zu dem sie ausgeführt wurden. Jede Anweisung hat einen statementDigest-Hash, der benötigt wird, um den Hash der transactionInfo-Struktur zu berechnen.

  • documents— Die Dokument-IDs, die durch die Kontoauszüge aktualisiert wurden. Jedes Dokument enthälttableId dastableName und zu dem es gehört, und den Index jeder Anweisung, mit der es aktualisiert wurde.

revisions

Die Liste der Dokumentversionen, die im Block festgeschrieben wurden. Jede Revisionsstruktur enthält alle Felder aus der bestätigten Ansicht der Revision.

Hierzu können auch Hashes gehören, die rein interne Systemrevisionen darstellen, die Teil der vollständigen Hashkette eines Journals sind.

Redigierte Versionen

In Amazon QLDB löscht eineDELETE Anweisung ein Dokument nur logisch, indem eine neue Revision erstellt wird, die es als gelöscht markiert. QLDB unterstützt auch einen Datenredigierungsvorgang, mit dem Sie inaktive Dokumentrevisionen in der Historie einer Tabelle dauerhaft löschen können.

Beim Schwärzen werden nur die Benutzerdaten in der angegebenen Revision gelöscht, und die Journalsequenz und die Metadaten des Dokuments bleiben unverändert. Dadurch bleibt die allgemeine Datenintegrität Ihres Ledgers erhalten. Weitere Informationen und ein Beispiel für einen Redigierungsvorgang finden Sie unterRedigieren von Dokumentrevisionen.

Beispiel für Revision

Betrachten Sie das vorherige Blockbeispiel. Nehmen Sie in diesem Block an, dass Sie die Revision redigieren, die eine Dokument-ID vonHwVFkn8IMRa0xjze5xcgga und eine Versionsnummer von hat0.

Nach Abschluss der Bearbeitung werden die Benutzerdaten in der Revision (dargestellt durch diedata Struktur) durch ein neuesdataHash Feld ersetzt. Der Wert dieses Feldes ist der Ionen-Hash der entferntendata Struktur. Dadurch behält das Ledger seine allgemeine Datenintegrität bei und bleibt durch die vorhandenen Verifizierungs-API-Operationen kryptografisch überprüfbar.

Das folgende Revisionsbeispiel zeigt die Ergebnisse dieser Schwärzung, wobei das neuedataHash Feld rot kursiv hervorgehoben ist.

Anmerkung

Dieses Revisionsbeispiel dient nur zu Informationszwecken. Die angezeigten Hashes sind keine echten berechneten Hashwerte.

...
{
  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 fügt dem Journal außerdem einen neuen Block für die abgeschlossene Redaktionsanfrage an. Dieser Block enthält einen zusätzlichenredactionInfo Eintrag, der eine Liste der Revisionen enthält, die in der Transaktion redigiert wurden, wie im folgenden Beispiel gezeigt.

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

Beispielanwendung

Ein Java-Codebeispiel, das die Hashkette eines Journals anhand exportierter Daten validiert, finden Sie im GitHub Repository aws-samples/amazon-qldb-dmv-sample -java. Diese Beispielanwendung enthält die folgenden Klassendateien:

  • ValidateQldbHashChain.java — Enthält Tutorialcode, der Journalblöcke aus einem Ledger exportiert und die exportierten Daten verwendet, um die Hash-Kette zwischen Blöcken zu validieren.

  • JournalBlock.java — Enthält eine Methode mit dem NamenverifyBlockHash(), die demonstriert, wie jede einzelne Hash-Komponente innerhalb eines Blocks berechnet wird. Diese Methode wird durch den Tutorialcode in aufgerufenValidateQldbHashChain.java.

Anweisungen zum Herunterladen und Installieren dieser vollständigen Beispielanwendung finden Sie unter Installation der Amazon QLDB Java-Beispielanwendung. Bevor Sie den Tutorialcode ausführen, stellen Sie sicher, dass Sie die Schritte 1—3 imJava-Anleitung Abschnitt So richten Sie ein Beispielbuch ein und laden Sie es mit Beispieldaten.

Weitere Informationen finden Sie auch unter

Weitere Informationen zu -Journals in QLDB finden Sie in den folgenden Themen: