以太坊即將迎來 Pectra 升級,這次升級意義重大,將引入多項重要的以太坊改進提案。其中,EIP-7702 對以太坊外部賬戶(EOA)進行了革命性改造,模糊了 EOA 與合約賬戶(CA)之間的界限,是繼 EIP-4337 之后邁向原生賬戶抽象(Native AA)的關(guān)鍵一步,為以太坊生態(tài)帶來了全新的交互模式。Pectra 已在測試網(wǎng)絡(luò)完成部署,預(yù)計很快將上線主網(wǎng)。本文將深入剖析 EIP-7702 的實現(xiàn)機制,探討其機遇與挑戰(zhàn),并為不同參與者提供實用指南。
EIP-7702 引入了一種全新交易類型,允許 EOA 指定智能合約地址并為其設(shè)置代碼,使 EOA 能像智能合約一樣執(zhí)行代碼,同時保留發(fā)起交易的能力。這一特性賦予 EOA 可編程性與可組合性,用戶可借此實現(xiàn)社交恢復(fù)、權(quán)限控制、多簽管理、zk 驗證、訂閱式支付、交易贊助及交易批處理等功能。EIP-7702 還能與 EIP-4337 實現(xiàn)的智能合約錢包完美兼容,極大簡化新功能開發(fā)與應(yīng)用。
EIP-7702 的具體實現(xiàn)是通過引入交易類型為 SET_CODE_TX_TYPE (0x04) 的交易,其數(shù)據(jù)結(jié)構(gòu)如下:rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, value, data, access_list, authorization_list, signature_y_parity, signature_r, signature_s])。其中 authorization_list 字段定義為:authorization_list = [[chain_id, address, nonce, y_parity, r, s], …]。新交易結(jié)構(gòu)中,除 authorization_list 字段外,其余遵循與 EIP-4844 相同的語義。authorization_list 是列表類型,可包含多個授權(quán)條目,每個條目包含 chain_id(生效鏈)、address(目標地址)、nonce(與授權(quán)賬戶 nonce 匹配)、y_parity, r, s(授權(quán)賬戶簽名數(shù)據(jù))。
授權(quán)者在簽署授權(quán)數(shù)據(jù)時,需先將 chain_id, address, nonce 進行 RLP 編碼,與 MAGIC 數(shù)(0x05)進行 keccak256 哈希運算,得到待簽名的數(shù)據(jù),再使用私鑰簽名。MAGIC 作為域分隔符,確保不同類型簽名不沖突。當(dāng)授權(quán)者授權(quán)的 chain_id 為 0 時,授權(quán)在所有支持 EIP-7702 的 EVM 兼容鏈上重放生效。
交易發(fā)起者將授權(quán)條目匯聚在 authorization_list 中簽名并廣播。Proposer 會先預(yù)檢查交易,強制檢查 to 地址非空(非合約創(chuàng)建交易),并要求 authorization_list 至少包含一項授權(quán)條目。若多個條目由同一授權(quán)者簽署,最終只有最后一個生效。
交易執(zhí)行時,節(jié)點先增加發(fā)起者 nonce,再對 authorization_list 中的每個授權(quán)條目進行 applyAuthorization 操作。applyAuthorization 會先檢查授權(quán)者 nonce,再增加其 nonce。若發(fā)起者與授權(quán)者為同一用戶,簽署授權(quán)交易時 nonce 應(yīng)再加 1。
節(jié)點應(yīng)用授權(quán)條目時,若遇錯誤會跳過該條目,但交易繼續(xù)執(zhí)行,避免批量授權(quán)場景中的 DoS 風(fēng)險。授權(quán)應(yīng)用完成后,授權(quán)者地址的 code 字段被設(shè)置為 0xef0100 || address,其中 0xef0100 是固定標識,確保此類代碼只能由 SET_CODE_TX_TYPE 部署。授權(quán)者可通過將目標地址設(shè)為 0 地址來移除授權(quán)。
EIP-7702 使授權(quán)者(EOA)兼具智能合約執(zhí)行與交易發(fā)起能力,為用戶帶來更接近原生賬戶抽象的體驗。盡管如此,新應(yīng)用場景也帶來新風(fēng)險,生態(tài)參與者需注意:
**私鑰存儲**
EOA 委托后可借助智能合約實現(xiàn)社交恢復(fù),但私鑰泄露風(fēng)險依然存在。執(zhí)行委托后,EOA 私鑰仍對賬戶擁有最高控制權(quán)。用戶或錢包服務(wù)商在完成委托后,即便刪除本地私鑰,也無法完全杜絕泄露風(fēng)險,尤其在供應(yīng)鏈攻擊場景中。用戶應(yīng)時刻牢記:Not your keys, not your coins。
**多鏈重放**
用戶可通過 chainId 選擇委托生效鏈,或使用 chainId 為 0 在多鏈上重放。但需注意,多鏈上同一合約地址可能存在不同代碼。錢包服務(wù)商應(yīng)檢查委托鏈與當(dāng)前網(wǎng)絡(luò)是否相符,并提醒用戶簽署 chainId 為 0 委托的風(fēng)險。
**無法初始化**
主流智能合約錢包采用代理模型,通過 DELEGATECALL 調(diào)用初始化函數(shù)。EIP-7702 委托僅更新地址 code 字段,無法調(diào)用初始化函數(shù)。開發(fā)者組合適配時,應(yīng)在錢包初始化操作中增加權(quán)限檢查,避免初始化被搶跑。
**存儲管理**
重新委托可能導(dǎo)致新合約復(fù)用舊合約數(shù)據(jù),引發(fā)賬戶鎖定或資金損失。用戶應(yīng)謹慎處理重新委托。開發(fā)者應(yīng)遵循 ERC-7201 的 Namespace Formula,將變量分配到指定存儲位置,緩解沖突風(fēng)險。ERC-7779 (draft) 提供重新委托標準流程,包括使用 ERC-7201 防止沖突,驗證存儲兼容性,并清理舊數(shù)據(jù)。
**假充值**
EOA 委托后可作為智能合約使用,CEX 可能面臨智能合約假充值風(fēng)險。CEX 應(yīng)通過 trace 檢查充值交易狀態(tài),防范風(fēng)險。
**賬戶轉(zhuǎn)換**
EIP-7702 后,賬戶可在 EOA 與 SC 間轉(zhuǎn)換,打破僅限 EOA 參與項目的安全假設(shè)。開發(fā)者應(yīng)假設(shè)未來參與者可能為智能合約,并通過 msg.sender == tx.origin 檢查防御重入攻擊將失效。
**合約兼容性**
ERC-721、ERC-777 代幣在轉(zhuǎn)賬時具有 Hook 功能,接收者需實現(xiàn)回調(diào)函數(shù)。委托目標合約應(yīng)實現(xiàn)相應(yīng)回調(diào)函數(shù),確保與主流代幣兼容。
**釣魚檢查**
賬戶委托惡意合約可能導(dǎo)致資金被盜。錢包服務(wù)商應(yīng)盡快支持 EIP-7702 交易,并在用戶簽名時展示委托目標合約,緩解釣魚風(fēng)險。對目標合約進行深入自動分析可幫助用戶避免風(fēng)險。
EIP-7702 通過引入新交易類型,使 EOA 具備可編程性與可組合性,模糊 EOA 與合約賬戶界限。目前尚無實戰(zhàn)考驗的兼容 EIP-7702 的智能合約標準,不同生態(tài)參與者面臨挑戰(zhàn)與機遇。本文所述最佳實踐雖無法涵蓋所有風(fēng)險,但仍值得借鑒應(yīng)用。
**示例**
[Set EOA Account Code] https://holesky.etherscan.io/tx/0x29252bf527155a29fc0df3a2eb7f5259564f5ee7a15792ba4e2ca59318080182
[Unset EOA Account Code] https://holesky.etherscan.io/tx/0xd410d2d2a2ad19dc82a19435faa9c19279fa5b96985988daad5d40d1a8ee2269
**相關(guān)鏈接**
[1] https://github.com/ethereum/go-ethereum/blob/7fed9584b5426be5db6d7b0198acdec6515d9c81/core/types/tx_setcode.go#L109-L113
[2] https://github.com/ethereum/go-ethereum/blob/7fed9584b5426be5db6d7b0198acdec6515d9c81/core/state_transition.go#L562
[3] https://github.com/ethereum/go-ethereum/blob/7fed9584b5426be5db6d7b0198acdec6515d9c81/core/state_transition.go#L304
[4] https://github.com/ethereum/go-ethereum/blob/7fed9584b5426be5db6d7b0198acdec6515d9c81/core/state_transition.go#L388-L390
[EIP-7702]https://eips.ethereum.org/EIPS/eip-7702
[EIP-4844]https://eips.ethereum.org/EIPS/eip-4844
[Go-ethereum]https://github.com/ethereum/go-ethereum/tree/7fed9584b5426be5db6d7b0198acdec6515d9c81
[EIP-3541]https://eips.ethereum.org/EIPS/eip-3541#backwards-compatibility
[Cobo: EIP-7702實用指南] https://mp.weixin.qq.com/s/ojh9uLw-sJNArQe-U73lHQ
[Viem]https://viem.sh/experimental/eip7702/signAuthorization
[ERC-7210]https://eips.ethereum.org/EIPS/eip-7201
[ERC-7779]https://eips.ethereum.org/EIPS/eip-7779
本文網(wǎng)址:http://iy168.cn/news/2313.html