Руководства

Руководства · Часть 3 из 6

Проверка записи

Проверка — та сторона Label 309, для которой не нужно ни у кого спрашивать разрешения. Имея ссылку на транзакцию Cardano, вы можете подтвердить запись сами: по публичному блокчейну, через обозреватель, который выберете вы. Никакого входа в систему, и результат никак не зависит от того, кто опубликовал запись.

Через CLI

Установите бинарник cardanowall и укажите ему транзакцию:

cardanowall verify 3b9f…c1a2

Он находит транзакцию через публичный обозреватель блокчейна Cardano, выполняет структурную валидацию записи, проверяет подписи авторства, если они есть, убеждается, что запись учтена в блокчейне, и выводит вердикт. Вердикт принимает одно из четырёх состояний, а код завершения несёт его дословно — так что проверка без переделок встраивается в CI:

Код завершенияВердиктЗначение
0validвсе требуемые проверки пройдены
1failedотносимая к записи проверка не прошла (целостность, структура или подпись)
2unverifiableвины записи нет, но требуемую проверку не удалось выполнить (сеть или политика)
3pendingпока недостаточно подтверждений — результат записи pending не окончателен
4ошибка ввода CLI (неверные аргументы или отсутствие требуемого входа)

Разделение между failed и unverifiable намеренно: вердикт failed всегда относим к самой записи, так что ни один недобросовестный обозреватель не может его сфабриковать; unverifiable означает, что верификатор не смог завершить проверку по причинам вне записи — недостижимый шлюз, хост из списка запрета или достигнутый предел выгрузки.

Добавьте --json для машиночитаемого отчёта и держите каждый сетевой переход под своим контролем, направив проверку на собственную инфраструктуру:

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

Если запись запечатана для вас, передайте верификатору свой ключ — он расшифрует полезную нагрузку и заново вычислит хеш открытого текста:

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

Предпочитайте --secret-key-stdin, --secret-key-file или переменную окружения CARDANOWALL_RECIPIENT_KEY голому флагу --secret-key, чтобы ключ не осел в истории оболочки.

Через TypeScript SDK

Верификатор, которым пользуется CLI, входит в состав SDK. Ему не нужны ни клиент, ни базовый URL, ни ключ — проверка не привязана к конкретному шлюзу:

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 возвращает полный отчёт VerifyReport: вердикт и exitCode, разрешённые block_time и confirmationDepth, список структурно-верификаторных проблем issues, результаты поэлементных проверок items и merkle, необязательное поле signatures и журнал auditTrail с каждым исходящим запросом — так вы сами можете убедиться, что верификатор ни разу не обращался к издателю.

Чтобы проверить запись, запечатанную для вас, передайте верификатору свой закрытый ключ. Связка ключей глобальна для запуска — каждый переданный ключ пробуется против каждого запечатанного элемента, поэтому индекса по элементам нет:

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

Через Python SDK

cardanowall-sdk — побайтный близнец TypeScript-верификатора: те же проверки, тот же вердикт:

import asyncio
import cardanowall

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

Через Rust SDK

Крейт cardanowall несёт тот же верификатор. verify_tx синхронен — внутри у него блокирующий транспорт — и возвращает тот же отчёт 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);
}

Чтобы проверить запись, запечатанную для вас, приложите свой закрытый ключ. Связка ключей глобальна для запуска — каждый ключ пробуется против каждого запечатанного элемента, так что у учётных данных нет индекса по элементам. Поля входной структуры публичны, поэтому стройте поверх 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);

Почему здесь не нужно никому доверять

Каждая проверка опирается на публичные данные и обозреватель, который выбираете вы. Те, кто опубликовал запись, не могут повлиять на результат — и если завтра они исчезнут, ваша проверка отработает ровно так же.