﻿---
title: "帳戶式狀態模型"
description: "透過帳戶欄位、狀態根與儲存根、有序交易執行、Gas 與回復、代幣儲存、EIP-7702 委派、存取清單、執行追蹤和最終性，理解以太坊的帳戶模型。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 帳戶式狀態模型

> 僅供教育參考，不構成投資建議；投資可能產生損失。

<a id="answer"></a>

## 直接答案

帳戶式模型將執行狀態表示為以位址為鍵的資料。在以太坊執行層中，帳戶葉節點包含 `[nonce, balance, storageRoot, codeHash]`。原生 `balance` 以 wei 計價；合約資料位於該帳戶 `storageRoot` 所指向的儲存空間；區塊執行後的 `stateRoot` 則承諾最終形成的世界狀態。錢包、RPC 服務商或區塊瀏覽器只負責讀取並解讀這些狀態，並不代替使用者保存規範帳本上的餘額。

ERC-20 餘額、授權額度、借貸債務與擔保品通常是合約儲存中的值，不是持有人協定帳戶上的額外欄位。同樣地，瀏覽器所稱的「內部交易」通常是透過執行追蹤還原的 EVM 訊息呼叫，並不是擁有獨立交易雜湊與傳送方 nonce 的另行簽章以太坊交易。

傳統的外部擁有帳戶（EOA）與合約帳戶之分仍然有用，但在啟用 EIP-7702 的鏈上，「EOA 一定沒有程式碼」已不再絕對。EOA 可以帶有委派指示符 `0xef0100 || address`，在保留 EOA 交易發起權限的同時執行受委派程式碼。因此，分類應依據鏈規則與實際帳戶程式碼，而不是沿用舊的介面標籤。

<a id="mechanism"></a>

## 七步狀態轉換查核

1. 固定觀察口徑：網路、`chainId`、分叉規則、區塊號碼與區塊雜湊、時間戳記，以及 `pending`、`latest`、`safe` 或 `finalized` 等區塊標籤。鏈頭附近的狀態可能因重組而改變；不同區塊的事實不得在未標示的情況下合併。
2. 讀取協定帳戶欄位：`nonce`、原生 `balance`、`storageRoot` 與 `codeHash`。如果程式碼是 EIP-7702 委派指示符，應依該分叉規則解析受委派位址。對於代理與委派帳戶，還要分別識別實作程式碼、升級控制與儲存配置。
3. 定位應用程式餘額。ETH 會改變原生餘額；ERC-20 餘額通常改變代幣合約儲存中的映射；授權額度、債務、擔保品與獎勵可能位於其他合約及儲存槽。代幣小數位數與日誌有助於解讀，但不是額外的帳戶葉欄位。
4. 解碼並預先檢查頂層交易：交易類型、鏈網域、簽章、傳送方 nonce、接收方或合約建立、轉移價值、輸入資料、Gas 上限、費用上限，以及選用的存取清單或 EIP-7702 授權。傳送方必須能支付轉移價值與最高費用承諾。遭拒絕的交易不會納入區塊，也不會耗用鏈上 Gas。
5. 從前一狀態開始，依區塊順序執行交易。EVM 處理巢狀訊息呼叫與合約建立框架，每個框架各有呼叫方、被呼叫方、價值、calldata、Gas 與回傳狀態。共享讀寫使結果取決於執行順序。EIP-2930 存取清單會預熱列明的帳戶與儲存槽並改變 Gas 核算，但既不禁止未宣告存取，也不能證明可以安全平行執行。
6. 套用提交與回復邊界。成功框架會提交其狀態與日誌，除非父框架之後回復。`REVERT` 會回復失敗框架的寫入、價值轉移與日誌，同時退還未使用 Gas；外層合約可以擷取子呼叫失敗後繼續成功。已納入區塊的頂層失敗，其收據為 `status = 0`，但傳送方交易 nonce 仍會增加，且須支付已耗用 Gas。即使之後的執行回復，EIP-7702 授權處理也有其獨立的持久化規則。
7. 核對執行後狀態。將原生與代幣餘額差額、儲存變化、收據狀態、Gas 使用量、有效 Gas 價格、日誌及服務商執行追蹤，與區塊承諾的根進行比對。執行追蹤是服務商重建的檢視，不是獨立共識交易。達到所需最終性後，再明確處理替換交易、鏈重組、索引器修訂、跨鏈橋、Rollup 與會計沖銷。

<a id="example"></a>

## 四個算例

- **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 持久化邊界。** 贊助方提交一筆 set-code 交易，其中包含帳戶 A 在 nonce `5` 時向實作 D 發出的授權。協定寫入 `23-byte` 指示符 `0xef0100 || 20-byte address`，並將 A 的授權 nonce 增至 `6`。如果該頂層交易之後的執行回復，已處理的委派指示符與授權 nonce 仍然保留。這與失敗呼叫寫入一般 EVM 儲存時的回復邊界不同。

<a id="risks"></a>

## 風險與控制

- 讀取錯誤的鏈、分叉、區塊雜湊或區塊標籤，會產生內部不一致的狀態快照。
- 過時或不可信的 RPC 可能遺漏、落後或誤報鏈頭狀態。
- 待處理 nonce 競爭、斷檔與替換可能使排隊假設失效。
- 錢包中的「取消」通常是替換交易，而不是協定層刪除。
- 餘額不足以支付價值與最高費用，會阻止交易納入。
- 基礎費變動或費用上限錯誤可能延遲納入或改變成本。
- EIP-7702 程式碼可能使舊式帳戶判斷法誤判 EOA。
- 惡意受委派程式碼、初始化缺陷或授權重播可能危及 EIP-7702 帳戶。
- 代理升級與委派呼叫可能使程式碼及儲存解讀隨時間改變。
- 金鑰、簽章網域或鏈 ID 錯誤可能授權竊取或重播。
- 重入與共享狀態排序可能在一次執行內改變餘額。
- 子呼叫失敗可被擷取，而外層交易仍顯示成功。
- 頂層回復或 Gas 耗盡仍會耗用 Gas 並增加傳送方 nonce。
- 代幣小數位數、轉帳收費、再定基與掛鉤可能使簡單餘額計算失效。
- 僅核對錢包餘額可能遺漏授權額度、債務、擔保品與獎勵。
- 日誌可能缺失、被回復、具有誤導性，或不足以證明最終狀態。
- 瀏覽器「內部交易」與服務商執行追蹤可能因其均為重建檢視而不同。
- 存取清單可能不完整、重複或不具經濟效益，也不會鎖定讀寫集。
- 共享狀態排序、優先費與 MEV 可能改變執行結果。
- 鏈重組、資料裁剪、證明無法取得、L2 系統轉換與跨鏈橋最終性可能沖銷或遮蔽會計紀錄。

<a id="misconceptions"></a>

## 常見迷思

- 「錢包保存鏈上餘額。」錢包保存憑證，並呈現從網路取得的狀態。
- 「每個位址都永久屬於無程式碼 EOA 或一般合約。」EIP-7702 委派改變了這種程式碼判斷方式。
- 「每一筆顯示的轉帳都是獨立以太坊交易。」代幣事件與內部訊息呼叫追蹤不是頂層簽章交易。
- 「失敗交易什麼都不改變，也沒有成本。」已納入的失敗可能耗用 Gas 並推進傳送方 nonce。
- 「帳戶模型或存取清單保證比 UTXO 更快地平行執行。」效能與衝突取決於完整協定與工作負載。

<a id="related"></a>

## 相關主題

- [狀態根](/zh-tw/crypto/state-root/)
- [UTXO 模型](/zh-tw/crypto/utxo-model/)
- [帳戶抽象化](/zh-tw/crypto/account-abstraction/)

<a id="sources"></a>

## 資料來源

- [以太坊帳戶](https://ethereum.org/developers/docs/accounts/)
- [以太坊黃皮書：可程式化區塊鏈以太坊的正式規範](https://ethereum.github.io/yellowpaper/paper.pdf)
- [交易](https://ethereum.org/developers/docs/transactions/)
- [區塊](https://ethereum.org/developers/docs/blocks/)
- [Merkle Patricia 樹](https://ethereum.org/developers/docs/data-structures-and-encoding/patricia-merkle-trie/)
- [EIP-7702：為 EOA 設定程式碼](https://eips.ethereum.org/EIPS/eip-7702)
- [EIP-2930：選用存取清單](https://eips.ethereum.org/EIPS/eip-2930)
- [權益證明（PoS）](https://ethereum.org/developers/docs/consensus-mechanisms/pos/)

Source: https://wiki.fcontext.com/zh-tw/crypto/account-based-model/index.mdx
