EIP-7702 委託可讓外部擁有帳戶(EOA)在不變更地址或交出私鑰的情況下,將其執行邏輯交由另一份合約處理。程式碼欄位會設為 0xef0100 加上受託地址,後續呼叫會在 EOA 自身的上下文中執行該程式碼,而餘額、Nonce 與儲存空間仍屬於該帳戶。
本文適合已了解自託管錢包與 EVM 帳戶模型的讀者。Ethereum 長期以來有兩類帳戶:由私鑰控制的 EOA,以及包含程式碼的合約帳戶;只有後者可以承載自訂驗證邏輯,但代價是必須使用新地址。此功能隨 Pectra 升級推出,將自訂驗證從建立新帳戶,改為在既有使用中的地址上寫入程式碼。
一個授權元組包含 6 個欄位,而委託指示器占用 23 位元組:3 位元組前綴加上 20 位元組地址。寫入路徑、新能力的限制、與 ERC-4337 的區隔,以及受託方是否可信,將決定帳戶在簽署後可保留多少控制權。
EIP-7702 委託會保留地址、私鑰、餘額與 Nonce,僅將程式碼欄位指向受託合約。
類型 0x04 交易會透過授權元組寫入委託;簽署訊息不包含費用欄位,且交易發送者不必是帳戶擁有人。
委託沒有到期日;撤銷會清除程式碼,但不會清除儲存空間、代幣授權或 Permit 簽名。
若受託合約未實作 receive() 或 fallback(),一般 ETH 轉帳將會回復,而 tx.origin 也不再代表帳戶沒有程式碼。
ERC-4337 建立獨立的帳戶系統,而 EIP-7702 則為既有 EOA 新增程式碼,因此兩者可以搭配使用。
Ethereum 有兩類帳戶:由私鑰控制的外部擁有帳戶,以及包含程式碼的合約帳戶。
使用 EIP-7702 後,改變的是程式碼欄位,而非帳戶身分。這是因為 EOA 可以暫時指向合約程式碼,而無須變更其地址。地址、私鑰、餘額與 Nonce 都維持原狀;差別在於,該地址現在帶有從另一份已部署合約取得的可執行程式碼。
該欄位包含一個 23 位元組的委託指示器:0xef0100 前綴加上 20 位元組地址。當呼叫以該 EOA 為目標時,EVM 會讀取此指示器並載入受託方的程式碼。因此,帳戶可以表現得像智慧帳戶,同時仍由私鑰控制,且發送者、餘額與儲存空間皆會以 EOA 身分讀取。
受託方無法存取自身狀態;其執行邏輯會從目標合約載入,但儲存空間與發送者上下文仍屬於 EOA,寫入操作也會依相同邏輯寫入 EOA 原本未使用過的儲存空間。
簽名仍由原始私鑰產生,因此帳戶不會變成多簽錢包。此設計是朝向帳戶抽象化邁進的一步,包括原生帳戶抽象化,而非改變帳戶類型。
寫入委託需要新的交易類型 0x04,其交易內容包含授權清單;每個元組均由帳戶持有人簽署,但交易本身可以由任何地址發送與支付費用,而授權會指定帳戶允許執行哪一份程式碼。
元組為 [chain_id, address, nonce, y_parity, r, s],簽署訊息為 keccak(0x05 || rlp([chain_id, address, nonce]));EIP-7702 規格使用 0x05 前綴,將授權簽名與一般交易簽名區隔開來,且該訊息不包含 Gas 或費用欄位。
簽署的內容是程式碼應指向哪個地址,而非某筆特定交易,因此有些系統會改為將授權與意圖搭配使用。帳戶也可以離線簽署一次,再由贊助方預先支付 Gas。
節點驗證分為 6 個步驟,其中 Nonce 綁定會使一項授權只能在對應 Nonce 下使用一次。
授權清單會如同存取清單擴展交易格式般納入交易內容:鏈 ID 為 0 或與本地鏈相符(0 代表可在任何鏈上有效);Nonce 小於 2^64–1;ecrecover 驗證簽名;帳戶程式碼為空或已經委託;Nonce 與目前數值相符;最後將程式碼寫為 0xef0100 || address,並遞增 Nonce。
撤銷會沿用相同流程,僅需將地址設為零,即可清除程式碼雜湊,而不會對底層 EOA 造成永久狀態變更。
4 項屬性會維持原狀,只有程式碼與儲存空間會改變:程式碼會從 0x 變為指示器,未使用的儲存空間槽位開始接受寫入,而這些數值在撤銷後仍會保留。規格另外列出 3 項不再成立的鏈上不變條件,涵蓋餘額、Nonce 與呼叫者身分;相關風險將於後文說明。
地址:維持不變,因此歷史紀錄、代幣授權與名稱記錄仍會指向同一地址。
私鑰:維持不變,且可簽署一般交易,以及用於覆寫或撤銷委託的新授權。
餘額:維持不變,因為委託不會移轉任何資產,帳戶仍直接持有資產。
Nonce:持續遞增,因為授權會消耗一個 Nonce,從而防止相同簽名遭重放。
預設不行。帳戶一旦帶有程式碼,一般 ETH 轉帳便會進入程式碼執行路徑;若受託方未實作 receive() 或 fallback(),轉帳將會回復,資金也會退回發送者。
此問題可能出現在交易所提現、薪資發放與空投等常見付款流程中。錢包軟體通常只會回報失敗,而不會指出原因在於受託方。簽署前,請確認目標已實作接收函式,或透過包含 calldata 的呼叫接收款項;錢包軟體也應更清楚地向使用者提示此原因。

圖 1。EIP-7702 寫入路徑:EOA 簽署授權元組,類型 0x04 交易將程式碼設為 0xef0100 加上受託地址,後續呼叫則在 EOA 的上下文中執行該程式碼。
委託可讓原本只能簽署交易的 EOA,對日常使用者而言表現得像智慧帳戶,其中最明顯的優勢包括批次處理、Gas 贊助與基於規則的復原。
批次處理是最具體的優勢:授權與兌換可以在單筆交易中完成。贊助方也可以透過在適當時機於背景協助完成多個步驟,簡化新用戶導入或批次操作,因此一次簽名即可一次結算,中間不會留下未使用的授權。
Gas 贊助來自將簽名與發送者分離:第三方支付費用,帳戶無須預先持有 ETH;搭配 ERC-4337 Paymaster 時,費用可由應用程式承擔。這也代表某些應用程式可在背景處理 Gas 或簡化新用戶導入,但開發者應避免在使用者僅是要求使用其他功能時提示其進行委託。
復原與工作階段金鑰仰賴受託方自行驗證簽名,例如以 Passkey、監護人集合或支出限額取代單一金鑰。受託方也可以針對轉帳或簽署者使用情況執行類似政策的功能。
界線很明確:持有私鑰的人始終可以簽署新的授權以覆寫委託,因此此處的復原能力弱於原生智慧帳戶,僅能降低遺失金鑰所造成的成本。
委託沒有到期日。它會持續有效,直到新的授權覆寫它,或以零地址撤銷為止,因此此權限具有長期效力,且需要主動管理。從安全角度來看,請檢視受託程式碼能夠存取及控制的範圍。
EIP-7702 會為既有 EOA 新增程式碼,而 ERC-4337 則建立獨立的帳戶系統。兩者皆為帳戶抽象化的互補方式,可以疊加使用,而非彼此取代。
| 面向 | EIP-7702 委託 | ERC-4337 智慧帳戶 |
|---|---|---|
| 地址來源 | 重複使用既有 EOA 地址 | 新部署的合約,由工廠合約與 Salt 設定 |
| 程式碼載體 | 程式碼欄位中的 23 位元組指示器 | 帳戶合約自身的位元組碼 |
| 與 EntryPoint 的關係 | 無;由一般交易執行 | 透過 EntryPoint 打包的 UserOperations 執行 |
| 遷移成本 | 無;一次授權即可 | 部署後再移轉資產與授權 |
| 簽署流程 | 金鑰簽署元組;任何人皆可發送 | 合約中的自訂驗證,由 Bundler 打包 |
ERC-4337 從新部署的合約開始,因此資產與授權需要跨地址移轉;7702 則從原始地址開始並新增程式碼,使既有帳戶無須先部署獨立錢包,即可使用智慧合約行為,從而避免遷移。
兩者搭配時,可讓 7702 帳戶作為 ERC-4337 的帳戶實作,開發者也能在經 7702 委託的帳戶上建立相容於 4337 的流程。這會重新引入初始化競爭問題:在委託上鏈與初始化完成之間,任何人都可以呼叫初始化函式並將自己設為擁有人。
有兩種解法:initWithSig,將簽名綁定至初始化參數;或限制僅能由 EntryPoint 進行初始化。
僅應委託給使用標準 CREATE2 initcode 部署的不可變合約;驗證機制應優先選擇沒有升級路徑的目標,因為代理合約、可升級合約,以及具有自毀路徑的合約,都不是理想的委託目標。
委託會將執行權限交給該程式碼,持有人不會收到任何變更通知。可升級目標代表升級者對所有委託給它的帳戶都握有執行權限;不可變目標至少能預先固定攻擊面,使其可接受審計。若受託程式碼可在授權後變更,安全風險就會提高。
不可變程式碼、無代理與可重現部署這 3 項條件,會在區塊鏈瀏覽器中轉化為錢包與開發者在授予委託前應驗證的 4 項檢查:
讀取實作與管理員槽位:以 0x360894 開頭的非零 EIP-1967 槽位,代表存在代理或升級路徑。
將鏈上位元組碼與已驗證原始碼比較,確認建構函式參數與已部署位元組碼相符。
搜尋 selfdestruct 與 delegatecall,確認不存在可清除程式碼或將執行轉送至其他位置的分支。
依 initcode 與 Salt 重新計算 CREATE2 地址,確認部署者無法在不同地址替換為另一份合約。
風險主要存在於 3 個面向:受託方的錯誤、委託改變的帳戶語意,以及一次性簽名的不可逆性。這不僅是功能升級,也是一種安全取捨;主要問題在於,一旦授權,程式碼可控制帳戶的範圍相當廣泛。
| 風險 | 觸發條件 | 後果與應對方式 |
|---|---|---|
| 受託方存在錯誤 | 任意呼叫或提款路徑 | 資產可能被抽走;僅委託給經審計的合約 |
| 一般轉帳回復 | 沒有 receive() 或 fallback() | ETH 流入失敗;透過 calldata 呼叫傳送款項 |
| 儲存空間衝突 | 不同實作在不同時間使用 | 舊儲存資料被錯誤讀取;切換前檢查槽位配置 |
| chain_id 設為 0 | 簽署時將鏈 ID 寫為 0 | 簽名可在其他鏈上有效;應按鏈分別簽署 |
| tx.origin 假設失效 | msg.sender == tx.origin 的重入保護 | 程式碼可在呼叫堆疊中執行;使用重入鎖 |
tx.origin 這一項的影響範圍最廣。已委託帳戶可以在呼叫堆疊內執行程式碼,因此 msg.sender == tx.origin 不再代表呼叫者沒有程式碼,而基於此比較建立的保護措施將不再有效;nonReentrant 或暫存儲存空間鎖不依賴呼叫者身分。
實務上,若錢包未清楚顯示授權詳情,使用者可能會核准自己原本無意檢視的存取權。Pectra 文件中的 EIP-7702 指引對此另有說明。
chain_id 為 0 會擴大第 3 類風險:同一個簽名可在其他 EVM 鏈上有效,因此帳戶可能在持有人從未考慮過的鏈上被寫入程式碼。簽署裝置往往不會顯示鏈 ID,這正是在冷錢包上啟用委託所涉及的安全取捨。
檢查只需讀取一次程式碼:eth_getCode 回傳 0x 代表未委託;回傳以 0xef0100 開頭的 23 位元組,代表該帳戶是已委託的外部擁有帳戶;其他位元組碼則代表它是合約帳戶。
委託屬於鏈層級狀態,因此同一地址可以在某條鏈上已委託,而在另一條鏈上未變更,每條鏈都需要分別檢查。最後 20 位元組為受託方地址;錢包或平台可自動化跨鏈檢查,並保留狀態檢查或變更紀錄以供審計與監控。
如需快速手動檢查,檢查及撤銷委託說明了相關流程。
撤銷需在錢包內進行:簽署一份地址欄位設為零的新授權後,節點會清除程式碼雜湊,讓帳戶回復為一般 EOA。外部 dApp 通常無法代替持有人執行此操作;若錢包團隊支援撤銷流程,任何代表持有人操作的請求仍應要求持有人自行核准。
撤銷會移除受託程式碼,但不會移除先前的智慧合約授權或已授予應用程式的其他存取權。OpenZeppelin 的 EOA 委託說明界定了這項界線。
EIP-7702 只需一次簽名,即可為 EOA 提供可程式化能力:地址與金鑰維持不變,程式碼欄位指向受託方,且執行會在帳戶自身的上下文中進行。
其代價是語意改變與長期權限:一般入帳可能失敗,tx.origin 不再代表 EOA,chain_id 為 0 的簽名可跨鏈使用,而撤銷只會清除程式碼。
不會。委託只會變更程式碼欄位,簽名仍由原始私鑰產生,因此單一金鑰持有人可獨立交易,也可透過新授權覆寫委託。即使受託方要求多個簽名,也可由該金鑰繞過。
對該地址呼叫 eth_getCode。回傳 0x 代表未委託;回傳以 0xef0100 開頭的 23 位元組,代表該帳戶已委託,最後 20 位元組為受託方;其他位元組碼則代表合約帳戶。
委託會按鏈記錄,因此請逐一檢查各條鏈,錢包或管理系統也可能保留這些檢查紀錄供檢閱。簡言之,不同錢包的介面細節可能不同,但底層程式碼檢查方式相同。
在錢包內簽署一份地址欄位設為零的新授權,驗證通過後節點會清除程式碼雜湊。僅帳戶持有人可簽署此授權,外部 dApp 通常無法代為操作。
委託沒有到期日,會持續有效直到被覆寫或撤銷。撤銷只會清除程式碼,儲存空間、ERC-20 授權與 Permit 簽名則不受影響。
是的。簽名是權限的移轉:攻擊者可藉此寫入指向惡意合約的委託,並獲得帳戶的廣泛存取權,無須接觸私鑰即可移轉資產。
請檢查元組中的鏈 ID 與目標地址,並只為不可變合約簽署。錢包團隊在代表組織授予內部委託相關核准前,也應驗證簽署者的職責。
* 投資有風險,入市須謹慎。本文不作為 Gate 提供的投資理財建議或其他任何類型的建議。
* 在未提及 Gate 的情況下,複製、傳播或抄襲本文將違反《版權法》,Gate 有權追究其法律責任。





