Contenido de revistas en Amazon QLDB - Base de datos Amazon Quantum Ledger (AmazonQLDB)

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Contenido de revistas en Amazon QLDB

importante

Aviso de fin de soporte: los clientes actuales podrán usar Amazon QLDB hasta que finalice el soporte, el 31 de julio de 2025. Para obtener más información, consulte Migración de un Amazon QLDB Ledger a Amazon Aurora SQL Postgre.

En AmazonQLDB, el diario es el registro transaccional inmutable que almacena el historial completo y verificable de todos los cambios en los datos. El diario es solamente un anexo, y está compuesto por un conjunto de bloques secuenciados y encadenados que contienen los datos confirmados y otros metadatos del sistema. QLDBescribe un bloque encadenado en el diario de una transacción.

En esta sección se proporciona un ejemplo de un bloque de diarios con datos de muestra y se describe el contenido del bloque.

Ejemplo de bloque

Un bloque de diarios contiene metadatos de transacciones junto con entradas que representan las revisiones del documento confirmadas en la transacción, así como las instrucciones PartiQL que las han confirmado.

El siguiente es un ejemplo de un bloque con datos de muestra.

nota

Este ejemplo de bloque se ofrece solo con fines informativos. Los hash que se muestran no son valores hash calculados reales.

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

En el campo revisions, es posible que algunos objetos de revisión contengan solo un valor hash y ningún otro atributo. Son revisiones del sistema exclusivamente internas que no contienen datos de usuario. Los hash de estas revisiones forman parte de la cadena de hash completa del diario, necesaria para la verificación criptográfica.

Contenidos del bloque

Un bloque de diarios cuenta con los siguientes campos:

blockAddress

La ubicación del bloque en el diario. La dirección es una estructura de Amazon Ion que consta de dos campos: strandId y sequenceNo.

Por ejemplo: {strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}

transactionId

El ID único de la transacción que confirmó el bloque.

blockTimestamp

La fecha y hora de confirmación del bloque en el diario.

blockHash

El valor de hash de 256 bits que representa ese bloque único. Es el hash de la concatenación de entriesHash y previousBlockHash.

entriesHash

El hash que representa todas las entradas del bloque, incluidas las entradas del sistema únicamente internas. Se trata del hash raíz del árbol de Merkle, en el que los nodos de las hojas están compuestos por todos los hash de entriesHashList.

previousBlockHash

El hash del anterior bloque encadenado del diario.

entriesHashList

La lista de hash que representan cada entrada del bloque. Esta lista puede incluir los siguientes hash de entrada:

  • El hash de Ion que representa transactionInfo. Este valor se calcula tomando el hash de Ion de toda la estructura de transactionInfo.

  • Se trata del hash raíz del árbol de Merkle, en el que los nodos de las hojas están compuestos por todos los hash de revisions.

  • El hash de Ion que representa redactionInfo. Este hash solo existe en los bloques confirmados mediante una transacción de redacción. Su valor se calcula tomando el hash de Ion de toda la estructura de redactionInfo.

  • Hashes que representan metadatos del sistema únicamente internos. Es posible que estos hashes no existan en todos los bloques.

transactionInfo

Estructura de Amazon Ion que contiene información sobre las instrucciones de la transacción en la que se confirmó el bloque. Esta estructura tiene los campos siguientes:

  • statements: la lista de instrucciones PartiQL y el startTime en que comenzaron a ejecutarse. Cada instrucción tiene un hash de statementDigest necesario para calcular el hash de la estructura de transactionInfo.

  • documents— El documento IDs que se actualizó con las declaraciones. Cada documento incluye el tableName e tableId al que pertenece, así como el índice de cada instrucción que lo actualizó.

revisions

La lista de revisiones de documentos confirmadas en el bloque. Cada estructura de revisión contiene todos los campos de la vista confirmada de la revisión.

También puede incluir hashes que representen revisiones del sistema exclusivamente internas y que formen parte de la cadena de hash completa de un diario.

Revisiones redactadas

En AmazonQLDB, una DELETE declaración solo elimina un documento de forma lógica al crear una nueva revisión que lo marca como eliminado. QLDBtambién admite una operación de redacción de datos que permite eliminar permanentemente las revisiones de documentos inactivas del historial de una tabla.

La operación de redacción elimina solo los datos de usuario de la revisión especificada, sin alterar el diario ni los metadatos del documento. Esto mantiene la integridad general de los datos del libro mayor. Para obtener más información y ver un ejemplo de operación de redacción, consulte Editar revisiones de documentos.

Ejemplo de revisión redactada

Considere el ejemplo de bloque anterior. En este bloque, supongamos que redacta la revisión con ID de documento HwVFkn8IMRa0xjze5xcgga y número de versión 0.

Una vez finalizada la redacción, los datos de usuario de la revisión (representados por la estructura data) se sustituyen por un nuevo campo dataHash. El valor de este campo es el hash de Ion de la estructura data eliminada. Como resultado, el libro mayor mantiene la integridad general de sus datos y sigue siendo verificable criptográficamente mediante las operaciones de verificación existentes. API

En el siguiente ejemplo de revisión se muestran los resultados de esta redacción, con el nuevo campo resaltado en dataHash red italics.

nota

Este ejemplo de revisión se ofrece solo con fines informativos. Los hash que se muestran no son valores hash calculados reales.

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

QLDBtambién añade un nuevo bloque al diario para completar la solicitud de redacción. En este bloque se incluye una entrada redactionInfo adicional que contiene una lista de las revisiones redactadas en la transacción, tal como se muestra en el ejemplo siguiente.

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

Aplicación de muestra

Para ver un ejemplo de código Java que valida la cadena hash de una revista con datos exportados, consulte el GitHub repositorio aws-samples/ -java. amazon-qldb-dmv-sample Esta aplicación de ejemplo incluye los siguientes archivos de clase:

  • ValidateQldbHashChain.java: contiene un código tutorial que exporta bloques de diarios de un libro mayor y utiliza los datos exportados para validar la cadena de hash entre bloques.

  • JournalBlock.java: contiene un nombre de método verifyBlockHash() que demuestra cómo calcular cada componente hash individual de un bloque. Este método se invoca mediante el código del tutorial de ValidateQldbHashChain.java.

Para obtener instrucciones sobre cómo descargar e instalar esta aplicación de ejemplo completa, consulte Instalación de la aplicación de muestra Amazon QLDB Java. Antes de ejecutar el código del tutorial, asegúrese de seguir los pasos 1 a 3 de Tutorial de Java para configurar un libro mayor y cargarlo con datos de ejemplo.

Véase también

Para obtener más información sobre las revistas enQLDB, consulte los siguientes temas: