Libra Developersサイトの要約:Life of a Transaction (2)

Libra
スポンサーリンク

Admission Control

アドミッションコントロールは、バリデータの唯一の外部インターフェースです。クライアントのバリデータへのリクエストはまずACに届きます。

Client → AC (AC.1)

バリデータVXのアドミッションコントールにクライアントがトランザクションを送る。これは「AC::SbumitTransaction()」によって行われます。

AC → VM (AC.2)

ACはバリデータのVMにアクセスし、不正なトランザクションを早期に拒否するため、トランザクションの前チェックを行う。これは「VM::ValidateTransaction()」によって行われます。

AC → Mempool (AC.3)

「VM::ValidateTransaction() 」がエラーなくリターンしたら、AC は、「Mempool::AddTransactionWithValidation()」を介してトランザクションをバリデータVXのmempoolに転送します。バリデータVXのmempoolは、TNのシーケンス番号がSenderアカウントの現在のシーケンス番号以上だった場合に、ACからのトランザクションTNを受け付けます。
(次のシーケンス番号になるまで、このトランザクションはコンセンサスに渡されないことに注意してください???)。

AC → Storage (AC.4)

クライアントがブロックチェーン上で読み取りクエリを実行した場合(例えば、アリスのアカウントの残高を取得する)、ACは、要求された情報を取得するためストレージコンポーネントとダイレクトにやり取りします。

Admission Control README

実装についての詳細はAdrmission ControlのReadMeを参照

Virtual Machine(VM)

AC → VM (VM.1)

バリデータVxのACがクライアントからトランザクションを受けたとき、ACはトランザクション検証のため、VM上で「VM::ValidateTransaction()」を呼び出します。

VM → Storage (VM.2)

ACまたはmempoolが「VM::ValidateTransaction()」を通してVMにトランザクションの検証をリクエストすると、VMはストレージからトランザクションセンダーのアカウントをロードして次の検証手続きを実施します。

  • サインされたトランザクションの署名が正しいかどうかをチェックする(不正な署名付きトランザクションを弾くため)。
  • 送信者のアカウント認証鍵が公開鍵(トランザクションの署名に使用された秘密鍵に対応する)のハッシュと同じかどうかをチェック。
  • トランザクションのシーケンス番号が、送信者のアカウントの現在のシーケンス番号よりも小さくないことを検証します。このチェックによって、送信者のアカウントに向けて同じトランザクションがリプレイされるのを防げます。
  • 不正なプログラムはVMで実行できないため、サインされたトランザクションのプログラムが不正なプログラムでないことを確認します。
  • 送信者のアカウントに、トランザクションで指定された最大ガス量を支払うのにに十分なバランスがあることを確認します。これは、トランザクションが使ったリソースの支払いができることを担保します。

Execution → VM (VM.3)

実行コンポーネントは「VM::ExecuteTransaction()」を通して、トランザクションを実行するためにVMを利用します。

トランザクションの実行は、レッジャーの状態を更新し結果をストレージに永続化することと異なるということを理解するのは重要です。
トランザクションTNは、コンセンサス中にブロックの合意に達するための試みの一部として最初に実行されます。トランザクションの順序とその実行結果について他のバリデータとの間で合意が得られた場合、 結果はストレージに保存され、元帳の状態が更新されます。トランザクションTnは、コンセンサスの中で、ブロックが合意にいたる過程の一部として最初に実行されます。トランザクションの順序とその実行結果について、他のバリデータとの間で合意に到ったら、結果はストレージに永続化され、レッジャーの状態が更新されます。

Mempool → VM (VM.4)

mempoolが共有mempoolを通して他のバリデータからトランザクションを受け取った場合、mempoolはトランザクションを検証するためVM上で「VM::ValidateTransaction()」を呼び出します。

VM README

実装の詳細についてはVirtual machine READMEを参照のこと。

Mempool

Mempoolは実行待ちのトランザクションを保有する共有バッファです。新しいトランザクションがMempoolに加えられると、そのmempoolはこのトランザクションをシステム内の他のバリデータに共有します。共有mempoolによるネットワーク消費を減らすため、それぞれのバリデータは他のバリデータに自分独自のトランザクションを配布しなければなりません。バリデータが他のバリデータのmempoolからのトランザクションを受け取ると、そのトランザクションを自分のmempoolに追加します。

AC → Mempool (MP.1)

  • 初期検証をした後、バリデータのACはトランザクションをmempoolに送ります。
  • バリデータVX用のmempoolは、トランザクションTNのシーケンス番号が送信者のアカウントの現在のシーケンス番号以上である場合に、送信者のアカウントにトランザクションTNを受け入れます。

Mempool → Other Validators (MP.2)

  • バリデータVXのmempoolはトランザクションTNを同じネットワークの他のバリデータにシェアします。
  • 他のバリデータは、自身のmemopoolのトランザクションをVXのmempoolと共有します。

Consensus → Mempool (MP.3)

  • バリデータVXがリーダーの場合、そのコンセンサスは自分のmempoolからトランザクションのブロックを取り出し、他のバリデータにそれを複製します。これによってブロック内のトランザクションの順序や実行結果のコンセンサス に至らせます。
  • トランザクションTNがコンセンサスブロックに含まれていたからといって、そのことが、TNが最終的にブロックチェーンの分散データベースに永続化されることを保証するものではないことに注意してください。

Mempool → VM (MP.4)

mempoolが他のバリデータからのトランザクションを受け取ると、mempoolはトランザクションを検証するためにVMで「VM::ValidateTransaction()」を呼び出します。

Mempool README

Mempoolの実装の詳細についてはMempool READMEを参照のこと。


Life of a Transaction · Libra
_**Note to readers:** This information was published before the Association released White Paper v2.0, which includes a number of key updates to the Libra payme...
タイトルとURLをコピーしました