僅供教育參考,不構成交易或簽章建議。Nonce 一詞指涉多個互不相關的欄位;分配、取代或重複使用前,應核實確切的鏈、帳戶、合約、域、EntryPoint 或區塊標頭規格及 canonical 狀態。
直接答案
Nonce 是一個數值,其意義來自特定的協定命名空間。它不一定是隨機數,也不是某個全域「僅使用一次」的值。在以太坊中,外部擁有帳戶的狀態 Nonce 用來排序並驗證該發送方的交易。合約可在儲存空間中另設應用 Nonce,供許可或簽署意圖防止重放。ERC-4337 智慧帳戶可使用結構化的 UserOperation Nonce,並劃分可平行運作的鍵與序列通道。在比特幣工作量證明中,區塊標頭 Nonce 是嘗試候選雜湊時使用的有限搜尋欄位。
這些數值不能互換。除非應用程式驗證自己的域與防重放欄位,否則以太坊帳戶 Nonce 無法保護任意型別化資料簽章。PoW 區塊標頭 Nonce 不負責帳戶交易排序。不同發送方、合約、鏈或通道採用相同數值,也代表不同狀態。
運作方式
- 讀取數值前先辨識命名空間:EOA 交易、合約帳戶狀態、應用儲存空間、ERC-4337
UserOperation,或指定的 PoW 區塊標頭。視情況鎖定鏈 ID、分叉與協定版本、帳戶或所有者、驗證合約與域、EntryPoint 或區塊標頭格式。 - 在明確的區塊標籤下讀取權威狀態。應區分 canonical EOA 帳戶 Nonce、服務商提供的待處理計數、應用的
nonces(owner)儲存值、ERC-4337 的鍵與序列,以及礦工本地的區塊標頭搜尋計數。多個 RPC 結果一致,仍不能取代 canonical 收據與狀態驗證。 - 建立完整的簽章譜系。記錄發送方或所有者、鏈與域、Nonce、酬載、截止時間、驗證合約、交易或訊息雜湊,以及每次取代。對以太坊交易而言,EIP-155 等鏈域規則是帳戶 Nonce 的補充;僅有 Nonce 並不構成完整的跨鏈防重放保護。
- 在正確通道內分配。協調同時作業的 EOA 簽署者,確保每個 canonical 序列只分配一次,並保留序列缺口及相同 Nonce 的取代譜系。對應用或智慧帳戶,應遵循其合約的原子檢查遞增及通道規則,不能假設只有一個全域計數器。
- 按正確准入規則送出。執行客戶端的待處理與取代政策屬本地策略;ERC-4337 bundler 依 EntryPoint 與帳戶規則驗證
UserOperation物件;EIP-712 或許可簽章可能由他人的交易轉送。這些本地接受路徑都不證明已 canonical 納入區塊。 - 追蹤完整結果。區分遭拒、待處理、排隊、已取代、成功納入、以
status = 0納入、因重組移除與最終確定。以太坊交易一經納入,即使 EVM 執行回復,發送方帳戶 Nonce 仍會遞增;在回復呼叫中更新的應用儲存 Nonce 則會回復。 - 重試前完成核對。驗證 canonical 收據、區塊雜湊、發送方 Nonce、應用儲存空間、ERC-4337 事件或收據及最終性。對 PoW,應驗證完整區塊標頭與目標,而非只看 Nonce;有限欄位用盡時,礦工會變更其他影響標頭的資料,建立新的搜尋空間。
計算範例
- 執行回復仍會消耗 EOA Nonce。 發送方 canonical Nonce 為
12。Nonce 為12的交易以status = 0納入區塊,使用50,000gas,成交 gas 價格為30 gwei,成本為50,000 * 30 gwei = 0.0015 ETH。合約變更回復,但發送方 canonical Nonce 變為13。若重組移除該區塊,Nonce 可能回到12;錢包必須重新核對完整交易譜系。 - 應用與轉送者 Nonce 各自獨立。 所有者 EOA 帳戶 Nonce 為
18;ERC-2612 代幣顯示nonces(owner) = 7;轉送者 EOA Nonce 為42。許可成功會消耗應用 Nonce7,使其成為8;交易納入使轉送者 Nonce 成為43,所有者 EOA Nonce 仍為18。若整個呼叫回復,轉送者 Nonce 仍成為43,但代幣儲存更新回復至7。 - ERC-4337 通道。 依教學用打包式
nonce = (key << 64) | sequence,鍵5、序列9得出5 * 2^64 + 9 = 92,233,720,368,547,758,089;序列10得出92,233,720,368,547,758,090。獨立鍵6、序列0得出110,680,464,442,257,309,696。能否平行使用仍取決於智慧帳戶的驗證邏輯,且與 bundler 的 EOA 交易 Nonce 分開。 - PoW 搜尋 Nonce。 比特幣區塊標頭 Nonce 為
32 bits,共有2^32 = 4,294,967,296個數值候選。在假設算力100 TH/s下,掃描該空間需4,294,967,296 / 100,000,000,000,000 = 0.00004294967296 seconds = 42.94967296 microseconds。礦工會改變 coinbase extraNonce、時間或交易集合,以改變 Merkle 根並取得新標頭;此欄位不是帳戶防重放狀態。
風險
- 混淆 EOA、合約、應用、ERC-4337 與 PoW 的 Nonce 命名空間。
- 從錯誤的鏈、分叉、合約或 EntryPoint 讀取 Nonce。
- 使用過時、不一致或惡意 RPC 回應。
- 同時作業的簽署者分配相同 EOA 交易 Nonce。
- Nonce 缺口阻塞後續本地交易候選。
- 把服務商的待處理 Nonce 當成 canonical 狀態。
- 忘記已納入但執行回復的交易仍消耗 EOA Nonce 與 gas。
- 重組後未恢復 Nonce 與候選交易譜系。
- 相同 Nonce 的取代交易不符合目標節點費用政策。
- 誤以為取代已從全網刪除舊簽署交易。
- 將不同發送方或域中數值相同的 Nonce 相關聯。
- 省略鏈 ID 或其他必要的簽章域分隔符。
- 未以原子方式檢查並遞增應用 Nonce。
- ERC-2612 所有者、截止時間、域分隔符或代幣合約錯誤。
- 應用簽章在不同鏈、合約或版本間遭重放。
- 把合約帳戶狀態 Nonce 誤讀為通用呼叫計數器。
- 錯誤打包 ERC-4337 Nonce 的鍵或序列位元寬度。
- 混淆 bundler EOA Nonce 與智慧帳戶的
UserOperationNonce。 - 代理升級或儲存衝突改變應用 Nonce 行為。
- 把有限的 PoW 搜尋 Nonce 本身當作授權、防重放狀態或證明。
常見誤解
- 所有稱為 Nonce 的欄位意義相同,而且在全域只使用一次。
- Nonce 越大,交易越安全、越快或越接近最終確定。
- 以太坊交易執行回復後不會消耗發送方 Nonce。
- 僅靠 Nonce 就能阻止所有跨鏈、跨合約及型別化訊息重放。
- 每個 ERC-4337 智慧帳戶都只有一個與 EOA 交易 Nonce 相同的線性計數器。
相關主題
資料來源
- Ethereum accounts - Ethereum.org(存取日期:2026-08-13)
- Transactions - Ethereum.org(存取日期:2026-08-13)
- EIP-2681: Limit account nonce to 2^64-1 - Ethereum Improvement Proposals(存取日期:2026-08-13)
- EIP-155: Simple replay attack protection - Ethereum Improvement Proposals(存取日期:2026-08-13)
- EIP-712: Typed structured data hashing and signing - Ethereum Improvement Proposals(存取日期:2026-08-13)
- ERC-2612: Permit Extension for EIP-20 Signed Approvals - Ethereum Improvement Proposals(存取日期:2026-08-13)
- ERC-4337: Account Abstraction Using Alt Mempool - Ethereum Improvement Proposals(存取日期:2026-08-13)
- Block Chain - Bitcoin Developer Documentation(存取日期:2026-08-13)