當錢包彈出簽名窗口時,用戶通常確認的是「我想要執行什麼動作」,卻很難保證交易最終「得到什麼結果」。以太坊基金會在10月5日的研究文章中,將這種落差稱為交易結果的不確定性,並討論了一種原生的交易斷言:在交易執行完、狀態真正形成之後,再由鏈上只讀規則來檢查結果;如果結果違反了事先獨立設定的約束,執行就會回滾。該方案仍在設計與討論中,EIP-7906只不過是可能的途徑之一,並未確定會進入升級,更不能說成是已經上線的以太坊主網的新安全功能。
問題為何值得討論?簽名通常會鎖定目標地址、金額和調用數據,但卻不會鎖定執行時的全部合約代碼和鏈上狀態。代理合約可能在簽名後更換實現方式,交易排序可能會改變池子價格,原本看過的模擬結果也可能與真正入塊時不同。智能合約會忠實執行用戶簽下的調用,但卻不會替用戶判斷經濟目標是否達到。基金會舉出的案例包括前端誘導用戶簽署了與預期不同的授權,以及用戶雖然簽訂了正確的訂單卻接受了極差的兌換結果。它們分別屬於「簽名意圖錯位」和「交易結果錯位」,防線不應該混為一談。
透明簽名和模擬為何還不夠
透明簽名能將複雜的調用轉換為人們能理解的動作,從而減少無意識的授權;但它仍然依賴於前端正確解碼、用戶注意到異常,而且主要只能解釋「將請求什麼」。模擬能預測在某個選定的鏈狀態下的結果,卻不能保證稍後入塊時狀態不會變化,也不能阻止簽名環節被惡意軟件替換內容。已有的合約的最小輸出量、錢包守衛等機制確實能在執行中檢查特定條件,但需要事先知道應該觀察哪一項狀態,未必能看到整筆交易造成的所有淨變化。新方案想要補充的就是這個觀察範圍,而不是宣告舊的防線沒有價值。
基金會所设想的原生斷言,是將一條只讀規則與交易動作一起簽入。動作執行後,斷言會比對交易前後的餘額、儲存、代碼和事件等淨變化。如果收款低於最低值、花費超過上限、新增了不被允許的授權,或者錢包控制邏輯被修改,規則可以令執行回滾。這裡的關鍵不僅在於「多一個判斷語句」,還在於判斷發生在真正執行結果出現之後,並且能夠看到過去普通合約不易統一訪問的狀態差異。對於自動化交易、受托代理或複雜路由,用戶可以把結果上限定得比「相信前端顯示」更明確。
EIP-7906 提出的技術路線建立在 EIP-8141 框架交易之上,在交易結尾增加一個只讀的 POST_TX 阶段,通過新的指令來枚舉淨狀態變化、读取特定的存儲差異與事件數據。該方案目前僅被列為升級的考慮對象,尚未最終確認。即便未來採用,該提案也不會強制每筆交易都要包含斷言;錢包和協議必須主動要求這些斷言。如果惡意前端同時掌握交易構造和斷言文本,它就可以寫出允許攻擊發生的規則,從而安全性的保障就會落空。真正可靠的約束應該來自於獨立確認的用戶意圖、錢包的長期政策,或是被調用協議的強制要求。
這也解釋了為何「交易失敗仍需支付手續費」並非設計上的缺陷。如果斷言不通過,執行動作會回滾,但交易仍會在區塊中留下失敗狀態,支付者仍需承擔已消耗的 Gas。否則攻擊者就可以免費地讓區塊建構者反複執行昂貴且注定會失敗的交易。對於用戶而言,這意味著斷言降低的是不希望的狀態變更風險,而非讓所有失敗的嘗試都沒有成本。對於協議而言,如果要強制保護,還必須拒絕那些沒有指定斷言的普通交易;已經部署且不可升級的合約未必能補上這一層檢查。
安全收益取決於規則是由誰來制定。
交易斷言最容易被誤解為一個萬能的「後悔按鈕」。它只能檢查一筆交易、一個網絡內的結果,無法覆蓋跨鏈路由的全部結算,也不能保證規則本身正確。舉例來說,用戶設定了最低兌換量,仍可能因為市場太薄而交易失敗;設定了允許的合約清單,也需有人維護清單並理解升級風險。基金會指出,某些代理執行場景可以先限制代理能調用什麼、最多花多少,再使用斷言來限制最終狀態;兩層約束相互補充。如果用戶根本不知道自己願意接受的價格區間,鏈上規則亦無法替他作出經濟判斷。
基金會目前邀請錢包和協議團隊參與設計,文章談的是如何填補風險控制上的空白,而非正式激活公告。對讀者來說,短期實用的做法仍是審查簽名內容、設定合理的滑點與限額、提防不明授權,並注意模擬只是一張當時狀態的快照。長期來看,如果原生斷言能形成兼容的錢包、合約和標準,交易保護可能從「看懂請求」延伸到「保證結果不越界」。但在提案確認、實現審計和實際部署之前,它仍是一項研究方向,而不是已經為所有以太坊用戶安裝的保險。
這項研究也為錢包產品提出了一個比新指令更難的問題:如何讓普通人理解他們所授權的「結果範圍」。如果界面只顯示一長串合約地址和存儲槽,用戶無法獨立確認規則是否正確;如果界面將規則簡化得過頭,又可能遺漏關鍵的例外情況。真正可行的方案需要將用戶能理解的預算、最低收款金額和允許的操作,與機器能嚴格執行的狀態檢查對應起來,還要能解釋失敗的原因。安全機制是否能進入大眾錢包,最終取決於這種「翻譯」是否可信,而非提案編號本身。












