﻿---
title: "跨鏈訊息重播保護"
description: "跨鏈重播保護會把經過驗證的來源訊息綁定至一個協定版本和目的域，並允許重試，同時確保成功的經濟效果最多發生一次。"
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>

## 直接答案

跨鏈訊息重播保護確保一則經過驗證的來源訊息，在預期目的域中最多產生一次成功的經濟效果。中繼者可以重複遞交同一證明，失敗的嘗試也可能允許重試，但已完成的訊息不得再次鑄幣、解鎖資產或呼叫接收方。

真實性、最終性與重播保護是三項獨立檢查。有效簽章、驗證者證明或儲存證明可以驗證資料，卻不一定證明來源事件已達最終性、預期目的地及接收方已經綁定，或目的端尚未處理該訊息。同樣，獲授權中繼者只是一條傳遞路徑；中繼者身分不能取代訊息驗證。

跨鏈系統不存在通用的 `messageId`。具體協定規範決定序列化與訊息身分。穩健的訊息封套通常綁定協定及版本、來源域及訊息器或發出者、來源傳送方、nonce 或來源交易/日誌身分、目的域及接收方、價值、負載和任何到期時間。Wormhole、CCTP、Optimism 與 ERC-5164 使用不同欄位和狀態機，其識別碼不可互換。

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

## 運作方式

來源操作發出或儲存訊息。達到所要求的確認或最終性政策後，驗證者、守護者或證明系統對其驗證。在目的端，驗證器檢查相關根或簽章集合、協定版本、可信遠端傳送方、目的地、接收方、負載及時間界限。接收方衍生協定規定的身分，並在產生外部效果前查詢持久化的已處理狀態。

傳遞通常是至少一次，而期望的業務效果是實際一次。實用狀態機應區分從未嘗試、處理中、失敗或可重試，以及成功或已消耗。目的地呼叫失敗並不自動構成重播攻擊。例如 ERC-5164 要求訊息成功執行最多一次，同時允許失敗後再次嘗試。具體產品的重試規則、Gas 處理和價值帳務仍起決定作用。

重播旗標或處理鎖應在不可信外部呼叫前建立，並控制重入。如果整筆交易回復，該狀態變更通常也會回復，從而留下明確的重試路徑；如果協定有意捕捉下游失敗，就必須記錄獨立的失敗狀態，且不得意外保留部分價值或效果。若下游系統還能經由其他路徑呼叫，接收方也應具備冪等性。

nonce 的作用域很重要。順序 nonce 強制執行次序，卻可能因一則缺失訊息阻塞後續所有訊息。無序 nonce 或位元圖允許獨立傳遞，但要求準確計算字和位元。批次設計必須說明整個批次是否具原子性，或每個葉節點是否具有獨立證明及已處理狀態。部分執行後僅把批次根標為已消耗，可能重複已成功的葉節點，也可能讓失敗葉節點永久擱置。

來源鏈重組政策也是重播安全的一部分。在充分最終性之前簽署的觀察，即使來源事件日後變成非標準紀錄，仍可能在密碼學上有效。升級是另一項邊界：代理儲存配置、已處理對應表、版本域、舊入口、對端輪替以及分叉或 chain ID 重複使用，都必須保留或刻意使舊身分失效，且不能重新開放已消耗訊息。

採用以下流程：

1. 固定協定、部署版本、來源域和目的域、可信訊息器或發出者、傳送方、接收方、價值、負載、nonce 或事件身分，以及到期語意。
2. 重現規範規定的標準編碼與 `messageId` 測試向量；拒絕歧義串接、欄位遺漏和從其他跨鏈橋借用的假設。
3. 核驗來源端納入及所要求的最終性或確認政策，再核驗正確的證明根、簽章法定人數、驗證者或守護者集合和版本。
4. 獨立核驗目的地、接收方、跨域傳送方、價值、負載及到期時間；把提交訊息的中繼者視為傳輸層，而不是授權主體。
5. 讀取持久化訊息狀態，並在任何不可信外部呼叫前進入處理中或已消耗狀態，同時配置重入保護，並明確測試交易回復行為。
6. 定義成功、失敗和可重試狀態轉換，順序或位元圖 nonce 行為、批次原子性及價值帳務；證明重複傳遞不能重複已成功葉節點的效果。
7. 測試升級、儲存遷移、已停用的舊入口、對端輪替、分叉及緊急復原，再核對收據、事件、已處理狀態和目的端餘額。

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

## 範例

- **目的域綁定。** 兩則指示都帶有 nonce `42` 和價值 `1,000`，但一則以鏈 `10` 為目的地，另一則以鏈 `8453` 為目的地。遺漏目的地的識別碼會把 `2 messages` 視為一個潛在衝突；綁定目的地的標準編碼則產生 `2 distinct IDs`。實際雜湊函式和域表示必須遵循協定。
- **無序位元圖。** 對 nonce `513`，`word = floor(513 / 256) = 2`、`bit = 513 mod 256 = 1`，且 `mask = 1 << 1 = 2`。首次成功將位元圖字 `2` 從 `0` 改為 `2`。重複訊息發現 `2 & 2 = 2`，因此遭拒；nonce `512` 則獨立使用位元 `0`。
- **重試不等於第二次效果。** 同一則經過驗證的訊息被傳遞 `3` 次。目的地呼叫使用 `110,000` 和 `125,000` Gas 時失敗並回復；第三次使用 `140,000` Gas 並成功一次。總 Gas 為 `110,000 + 125,000 + 140,000 = 375,000`；以 `20 gwei` 計為 `0.0075 ETH`。傳遞次數是 `3`，但成功業務效果次數是 `1`。
- **部分批次帳務。** 四個可獨立執行的葉節點分別攜帶 `25 + 40 + 15 + 20 = 100` 單位。葉節點 `0`、`1` 和 `3` 成功，合計 `25 + 40 + 20 = 85`；葉節點 `2` 失敗，留下 `15` 待處理。僅消耗批次根會使這 `15` 永久擱置；若無葉節點狀態便重試整個批次，則可能重複這 `85`。應依規範採用原子回復或逐葉已處理狀態。

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

## 風險

- 識別碼遺漏目的鏈或目的域。
- 識別碼遺漏來源訊息器或發出者。
- 域中缺少協定或訊息版本。
- nonce 命名空間在傳送方或部署間衝突。
- 歧義緊密編碼導致不同欄位組合發生衝突。
- 分叉或重複使用的 chain ID 使舊域再次有效。
- 來源事件在充分最終性前被接受，之後又遭重組移除。
- 接受了錯誤的證明根、驗證者集合或守護者集合。
- 升級後舊簽章域仍然有效。
- 代理儲存損壞導致已處理訊息狀態重設或混疊。
- 遷移遺漏已消耗訊息，或仍保留舊入口。
- 僅在外部呼叫後標記狀態，造成重入。
- 失敗呼叫被標為成功，因而永遠無法重試。
- 成功呼叫未持久化，重複產生經濟效果。
- 一個缺失的順序 nonce 阻塞後續所有訊息。
- 位元圖字、位元或失效計算錯誤。
- 批次根狀態與逐葉部分執行衝突。
- 重試重複執行已經成功的葉節點。
- 截止時間、到期時間或目的端時鐘單位被誤讀。
- 把中繼者允許清單誤認為訊息授權。

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

## 常見迷思

- **nonce 本身在全域唯一。** 其命名空間取決於傳送方、協定、部署以及來源域和目的域。
- **只有獲授權中繼者才能防止重播。** 中繼者負責傳遞；目的端驗證及持久化消耗狀態負責執行授權和重播控制。
- **每次重複傳遞都是攻擊。** 至少一次網路可能重試失敗訊息；不變量是成功效果最多發生一次。
- **有效證明或簽章可以證明最終性與意圖。** 它可能遺漏預期目的地、綁定錯誤版本，或證明日後遭重組的來源狀態。
- **跨鏈橋交易成功就證明恰好完成一次。** 應核驗收據狀態、已處理儲存、接收方事件和實際餘額，包括批次中的每個葉節點。

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

## 相關主題

- [跨鏈橋](/zh-tw/crypto/cross-chain-bridge/)
- [標準跨鏈橋](/zh-tw/crypto/canonical-bridge/)
- [跨鏈中繼者失效](/zh-tw/crypto/bridge-relayer-liveness-risk/)

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

## 來源

- [ERC-5164: Cross-Chain Execution](https://eips.ethereum.org/EIPS/eip-5164) - Ethereum Improvement Proposals（查閱日期：2026-08-13）
- [EIP-712: Typed structured data hashing and signing](https://eips.ethereum.org/EIPS/eip-712) - Ethereum Improvement Proposals（查閱日期：2026-08-13）
- [CCTP Technical Guide](https://developers.circle.com/cctp/references/technical-guide) - Circle Developers（查閱日期：2026-08-13）
- [Interop message passing overview](https://docs.optimism.io/app-developers/guides/interoperability/message-passing) - Optimism Documentation（查閱日期：2026-08-13）
- [VAAs](https://docs.wormhole.com/protocol/infrastructure/vaas/) - Wormhole Docs（查閱日期：2026-08-13）
- [Security Considerations](https://docs.soliditylang.org/en/latest/security-considerations.html) - Solidity Documentation（查閱日期：2026-08-13）
- [Proof-of-stake (PoS)](https://ethereum.org/developers/docs/consensus-mechanisms/pos/) - ethereum.org（查閱日期：2026-08-13）
- [Upgrading smart contracts](https://docs.openzeppelin.com/contracts/5.x/learn/upgrading-smart-contracts) - OpenZeppelin Docs（查閱日期：2026-08-13）

Source: https://wiki.fcontext.com/zh-tw/crypto/bridge-message-replay-protection/index.mdx
