教育目的の参考情報であり、投資助言ではありません。投資により損失が生じる可能性があります。
直接の答え
アカウントベースモデルは、実行状態をアドレスをキーとするデータとして表します。Ethereumの実行レイヤーでは、アカウントのリーフに [nonce, balance, storageRoot, codeHash] が格納されます。ネイティブの balance はwei建てで、コントラクトデータはそのアカウントの storageRoot の先にあり、ブロック実行後の stateRoot が結果として得られたワールドステートにコミットします。ウォレット、RPCプロバイダー、エクスプローラーはこの状態を読み取って解釈しますが、利用者に代わって正規の残高を保管するわけではありません。
ERC-20残高、アローワンス、貸借債務、担保は通常、保有者のプロトコルアカウントに追加されたフィールドではなく、コントラクトストレージ内の値です。同様に、エクスプローラーの「内部トランザクション」は通常、EVMメッセージコールをトレースから再構成したもので、独自のトランザクションハッシュと送信者nonceを持つ、別途署名されたEthereumトランザクションではありません。
従来の外部所有アカウント(EOA)とコントラクトアカウントの区別は今も有用ですが、EIP-7702を有効化したチェーンでは「EOAのコードは常に空」という前提は絶対ではありません。EOAは委任インジケーター 0xef0100 || address を持ち、EOAとしてトランザクションを発行する権限を維持しながら、委任先のコードを実行できます。したがって、分類には古いUIラベルではなく、チェーンルールと実際のアカウントコードを用います。
状態遷移を監査する7ステップ
- 観測条件を固定します。ネットワーク、
chainId、フォーク規則、ブロック番号とハッシュ、タイムスタンプ、さらにpending、latest、safe、finalizedなどのブロックタグを記録します。チェーン先端付近の状態はリオーグで変わり得るため、異なるブロックの事実を無表示で混在させてはいけません。 - プロトコル上のアカウントフィールド、すなわち
nonce、ネイティブbalance、storageRoot、codeHashを読み取ります。コードがEIP-7702委任インジケーターなら、そのフォークの規則に従って委任先を解決します。プロキシや委任済みアカウントでは、実装コード、アップグレード管理、ストレージレイアウトも別々に特定します。 - アプリケーション残高の所在を確認します。ETHはネイティブ残高を変えますが、ERC-20残高は通常、トークンコントラクトのストレージにあるマッピングを変えます。アローワンス、債務、担保、報酬が別のコントラクトやスロットにある場合もあります。トークンの小数桁とログは解釈を助けますが、追加のアカウントリーフフィールドではありません。
- トップレベル・トランザクションの種別、チェーンドメイン、署名、送信者nonce、宛先または作成、value、入力、Gas上限、手数料上限、任意のアクセスリストまたはEIP-7702認可をデコードして事前確認します。送信者はvalueと最大手数料負担を賄う必要があります。拒否されたトランザクションはブロックに含まれず、オンチェーンGasも消費しません。
- 直前の状態から、ブロック内の順序どおりにトランザクションを実行します。EVMはネストしたメッセージコールとコントラクト作成フレームを処理し、各フレームは呼出元、呼出先、value、calldata、Gas、戻り状態を持ちます。共有された読み書きにより、結果は順序に依存します。EIP-2930アクセスリストは指定したアカウントとスロットをウォーム化してGas計算を変えますが、未宣言アクセスを禁止せず、安全な並列実行を証明するものでもありません。
- コミットとロールバックの境界を適用します。成功したフレームの状態とログは、後で親がリバートしない限りコミットされます。
REVERTは失敗フレームの書き込み、value移転、ログをロールバックし、未使用Gasを返します。外側のコントラクトは子呼び出しの失敗を捕捉して成功を続けることができます。ブロックに含まれたトップレベル失敗のレシートはstatus = 0ですが、送信者のトランザクションnonceは増え、消費Gasも支払われます。EIP-7702の認可処理には、後続実行がリバートしても適用される独自の永続化規則があります。 - 実行後の状態を照合します。ネイティブおよびトークン残高差、ストレージ変更、レシート状態、Gas使用量、実効Gas価格、ログ、プロバイダーのトレースを、ブロックがコミットしたルートと突き合わせます。トレースはプロバイダーが再構成したもので、別個のコンセンサストランザクションではありません。必要なファイナリティを待った後、置換、リオーグ、インデクサー修正、ブリッジ、ロールアップ、会計上の戻入を明示的に処理します。
4つの計算例
- EIP-1559のETH送金。 Aの開始残高は
5 ETH、nonceは12、Bの開始残高は1 ETHです。Aは1 ETHを送り、21,000 gas、ベースフィー20 gwei、優先手数料上限3 gwei、最大手数料40 gweiを指定します。実効Gas価格はmin(40, 20 + 3) = 23 gwei、総手数料は21,000 × 23 gwei = 0.000483 ETHで、このうち0.000420 ETHがベースフィーとしてバーンされ、0.000063 ETHが優先手数料です。署名時点の最大必要額は1 ETH + 21,000 × 40 gwei = 1.000840 ETHです。最終残高はAが3.999517 ETH、Bが2 ETH、Aのnonceは13です。 - ブロックに含まれたリバート取引。 Aの開始残高は
2 ETH、nonceは7です。Aが0.50 ETHを伴ってコントラクトを呼び出し、トップレベル実行が80,000 gas消費後にリバートしたとします。実効Gas価格は25 gweiなので、手数料は80,000 × 25 gwei = 0.002000 ETHです。コントラクトストレージの書き込み、ログ、0.50 ETHの移転はロールバックしますが、Aの最終残高は1.998000 ETH、nonceは8、レシートはstatus = 0です。子呼び出しの失敗を捕捉した場合は、外側のレシートがstatus = 1になることもあります。 - トークン残高はコントラクトストレージ。 トークンコントラクトにAliceが
1,000 units、Bobが200 unitsと記録されています。250 unitsの送付に成功すると、Aliceは750 units、Bobは450 unitsとなり、合計1,200 unitsは変わりません。Aliceのトップレベル取引が60,000 gas × 20 gwei = 0.001200 ETHを使ったなら、ネイティブETH残高は別途その手数料分減少します。トークンアカウントのstorageRootとグローバルなstateRootは変わりますが、トークン元本がAliceのネイティブアカウント残高になることはありません。 - EIP-7702の永続化境界。 スポンサーが、nonce
5のアカウントAから実装Dへの認可を含むset-codeトランザクションを提出します。プロトコルは23-byteのインジケーター0xef0100 || 20-byte addressを書き込み、Aの認可nonceを6に増やします。その外側のトランザクションで後続実行がリバートしても、処理済み委任インジケーターと認可nonceは残ります。これは、失敗した呼び出しが通常のEVMストレージへ行った書き込みのロールバック境界とは異なります。
リスクと管理策
- 誤ったチェーン、フォーク、ブロックハッシュ、ブロックタグを読むと、内部的に不整合な状態スナップショットになります。
- 古い、または信頼できないRPCはチェーン先端状態を欠落、遅延、誤報する可能性があります。
- pending nonceの競合、欠番、置換により、待機中取引の前提が無効になる可能性があります。
- ウォレットの「キャンセル」は通常、プロトコル上の削除ではなく置換トランザクションです。
- valueと最大手数料を賄う残高がなければ、トランザクションは含まれません。
- ベースフィーの変動や手数料上限の誤りは、取り込みを遅らせたり費用を変えたりします。
- EIP-7702コードにより、古いアカウント判定法がEOAを誤分類する可能性があります。
- 悪意ある委任先、初期化不備、認可リプレイがEIP-7702アカウントを侵害する可能性があります。
- プロキシのアップグレードとデリゲートコールにより、コードとストレージの解釈が時間とともに変わる場合があります。
- 鍵、署名ドメイン、チェーンIDの誤りは盗難やリプレイを認可し得ます。
- リエントランシーと共有状態の順序により、一回の実行中に残高が変わり得ます。
- 子呼び出しの失敗を捕捉し、外側のトランザクションが成功と表示される場合があります。
- トップレベルのリバートやGas枯渇でも、Gasを消費して送信者nonceが増えます。
- 小数桁、送金手数料、リベース、フックのあるトークンでは、単純な残高計算が成立しない場合があります。
- ウォレット残高だけの照合では、アローワンス、債務、担保、報酬を見落とします。
- ログは欠落、リバート、誤解を招く表示があり得て、最終状態を証明するには不十分な場合があります。
- エクスプローラーの「内部トランザクション」とプロバイダーのトレースは、再構成方法により異なる場合があります。
- アクセスリストは不完全、重複、非経済的になり得て、読み書きセットをロックしません。
- 共有状態の順序、優先手数料、MEVが実行結果を変える可能性があります。
- リオーグ、プルーニング、証明の利用不能、L2システム遷移、ブリッジのファイナリティが会計を反転または不明瞭にする可能性があります。
よくある誤解
- 「ウォレットがオンチェーン残高を保存する。」ウォレットは認証情報を保持し、ネットワークから取得した状態を表示します。
- 「すべてのアドレスは、コードのないEOAか通常のコントラクトのどちらかに永久に属する。」EIP-7702委任により、このコード判定法は変わります。
- 「表示される送金はすべて別個のEthereumトランザクションである。」トークンイベントと内部メッセージコールのトレースは、トップレベルの署名済み取引ではありません。
- 「失敗した取引は何も変えず、費用もかからない。」ブロックに含まれた失敗はGasを消費し、送信者nonceを進める場合があります。
- 「アカウントモデルやアクセスリストはUTXOより高速な並列実行を保証する。」性能と競合はプロトコル全体とワークロードに依存します。