覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Ethereum - トランザクションの実行の流れ

ビットコインのトランザクションはTXOモデルとなっています。
しかし、Ethereum(イーサリアム)ではアカウント情報を保存しているState Tree の中に残高情報を保持しているためトランザクションの実行フローが異なっています。


トランザクションが満たす必要がある条件

トランザクションは以下項目を満たす必要があります。

  • RLPフォーマット(入れ子構造のバイナリデータの符号化用データフォーマット)に従う形式で追加の後続バイトが存在しないこと。
  • 署名が有効であること。
  • nonce が有効であること。(Sate Treeのアカウントが保持するnonce と照合して有効であるかを確認する)
  • トランザクションに事前に定められたGas量 + 送信するデータを送信するのに必要となるGas量 よりも、Gas Limit が大きく設定されていること。
    コントラクト生成のトランザクションの場合は、さらに追加で 32,000 gas が必要となる。
  • 送信者アカウントの残高が上述のGas を上回っていること。

上記項目を満たす場合、トランザクションは次の処理に移り、サブ状態のSubstate を作成します。
Substate は以下の情報から構成される。

  • Self-Destruct Set
    • トランザクション完了後に破棄されるアカウント情報がある場合、ここに格納される。
  • Log Series
    • トランザクションがどこまで実行されたかを保持するチェックポイント。
      フロントエンドなどからトランザクションの実行状態を確認する場合に、この情報が必要となります。
  • Refund Balance
    • トランザクション完了後にアカウントに戻される金額。
      State Tree にデータを書き込むためにはGasが必要だが、逆にState Treeからデータを削除する場合、State Treeを小さくすることになり、
      State Tree を削減した報酬として金額が返ってくる仕組みとなっている。
      トランザクション実行の進捗状況に従って、状態データを削除していくと、本項目の値が増加する。
      実際には、トランザクション実行のコストと相殺されたあとに返却される。


トランザクションの実行

通常の送金やコントラクトを実行する "メッセージコールトランザクション" と コントラクトを生成する "コントラクト生成トランザクション" があり、
各々のトランザクションの実行ステップは以下のようになっています。


メッセージコールトランザクション

メッセージコールトランザクションの実行ステップは以下の通りです。

  1. State Tree にあるトランザクション送信者のnonceが1インクリメントされる
  2. トランザクションを実行するため、必要なGasがアカウントの残高から差し引かれる
  3. トランザクション実行後、残っているGasとRefund Balanceに記載されているGasから返金される金額を計算して返金する
    これによりトランザクションの状態が確定する
  4. Gasの返金受け取り後に、ブロックにトランザクションを取り込んだマイナー、もしくはブロック生成ノードに使用したGas分のETHが送られる
  5. Self-Destruct Set にアカウント情報が含まれていた場合、削除する
  6. トランザクションに使用したGas量とログを記録する


コントラクト生成トランザクション

コントラクト生成トランザクションの実行ステップは以下の通りです。
(メッセージコールトランザクションとは異なり、コントラクト生成トランザクションを生成したアカウントやEVMコードからサブ状態を作成し、その後に下記ステップでコントラクトアカウントを生成する。)

  1. トランザクションを発行したアカウントとnonceからコントラクトのアドレスを作成する
  2. nonceに0を指定する
  3. コントラクトアカウントにトランザクションに送金したEtherの金額を設定する
  4. アカウントのStorageを空に設定する
  5. codeHashに空の文字列ハッシュを設定する
  6. 初期化コードを実行してアカウントを作成する。
    初期化コードの実行はGasを消費する。Gasが不足した場合トランザクションは無かったものとなる
    Revert Codeでエラーが出力された場合、その時点で残っているGasが戻り、ステップ3で設定したEtherが戻る
  7. 初期化コードの実行に成功した場合、コントラクトのデータサイズに応じてGasが支払われ、余ったGasはトランザクションの送信者に戻る



関連エントリ・書籍

ブロックチェーンアプリケーション開発の教科書

ブロックチェーンアプリケーション開発の教科書