Guide

Guide · Parte 3 di 6

Verificare un record

La verifica è la metà di Label 309 che non chiede il permesso a nessuno. Con il riferimento a una transazione Cardano, puoi confermare un record da solo, a partire dalla chain pubblica e tramite un explorer che scegli tu. Non c'è alcun login, e nulla del risultato dipende da chi ha pubblicato il record.

Con la CLI

Installa il binario cardanowall, poi puntalo a una transazione:

cardanowall verify 3b9f…c1a2

Risolve la transazione tramite un explorer Cardano pubblico, esegue la validazione strutturale del record, controlla eventuali firme di paternità, conferma che il record sia definitivamente registrato e stampa un verdetto. Il verdetto è uno di quattro stati, e il codice di uscita lo trasporta tale e quale, così si inserisce direttamente in un job di CI:

Codice di uscitaVerdettoSignificato
0validogni controllo richiesto è stato superato
1failedun controllo attribuibile al record è fallito (integrità, struttura o firma)
2unverifiablenessuna colpa del record, ma un controllo richiesto non ha potuto eseguirsi (rete o policy)
3pendingconferme ancora insufficienti: da un record in attesa nessun esito è definitivo
4errore di input della CLI (argomenti errati o input richiesto mancante)

La distinzione tra failed e unverifiable è deliberata: un verdetto failed è sempre attribuibile al record stesso, perciò nessun explorer malevolo può fabbricarne uno; unverifiable significa che il verificatore non ha potuto completare un controllo per ragioni esterne al record — un gateway irraggiungibile, un host in lista di blocco o un tetto al recupero dei byte.

Aggiungi --json per un report leggibile da una macchina, e tieni ogni passaggio di rete sotto il tuo controllo puntando alla tua infrastruttura:

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

Se il record è sigillato a te, consegna la tua chiave al verificatore: decifrerà il payload e ricalcolerà l'hash del testo in chiaro:

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

Preferisci --secret-key-stdin, --secret-key-file o la variabile d'ambiente CARDANOWALL_RECIPIENT_KEY rispetto al flag --secret-key nudo, così la chiave non finisce mai nella cronologia della shell.

Con l'SDK TypeScript

Il verificatore usato dalla CLI è incluso nell'SDK. Non serve alcun client, nessun base URL e nessuna chiave: la verifica è indipendente dal gateway:

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);
}

verifyTx restituisce un VerifyReport completo: il verdetto e exitCode, il block_time (l'orario del blocco) e la confirmationDepth risolti, l'elenco issues dei problemi strutturali e del verificatore, i risultati dei controlli per items e merkle, le signatures opzionali e un log auditTrail di ogni richiesta in uscita effettuata, così puoi dimostrare a te stesso che non ha mai contattato chi ha pubblicato il record.

Per verificare un record sigillato a te, consegna al verificatore la tua chiave privata. Il portachiavi è globale all'esecuzione: ogni chiave che passi viene provata contro ogni elemento sigillato, perciò non c'è alcun indice per elemento:

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

Con l'SDK Python

cardanowall-sdk è un gemello byte per byte del verificatore TypeScript: stessi controlli, stesso verdetto:

import asyncio
import cardanowall

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

Con l'SDK Rust

Il crate cardanowall include lo stesso verificatore. verify_tx è sincrono (incorpora un trasporto bloccante) e restituisce lo stesso 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);
}

Per verificare un record sigillato a te, allega la tua chiave privata. Il portachiavi è globale all'esecuzione: ogni chiave viene provata contro ogni elemento sigillato, perciò una credenziale non porta alcun indice di elemento. I campi di input sono pubblici, quindi costruisci sopra 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);

Perché non serve fidarsi di nessuno

Ogni controllo si basa su dati pubblici e su un explorer che scegli tu. Chi ha pubblicato il record non può influenzare l'esito, e se domani sparisse, la tua verifica continuerebbe a funzionare esattamente allo stesso modo.