金鑰、錢包與帳戶抽象化

Nonce 管理

Nonce 管理是把每個帳戶的交易序號(nonce)維持在正確順序的實務工作。在以太坊這類以帳戶為基礎的鏈上,每個帳戶都有一個計數器——它的 nonce——每送出一筆交易就必須剛好加一。這個計數器賦予帳戶嚴格、無間隙的交易順序,也是鏈對抗重放的防線:一筆已簽署的交易只對它特定的 nonce 有效,因此無法被重新提交或執行兩次。

這份嚴格也帶來錢包必須處理的麻煩。網路嚴格按 nonce 順序執行一個帳戶的交易,因此若 nonce 5 的交易尚在等待、你卻廣播了 nonce 6,nonce 6 會在記憶池中等到 5 確認為止。若 nonce 5 出價過低而卡住,它後面的一切也跟著「卡住」——一個間隙便堵住整條佇列。要修正這點,你以更高費用重新廣播同一個 nonce 來替換卡住的交易(「加速」或「取消」);要解開間隙,則必須讓那個缺失的 nonce 被打包。因此錢包、尤其是高吞吐量的服務(交易所、機器人),都必須在本機追蹤最近用過的 nonce,因為在許多交易同時在途時,只仰賴節點的計數可能失準。

帳戶抽象化把 nonce 一般化了。ERC-4337 引入二維 nonce:一個 192 位元的 key 加一個 64 位元的 sequence,由 EntryPoint 中的 NonceManager 管理。這讓一個智能合約帳戶能並行地跑許多各自獨立、各有順序的串流——不同的應用或會話金鑰各用自己的 nonce key——使無關的操作不再像單一線性計數器所迫的那樣彼此阻塞。請留意它與比特幣這類 UTXO 鏈的對比:後者根本沒有帳戶層級的 nonce;在那裡,重放保護來自每一個輸出只能被花用一次。

一個機器人接連送出 nonce 為 10、11、12 的交易,但 nonce 10 的 gas 價設得太低而遲遲未被打包。nonce 11 與 12 雖有效卻無法執行,因為鏈不會跳過 nonce 10。機器人以更高的 max fee 重送 nonce 10;它一確認,11 與 12 便立刻跟上。

切莫把這個「帳戶 nonce」與工作量證明的「區塊 nonce」搞混。帳戶 nonce 為一個帳戶的交易排序並去重;挖礦 nonce 則是礦工為了找出有效區塊雜湊而變動的數字。它們同名,卻解決全然不同的問題。

又称
transaction sequencing交易序號管理