ガイド

ガイド · 全6部中 第3部

レコードを検証する

検証は、Label 309 のうちだれの許可も必要としない側面です。Cardano のトランザクション参照さえあれば、自分で選んだエクスプローラーを通して、公開されたチェーンに対してレコードを自ら検証できます。ログインは要らず、結果はそれを発行した相手にまったく左右されません。

CLI から

cardanowall バイナリをインストールし、トランザクションを指定します。

cardanowall verify 3b9f…c1a2

公開された Cardano エクスプローラーを通じてトランザクションを解決し、レコードを構造的に検証し、著作者性の署名があればそれを確認し、レコードが確定済みであることを確かめたうえで判定を出力します。判定は 4 つの状態のいずれかであり、終了コードがそれをそのまま反映するため、CI にそのまま組み込めます。

終了コード判定意味
0valid必須のチェックがすべて合格
1failedレコードに起因するチェックが不合格(整合性、構造、または署名)
2unverifiableレコードに不備はないが、必須のチェックを実行できなかった(ネットワークまたはポリシー)
3pendingまだ確認数が足りない — 保留中のレコードから得られる結果は確定ではない
4CLI の入力エラー(不正な引数、または必須入力の欠落)

failedunverifiable を分けているのは意図的です。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 フラグをそのまま使うのではなく、--secret-key-stdin--secret-key-file、または環境変数 CARDANOWALL_RECIPIENT_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_timeconfirmationDepth、構造と検証者による issues のリスト、アイテムごとの itemsmerkle のチェック結果、任意の 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);

信頼が不要な理由

すべてのチェックは、公開されたデータと自分で選んだエクスプローラーだけで実行されます。レコードを発行した人物が結果を左右することはできません。仮にその発行者が明日いなくなったとしても、検証はまったく同じように機能します。