金鑰、錢包與帳戶抽象化

ERC-4337

ERC-4337 是在完全不更動核心協議的前提下,於以太坊上實現帳戶抽象化的標準。先前的嘗試都需要硬分叉;ERC-4337 改為在既有鏈之上搭建一套並行的交易系統,使智能合約錢包在以太坊既有的樣貌上就獲得一等公民的功能。它那唯一的 EntryPoint 合約於 2023 年 3 月部署上主網。

其流程如下。使用者不送出一般交易,而是簽署一個 UserOperation——一個表達其意圖的結構化物件——並提交到一個獨立的高層記憶池。稱為打包者(bundler)的專責角色收集許多 UserOperation,驗證它們,再把它們裝進一筆呼叫全域 EntryPoint 合約的普通以太坊交易。EntryPoint 接著針對每個操作,呼叫使用者的智能合約帳戶:先是它的 validateUserOp 函數(執行該帳戶所定義的任何自訂簽章或政策檢查),然後是它請求的動作。一個選用的 paymaster 合約可被呼叫來代付 gas。

兩項設計抉擇讓它穩健。其一,驗證步驟被沙盒化:打包者會模擬每個 UserOperation,並有一套規則限制驗證可觸碰的範圍,使打包者在花 gas 把操作納入之前,能確信該操作會付款——這防住了替代記憶池中的拒絕服務騷擾。其二,因為一切都經由單一、經審計的 EntryPoint 路由,帳戶與 paymaster 共用一個共通、經充分審視的結算與 gas 計帳核心,而非各自重新發明。然而代價是實實在在的:一個 UserOperation 帶有驗證開銷,在 gas 上通常比單純的 EOA 轉帳更貴,而打包者/paymaster 那層也增添了必須保持在線且誠實的基礎設施。

// EntryPoint, simplified, per UserOperation:
function handleOps(UserOperation[] ops, address payable beneficiary) {
  for (op in ops) {
    account = op.sender;
    account.validateUserOp(op, opHash, missingFunds); // custom auth runs here
    if (op.paymasterAndData.length) paymaster.validatePaymasterUserOp(op, ...);
    (success, ) = account.call(op.callData);          // the user's intended action
    // gas is metered and refunded to `beneficiary` (the bundler)
  }
}

EntryPoint 先驗證、再執行每個 UserOperation,並從帳戶或 paymaster 償付打包者。

一個常見的誤解是把 ERC-4337 的 UserOperation 當成「交易」。它們不是——對底層協議而言,在打包者把它們包進一筆真正的交易之前,它們只是 calldata。這正是它們存在於自己的記憶池中、且其上鏈與否取決於打包者而非直接取決於區塊提議者的原因。

又称
account abstraction via entry pointEntryPoint 帳戶抽象化