Conteúdo do periódico na Amazon QLDB - Banco de dados Amazon Quantum Ledger (AmazonQLDB)

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Conteúdo do periódico na Amazon QLDB

Importante

Aviso de fim do suporte: os clientes existentes poderão usar a Amazon QLDB até o final do suporte em 31/07/2025. Para obter mais detalhes, consulte Migrar um Amazon QLDB Ledger para o Amazon Aurora Postgre. SQL

Na AmazonQLDB, o diário é o registro transacional imutável que armazena o histórico completo e verificável de todas as alterações em seus dados. O diário é somente para anexar e é composto por um conjunto de blocos sequenciados e encadeados em hash que contêm seus dados confirmados e outros metadados do sistema. QLDBgrava um bloco encadeado no diário em uma transação.

Esta seção fornece um exemplo de um bloco de diário com dados de amostra e descreve o conteúdo de um bloco.

Exemplo do bloco

Um bloco de diário contém metadados da transação junto com entradas que representam as revisões do documento que foram confirmadas na transação e as instruções partiQL que as confirmaram.

Veja a seguir um exemplo de um bloco com dados de amostra.

nota

Este exemplo de bloco é fornecido apenas para fins informativos. Os hashes mostrados não são valores reais de hash calculados.

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

No campo revisions, alguns objetos de revisão podem conter apenas um valor hash e nenhum outro atributo. Essas são revisões de sistema somente internas que não contêm dados do usuário. Os hashes dessas revisões fazem parte da cadeia de hash completa do diário, necessária para a verificação criptográfica.

Conteúdo do bloco

Um bloco de diário tem os seguintes campos:

blockAddress

A localização do bloco no diário. Um endereço é uma estrutura Amazon Ion que tem dois campos: strandId e sequenceNo.

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

transactionId

O ID exclusivo da transação que confirmou o bloco.

blockTimestamp

A data e hora em que o bloco foi confirmado no diário.

blockHash

O valor de hash de 256 bits que representa exclusivamente o bloco. Esse é o hash da concatenação de entriesHash e previousBlockHash.

entriesHash

O hash que representa todas as entradas dentro do bloco, incluindo entradas do sistema somente internas. Esse é o hash raiz da árvore Merkle, no qual os nós das folhas consistem em todos os hashes em entriesHashList.

previousBlockHash

O hash do bloco encadeado anterior no diário.

entriesHashList

A lista de hashes que representam cada entrada dentro do bloco. Essa lista pode incluir os seguintes hashes de entrada:

  • O hash Ion que representa transactionInfo. Esse valor é calculado usando o hash Ion de toda a estrutura transactionInfo.

  • Esse é o hash raiz da árvore Merkle, no qual os nós das folhas consistem em todos os hashes em revisions.

  • O hash Ion que representa redactionInfo. Esse hash só existe em blocos que foram confirmados por uma transação de redação. Esse valor é calculado retirando o hash Ion de toda a estrutura redactionInfo.

  • Hashes que representam metadados do sistema somente internos. Esses hashes podem não existir em todos os blocos.

transactionInfo

Uma estrutura Amazon Ion que contém informações sobre as declarações na transação que confirmou o bloqueio. Esta estrutura tem os seguintes campos:

  • statements: a lista de instruções partiQL e startTime quando elas começaram a ser executadas. Cada declaração tem um hash statementDigest, que é necessário para calcular o hash da estrutura transactionInfo.

  • documents— O documento IDs que foi atualizado pelas declarações. Cada documento inclui o tableName e o tableId ao qual pertence e o índice de cada declaração que o atualizou.

revisions

A lista de revisões de documentos que foram confirmadas no bloco. Cada estrutura de revisão contém todos os campos da visão comprometida da revisão.

Isso também pode incluir hashes que representam revisões internas do sistema que fazem parte de toda a cadeia de hash de um diário.

Revisões editadas

Na AmazonQLDB, uma DELETE declaração só exclui logicamente um documento criando uma nova revisão que o marca como excluído. QLDBtambém oferece suporte a uma operação de redação de dados que permite excluir permanentemente revisões de documentos inativas no histórico de uma tabela.

A operação de redação exclui somente os dados do usuário na revisão especificada e deixa a sequência do diário e os metadados do documento inalterados. Isso mantém a integridade geral dos dados do seu ledger. Para obter mais informações e um exemplo de uma operação de redação, consulte Redigir revisões de documentos.

Exemplo de revisão redigida

Considere o exemplo de bloco anterior. Neste bloco, suponha que você redija a revisão que tem um ID de documento HwVFkn8IMRa0xjze5xcgga e um número de versão de 0.

Depois que a redação for concluída, os dados do usuário na revisão (representados pela estrutura data) serão substituídos por um novo campo dataHash. O valor desse campo é o hash de Ion da estrutura data removida. Como resultado, o livro mantém a integridade geral dos dados e permanece criptograficamente verificável por meio das operações de verificação existentes. API

O exemplo de revisão a seguir mostra os resultados dessa redação, com o novo dataHash campo destacado em red italics.

nota

Este exemplo de revisão é fornecido apenas para fins informativos. Os hashes mostrados não são valores reais de hash calculados.

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

QLDBtambém acrescenta um novo bloco ao diário para a solicitação de redação concluída. Esse bloco inclui uma entrada redactionInfo adicional que contém uma lista de revisões que foram editadas na transação, conforme mostrado no exemplo a seguir.

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

Aplicação de exemplo

Para ver um exemplo de código Java que valida a cadeia de hash de um diário usando dados exportados, consulte o GitHub repositório aws-samples/ -java. amazon-qldb-dmv-sample Esse aplicativo de exemplo inclui os seguintes arquivos de classe:

  • ValidateQldbHashChain.java — Contém código de tutorial que exporta blocos de diário de um livro contábil e usa os dados exportados para validar a cadeia de hash entre os blocos.

  • JournalBlock.java — Contém um método chamado verifyBlockHash() que demonstra como calcular cada componente de hash individual em um bloco. Esse método é chamado pelo código do tutorial em ValidateQldbHashChain.java.

Para obter instruções sobre como baixar e instalar esse aplicativo de amostra completo, consulte Instalando o aplicativo de amostra Amazon QLDB Java. Antes de executar o código do tutorial, siga as etapas de 1 a 3 em Tutorial de Java para configurar um ledger de amostra e carregá-lo com dados de amostra.

Consulte também

Para obter mais informações sobre periódicos emQLDB, consulte os seguintes tópicos: