
同一筆跨鏈提款換一種簽名編碼再提交應(yīng)該被當(dāng)成第二筆業(yè)務(wù)嗎顯然不應(yīng)該。但如果接收端用簽名字節(jié)的哈希充當(dāng)“已消費(fèi)”索引業(yè)務(wù)身份就會(huì)被密碼學(xué)包裝牽著走。即使簽名庫(kù)正確處理了編碼消息的域、目標(biāo)和唯一編號(hào)仍需要單獨(dú)設(shè)計(jì)。EIP-712 提供結(jié)構(gòu)化消息與域隔離的規(guī)則同時(shí)明確它本身不包含重放保護(hù)。因此“采用了 typed data”不是跨鏈橋防雙花的完成條件。規(guī)范消息鍵應(yīng)覆蓋業(yè)務(wù)意圖一個(gè)提款消息通常需要綁定源鏈、目標(biāo)鏈、源端合約、目標(biāo)接收器、業(yè)務(wù) nonce、資產(chǎn)、金額和接收人。具體字段由協(xié)議決定但不能只綁定其中一部分再讓調(diào)用者自由替換其他字段。唯一性還必須說(shuō)明作用域同一個(gè)源發(fā)送者的 nonce不能和另一發(fā)送者混為一談。簽名是否由可信主體產(chǎn)生消息是否對(duì)應(yīng)已最終確認(rèn)的源鏈?zhǔn)录约跋⑹欠癖幌M(fèi)是三個(gè)獨(dú)立問(wèn)題。多簽、輕客戶(hù)端或 ZK 證明各自解決不同的認(rèn)證問(wèn)題不該都被一個(gè)verify()布爾值掩蓋。本地演示改變包裝不改變消費(fèi)記錄下面使用規(guī)范化 JSON 和 SHA-256 演示“業(yè)務(wù)字段決定消息身份”。這是應(yīng)用層身份示例不是 Solidity ABI 編碼、EIP-712 哈希、Keccak 或真實(shí)簽名驗(yàn)證器。不要把輸出拿去當(dāng)鏈上兼容簽名摘要。import hashlib import json FIELDS {src, dst, sender, receiver, nonce, asset, amount, to} used set() def message_id(message): if set(message) ! FIELDS: raise ValueError(missing or unexpected business fields) raw json.dumps(message, sort_keysTrue, separators(,, :)).encode() return hashlib.sha256(raw).hexdigest() def consume_after_authentication(message): key message_id(message) if key in used: return REPLAY used.add(key) return PROCESSED m dict(src1, dst2, senderbridge-A, receiverbridge-B, nonce7, assettoken-X, amount50, toalice) assert consume_after_authentication(m) PROCESSED # Different signature wrappers would still pass the same authenticated message. assert consume_after_authentication(dict(m)) REPLAY assert message_id(dict(m, dst3)) ! message_id(m) assert message_id(dict(m, senderbridge-C)) ! message_id(m) print(4 identity cases checked; authentication is not implemented)保存為replay.py并運(yùn)行python3 replay.py。函數(shù)名里的after_authentication是調(diào)用前提不是認(rèn)證實(shí)現(xiàn)。真實(shí)接收器需要在認(rèn)證成功后、外部調(diào)用前按正確的重入防護(hù)和事務(wù)語(yǔ)義消費(fèi)消息進(jìn)程內(nèi)的set既沒(méi)有持久化也沒(méi)有并發(fā)原子性。映射升級(jí)也會(huì)改變消息的含義源資產(chǎn)到目標(biāo)資產(chǎn)的映射如果可被管理者隨意改寫(xiě)舊消息可能在新配置下解釋成另一種資產(chǎn)。協(xié)議應(yīng)說(shuō)明消息綁定映射版本還是讀取當(dāng)前配置升級(jí)如何影響排隊(duì)中的提款取消與退款由誰(shuí)處理。時(shí)間鎖能為危險(xiǎn)變更提供觀(guān)察窗口但不能證明新映射正確。OpenZeppelin 文檔也將提案者和執(zhí)行者分開(kāi)強(qiáng)調(diào)延遲給用戶(hù)留下審閱與退出機(jī)會(huì)。訪(fǎng)問(wèn)控制與延遲本文沒(méi)有復(fù)現(xiàn)任何頭部橋的真實(shí)漏洞也沒(méi)有調(diào)用模型或驗(yàn)證器。代碼驗(yàn)證的是四個(gè)消息身份用例可信根、密碼學(xué)簽名、源鏈最終性和跨鏈執(zhí)行仍未集成。一個(gè)可靠的防重放設(shè)計(jì)應(yīng)能明確回答“這是誰(shuí)的哪一條業(yè)務(wù)消息”而不只回答“這串簽名以前見(jiàn)過(guò)沒(méi)有”。