IOGブログ, ニュース, ...

カルダノのトランザクション検証に驚きはない:パート2

関連記事:カルダノのトランザクション検証に驚きはない

以下はIOGブログに掲載された記事「No-surprises transaction validation: part 2」を翻訳したものです。

驚きのないトランザクション検証:パート2

アロンゾのトランザクション検証は、検証作業に対する公正な報酬を確保するために、2つのフェーズで行われます。

By Polina Vinogradova 2021年9月7日

前回のブログ記事では、アロンゾ(Alonzo)台帳におけるトランザクションとスクリプトの検証の決定論的な性質について説明しました。これにより、オンチェーンのトランザクションアプリケーションとスクリプトの検証の結果は、トランザクションが送信される前にローカルで正確に予測できることが保証されます。

アロンゾ(Alonzo)台帳の決定論的な設計によって提供される保証に基づいて、私たちは特定の2段階の検証スキームを実装しました。これは、ネットワークトランザクションを検証するためにノードが使用するリソースを最小限に抑えると同時に、ユーザーの予期せぬコストを排除するように設計されています。このブログ記事では、2段階の検証がどのように機能するかを詳しく説明します。

シェリー(Shelley)、アレグラ(Allegra)、メアリー(Mary)の各時代では、トランザクションの検証は1段階のプロセスでした。有効な取引が元帳に与える影響は、それが適用される前に完全に予測できました。トランザクションが有効であれば、そのトランザクションはブロックに組み込まれ、元帳に追加される。そうでない場合は、ノードが検証に失敗して拒否し、そのトランザクションはブロックに含まれない。しかし、入力されたトランザクションを検証するノードは、そのトランザクションがブロックに含まれるかどうかにかかわらず、時間とリソースを使用しました。

アロンゾはPlutusスクリプトを導入しており、以前の時代のシンプルなスクリプトと比較して、検証のためにかなり多くのリソースを必要とする可能性があります。拒否されたトランザクションのスクリプトの検証にノードがリソースを費やすという問題に対処するため、アロンゾは2段階の検証アプローチを導入しました。この戦略により、トランザクションを元帳に適用する際の予測可能な結果が維持され、ノードの作業とリソースの使用に対する公正な報酬も確保されます。

2段階のトランザクション検証

カルダノのトランザクション検証は2つのフェーズに分かれています。2フェーズの検証を導入する主な理由は、ノードによる補償のない検証作業の量を制限することです。この目的を達成するために、各フェーズには目的があります。大まかに言うと、第1フェーズでは、トランザクションが正しく構築されているか、処理費用を支払えるかをチェックします。第2フェーズでは、トランザクションに含まれるスクリプトを実行する。トランザクションがフェーズ1で有効であれば、フェーズ2のスクリプトが実行される。フェーズ1が失敗した場合、スクリプトは実行されず、そのトランザクションは直ちに破棄されます。

このように、ノードは、たとえトランザクションがフェーズ2で有効でなくても、処理可能なトランザクションをブロックに追加することが期待されます。これは次のいずれかを意味します。

  • トランザクションが処理可能でないことを知るためにノードが少量の補償されない作業を行うが、高価なフェーズ2の検証は行われない、または
  • そのトランザクションは処理可能である。ノードはその後、スクリプトのフェーズ2検証を行い、それに応じてトランザクションにフェーズ2有効またはフェーズ2無効のタグを付け、ブロックに追加することができる。いずれの場合も、ノードは後に、このトランザクションから収集された手数料または担保によって、検証の両フェーズを補償します。

フェーズ2の失敗は稀であることが期待されている。なぜなら、失敗したスクリプトでトランザクションを提出したユーザーは、何も得られないままADAを失うことになるからである。これは局所的に予測可能であり、したがって予防可能な事象である。フェーズは、スクリプトの潜在的にリソース集約的な計算に対する補償を保証するために必要なセーフガードです。

各フェーズの具体的な内容を詳しく見ていきましょう。

第1フェーズ

検証の第1フェーズは単純でなければなりません。このフェーズが失敗した場合、ノードは処理できないトランザクションから処理手数料を受け取ることができないため、ノードが行った作業の補償を受けることができません。

フェーズ1の検証では、トランザクションが正しく構築されているか、それを元帳に追加することが可能か、という2つの点を検証する。この検証には、以下のチェックといくつかの追加チェックが含まれる。

  • 正しい金額の手数料を支払い、正しい金額の担保を提供していること(例:後述するスクリプトの失敗時に回収されるADA)。
  • Plutusスクリプトの実行に必要なすべてのデータが含まれていること
  • プロトコルのパラメータで設定された境界(出力サイズなど)を超えていない。
  • 入力が元帳上に存在するUTXOを参照している。
  • 提示された取引の計算予算が、取引ごとの最大リソース制限を超えていないこと 完全性ハッシュチェックなど

受信したトランザクションをメモリプールに(そして最終的にはブロックに)追加する前に、ノードはすべてのフェーズ1の検証チェックを実行しなければならない。これらのチェックのいずれかが失敗した場合、そのトランザクションはブロックに組み込まれることなく拒否され、手数料は請求されない。過去の時代には、これが唯一の検証フェーズであり、Cardanoはすべての検証失敗をこの方法で処理していた。

危害を加えられていない誠実なノードは、意図的に処理不能なトランザクションを生成することは期待できません。ノードは、フェーズ1の無効なトランザクションを悪意を持って広める行為を行った場合、接続を切断することもできます。

フェーズ2

第2段階の検証では、Plutusスクリプトが実行されますが、これは計算量が多くなる可能性があります。そのため、第2フェーズで成功または失敗した場合には、手数料が発生します。回収されたADAは料金ポットに入り、検証プロセスで使用されたリソースがノードに補償されることになる。

フェーズ1の検証が成功しても、トランザクションのすべてのアクションが処理可能であることは保証されず、担保の回収が可能であることのみが保証される。フェーズ2ではPlutusスクリプトの検証が行われ、検証の結果に基づいて、完全処理を行うか、担保の回収のみを行うかが決定される。

トランザクションを完全に適用する(Alonzo以前の唯一の可能性) – Plutusスクリプトがトランザクションのすべてのアクションを検証する場合、または
Plutusスクリプトの1つが失敗した場合は、担保のADAを回収し、残りの取引を無視する。
スクリプトの検証は局所的に予測可能な結果を持ち、終了することが保証されていることを思い出してください。ユーザーはスクリプトの検証結果をローカルに確認することができ、与えられたトランザクションとその中のスクリプトをどのように処理するかについて、誠実なノード間で意見の相違が生じることはありません。

担保

スクリプトが検証されない場合でも、ノードの作業を補償する必要があります。しかし、トランザクションの入力データからお金を取ることはできません。なぜなら、入力データはスクリプトでロックされている可能性があるからです。そこでAlonzoは、このための特別な規定を導入しました。トランザクションの担保は、フェーズ2のスクリプト検証が失敗した場合に手数料として徴収されるADAの量です。処理可能なトランザクションでは、この金額はプロトコルパラメータで指定されたトランザクション手数料の一定割合以上でなければなりません。

この金額は、トランザクションを構築する際に指定されます。直接ではなく、取引に担保の入力を加えることである。これらの特別にマークされた入力に対応するUTXOの残高の合計が、取引の担保金額である。これらのUTXOは、公開鍵(スクリプトではなく)のアドレスを持ち、ADA以外のトークンを含んではならない。

担保の入力は、いずれかのスクリプトがフェーズ2の検証に失敗した場合にのみ、台帳のUTXOから削除される。すべてのスクリプトが合格した場合、以前の時代と同様に、指定された取引手数料額が徴収される。特に、この金額は通常の非担保入力から発生し、担保入力は単に無視されます。そして、朗報です。UTXOから削除されるのはどちらか一方だけなので、同じ入力を担保と通常の両方に使用することができる。

担保入力の使用を検証するために必要な署名は、取引の完全性を維持する上でも重要な役割を果たします。これは、敵対者がトランザクションの内容を変更して、処理可能でありながらフェーズ2の検証に失敗することを防ぐためである。この例としては、敵対者が換金者を置き換えることが挙げられる。このような変更を行うには、担保鍵所有者の署名が必要です。担保鍵所有者は、スクリプトの検証が失敗した場合に ada を失うことになる唯一のユーザでもある。

スクリプトの評価は決定論的であるため、担保鍵保有者は、取引がオンチェーンでフェーズ2の検証を通過するかどうかを、署名する前にローカルで確認することができる。もし合格していれば、オンチェーンでも合格していることが確認でき、担保を失うことはありません。善意で行動するユーザーは、担保を失うことはありません。また、同じ担保入力を複数の取引に再利用することができ、担保が回収されないことを保証することにもなります。

Alonzoの公開テストネットを開始した今、すべてのユーザーと開発者がPlutusスクリプトを構築・実行して評価することを歓迎します。Alonzoテストネット専用のリポジトリで詳細情報を確認したり、PlutusやAlonzoに関するトピックを多様なコミュニティで議論することができます。

お問い合わせ

Contact Us
SIPOのステーキングサービス、Cardano ADA、ADAの購入方法から保管方法についてご興味、ご質問がある方はこちらのフォームからお問い合わせください。24時間以内にメールにてご返信いたします。