Conteúdo do periódico no Amazon QLDB - Amazon Quantum Ledger Database (Amazon QLDB)

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 no Amazon QLDB

No Amazon QLDB, o diário é o log transacional imutável que armazena o histórico completo e verificável de todas as alterações nos 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. O QLDB grava 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.

Bloquear conteúdo

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— Os IDs dos documentos que foram atualizados 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

No Amazon QLDB, uma instrução DELETE só exclui logicamente um documento criando uma nova revisão que o marca como excluído. O QLDB també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 Redigindo 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 uma 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 íons da estrutura data removida. Como resultado, o ledger mantém a integridade geral dos dados e permanece criptograficamente verificável por meio das operações existentes da API de verificação.

O exemplo de revisão a seguir mostra os resultados dessa redação, com o novo campo dataHash destacado em itálico vermelho.

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

O QLDB também anexa 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
    }
  ]
}
...

Aplicativo de amostra

Para ver um exemplo de código Java que valida a cadeia de hash de um diário usando dados exportados, consulte o repositório do GitHub aws-samples/amazon-qldb-dmv-sample-java. 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 ledger 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 Java do Amazon QLDB. 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 QLDB, consulte os seguintes tópicos: