什麼是 ERC-677:讓智慧合約互動更簡易

重點總結
• ERC-677 透過 transferAndCall 函式簡化了代幣轉移與合約呼叫的流程。
• 此標準消除了傳統 ERC-20 的兩步驟操作,減少了 Gas 費用和使用者出錯的機率。
• ERC-677 在質押、DEX 流程及跨鏈互通性等場景中具有廣泛應用潛力。
• 開發者需注意安全性問題,如重入攻擊及驗證代幣來源,以確保合約的安全性。
智慧合約驅動著 EVM 鏈上幾乎所有有意義的互動,從代幣交換、質押,到資產跨鏈和觸發預言機更新。然而,基礎的 ERC-20 代幣標準經常需要多步驟的使用者體驗模式,例如「批准」(approve) 後再「呼叫」(call),這會增加摩擦、消耗更多 Gas,並提高使用者出錯的機率。ERC-677 是一個對 ERC-20 的務實擴展,它透過將代幣轉移與即時合約呼叫結合,來簡化這些流程。
本文將解釋 ERC-677 是什麼、它的運作方式、它的適用場景,以及開發者和使用者在 2025 年應該注意什麼。
僅使用 ERC-20 的問題
ERC-20 定義了一個簡單的標準化介面,用於處理同質化代幣——轉移 (transfer)、批准 (approve) 和從 (transferFrom)。這種簡單性幫助 ERC-20 成為 DeFi 和穩定幣的基石,但也迫使常見的工作流程需要兩個交易:
- 批准支出方 (approve spender)
 - 呼叫協議合約 (call the protocol contract) (然後該合約執行 transferFrom)
 
這種兩步驟模式:
- 增加了交易數量和 Gas 費用。
 - 造成了使用者體驗的摩擦和混亂。
 - 可能引入批准的競爭條件和殘留的授權。請參閱 OpenZeppelin 的指南,了解如何調整授權以減輕與 approve 語義相關的問題。OpenZeppelin ERC-20 授權建議
 
關於 ERC-20 本身的背景,請參閱 Ethereum.org 的文件。ERC-20 標準概述
ERC-677 的新增功能
ERC-677 透過一個關鍵函式 transferAndCall 來擴展 ERC-20。在單一交易中,代幣被轉移到一個接收者合約,並立即在該接收者上調用一個預定義的回調函式(通常是 onTokenTransfer),並附帶任意數據。
高層次流程:
- 使用者對 ERC-677 代幣簽署 
transferAndCall。 - 代幣合約將代幣轉移給接收者。
 - 代幣合約呼叫 
recipient.onTokenTransfer(sender, amount, data)。 - 接收者合約執行邏輯——例如,存款、質押、交換或觸發預言機。
 
這種模式無需單獨的批准步驟,並允許合約立即對接收到的代幣做出反應。
Chainlink 的 LINK 代幣是一個知名的 ERC-677 實現,其設計目的是讓合約能夠立即對 LINK 代幣的轉移做出反應,以支付預言機服務和相關互動費用。 Chainlink LINK 代幣與 ERC-677
典型用途
- 質押和金庫存款:使用者一次交易即可完成存款,金庫在回調中處理該存款。
 - DEX 和流動性流程:協議可以直接接收代幣並執行交換或添加流動性的邏輯。
 - 預言機和服務支付:將代幣轉移到服務合約,並在同一呼叫中觸發使用或計費。這就是 LINK ERC-677 如何實現順暢的預言機支付。 Chainlink LINK 代幣與 ERC-677
 - 橋接和跨鏈協議:將代幣交付與用於橋接或訊息傳遞的指令負載結合。
 - 跨鏈互通性:隨著跨鏈使用的增長,結合價值轉移和執行變得非常有用。Chainlink CCIP 的設計說明了跨網路可程式化代幣流動日益增長的需求。 什麼是 CCIP
 
ERC-677 與替代方案的比較
- 
ERC-1363(類似
transferAndCall的「可支付代幣」):目標類似——允許合約在接收代幣時做出反應,並提供用於支出和批准流程的標準化回調。適用於類似支付的體驗。 ERC-1363 規格 - 
ERC-777(基於掛鉤的代幣):提供更豐富的代幣語義和接收者掛鉤。功能強大,但歷史上帶來了更多複雜性和重入風險(如果接收者設計不當)。 ERC-777 規格
 - 
EIP-2612(
permit)和 Permit2:專注於透過簽名訊息實現無 Gas 的批准,減少了對 approve 交易的需求。對 DEX 和錢包非常有用,但通常仍然需要隨後的合約呼叫。ERC-677 透過捆綁轉移和執行來減少使用者步驟。 EIP-2612 permit, Uniswap Permit2 - 
帳戶抽象 (EIP-4337):允許錢包和支付者捆綁多個操作並贊助 Gas,從而改善使用者體驗。ERC-677 透過進一步減少協議端的步驟來補充 AA。 EIP-4337 帳戶抽象
 
簡而言之:permit 和 AA 從錢包端減少了摩擦;ERC-677 透過讓代幣轉移本身觸發智慧合約邏輯來減少摩擦。
開發者考量與安全性
對於接收代幣時的回調,謹慎至關重要:
- 
重入(Reentrancy):代幣合約會調用接收者的邏輯。如果接收者隨後又調用代幣或其他外部合約,可能會引入重入漏洞。在適當的地方使用「檢查-效果-互動」或防護模式。 SWC-107 重入, OpenZeppelin ReentrancyGuard
 - 
驗證發送者和代幣:確保接收者合約檢查
msg.sender是否等於受信任的代幣合約,並在支援多種代幣時驗證代幣地址。 - 
白名單:對於回調可以執行敏感操作的代幣,考慮將允許的接收者合約列入白名單(或驗證介面)。
 - 
事件設計:發射豐富的事件有助於索引和分析。在可行時,與 ERC-677 特定的數據一起維護 ERC-20 的
Transfer事件,以確保工具的相容性。 - 
備用安全:如果接收者未實現預期的回調,則轉移應回滾或遵循安全的、明確的失敗路徑,以避免「靜默」的功能喪失。
 - 
Gas 和失敗模式:回調可能會回滾;請使用清晰的錯誤訊息處理失敗,並確保使用者了解轉移是否成功,或整個交易是否回滾。
 
關於一般智慧合約安全,Solidity 文件中的安全考量仍然是必讀內容。 Solidity 安全考量
錢包使用者體驗:為什麼這對使用者很重要
透過移除「批准後呼叫」的順序,ERC-677 可以讓複雜的互動感覺像是一個單一、有目的的動作。這可以減少簽名疲勞,降低認知負擔,並常常節省 Gas。然而,單一交易更為複雜:你同時在轉移代幣和執行合約邏輯。這要求錢包提供清晰的預覽、模擬和可讀的呼叫數據。
如果您是一位注重安全的使用者,正在與使用 ERC-677 的協議互動,使用支援顯示人類可讀函數名稱、參數和預計價值變更的硬體錢包,可以幫助您自信地簽署。
2025 年的背景:採用與組合性
在 2025 年,將價值轉移與意圖執行捆綁的趨勢將持續下去:
- 越來越多的協議偏好「一鍵式」存款、交換或服務支付,這些操作感覺更原生,並減少了批准的雜亂。
 - 跨鏈框架強調可程式化的代幣移動和訊息負載——ERC-677 類似的語義與這些架構非常契合。看看 CCIP 如何為跨鏈用例的形式化可程式化訊息和代幣轉移。 什麼是 CCIP
 
預計錢包和中間件將提供更多支援,用於模擬回調流程、揭示風險,並提供易於理解的提示,從而使組合的轉移和執行操作更安全。
最小介面草圖
概念上,ERC-677 如下所示(實作可能略有不同):
interface IERC677 {
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
    event Transfer([address](https://onekey.so/blog/zh-HK/ecosystem/what-is-a-crypto-wallet-address/) indexed from, [address](https://onekey.so/blog/zh-HK/ecosystem/what-is-a-crypto-wallet-address/) indexed to, uint256 value, bytes data);
}
interface IERC677Receiver {
    function onTokenTransfer([address](https://onekey.so/blog/zh-HK/ecosystem/what-is-a-crypto-wallet-address/) sender, uint256 value, bytes calldata data) external;
}
代幣合約在轉移價值後立即在接收者上調用 onTokenTransfer,允許接收者在單一交易中做出反應。
實用技巧
- 對於協議開發者:清楚地記錄預期的回調介面和回滾原因。在適用的情況下,發布允許列表或介面檢查,以便整合者可以驗證行為。
 - 對於整合者:模擬 
transferAndCall以預覽回調後的狀態變更。向使用者標記有風險的接收者或未知的回調。 - 對於使用者:偏好信任的協議並檢查交易預覽。如果您的錢包支援可讀解碼,請花點時間審查傳遞給回調的參數。
 
您應該使用 ERC-677 嗎?
當您需要以下情況時,請使用 ERC-677:
- 您希望為核心使用者流程消除「批准 + 呼叫」模式。
 - 協議受益於對接收代幣的即時、原子反應。
 - 您可以加固接收者回調以抵抗重入,並徹底驗證代幣來源。
 
如果您的用例純粹是圍繞批准(例如,允許 DEX 稍後支出代幣),EIP-2612 或 Permit2 可能就足夠了。如果您需要在許多接收者之間獲得更豐富的回調語義,請評估 ERC-777,但要留意其複雜性。
給 OneKey 使用者的說明
ERC-677 交易結合了代幣轉移和合約呼叫。簽署時,能夠確切看到將執行哪個函式以及使用哪些參數會很有幫助。OneKey 的開源方法和 EVM 支援旨在提供透明的呼叫預覽和可靠的簽名,用於 transferAndCall 等高級互動,以便進階使用者在享受簡化使用者體驗的同時,能維持強大的安全性。
透過理解 ERC-677 並使用能夠清晰顯示交易細節的錢包,您可以安全地受益於更簡單、單一交易的智慧合約互動。






