買幣
行情
現貨
合約BTC
理財
活動中心
福利中心
更多
0 費狂歡節
Nonce 重放保護: 什麼是 Nonce 重放保護?Nonce 重放保護是一種安全機制,可防止有效的加密貨幣交易、訊息、Permit、授權或智能合約操作被重複使用。Nonce 是一個數字或唯一值,設計上只會在特定情境中使用一次。重放保護是指簽署過的操作使用後,網路、錢包、合約或應用程式會拒絕再次提交的相同簽署操作。Nonce 重放保護對加密貨幣至關重要,因為數位簽章可以被完整複製。如果使用者簽署交易或訊息,而系統沒有追Nonce 重放保護: 什麼是 Nonce 重放保護?Nonce 重放保護是一種安全機制,可防止有效的加密貨幣交易、訊息、Permit、授權或智能合約操作被重複使用。Nonce 是一個數字或唯一值,設計上只會在特定情境中使用一次。重放保護是指簽署過的操作使用後,網路、錢包、合約或應用程式會拒絕再次提交的相同簽署操作。Nonce 重放保護對加密貨幣至關重要,因為數位簽章可以被完整複製。如果使用者簽署交易或訊息,而系統沒有追

Nonce 重放保護

2026/10/13 16:35
#Advanced
Humanity
H$0.05871+3.23%
SynFutures
F$0.003147+10.61%
PX
PX$0.0113-0.87%
SPACE ID
ID$0.03347+8.31%
DAO Maker
DAO$0.02214-4.48%

什麼是 Nonce 重放保護?

Nonce 重放保護是一種安全機制,可防止有效的加密貨幣交易、訊息、Permit、授權或智能合約操作被重複使用。

Nonce 是一個數字或唯一值,設計上只會在特定情境中使用一次。

重放保護是指簽署過的操作使用後,網路、錢包、合約或應用程式會拒絕再次提交的相同簽署操作。

Nonce 重放保護對加密貨幣至關重要,因為數位簽章可以被完整複製。

如果使用者簽署交易或訊息,而系統沒有追蹤該內容是否已經使用,攻擊者可能重放同一簽章,再次執行相同操作。

重複操作可能再次轉移資金、再次核准代幣支出、再次呼叫智能合約、再次投票、再次領取獎勵,或再次觸發授權。

Ethereum 的帳戶文件說明,Ethereum 帳戶有一個 nonce 欄位,而且每個帳戶只能執行一筆具有特定 nonce 的交易。

同一份文件指出,這項機制可防止重放攻擊,避免已簽署的交易被一再廣播及重新執行。

因此,Nonce 重放保護是區塊鏈簽章能用於實際價值轉移的基本安全防護之一。

Nonce 重放保護重點整理

    • Nonce 重放保護可防止相同的加密貨幣簽署操作被接受多次。

    • Nonce 可以是依序遞增、隨機產生、依網域、帳戶或合約區分,也可以依序列通道設定。

    • Ethereum 外部擁有帳戶使用依序遞增的交易 Nonce,避免交易重複執行。

    • EIP-155 將 Chain ID 納入簽署交易資料,以降低跨鏈重放風險。

    • EIP-712 型別化資料仍需要應用程式層級的重放保護,因為如果合約不拒絕重複簽章,型別化簽章仍可能被多次提交。

    • ERC-2612 Permit 使用所有者 Nonce 及期限,避免代幣核准簽章無限期遭到重複使用。

    • ERC-3009 使用隨機產生的 32 位元組 Nonce 及授權狀態,防止已簽署的轉帳被重複執行。

    • ERC-4337 智能帳戶採用更彈性的 Nonce 設計,以支援帳戶抽象及平行工作流程。

    • 重放保護也應將簽章綁定至正確的區塊鏈、合約、函式、使用者、期限及預定操作。

    • Nonce 設計薄弱可能導致雙重支出、重複核准、交易卡住、簽章遭竊後被利用、Meta-Transaction 失敗及跨鏈重放攻擊。

重放攻擊為何與加密貨幣有關

重放攻擊是指有人取得有效的簽署操作,並在仍會接受該操作的情境中再次提交。

加密貨幣簽章不像紙本手寫簽名,因為數位簽章可以被完整複製並重新廣播。

如果已簽署的交易曾經有效,而協議沒有將其標記為已使用,同一筆交易可能再次有效。

這很危險,因為區塊鏈通常將有效簽章視為授權。

重放轉帳可能再次轉移資金。

重放核准可能重新提供支出權限。

重放領取操作可能耗盡獎勵池。

若合約沒有追蹤投票狀態,重放治理投票可能扭曲決策結果。

重放跨鏈訊息可能導致錯誤鑄造或釋放資產。

Nonce 重放保護可將可重複使用的簽章轉變為只能使用一次的授權。

Nonce 如何防止重放

Nonce 會讓每一項簽署操作都具有唯一性且可追蹤,藉此防止重放。

使用者簽署操作時,Nonce 會納入簽署資料中。

執行操作時,協議會檢查 Nonce 是否有效且尚未使用。

若檢查通過,操作便會執行,而 Nonce 會被消耗、遞增或標記為已使用。

若有人再次提交相同的簽署操作,Nonce 檢查就會失敗。

該簽章在數學上可能仍然有效,但系統會因為 Nonce 已經使用而拒絕它。

這項區別相當重要。

簽章有效性可證明使用者授權了某則訊息。

Nonce 的新鮮度則可證明該授權尚未被使用。

安全的系統需要兩者兼備。

依序遞增的 Nonce

依序遞增的 Nonce 是每次操作被接受後都會增加的計數器。

Ethereum 外部擁有帳戶在一般交易中採用此模式。

若帳戶的 Nonce 為 10,該帳戶下一筆有效交易通常需要使用 Nonce 10。

該交易納入區塊後,下一筆有效交易需要使用 Nonce 11。

這可防止兩筆使用同一帳戶 Nonce 的不同交易都被執行。

此機制也能建立交易順序,因為較大的 Nonce 通常無法在較小的 Nonce 尚未填補前處理。

依序遞增的 Nonce 簡單有效,適用於一般帳戶交易。

但對 Meta-Transaction、批次工作流程、多裝置、自動化工作階段及帳戶抽象系統而言,這種方式可能造成不便。

因此,一些較新的設計會採用隨機 Nonce、Nonce 通道或應用程式專用的 Nonce 對照方式。

隨機 Nonce

隨機 Nonce 是透過隨機產生而非逐一計數的唯一值。

在不需要嚴格交易排序的簽署授權及 Meta-Transaction 系統中,隨機 Nonce 很常見。

ERC-3009 使用隨機產生的 32 位元組 Nonce,並使其與授權者地址唯一對應。

ERC-3009 標準定義了授權狀態函式及相關事件,用以記錄授權 Nonce 是否已使用或取消。

這種模式允許多項彼此獨立的簽署授權同時存在。

它可避免某個待處理的依序 Nonce 阻擋後續授權的問題。

但取捨是合約必須儲存或檢查已使用的隨機 Nonce,避免相同授權遭到重複使用。

隨機 Nonce 需要具備良好的隨機性。

若 Nonce 可預測,或意外重複使用,重放保護就可能變得薄弱。

帳戶 Nonce

帳戶 Nonce 可保護同一帳戶發出的交易。

對外部擁有帳戶而言,Nonce 有助於讓每筆交易都具備唯一性,並控管交易順序。

若使用者以相同帳戶 Nonce 發送兩筆交易,依一般規則,只有其中一筆能被納入區塊。

另一筆可能遭到拒絕、取代,或因網路及費用處理方式而維持無效。

因此,錢包必須仔細追蹤下一個帳戶 Nonce。

若錢包使用過低的 Nonce,該交易可能已經被使用,因此會失敗。

若錢包使用過高的 Nonce,該交易可能必須等到較前面的缺漏 Nonce 確認後才能處理。

若使用者以相同 Nonce 廣播一筆手續費較高的替代交易,依節點政策,這筆替代交易可能取代較早的待處理交易。

帳戶 Nonce 可以防止重放,但也會帶來實際的交易管理問題。

使用者可能會遇到交易卡住、待處理佇列、替代交易或嘗試取消交易等情況。

Chain ID 重放保護

Chain ID 重放保護可防止為某條區塊鏈簽署的交易,在使用相似交易格式的另一條鏈上也有效。

隨著區塊鏈分叉及多個 EVM 相容網路增加,這項保護變得格外重要。

EIP-155將 Chain ID 加入 Ethereum 簽署交易資料中。

其目的在於讓交易只對一條區塊鏈有效,並在 Chain ID 不同的其他鏈上失效。

若沒有這項保護,某條鏈上廣播的交易可能會在帳戶、Nonce 及交易格式相符時,被複製並提交至另一條鏈。

Chain ID 重放保護與帳戶 Nonce 重放保護並不相同。

帳戶 Nonce 可防止同一筆交易在同一條鏈上重複執行。

Chain ID 則有助於防止相同的簽署交易在另一條鏈上使用。

穩健的重放保護通常需要兩者兼備。

網域分隔

網域分隔是指將簽章綁定至特定的簽署情境。

情境可能包括 Chain ID、合約地址、協議名稱、版本、函式類型、使用者地址、Nonce 及期限。

EIP-712定義型別化結構資料簽章,並在網域欄位中納入名稱、版本、Chain ID 及驗證合約等項目。

網域分隔有助於防止某個應用程式的簽章被另一個應用程式接受。

例如,使用者可能打算針對某條鏈上的某個合約簽署訊息。

若簽章未包含區塊鏈及驗證合約資訊,其他合約或區塊鏈可能將其視為有效。

這會帶來重放風險,因為相同簽章可能在不同情境之間移動。

Nonce 可防止在同一情境中重複使用。

網域分隔則有助於防止在錯誤情境中使用。

安全的鏈下簽章需要同時具備這兩種控管。

EIP-712 訊息中的 Nonce 重放保護

EIP-712 可讓錢包及使用者更容易理解訊息,但不會自動讓每則簽署訊息只能使用一次。

EIP-712 的安全性章節警告,應用程式必須妥善處理相同簽署訊息被提交兩次的情況。

這代表合約或應用程式必須拒絕重複的簽署訊息,或確保重複操作不會造成額外影響。

型別化訊息可以包含 Nonce,但接收合約必須檢查並消耗該 Nonce。

型別化訊息可以包含期限,但期限必須在鏈上強制執行。

型別化訊息可以包含驗證合約,但合約必須正確驗證網域分隔符。

型別化資料能提升清晰度,但本身不會提供重放安全性。

重放安全性取決於整體設計。

安全的 EIP-712 流程會一併使用網域分隔、Nonce 追蹤、簽章驗證、操作綁定及期限檢查。

缺少任何一項都可能造成重放風險。

ERC-2612 Permit 中的 Nonce 重放保護

ERC-2612 Permit 讓代幣所有者能以簽署訊息的方式核准代幣支出,而不必直接在鏈上提交核准交易。

這能改善使用者體驗,因為其他人可以代表所有者提交已簽署的 Permit。

ERC-2612 標準要求提供 Nonces 函式,並規定 Permit 成功後必須增加所有者的 Nonce。

標準也指出,提供 Nonces 對照表是為了重放保護。

這能防止相同的 Permit 簽章遭到重複使用。

ERC-2612 也包含期限參數。

期限會限制已簽署 Permit 的有效時間。

這很重要,因為收到 Permit 的中繼者可以自行選擇在到期前提交的時間。

較短的期限可降低舊簽章日後遭到使用的風險。

若 Permit 未妥善處理 Nonce 及期限,可能造成嚴重的代幣核准風險。

ERC-3009 中的 Nonce 重放保護

ERC-3009 是一種代幣簽署轉帳授權模式。

代幣持有者不必先核准支出者,而是直接為特定轉帳簽署授權。

之後,合約會在執行前檢查簽章、有效期間及 Nonce。

ERC-3009 使用 authorizationState 對照表,追蹤 Nonce 是否已使用。

標準規定,成功執行轉帳授權後,系統會將 Nonce 標記為已使用。

這可防止相同的簽署轉帳再次執行。

部分 ERC-3009 實作也支援取消授權。

標準包含 validAfter 及 validBefore 欄位,以設定授權的有效期間。

此設計適用於免 Gas 或由中繼者代送的代幣流程。

它也說明了重放保護不只是計數器而已。

安全的授權應具備唯一 Nonce、有效時間範圍、明確收款人、確切金額及正確網域。

ERC-4337 智能帳戶中的 Nonce 重放保護

ERC-4337 透過 UserOperation 及智能合約帳戶引入帳戶抽象。

ERC-4337 標準將 UserOperation Nonce 定義為防重放參數。

標準也要求簽章須與 Chain ID 及 EntryPoint 地址相關聯,以防止跨鏈重放或跨 EntryPoint 重放。

ERC-4337 採用半抽象化的 Nonce 模型。

Nonce 可被視為由一個 Key 與一個序列值組合而成。

這讓智能帳戶能支援多個 Nonce 通道。

例如,錢包可為一般交易使用一個通道,並為管理操作使用另一個通道。

這有助於帳戶抽象支援平行工作流程,同時維持重放保護。

這種設計比單一依序遞增的 Nonce 更有彈性。

但彈性提高也代表錢包開發者必須仔細管理 Nonce 通道。

Nonce 通道

Nonce 通道是彼此獨立的一系列 Nonce 值。

Nonce 通道不會強制帳戶的所有操作都排入同一序列,而是讓不同類別的操作分別遞增。

這適用於智能帳戶、工作階段金鑰、自動付款、訂閱、復原操作、遊戲操作及外掛式錢包。

例如,使用者可以為日常支出設定一個通道,並為復原操作設定另一個通道。

復原通道中的交易不應阻擋日常支出通道中的交易。

Nonce 通道可以提升彈性與使用者體驗。

但若錢包沒有清楚顯示通道,也可能增加複雜性。

若錢包使用錯誤的通道簽署,操作可能失敗,或產生非預期的排序。

若合約未能正確驗證通道,重放保護可能不完整。

只有在規則容易理解時,Nonce 通道才有實際效用。

智能合約的重放保護

智能合約通常需要自己的 Nonce 重放保護,因為一般帳戶 Nonce 無法保護所有合約層級的授權。

若合約接受簽章,就必須判斷該簽章是否已經使用。

例如,空投領取合約可能使用對照表,標記某個使用者是否已領取。

治理合約可能會記錄投票者是否已針對某項提案投票。

Permit 合約可能會為每位所有者儲存 Nonce。

跨鏈橋合約可能會儲存已處理的訊息 ID。

類似市場託管服務可能會儲存已成交或取消的訂單雜湊值。

以上都是重放保護的形式。

具體資料結構可能不同,但目的相同。

合約必須防止相同授權造成重複的狀態變更。

跨鏈橋的重放保護

跨鏈橋需要完善的重放保護,因為它們會在區塊鏈之間轉移價值或訊息。

跨鏈橋訊息可能表示資產已在一條鏈上鎖定,應在另一條鏈上鑄造或釋放。

若相同的跨鏈橋訊息可處理兩次,目標鏈可能釋放過多資產。

跨鏈橋重放保護通常會使用訊息 ID、來源鏈 ID、目標鏈 ID、來源合約地址、序列號及已處理訊息對照表。

目標合約應將每則有效訊息標記為已處理。

若再次提交相同訊息,合約應予以拒絕。

跨鏈重放風險較高,因為不同區塊鏈可能使用相同的地址格式、代幣符號及智能合約介面。

跨鏈橋必須將每則訊息綁定至指定的來源鏈、目標鏈、跨鏈橋合約、傳送者、接收者、金額及 Nonce。

跨鏈橋重放保護薄弱,可能造成鑄造錯誤、資金損失或系統性流動性風險。

Meta-Transaction 的重放保護

Meta-Transaction 是由其他參與者提交的使用者簽署指令。

使用者在鏈下簽署,再由中繼者將交易提交至鏈上。

這能讓應用程式更容易使用,因為使用者可能不必直接以原生資產支付 Gas 費。

Meta-Transaction 需要謹慎設計 Nonce 重放保護。

若已簽署指令可重複提交,中繼者或攻擊者可能重複執行該操作。

若使用者同時在不同應用程式中簽署多筆 Meta-Transaction,依序遞增的 Nonce 可能造成問題。

隨機 Nonce 或各應用程式專用的 Nonce 空間,可降低這類衝突。

設定期限可降低舊簽署指令遭到使用的風險。

網域分隔可防止某個應用程式的 Meta-Transaction 簽章被用於另一個應用程式。

Meta-Transaction 的安全性與簽章驗證一樣仰賴重放保護。

錢包登入訊息的重放保護

許多加密貨幣應用程式會要求使用者簽署訊息,以證明錢包所有權。

這常用於登入、帳戶連結、個人資料更新及鏈下驗證。

登入簽章應包含由伺服器產生的 Nonce 或驗證挑戰。

成功登入後,伺服器應將該驗證挑戰標記為已使用。

若可行,訊息也應包含網域、區塊鏈、簽發時間、到期時間及預定操作。

若登入訊息沒有包含新的驗證挑戰,攻擊者可能重放舊簽章來冒充使用者。

若登入訊息沒有包含正確網域,某個網站的簽章可能會被用於另一個網站。

錢包登入通常是在鏈下進行,但重放保護仍然重要。

證明錢包所有權的簽章不應變成可永久重複使用的密碼。

安全性最高的登入簽章應具備明確目的、時效性、使用限制及易讀性。

治理的重放保護

治理系統需要重放保護,確保投票及委託不會超出預期次數計算。

投票合約可能會儲存地址是否已針對某項提案投票。

以簽章委託的合約可能使用 Nonce,避免相同委託簽章遭到重複使用。

提案執行系統可能會在成功執行後,將提案標記為已執行。

若治理決策會同步至多條網路,跨鏈重放保護也很重要。

除非明確設計如此,否則為某條鏈簽署的治理訊息不應自動在另一條鏈上執行。

治理重放故障可能造成嚴重後果,因為它可能更改協議參數、轉移金庫資金、升級合約或改變風險控管。

完善的治理合約會妥善使用提案 ID、Chain ID、合約地址、投票期間、Nonce 及執行狀態。

只有在系統刻意允許期限前修改投票時,投票才應能重複提交。

即使如此,最終計票規則仍必須清楚明確。

空投及領取操作的重放保護

空投及獎勵領取合約通常會使用重放保護,避免使用者重複領取。

簡單的領取系統可能會以對照表記錄每個符合資格地址的領取狀態。

Merkle 空投可能會驗證使用者的證明,之後將地址或領取索引標記為已使用。

以簽章為基礎的獎勵領取可能包含 Nonce、領取 ID、活動 ID、期限及使用者地址。

若沒有重放保護,有效領取證明可能會被重複使用,直到獎勵池耗盡。

重放保護也應考量不同活動之間的區隔。

活動 A 的領取簽章不應能用於活動 B。

除非系統明確如此設計,否則一條鏈上的領取操作不應能用於另一條鏈。

一種代幣的領取操作不應授權領取另一種代幣。

完善的領取設計會將證明綁定至正確的使用者、活動、區塊鏈、代幣、金額及 Nonce。

重放保護與期限

期限是簽署授權的時間限制。

期限不能取代 Nonce,但可縮短遭竊或延遲的簽章可被使用的時間範圍。

ERC-2612 Permit 使用期限欄位。

ERC-3009 使用 validAfter 及 validBefore 欄位。

ERC-4337 UserOperation 可透過驗證資料包含有效時間範圍。

當使用者將簽章交給可自行決定提交時間的中繼者或應用程式時,期限尤其實用。

若沒有期限,舊的簽署授權可能在遠超過使用者預期的時間內持續有效。

設定期限後,簽章便會在指定時間後失效。

較短的期限可提升安全性,但若網路壅塞,也可能增加交易失敗的機率。

最適合的期限取決於操作價值、風險、急迫性及預期結算時間。

重放保護與冪等性

冪等性是指重複執行同一操作,最終結果與只執行一次相同。

EIP-712 指出,應用程式應拒絕重複的簽署訊息,或讓授權操作具備冪等性。

例如,將使用者個人資料名稱設為相同內容兩次,可能不會造成危害。

但重複轉帳 100 枚代幣就不無害。

重複核准支出者,是否造成危害取決於金額及目前的額度。

若兩次治理投票都被計入,便可能造成危害。

若使用者重複領取並獲得雙倍獎勵,也會造成危害。

設計者應決定重複執行時要拒絕操作,還是讓操作不產生額外影響。

多數會轉移價值的操作都應拒絕重複執行。

冪等性可用於低風險的狀態更新,但不應草率套用於金融操作。

重放保護與簽章綁定

簽章應綁定使用者確切想要執行的操作。

這代表簽署訊息應包含收款人、金額、代幣、合約、Chain ID、函式用途、Nonce、期限及其他重要參數。

若簽章只核准模糊不清的權限,攻擊者可能在更廣泛的情境中重複使用。

若簽章只簽署數字而沒有代幣地址,該簽章可能被解讀為適用於錯誤的代幣。

若簽章只指定目的地而沒有 Chain ID,便可能在另一條鏈上遭到重放。

若簽章只指定使用者地址而沒有合約地址,其他合約可能接受該簽章。

簽章範圍越明確,重放保護就越完善。

範圍明確的簽章會清楚指出允許執行的操作,不多也不少。

範圍過廣的簽章則可能造成重放、濫用及使用者混淆。

錢包應在使用者簽署前清楚顯示這些細節。

重放保護與網路釣魚

Nonce 重放保護無法完全保護使用者免於網路釣魚。

若使用者以有效的 Nonce 簽署惡意訊息,攻擊者仍可能使用一次。

Nonce 可能防止重複使用,但第一次使用仍可能造成傷害。

例如,網路釣魚網站可能要求使用者簽署 Permit,核准代幣支出。

該 Permit 可能包含有效的 Nonce 及期限。

提交後,攻擊者仍可使用這項有效授權一次。

重放保護可防止重複操作,但無法防止惡意意圖。

使用者仍必須檢查簽署內容。

錢包仍必須顯示清楚且容易理解的警告。

合約仍必須將簽章權限限制在特定操作。

重放保護與搶先交易

搶先交易是指其他參與者看見交易或簽章後,先提交自己的交易。

Nonce 重放保護可讓簽章只能使用一次,藉此限制損害。

但它不一定能阻止搶先者成為第一個使用簽章的人。

ERC-2612 指出,其他參與者可能在預定提交者之前搶先呼叫 Permit,但對簽署者而言,最終核准效果可能相同。

ERC-3009 包含 receiveWithAuthorization,可透過確認收款人與呼叫者相符,減少特定搶先交易問題。

這說明重放保護與搶先交易防護彼此相關,但並不相同。

Nonce 可防止重複執行。

搶先交易控管則決定誰有權提交或受益於第一次執行。

高價值簽章應包含收款人綁定、期限及特定函式的操作意圖。

設計者不應假設只靠 Nonce 檢查,就能解決所有記憶池攻擊。

跨合約重複使用的重放保護

跨合約重放是指原本用於某個合約的簽章,卻被另一個合約接受。

若簽署資料未包含驗證合約地址,就可能發生這種情況。

EIP-712 網域分隔可透過在網域中加入 verifyingContract,降低這類風險。

ERC-2612 建議使用專屬於該合約及區塊鏈的網域分隔符。

若多個合約使用相同簽章結構,卻沒有加入合約專屬網域,也可能發生跨合約重放。

例如,兩個代幣合約可能都接受類似 Permit 的訊息,前提是簽署資料不夠明確。

使用者可能只打算核准一種代幣,但同一簽章也可能被另一種代幣解讀。

因此,綁定合約地址至關重要。

有效簽章不應在合約之間自由流通。

它應只屬於一個明確的驗證網域。

跨鏈重複使用的重放保護

跨鏈重放是指原本用於某條鏈的簽署交易或訊息,在另一條鏈上也被接受。

EIP-155 透過將 Chain ID 加入簽署交易雜湊值,降低 Ethereum 類型交易的此類風險。

EIP-712 型別化資料也支援在簽署網域中加入 chainId。

若簽署資料省略 Chain ID,應用程式層級訊息仍可能面臨跨鏈重放風險。

例如,跨鏈橋、DAO、代幣 Permit 或登入簽章應在區塊鏈情境重要時,註明預定使用的鏈。

對 EVM 相容網路而言,Chain ID 特別重要,因為不同鏈上的地址及合約位元碼可能看起來相似。

使用者可能在多條鏈上控制相同地址。

透過確定性部署的方式,合約也可能在多條鏈上部署於相同地址。

若沒有綁定區塊鏈,簽章就可能危險地被移植至其他鏈。

安全的設計會明確指定區塊鏈。

重放保護與交易取代

交易取代是指使用者以相同帳戶 Nonce 發送手續費較高的新交易,以取代待處理交易。

這本身並不是重放攻擊。

在許多 Ethereum 類型的交易流程中,這是一般的交易管理方法。

關鍵在於,最終只能有一筆使用該 Nonce 的交易執行。

使用者可以用較快的交易取代速度較慢的交易。

使用者也可以使用相同 Nonce,向自己發送價值為 0 的交易,以取消待處理交易。

替代交易必須符合網路的費用調升規則,才能被節點接受。

Nonce 重放保護讓交易取代機制得以成立。

Nonce 會迫使網路在該交易序列位置選擇其中一筆交易。

使用者應小心操作,因為取代錯誤的 Nonce 可能會取消或取代原本仍想執行的操作。

重放保護與卡住的交易

若交易的手續費偏低並持續待處理,就可能造成交易卡住。

若該交易使用下一個必要的 Nonce,同一帳戶的後續交易也可能因此排在後面等待。

這是依序遞增 Nonce 的副作用之一。

在一般交易排序中,帳戶無法跳過缺漏的 Nonce。

使用者可能需要透過以相同 Nonce 提交替代交易,加速或取消卡住的交易。

錢包通常會自動處理這些狀況,但手動設定 Nonce 可能造成混淆。

若使用者設定過高的 Nonce,交易可能要等到較前面的 Nonce 填補後才會確認。

若使用者設定過低的 Nonce,交易可能因為該 Nonce 已經使用而失敗。

Nonce 重放保護能保護帳戶,但也需要謹慎安排交易順序。

進階使用者手動編輯交易 Nonce 前,應了解目前的 Nonce 狀態。

重放保護與工作階段金鑰

工作階段金鑰是可在一段時間內授權特定操作的限時金鑰。

它適用於遊戲、訂閱、自動化策略及帳戶抽象錢包。

工作階段金鑰可能會簽署許多小額操作,因此需要完善的 Nonce 重放保護。

工作階段金鑰授權應設定限制,例如允許使用的函式、支出上限、目的合約、到期時間、Chain ID 及 Nonce 規則。

若沒有 Nonce 保護,攻擊者取得一筆工作階段金鑰簽章後,可能反覆重放。

若沒有操作限制,工作階段金鑰可能變得權限過大。

Nonce 通道可協助將工作階段金鑰操作與主要錢包操作分開。

這能在維持重放安全性的同時,讓使用者操作更順暢。

工作階段金鑰應易於撤銷。

其權限範圍也應受到足夠限制,以降低重放造成的損害。

多重簽章錢包的重放保護

多重簽章錢包也需要重放保護。

多重簽章交易通常會使用內部 Nonce,追蹤已執行的錢包操作。

簽署者會核准特定交易雜湊值,其中包含錢包 Nonce 及操作細節。

多重簽章交易執行後,Nonce 會遞增,或該交易雜湊值會被標記為已執行。

這可防止同一組簽章被重複使用,以再次執行相同操作。

多重簽章重放保護應將簽章綁定至錢包地址、Chain ID、目標地址、價值、資料、操作類型及 Nonce。

若多重簽章錢包部署在多條鏈上,跨鏈重放保護就特別重要。

簽署者核准前應確認區塊鏈及錢包地址。

不能只因為有多人簽署,就認為多重簽章簽章安全。

簽署內容仍必須明確且具備重放防護。

預言機的重放保護

預言機系統可能會簽署價格更新、資料證明、儲備報告、隨機數輸出或跨鏈訊息。

這些簽署資料封包需要重放保護。

過期的價格更新不應永遠有效。

隨機數結果不應在不同的遊戲回合中重複使用。

儲備證明不應在過期後遭到重放。

視情況而定,預言機訊息應包含資料 Feed ID、回合 ID、時間戳記、序列號、Chain ID 及目的合約。

合約應拒絕過期或已使用的預言機訊息。

由於智能合約可能會自動根據預言機資料執行操作,因此重放保護至關重要。

若舊資料可遭重放,強制平倉、結算、鑄造、贖回或付款都可能出錯。

預言機資料時效性及 Nonce 控管都是智能合約安全的一部分。

若資料過時或遭到重複使用,簽章正確仍不足以確保安全。

代幣核准的重放保護

代幣核准是重放保護最敏感的領域之一。

一般鏈上核准會使用交易的帳戶 Nonce,並更新支出額度狀態。

簽署式 Permit 則會使用合約層級的 Nonce 及期限,讓代幣所有者不必直接提交交易也能授權核准。

若 Permit 簽章可遭到重放,使用者可能以為核准已失效,支出者卻能重新取得支出額度。

若 Permit 未包含支出者、代幣、金額、Nonce、期限或網域,簽章就可能遭到濫用。

使用者應將簽署式核准視為重要的金融授權。

錢包應清楚顯示支出者、代幣、金額、期限及應用程式。

合約應立即拒絕已使用的 Permit Nonce。

除非確有必要,應用程式應避免要求無限額核准。

具備重放防護的核准設計,可降低常見的錢包資產遭竊攻擊途徑之一。

智能合約升級的重放保護

可升級合約會帶來額外的重放保護考量。

合約升級後,舊簽章可能仍然有效,除非網域版本、Nonce 邏輯或驗證規則有所變更。

EIP-712 在簽署網域中加入版本欄位,原因之一就在於此。

重大合約升級時,應評估舊授權是否仍然安全。

若升級後不應再接受舊簽章,合約可能需要新的網域版本或使 Nonce 失效的機制。

若舊簽章仍應有效,升級時就必須正確保留 Nonce 狀態。

若遷移 Nonce 狀態時處理不當,舊簽章可能遭到重放,也可能導致有效簽章無法使用。

升級計畫應涵蓋簽章遷移、網域變更、Nonce 儲存配置及使用者溝通。

重放保護不只是部署時才需要考量的事項。

它必須能在升級及遷移後持續運作。

區塊鏈分叉的重放保護

若分叉的兩側都接受相同的交易格式及狀態,就可能產生重放風險。

如果使用者在兩條分叉鏈上持有相同私鑰及帳戶狀態,除非兩條鏈採用不同防護措施,否則一條鏈上的交易可能在另一條分叉鏈上遭到重放。

EIP-155 的 Chain ID 保護旨在降低 Ethereum 交易的這類風險。

然而,應用程式層級的簽章仍需要綁定區塊鏈。

若區塊鏈情境不明確,分叉前後簽署的 Permit、治理投票、跨鏈橋訊息或鏈下訂單,可能產生非預期效果。

區塊鏈分叉及鏈分裂期間,使用者應謹慎操作。

錢包及應用程式應正確更新 Chain ID 及網域分隔符。

除非設計能安全處理,否則合約應避免以可能在分叉後造成重放風險的方式快取 Chain ID。

分叉重放保護同時涉及協議層及應用程式層。

兩個層級都需要留意。

Nonce 重放保護的優點

第一個優點是授權只能使用一次。

已簽署操作使用一次後,便可被消耗並在之後拒絕。

第二個優點是交易具備唯一性。

同一帳戶的交易可以透過不同 Nonce 值區分。

第三個優點是交易排序。

依序遞增的 Nonce 有助於定義帳戶交易的有效順序。

第四個優點是與 Chain ID 搭配時可提升跨鏈安全性。

簽章可綁定至預定使用的網路。

第五個優點是提升智能合約安全性。

合約可防止 Permit、領取操作、投票、轉帳及跨鏈訊息遭到重複執行。

第六個優點是改善使用者體驗的安全性。

錢包可以更可靠地偵測待處理操作、卡住的交易及替代交易。

Nonce 重放保護的風險與限制

第一個限制是,Nonce 保護無法阻止已簽署訊息第一次遭到惡意使用。

如果使用者簽署有害授權,Nonce 只能防止第一次執行後再次使用。

第二個限制是交易管理更加複雜。

依序遞增的 Nonce 可能造成交易卡住及佇列阻塞。

第三個限制是儲存成本。

合約若儲存已使用的隨機 Nonce,可能增加鏈上儲存用量。

第四個限制是實作風險。

若缺少 Nonce 檢查,簽章就可能遭到重放。

第五個限制是跨網域複雜性。

Nonce 可能保護某個合約,卻無法保護另一個合約或區塊鏈。

第六個限制是升級風險。

若合約遷移時處理不當,Nonce 狀態可能遭到破壞。

Nonce 重放保護的常見錯誤

常見錯誤之一是驗證簽章,卻沒有檢查 Nonce。

另一個錯誤是檢查 Nonce,卻忘記遞增或將其標記為已使用。

第三個錯誤是對所有使用者使用同一個全域 Nonce,而不是按使用者個別設定。

第四個錯誤是在簽署資料中省略 Chain ID。

第五個錯誤是在型別化資料中省略驗證合約地址。

第六個錯誤是接受未設定期限的簽章。

第七個錯誤是讓相同 Nonce 可用於不同操作類型。

第八個錯誤是在升級時未遷移 Nonce 儲存資料。

第九個錯誤是使用可預測的隨機 Nonce。

第十個錯誤是認為 EIP-712 會自動防止所有重放攻擊。

開發者最佳實務

所有可能改變價值或狀態的鏈下授權,都應包含 Nonce。

除非設計明確需要全域序列,否則應依簽署者個別追蹤 Nonce,而不是採用全域設定。

應在執行前或執行期間遞增 Nonce,或將其標記為已使用,並確保這項機制無法被繞過。

若區塊鏈情境重要,應在簽署網域中加入 Chain ID。

應在簽署網域中加入驗證合約地址。

簽署訊息應包含確切的函式意圖、收款人、金額、代幣、期限及相關參數。

中繼簽章應設定期限或有效時間範圍。

需要平行執行時,應為互不相關的工作流程分開設定 Nonce 空間。

授權被使用或取消時,應發出事件。

部署前,應測試重放嘗試、跨鏈簽章、合約升級、取消操作及執行失敗路徑。

錢包及應用程式最佳實務

使用者簽署前,應顯示區塊鏈、合約、支出者、金額、期限、Nonce 情境及操作類型。

簽章若授予支出權或長期授權,應向使用者發出警告。

錢包驗證應使用新的登入挑戰。

登入後應將驗證挑戰標記為已使用。

避免要求使用者簽署模糊不清或難以閱讀的訊息。

若情況允許,應使用 EIP-712 型別化資料進行結構化簽署。

應以明確的加速及取消選項處理卡住交易的 Nonce。

不要向使用者隱瞞交易取代的行為。

只有在介面能安全說明 Nonce 通道時,才支援帳戶抽象的 Nonce 通道。

應避免使用者簽署舊的、已過期的或鏈別錯誤的請求。

使用者最佳實務

簽署任何訊息或交易前,請先閱讀錢包提示。

簽署前確認區塊鏈。

確認要求簽章的合約或應用程式。

使用 Permit 類型的核准時,確認代幣、支出者、金額及期限。

若簽章內容模糊、授權無上限,或與目前操作無關,請拒絕簽署。

不要簽署來自可疑網域的登入訊息。

不要以為有 Nonce 就代表惡意簽章安全無虞。

若條件允許,大額資產應使用硬體錢包或多重簽章錢包。

適時撤銷不必要的代幣核准。

除非了解待處理交易狀態,否則應謹慎手動設定 Nonce。

Nonce 重放保護在哪些情況下最重要?

當簽章授權資產移動時,Nonce 重放保護最重要。

它對一般區塊鏈交易很重要。

它對 Permit 核准很重要。

它對免 Gas 代幣轉帳很重要。

它對跨鏈橋訊息很重要。

它對治理投票及委託很重要。

它對空投領取及獎勵領取很重要。

它對錢包登入驗證很重要。

它對多重簽章交易及帳戶抽象 UserOperation 很重要。

凡是複製簽章可能造成重複或非預期效果的情境,都需要重放保護。

一句話認識 Nonce 重放保護

Nonce 重放保護是運用唯一、可追蹤且綁定特定情境的 Nonce 值,確保已簽署的加密貨幣交易、訊息或授權,只能在預定的區塊鏈、合約及應用程式情境中執行一次。

常見問題

Nonce 重放保護是什麼意思?

Nonce 重放保護是指透過檢查並消耗唯一 Nonce,防止相同的加密貨幣簽署操作被接受多次。

加密貨幣中的 Nonce 是什麼?

Nonce 是在特定情境中使用一次的數字或唯一值,可讓交易、訊息或授權具備唯一性。

什麼是重放攻擊?

重放攻擊是指有人複製有效的簽署操作,再次提交,以重複執行或濫用該授權。

Ethereum 如何使用 Nonce?

Ethereum 帳戶會使用 Nonce 計數器,確保每個帳戶只能執行一筆具有特定 Nonce 的交易。

什麼是 Chain ID 重放保護?

Chain ID 重放保護會將交易或訊息綁定至特定區塊鏈,降低其在另一條鏈上遭到重複使用的可能性。

EIP-712 會自動阻止重放攻擊嗎?

不會。EIP-712 會為簽署資料建立結構,但應用程式仍需進行 Nonce 檢查、設定期限及正確進行網域分隔。

Permit 為什麼需要 Nonce?

Permit 需要 Nonce,避免相同的代幣核准簽章被重複提交。

Nonce 與期限有什麼差異?

Nonce 可讓簽章只能使用一次,而期限會限制簽章的有效時間。

重放保護能防止網路釣魚嗎?

不能。重放保護可防止重複使用,但若使用者簽署惡意授權,就無法阻止第一次造成傷害的操作。

Nonce 被重複使用時會發生什麼事?

若 Nonce 處理機制正常,第二次使用應會失敗;但若系統設計不完善,重複使用 Nonce 可能造成重放或交易失敗問題。

智能合約為什麼需要自己的 Nonce 檢查?

智能合約需要自行檢查 Nonce,因為一般帳戶 Nonce 不會自動保護鏈下簽章、Permit、領取操作、投票或跨鏈橋訊息。

最安全的重放保護設計是什麼?

最安全的設計會結合簽署者個別 Nonce、Chain ID、驗證合約、確切操作細節、期限、已使用狀態追蹤及謹慎的簽章驗證。

結論

Nonce 重放保護是加密貨幣中重要卻不易察覺的安全基礎。

它可確保有效簽章不會變成可以重複使用的空白支票。

區塊鏈簽章可證明私鑰核准了某則訊息,但不會自動證明該核准是最新的、尚未使用,或只能執行一次。

Nonce 增加了這一層新鮮度保護。

若 Nonce 經過正確檢查及消耗,相同的簽署操作就無法再次執行。

這能保護一般交易、代幣 Permit、免 Gas 轉帳、智能帳戶操作、多重簽章核准、跨鏈橋訊息、治理投票、登入驗證、獎勵領取及許多其他加密貨幣流程。

現代重放保護不只依靠一個計數器。

它通常會結合帳戶 Nonce、合約層級 Nonce、隨機授權 ID、Chain ID、驗證合約地址、期限、有效時間範圍、Nonce 通道及已處理訊息對照表。

每個層級都會處理不同的重放問題。

帳戶 Nonce 可防止同一帳戶在同一條鏈上重複提交交易。

Chain ID 可防止交易被複製到其他區塊鏈。

合約 Nonce 可防止已簽署訊息在應用程式內遭到重複使用。

期限可防止舊簽章無限期有效。

網域分隔可防止簽章被用於錯誤的合約或應用程式。

Nonce 通道可讓智能帳戶支援平行工作流程,同時維持重放保護。

缺少這些控管時,風險相當嚴重。

可被重放的簽章可能耗盡資金、重複核准、重複領取、讓跨鏈橋訊息執行兩次,或扭曲治理結果。

即使已採用 Nonce 保護,若使用者簽署一次惡意授權,仍可能遭受網路釣魚攻擊。

因此,重放保護必須搭配清楚的錢包提示、明確限縮的簽章範圍、完善的合約設計及謹慎的使用者行為。

對開發者而言,原則很簡單。

每一個可能轉移價值或改變重要狀態的簽章,都需要 Nonce、網域及明確的消耗規則。

對錢包而言,原則是在使用者簽署前,清楚顯示其授權內容。

對使用者而言,原則是將每個簽章視為真正的操作,而不是無害的確認。

Nonce 重放保護不會讓加密貨幣變得毫無風險。

它透過確保一項核准只會在指定情境中依預期使用一次,而不會在未來被無限次重放,讓簽署授權能實際運作。
ETF單週失血6.79億,花旗看多BTC至11.3萬!
ETF單週失血6.79億,花旗看多BTC至11.3萬!ETF單週失血6.79億,花旗看多BTC至11.3萬!
機構在賭什麼?