跳到正文

加密領域的 Nonce 命名空間

解析以太坊帳戶 Nonce、應用層防重放 Nonce、ERC-4337 鍵與序列通道,以及工作量證明區塊標頭搜尋 Nonce。

更新於

僅供教育參考,不構成交易或簽章建議。Nonce 一詞指涉多個互不相關的欄位;分配、取代或重複使用前,應核實確切的鏈、帳戶、合約、域、EntryPoint 或區塊標頭規格及 canonical 狀態。

直接答案

Nonce 是一個數值,其意義來自特定的協定命名空間。它不一定是隨機數,也不是某個全域「僅使用一次」的值。在以太坊中,外部擁有帳戶的狀態 Nonce 用來排序並驗證該發送方的交易。合約可在儲存空間中另設應用 Nonce,供許可或簽署意圖防止重放。ERC-4337 智慧帳戶可使用結構化的 UserOperation Nonce,並劃分可平行運作的鍵與序列通道。在比特幣工作量證明中,區塊標頭 Nonce 是嘗試候選雜湊時使用的有限搜尋欄位。

這些數值不能互換。除非應用程式驗證自己的域與防重放欄位,否則以太坊帳戶 Nonce 無法保護任意型別化資料簽章。PoW 區塊標頭 Nonce 不負責帳戶交易排序。不同發送方、合約、鏈或通道採用相同數值,也代表不同狀態。

運作方式

  1. 讀取數值前先辨識命名空間:EOA 交易、合約帳戶狀態、應用儲存空間、ERC-4337 UserOperation,或指定的 PoW 區塊標頭。視情況鎖定鏈 ID、分叉與協定版本、帳戶或所有者、驗證合約與域、EntryPoint 或區塊標頭格式。
  2. 在明確的區塊標籤下讀取權威狀態。應區分 canonical EOA 帳戶 Nonce、服務商提供的待處理計數、應用的 nonces(owner) 儲存值、ERC-4337 的鍵與序列,以及礦工本地的區塊標頭搜尋計數。多個 RPC 結果一致,仍不能取代 canonical 收據與狀態驗證。
  3. 建立完整的簽章譜系。記錄發送方或所有者、鏈與域、Nonce、酬載、截止時間、驗證合約、交易或訊息雜湊,以及每次取代。對以太坊交易而言,EIP-155 等鏈域規則是帳戶 Nonce 的補充;僅有 Nonce 並不構成完整的跨鏈防重放保護。
  4. 在正確通道內分配。協調同時作業的 EOA 簽署者,確保每個 canonical 序列只分配一次,並保留序列缺口及相同 Nonce 的取代譜系。對應用或智慧帳戶,應遵循其合約的原子檢查遞增及通道規則,不能假設只有一個全域計數器。
  5. 按正確准入規則送出。執行客戶端的待處理與取代政策屬本地策略;ERC-4337 bundler 依 EntryPoint 與帳戶規則驗證 UserOperation 物件;EIP-712 或許可簽章可能由他人的交易轉送。這些本地接受路徑都不證明已 canonical 納入區塊。
  6. 追蹤完整結果。區分遭拒、待處理、排隊、已取代、成功納入、以 status = 0 納入、因重組移除與最終確定。以太坊交易一經納入,即使 EVM 執行回復,發送方帳戶 Nonce 仍會遞增;在回復呼叫中更新的應用儲存 Nonce 則會回復。
  7. 重試前完成核對。驗證 canonical 收據、區塊雜湊、發送方 Nonce、應用儲存空間、ERC-4337 事件或收據及最終性。對 PoW,應驗證完整區塊標頭與目標,而非只看 Nonce;有限欄位用盡時,礦工會變更其他影響標頭的資料,建立新的搜尋空間。

計算範例

  • 執行回復仍會消耗 EOA Nonce。 發送方 canonical Nonce 為 12。Nonce 為 12 的交易以 status = 0 納入區塊,使用 50,000 gas,成交 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。許可成功會消耗應用 Nonce 7,使其成為 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 與智慧帳戶的 UserOperation Nonce。
  • 代理升級或儲存衝突改變應用 Nonce 行為。
  • 把有限的 PoW 搜尋 Nonce 本身當作授權、防重放狀態或證明。

常見誤解

  • 所有稱為 Nonce 的欄位意義相同,而且在全域只使用一次。
  • Nonce 越大,交易越安全、越快或越接近最終確定。
  • 以太坊交易執行回復後不會消耗發送方 Nonce。
  • 僅靠 Nonce 就能阻止所有跨鏈、跨合約及型別化訊息重放。
  • 每個 ERC-4337 智慧帳戶都只有一個與 EOA 交易 Nonce 相同的線性計數器。

相關主題

資料來源

導覽

搜尋知識庫...