Руководства · Часть 3 из 6
Проверка записи
Проверка — та сторона Label 309, для которой не нужно ни у кого спрашивать разрешения. Имея ссылку на транзакцию Cardano, вы можете подтвердить запись сами: по публичному блокчейну, через обозреватель, который выберете вы. Никакого входа в систему, и результат никак не зависит от того, кто опубликовал запись.
Через CLI
Установите бинарник cardanowall и укажите ему транзакцию:
cardanowall verify 3b9f…c1a2Он находит транзакцию через публичный обозреватель блокчейна Cardano, выполняет структурную валидацию записи, проверяет подписи авторства, если они есть, убеждается, что запись учтена в блокчейне, и выводит вердикт. Вердикт принимает одно из четырёх состояний, а код завершения несёт его дословно — так что проверка без переделок встраивается в CI:
| Код завершения | Вердикт | Значение |
|---|---|---|
0 | valid | все требуемые проверки пройдены |
1 | failed | относимая к записи проверка не прошла (целостность, структура или подпись) |
2 | unverifiable | вины записи нет, но требуемую проверку не удалось выполнить (сеть или политика) |
3 | pending | пока недостаточно подтверждений — результат записи 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);Почему здесь не нужно никому доверять
Каждая проверка опирается на публичные данные и обозреватель, который выбираете вы. Те, кто опубликовал запись, не могут повлиять на результат — и если завтра они исчезнут, ваша проверка отработает ровно так же.