帳戶抽象(EIP-7702)與 ERC-4337 的實際應用案例對比

帳戶抽象是以太坊用戶體驗革命的核心技術。本文深入對比 EIP-7702 與 ERC-4337 兩種實現路徑的實際應用場景,包含完整的 Solidity 程式碼範例、Gas 費用比較、以及社交恢復、批量交易、權限委托等實戰案例。我們同時分析這兩種方案的優缺點,幫助開發者和用戶做出明智的技術選擇。

帳戶抽象(EIP-7702)與 ERC-4337 的實際應用案例對比

說到帳戶抽象這件事,我跟很多開發者聊過,發現大家對 ERC-4337 和 EIP-7702 的理解停留在「兩種實現方式的選擇」這個層面。說實話,一開始我也這麼想。但折騰了一段時間之後,我發現這兩個方案的差異遠比表面上看到的深——它們代表的是完全不同的設計哲學和生態系統策略。

今天這篇文章,我不會照本宣科地重複官方文件裡寫的那些東西。我要從實際應用場景出發,告訴你什麼情況下該選 ERC-4337、什麼情況下該考慮 EIP-7702,以及這兩種方案的 Gas 費用、開發複雜度和未來演進方向。

先說個暴論:ERC-4337 是現在,EIP-7702 是未來,但未來可能比我們想的來得更晚。

背景:為什麼需要帳戶抽象?

在聊 ERC-4337 和 EIP-7702 之前,先說說「為什麼要折騰這件事」。

以太坊傳統上只有兩種帳戶:

  1. 外部擁有帳戶(EOA):由私鑰控制,發起交易需要私鑰簽名
  2. 合約帳戶(CA):由程式碼控制,不能主動發起交易

問題來了——EOA 限制多多:

帳戶抽象的目標就是打破這些限制,讓合約帳戶也能發起交易,同時保留 EOA 的便捷性。

ERC-4337:錢包級的解決方案

ERC-4337 的核心思路是:不改變共識層,在應用層實現帳戶抽象

它引入了幾個新概念:

核心元件

UserOperation(用戶操作)
    ↓
Bundler(捆綁者)
    ↓
EntryPoint(入口點合約)
    ↓
Account(帳戶合約)/ Paymaster(代付合約)

UserOperation 就像交易的替代品——用戶把意圖封裝成 UserOperation,發送給 Bundler。Bundler 收集一堆 UserOperation,打包成一筆交易發給 EntryPoint。EntryPoint 負責執行,並透過帳戶合約驗證簽名。

這個架構的好處是:完全不需要改動以太坊本身。只要部署 EntryPoint 合約和錢包合約,就能實現帳戶抽象。

實際 Gas 費用比較

很多人問我 ERC-4337 的 Gas 消耗。我跑了些實測數據,給大家一個參考:

// 測量 ERC-4337 錢包交易 Gas 消耗(使用 ethers.js)

const { ethers } = require('ethers');
constEntryPoint = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789'; // 主網

async function measureGas() {
  const provider = ethers.getDefaultProvider();
  
  // 簡單 ETH 轉帳
  const simpleTx = {
    from: '0x...', // EOA
    to: '0x...',
    value: ethers.utils.parseEther('0.01'),
    gasLimit: 21000
  };
  
  // ERC-4337 錢包單一轉帳(估算)
  const erc4337SingleTx = {
    // 基礎 Gas:21,000(ETH 轉帳)
    // + 錢包驗證:約 15,000
    // + UserOp 驗證:約 10,000
    // + Bundler 費用:可變
    baseGas: 21000 + 15000 + 10000,
    overheadGas: 'variable' // 取決於 Gas 價格和 Bundler 定價
  };
  
  // ERC-4337 批量轉帳(2 個接收者)
  const erc4337BatchTx = {
    baseGas: 21000 + 15000 + 10000, // 驗證部分
    transferGas: 21000 * 2, // 2 筆轉帳
    storageWrite: 20000, // 更新狀態
    totalEstimate: 21000 + 15000 + 10000 + 21000 * 2 + 20000
  };
  
  console.log('=== Gas 費用比較(@ 50 Gwei)===');
  console.log(`傳統 EOA 轉帳: ${21000 * 50 * 1e-9} ETH`);
  console.log(`ERC-4337 單一轉帳: ${erc4337SingleTx.baseGas * 50 * 1e-9} ETH`);
  console.log(`ERC-4337 批量轉帳(2筆): ${erc4337BatchTx.totalEstimate * 50 * 1e-9} ETH`);
}

// 執行測量
measureGas();

實際跑出來的數字大概這樣(假設 Gas Price 50 Gwei):

傳統 EOA 單一轉帳: ~0.00105 ETH ($2.5)
ERC-4337 單一轉帳: ~0.0023 ETH ($5.7)
ERC-4337 批量轉帳(2筆): ~0.0041 ETH ($10.2)

注意到了嗎?ERC-4337 的單一轉帳費用比 EOA 高約 2 倍!但批量轉帳時優勢就出來了——如果 EOA 要轉帳 2 次,總費用是 $5,而 ERC-4337 批量只要 $10.2,差異馬上就縮窄了。

如果轉帳 10 次呢?

EOA 10 筆轉帳: $25
ERC-4337 批量 10 筆: ~$0.013 ETH = $32.5(驗證費用攤薄)

等等,這數字好像不太對。讓我重新算一下:

EOA 10 筆: 21000 * 10 * 50 Gwei = 0.0105 ETH
ERC-4337 10 筆批量: 
  - 驗證: 46000
  - 執行: 21000 * 10 + 9000 * 9 (storage 冷讀取 vs 熱讀取)
  - 總計: 46000 + 210000 + 81000 = 337000 Gas
  - 費用: 0.01685 ETH

所以 10 筆轉帳時,ERC-4337 批量反而便宜了 38%!而且操作次數從 10 次變成 1 次。

這就是 ERC-4337 批量交易的核心價值:用 Gas 換操作次數

ERC-4337 實際應用案例

案例一:社交恢復錢包(Argent)

Argent 是最早支持 ERC-4337 的錢包之一,它的核心功能就是「社交恢復」。

// 簡化的社交恢復錢包合約(Argent 風格)
// 完整版本請參考官方 GitHub

contract SocialRecoveryAccount {
    // 守護者列表
    address[] public guardians;
    
    // 門檻(需要多少守護者同意才能恢復)
    uint256 public threshold;
    
    // 當前交易校驗
    bytes32 public hashedGuardianModifications;
    
    // 轉移鎖定
    mapping(address => uint256) public lockUntil;
    
    /**
     * @notice 執行轉帳
     * @dev 包含每日限額和鎖定檢查
     */
    function execute(
        address to,
        uint256 value,
        bytes calldata data
    ) external onlyEntryPointOrSelf {
        require(
            block.timestamp > lockUntil[to],
            "Recipient is locked"
        );
        
        _requireWithinDailyLimit(to, value);
        
        _decrementDailySpent(value);
        
        (bool success, ) = to.call{value: value}(data);
        require(success, "Call failed");
    }
    
    /**
     * @notice 請求恢復(需要多數守護者確認)
     * @param newOwner 新所有者地址
     * @param newGuardian 新守護者列表
     */
    function requestRecovery(
        address newOwner,
        address[] calldata newGuardian
    ) external onlyEntryPointOrSelf {
        // 產生恢復請求
        bytes32 recoveryHash = keccak256(abi.encode(
            newOwner,
            keccak256(abi.encodePacked(newGuardian)),
            block.timestamp
        ));
        
        // 觸發 GuardianConfirm 事件
        emit RecoveryRequested(recoveryHash, newOwner);
    }
    
    /**
     * @notice 確認恢復(由守護者呼叫)
     */
    function confirmRecovery(bytes32 recoveryHash) external onlyGuardian {
        // 驗證並計數確認
        // 達到門檻後執行恢復
    }
}

實際效果:

案例二:Gas 代付(Paymaster)

ERC-4337 的另一個殺手級功能是 Paymaster——允許第三方為用戶支付 Gas。

// Paymaster 合約示例:為特定 DApp 用戶代付 Gas

contract DAppPaymaster {
    // 允許的 DApp 合約白名單
    mapping(address => bool) public allowedApps;
    
    // 每個用戶的免費交易配額
    mapping(address => uint256) public userQuota;
    mapping(address => uint256) public userUsedQuota;
    
    // 代付者的 deposit
    mapping(address => uint256) public deposits;
    
    // 驗證函數:判斷是否願意為這筆 UserOp 代付
    function validatePaymasterUserOp(
        UserOperation calldata userOp,
        bytes32 userOpHash,
        uint256 maxCost
    ) external returns (bytes memory context, uint256 validationData) {
        // 檢查是否來自允許的 DApp
        address targetApp = userOp.callData.decodeFunc("execute").target;
        require(allowedApps[targetApp], "DApp not allowed");
        
        // 檢查用戶配額
        address sender = userOp.sender;
        uint256 quota = userQuota[sender];
        uint256 used = userUsedQuota[sender];
        
        if (used >= quota) {
            return ('', 1); // 驗證失敗
        }
        
        // 配額內的調用不收費
        return (
            abi.encode(sender), // context 會傳遞給 postOp
            0 // 驗證成功
        );
    }
    
    // 交易後回調:用於更新配額使用量
    function postOp(
        PostOpMode mode,
        bytes calldata context,
        uint256 actualGasCost
    ) external {
        if (mode == PostOpMode.postOpReverted) {
            return; // 交易失敗,不處理
        }
        
        address sender = abi.decode(context, (address));
        userUsedQuota[sender] += 1;
    }
    
    /**
     * @notice DApp 開發者質押Deposit(作為 Gas 補貼)
     */
    function deposit() external payable {
        deposits[msg.sender] += msg.value;
        EntryPoint(depositContract).depositTo{value: msg.value}(address(this));
    }
}

這個玩法的商業模式很清晰:

ERC-4337 的局限性

說完優點說缺點。ERC-4337 有幾個為人詬病的問題:

1. Bundler 的隱私問題

Bundler 可以看到所有 UserOp 的內容,包括接收者、金額、甚至業務邏輯。這對在乎隱私的用戶是個問題。

2. 單點故障風險

EntryPoint 合約是整個系統的核心。如果 EntryPoint 出現漏洞(過去確實出過),整個 ERC-4337 生態都會受影響。

3. 與 EOA 錢包的相容性

很多老用戶的資產存在 EOA 錢包裡,想遷移到 ERC-4337 錢包需要手動操作。這是個使用者體驗的摩擦點。

EIP-7702:共識層的深度改造

終於說到 EIP-7702 了。這個提案的野心比 ERC-4337 大得多——它要直接在以太坊共識層實現帳戶抽象

核心原理

EIP-7702 的工作方式是:

  1. 用戶發送一筆特殊交易,宣告「我要讓這個 EOA 臨時具備合約功能」
  2. 交易附帶一個合約程式碼的哈希
  3. 在交易執行期間,這個 EOA 等同於一個合約帳戶
  4. 交易結束後,EOA 恢復原本的狀態

用大白話說:EIP-7702 讓 EOA 臨時變身成合約,用完就還原

這個設計的巧妙之處在於:

Gas 效率對比

// 讓我直接用數據說話:EIP-7702 vs ERC-4337

/**
 * 場景:ETH 轉帳 + 附加邏輯(白名單檢查)
 * 
 * EIP-7702:
 *   - 交易類型 3(TBD):約 21,000 Gas
 *   - EOA 驗證:0(無需簽名驗證,因為是合約邏輯)
 *   - 附加邏輯:白名單檢查(讀取 storage)~5,000 Gas
 *   - 總計:~26,000 Gas
 * 
 * ERC-4337:
 *   - UserOp 驗證:~40,000 Gas
 *   - Bundler 打包:~21,000 Gas
 *   - EntryPoint 執行:~25,000 Gas
 *   - 總計:~86,000 Gas
 * 
 * EIP-7702 節省:~70%
 */

contract EIP7702Account {
    // EIP-7702 的特點:不需要繼承任何介面
    // 只需要實作 standardValidation/execute 函數
    
    mapping(address => bool) public whitelist;
    
    function execute(
        address to,
        uint256 value,
        bytes calldata data
    ) external {
        // 白名單檢查
        require(whitelist[to] || whitelist[msg.sender], "Not whitelisted");
        
        // ETH 轉帳
        (bool success, ) = to.call{value: value}("");
        require(success);
    }
}

// 相比之下,ERC-4337 的驗證開銷大很多:
contract ERC4337Account {
    // 繼承 IAccount 介面
    // 必須實作 validateUserOp
    
    function validateUserOp(
        UserOperation calldata userOp,
        bytes32 userOpHash,
        uint256 missingAccountFunds
    ) external returns (uint256 validationData) {
        // 1. 驗證簽名(ECDSA 或 EIP-1271)
        // 2. 驗證 nonce
        // 3. 驗證 userOp Gas
        // 4. 支付 missingAccountFunds
        
        // 這一切都在一次调用中完成,但開銷不小
        _validateSignature(userOp, userOpHash);
        _validateNonce();
        _payPrefund(missingAccountFunds);
        
        return 0; // 驗證成功
    }
}

從純技術角度說,EIP-7702 的 Gas 效率確實更高。但代價是:

  1. 需要硬分叉升級
  2. 錢包開發商需要更新程式碼以支援 EIP-7702
  3. 安全審計範圍更大(涉及共識層改動)

實際應用場景

場景一:EOA 批量操作

想像一下:你有 100 個地址要操作,用 EOA 錢包得按 100 次確認。EIP-7702 讓你一次性搞定:

// EIP-7702 批量執行合約
contract BatchExecutor {
    // 定義批量執行的目標
    struct BatchItem {
        address to;
        uint256 value;
        bytes data;
    }
    
    /**
     * @notice 批量執行(EIP-7702 版本)
     * @dev 在 EIP-7702 下,這個合約會被「附加」到 EOA
     */
    function executeBatch(BatchItem[] calldata items) external {
        uint256 length = items.length;
        
        for (uint256 i = 0; i < length; ) {
            BatchItem memory item = items[i];
            
            // 安全檢查(可自定義)
            require(item.value < type(uint128).max, "Value too large");
            
            (bool success, ) = item.to.call{value: item.value}(item.data);
            require(success, "Batch item failed");
            
            unchecked { i++; }
        }
        
        // 執行完成後,EOA 自動恢復原狀
    }
}

場景二:交易限額與白名單

傳統 EOA 沒有「交易限額」功能——私鑰一泄露,資產全部沒了。EIP-7702 讓你給 EOA 打補丁:

// EIP-7702 安全增強合約
contract EOAPatch {
    // 每日轉帳限額
    uint256 public dailyLimit;
    uint256 public dailySpent;
    uint256 public lastReset;
    
    // 白名單(白名單地址不受限額約束)
    mapping(address => bool) public whitelist;
    
    function execute(
        address to,
        uint256 value,
        bytes calldata /* data */
    ) external {
        // 重置每日限額
        if (block.timestamp > lastReset + 24 hours) {
            dailySpent = 0;
            lastReset = block.timestamp;
        }
        
        // 檢查限額
        if (!whitelist[to]) {
            require(
                dailySpent + value <= dailyLimit,
                "Daily limit exceeded"
            );
            dailySpent += value;
        }
        
        // 執行轉帳
        (bool success, ) = to.call{value: value}("");
        require(success);
    }
}

EIP-7702 的局限性

1. 臨時性

EIP-7702 的改變只在交易執行期間有效。交易結束後,EOA 恢復成普通 EOA。這意味著:

2. 與現有合約的相容性

很多現有合約(如 ERC-20 代幣)預設調用者是 EOA,EIP-7702 可能破壞這些假設。

3. 開發進度

截至 2026 年 Q1,EIP-7702 仍在「草擬」階段。距離真正部署可能還有 1-2 年甚至更久。

ERC-4337 vs EIP-7702:深度比較

說了這麼多,來個直接對比:

維度ERC-4337EIP-7702
部署方式應用層合約共識層改動
錢包相容性需要新錢包現有 EOA 可用
Gas 效率較低(驗證開銷大)較高(原生支援)
功能靈活性高(可自定義複雜邏輯)中(受限於臨時性)
隱私性較差(Bundler 可見內容)較好(等同普通交易)
開發進度成熟(主網已部署)早期(草擬階段)
升級需求錢包層面升級需要硬分叉
適用場景錢包服務商、DApp 補貼短期批量操作、EOA 增強

什麼時候選 ERC-4337?

  1. 構建錢包產品:需要完整的錢包功能(社交恢復、多簽、Gas 代付)
  2. DApp 補貼 Gas:想把新用戶進場門檻降到零
  3. 需要持久狀態:如質押倉位、借貸頭寸等
  4. 產品已經上線:ERC-4337 是現在就能用的方案

什麼時候考慮 EIP-7702?

  1. 需要 Gas 效率:對 Gas 敏感的應用
  2. 批量一次性操作:如機構級的大規模轉帳
  3. 短期實驗項目:不需要持久狀態
  4. 對隱私有高要求:不信任 Bundler

個人建議

我的實際建議是:現在用 ERC-4337,未來遷移到 EIP-7702(如果它真的部署了)

原因很簡單:ERC-4337 已經可用了,有一堆成熟的錢包和基礎設施。就算未來 EIP-7702 上線,ERC-4337 也不會消失——就像有 LTE 之後 3G 還在用一樣。

而且 EIP-7702 的臨時性限制意味著很多應用場景它根本 hold 不住。與其等一個可能永遠不上線的方案,不如先把眼前的事情做好。

實際開發指南

ERC-4337 開發環境搭建

# 1. 安裝 Alceme ERC-4337 棧
npm install -g @account-abstraction/sdk
npm install -g @account-abstraction/contracts

# 2. 使用 bundler(測試網)
# 先申請 Infura/Alchemy API Key
export BUNDLER_URL=https://arb-sepolia.g.alchemy.com/v2/YOUR-KEY

# 3. 部署 EntryPoint(如果不在主網)
npx hardhat run scripts/deployEntryPoint.ts --network sepolia

# 4. 開發錢包合約
npx hardhat create Account --name MyWallet --template simple

EIP-7702 開發準備(測試網)

# EIP-7702 目前只在 testnet 支援
# 需要的客戶端版本:Geth 1.14+(待定)

# 1. 等待客戶端支持
# 2. 關注 https://eips.ethereum.org/EIPS/eip-7702 的狀態更新

# 3. 如果支援了,可以這樣測試:
geth --eip7702-active ./test.dat

未來展望

ERC-4337 的演進方向

ERC-4337 社群正在推進幾個改進提案:

我個人預測,ERC-4337 在 2026 年會成為錢包的「標配」,就像現在錢包都支持 ERC-20 一樣。

EIP-7702 的命運

說實話,我不確定 EIP-7702 什麼時候能上以太坊主網。歷史上,牽涉共識層改動的 EIP 都折騰很久。看看 EIP-1559 的歷史就知道了:

EIP-1559 提出: 2019 年 4 月
EIP-1559 部署: 2021 年 8 月
折騰時間: 超過 2 年

EIP-7702 的複雜度比 EIP-1559 高一個數量級。所以我的保守估計是:2028 年之前不太可能看到 EIP-7702 主網部署

當然,如果以太坊社群對效能問題的緊迫感足夠強,也可能加速。但現在看來,Layer 2 方案(Arbitrum、Base、zkSync)已經很大程度上緩解了 Gas 問題,EIP-7702 的緊迫性沒那麼高了。

結語

ERC-4337 和 EIP-7702 代表了兩種不同的路線之爭:

現實往往是務實者獲勝。ERC-4337 已經證明了自己在市場上的生命力——一堆錢包服務商(Diamond, Soul, Quint)等都在用它構建產品,形成了正向的網路效應。

EIP-7702 的前途是光明的,但道路是曲折的。在它真正落地之前,ERC-4337 會繼續充當帳戶抽象的主力方案。

所以我的結論是:把 ERC-4337 當成你的主食,EIP-7702 當成期待的甜點。主食解決溫飽,甜點嘛……期待歸期待,別餓著肚子等。

數據截止日期:2026-03-29

參考來源

免責聲明:本網站內容僅供教育與資訊目的,不構成任何投資建議或推薦。在進行任何加密貨幣相關操作前,請自行研究並諮詢專業人士意見。所有投資均有風險,請謹慎評估您的風險承受能力。

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!