Guias

Guias · Parte 3 de 6

Verificar um registro

A verificação é a metade do Label 309 que não pede permissão a ninguém. A partir de uma referência de transação Cardano, você mesmo pode confirmar um registro — diretamente na cadeia pública, por meio de um explorador de sua escolha. Não há login, e nenhum aspecto do resultado depende de quem o publicou.

Com a CLI

Instale o binário cardanowall e aponte-o para uma transação:

cardanowall verify 3b9f…c1a2

Ele resolve a transação por meio de um explorador público do Cardano, valida estruturalmente o registro, confere eventuais assinaturas de autoria, confirma que o registro já foi liquidado e imprime um veredito. O veredito é um de quatro estados, e o código de saída o carrega literalmente — o que o torna diretamente aproveitável em CI:

Código de saídaVereditoSignificado
0validtoda verificação obrigatória passou
1faileduma verificação atribuível ao registro falhou (integridade, estrutura ou assinatura)
2unverifiablenenhuma falha do registro, mas uma verificação obrigatória não pôde rodar (rede ou política)
3pendingainda não há confirmações suficientes — nenhum resultado de um registro pendente é definitivo
4erro de entrada da CLI (argumentos inválidos ou entrada obrigatória ausente)

A separação entre failed e unverifiable é proposital: um veredito failed é sempre atribuível ao próprio registro, de modo que nenhum explorador mal-intencionado consegue fabricá-lo; unverifiable significa que o verificador não conseguiu concluir uma verificação por motivos alheios ao registro — um gateway que ele não pôde alcançar, um host em lista de bloqueio ou um teto de busca.

Acrescente --json para obter um relatório legível por máquina e mantenha cada salto de rede sob seu controle apontando para a sua própria infraestrutura:

cardanowall verify 3b9f…c1a2 \
  --cardano-gateway https://your-koios-instance/api/v1 \
  --threshold 20 \
  --json

Se o registro estiver selado para você, forneça sua chave ao verificador, que vai descriptografar a carga útil e recalcular o hash do texto claro:

cardanowall verify 3b9f…c1a2 --secret-key-stdin

Prefira --secret-key-stdin, --secret-key-file ou a variável de ambiente CARDANOWALL_RECIPIENT_KEY em vez de um --secret-key direto, para que a chave nunca fique no histórico do shell.

Com o SDK TypeScript

O verificador que a CLI usa vem junto com o SDK. Ele não precisa de cliente, de URL base nem de chave — a verificação não depende de gateway algum:

import { verifyTx } from '@cardanowall/sdk-ts/verifier';

const report = await verifyTx({ txHash: '3b9f…c1a2' });

console.log(report.verdict); // 'valid' | 'pending' | 'unverifiable' | 'failed'

if (report.verdict !== 'valid') {
  console.error(report.issues, report.signatures);
}

O verifyTx retorna um VerifyReport completo: o veredito e o exitCode, o block_time e o confirmationDepth resolvidos, a lista de issues estruturais e do verificador, os resultados das verificações por item em items e em merkle, as signatures opcionais e um registro auditTrail de cada requisição de saída que ele fez — assim você mesmo pode comprovar que ele nunca entrou em contato com quem publicou.

Para verificar um registro selado para você, entregue sua chave secreta ao verificador. O chaveiro é global para a execução — toda chave que você passa é testada contra todos os itens selados, de modo que não há índice por item:

const report = await verifyTx({
  txHash: '3b9f…c1a2',
  decryption: [{ recipientSecretKey: mySecretKey }],
});

Com o SDK Python

O cardanowall-sdk é um gêmeo byte a byte do verificador em TypeScript — as mesmas verificações, o mesmo veredito:

import asyncio
import cardanowall

report = asyncio.run(cardanowall.verify_tx(cardanowall.VerifyTxInput(tx_hash="3b9f…c1a2")))
print(report.verdict)

Com o SDK Rust

O crate cardanowall traz o mesmo verificador. O verify_tx é síncrono — ele incorpora um transporte bloqueante — e retorna o mesmo VerifyReport:

use cardanowall::verifier::{verify_tx, Verdict, VerifyTxInput};

let report = verify_tx(&VerifyTxInput::new("3b9f…c1a2"));

println!("{}", report.verdict.as_str()); // "valid" | "pending" | "unverifiable" | "failed"

if report.verdict != Verdict::Valid {
    eprintln!("{:?}", report.issues);
    eprintln!("{:?}", report.record_signatures);
}

Para verificar um registro selado para você, anexe sua chave secreta. O chaveiro é global para a execução — toda chave é testada contra todos os itens selados, de modo que uma credencial não carrega índice de item. Os campos de entrada são públicos, então construa sobre VerifyTxInput::new:

use cardanowall::verifier::{verify_tx, Decryption, VerifyTxInput};

let mut input = VerifyTxInput::new("3b9f…c1a2");
input.decryption = Some(vec![Decryption::Recipient {
    recipient_secret_key: my_secret_key, // Vec<u8>
}]);

let report = verify_tx(&input);

Por que isso dispensa confiança

Cada verificação é executada a partir de dados públicos e de um explorador de sua escolha. Quem publicou o registro não tem como influenciar o resultado — e, se essas pessoas sumissem amanhã, sua verificação continuaria funcionando exatamente da mesma forma.