Contenuto del diario in Amazon QLDB - Database Amazon Quantum Ledger (Amazon QLDB)

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Contenuto del diario in Amazon QLDB

In Amazon QLDB, il journal è il registro transazionale immutabile che memorizza la cronologia completa e verificabile di tutte le modifiche ai dati. Il journal è disponibile solo per le appendici ed è composto da un set di blocchi sequenziati e concatenati in hash che contengono i dati salvati e altri metadati di sistema. QLDB scrive un blocco concatenato nel journal in una transazione.

Questa sezione fornisce un esempio di blocco di diario con dati di esempio e descrive il contenuto di un blocco.

Esempio di blocco

Un blocco di diario contiene i metadati delle transazioni insieme a voci che rappresentano le revisioni dei documenti che sono state commesse nella transazione e le dichiarazioni di PartiQL che le hanno commesse.

Di seguito è riportato un esempio di blocco con dati di esempio.

Nota

Questo esempio di blocco viene fornito solo a scopo informativo. Gli hash mostrati non sono valori hash reali calcolati.

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

Nelrevisions campo, alcuni oggetti di revisione potrebbero contenere solo unhash valore e nessun altro attributo. Si tratta di revisioni del sistema solo interne che non contengono dati utente. Gli hash di queste revisioni fanno parte dell'intera catena di hash della rivista, necessaria per la verifica crittografica.

Blocca contenuti

Un blocco del diario ha i campi riportati di seguito:

blockAddress

La posizione del blocco nel diario. Un indirizzo è una struttura Amazon Ion con due campi:strandId esequenceNo.

Ad esempio: {strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}

transactionId

L'ID univoco della transazione che ha commesso il blocco.

blockTimestamp

Il timestamp in cui il blocco è stato salvato nel journal.

blockHash

Il valore hash a 256 bit che rappresenta in modo univoco il blocco. Questo è l'hash della concatenazione dientriesHash epreviousBlockHash.

entriesHash

L'hash che rappresenta tutte le voci all'interno del blocco, incluse le voci di sistema solo interne. Questo è l'hash principale dell'albero Merkle in cui i nodi delle foglie sono costituiti da tutti gli hash in cui sono costituitientriesHashList.

previousBlockHash

L'hash del precedente blocco concatenato nel journal.

entriesHashList

L'elenco degli hash che rappresentano ogni voce all'interno del blocco. Questo elenco può includere gli hash della voce riportati di seguito:

  • L'hash Ion che rappresentatransactionInfo. Questo valore viene calcolato prendendo l'hash Ion dell'interatransactionInfo struttura.

  • L'hash della radice dell'albero Merkle in cui i nodi delle foglie sono costituiti da tutti gli hash in cui sono contenutirevisions.

  • L'hash Ion che rappresentaredactionInfo. Questo hash esiste solo nei blocchi che sono stati commessi da una transazione di redazione. Il suo valore viene calcolato prendendo l'hash Ion dell'interaredactionInfo struttura.

  • Hash che rappresentano metadati di sistema solo interni. Questi hash potrebbero non esistere in tutti i blocchi.

transactionInfo

Una struttura Amazon Ion che contiene informazioni sulle dichiarazioni della transazione che ha commesso il blocco. Questa struttura include i campi riportati di seguito:

  • statements— L'elenco delle istruzioni PartiQL e ilstartTime momento in cui hanno iniziato a funzionare. Ogni istruzione ha unstatementDigest hash, necessario per calcolare l'hash dellatransactionInfo struttura.

  • documents— Gli ID dei documenti che sono stati aggiornati dalle dichiarazioni. Ogni documento include iltableName e atableId cui appartiene e l'indice di ogni dichiarazione che lo ha aggiornato.

revisions

L'elenco delle revisioni dei documenti che sono state eseguite nel blocco. Ogni struttura di revisione contiene tutti i campi della visualizzazione confermata della revisione.

Ciò può includere anche hash che rappresentano revisioni di sistema solo interne che fanno parte dell'intera catena di hash di un journal.

Revisioni redatte

In Amazon QLDB, un'DELETEistruzione elimina logicamente un documento solo creando una nuova revisione che lo contrassegna come eliminato. QLDB supporta anche un'operazione di redazione dei dati che consente di eliminare definitivamente le revisioni di documenti inattive nella cronologia di una tabella.

L'operazione di redazione elimina solo i dati dell'utente nella revisione specificata e lascia invariati la sequenza del diario e i metadati del documento. Ciò mantiene l'integrità complessiva dei dati del registro. Per ulteriori informazioni e un esempio di operazione di redazione, consultaRedazione delle revisioni dei documenti.

Esempio di revisione redatto

Considerate l'esempio di blocco precedente. In questo blocco, supponiamo di redigere la revisione che ha un ID del documentoHwVFkn8IMRa0xjze5xcgga e un numero di versione di0.

Una volta completata la redazione, i dati utente nella revisione (rappresentati dalladata struttura) vengono sostituiti da un nuovodataHash campo. Il valore di questo campo è l'hash Ion delladata struttura rimossa. Di conseguenza, il registro mantiene l'integrità complessiva dei dati e rimane verificabile crittograficamente attraverso le operazioni dell'API di verifica esistenti.

Il seguente esempio di revisione mostra i risultati di questa redazione, con il nuovodataHash campo evidenziato in corsivo rosso.

Nota

Questo esempio di revisione viene fornito solo a scopo informativo. Gli hash mostrati non sono valori hash reali calcolati.

...
{
  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 aggiunge anche un nuovo blocco al giornale per la richiesta di redazione completata. Questo blocco include unaredactionInfo voce aggiuntiva che contiene un elenco di revisioni che sono state cancellate nella transazione, come illustrato nell'esempio seguente.

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

Applicazione di esempio

Per un esempio di codice Java che convalida la catena hash di un journal utilizzando dati esportati, consulta il GitHub repository aws-samples/amazon-qldb-dmv-sample -java. Questa applicazione di esempio include i seguenti file di classe:

  • ValidateQldbHashChain.java — Contiene un codice tutorial che esporta i blocchi di diario da un libro mastro e utilizza i dati esportati per convalidare la catena di hash tra i blocchi.

  • JournalBlock.java — Contiene un metodo denominatoverifyBlockHash() che dimostra come calcolare ogni singolo componente hash all'interno di un blocco. Questo metodo viene richiamato dal codice del tutorial inValidateQldbHashChain.java.

Per istruzioni su come scaricare e installare questa applicazione di esempio completa, vedereInstallazione dell'applicazione di esempio Java Amazon QLDB. Prima di eseguire il codice del tutorial, assicurati di seguire i passaggi da 1Tutorial su Java a 3 per configurare un registro di esempio e caricarlo con dati di esempio.

Consulta anche

Per ulteriori informazioni sui giornali in QLDB, consulta i seguenti argomenti: