

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 del diario en Amazon QLDB
<a name="journal-contents"></a>

**importante**  
Aviso de fin del soporte: los clientes actuales podrán utilizar Amazon QLDB hasta que finalice el soporte, el 31 de julio de 2025. Para obtener más información, consulte [Migración de un registro de Amazon QLDB a Amazon Aurora](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/) PostgreSQL.

En Amazon QLDB, un *diario* es un 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. QLDB escribe 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.

**Topics**
+ [Ejemplo de bloque](#journal.block-example)
+ [Contenidos del bloque](#journal.block-contents)
+ [Revisiones redactadas](#journal.redacted-revisions)
+ [Aplicación de muestra](#journal.sample)
+ [Véase también](#journal.see-also)

## Ejemplo de bloque
<a name="journal.block-example"></a>

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](ql-reference.md) 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
<a name="journal.block-contents"></a>

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](ion.md) 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](verification.md#verification.how-it-works.merkle-tree), 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](working.metadata.md) 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
<a name="journal.redacted-revisions"></a>

En Amazon QLDB, una instrucción `DELETE` solo elimina un documento de forma lógica al crear una nueva revisión que lo marca como eliminado. QLDB también permite realizar una operación de *edición de datos* para eliminar permanentemente las revisiones de documentos inactivos 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](working.redaction.md).

### Ejemplo de revisión redactada
<a name="journal.redacted-revisions.example"></a>

Considere el [ejemplo de bloque](#journal.block-example) 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 la API de verificación existentes.

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

**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"
  }
}
...
```

QLDB también añade un nuevo bloque al diario con la solicitud finalizada 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
<a name="journal.sample"></a>

Para ver un ejemplo de código Java que valida la cadena hash de una revista con datos exportados, consulte el GitHub repositorio [amazon-qldb-dmv-sampleaws-samples/](https://github.com/aws-samples/amazon-qldb-dmv-sample-java) -java. Esta aplicación de ejemplo incluye los siguientes archivos de clase:
+ [ValidateQldbHashChain.java](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/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](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/qldb/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 ejemplo Java de Amazon QLDB](sample-app.java.md). Antes de ejecutar el código del tutorial, asegúrese de seguir los pasos 1 a 3 de [Tutorial de Java](getting-started.java.tutorial.md) para configurar un libro mayor y cargarlo con datos de ejemplo.

## Véase también
<a name="journal.see-also"></a>

Para obtener más información sobre diarios en QLDB, consulte los siguientes temas:
+ [Exportación de datos de diarios desde Amazon QLDB](export-journal.md): para saber cómo exportar datos del diario a Amazon Simple Storage Service (Amazon S3).
+ [Transmisión de datos de diarios desde Amazon QLDB](streams.md): para saber cómo transmitir datos del diario a Amazon Kinesis Data Streams.
+ [Verificación de datos en Amazon QLDB](verification.md): para obtener más información sobre la verificación criptográfica de los datos del diario.