
ERC:面向自主代理的沙盒智能錢包標準
本標準提議為高頻交易代理建立一個沙盒智能錢包環境,使其能脫離所有者主帳戶獨立運行,同時保持安全且細粒度的控制。它透過強制執行單向關係和時間限制權限,解決了現有委託方法(如會話密鑰和 TEE)在安全性上的權衡問題。
透過錢包中的代理人(Agents)實現自動化是產業發展的趨勢,目前已有許多關於如何安全地將存取權或資產委託給代理人的討論與提案,包括會話密鑰(session keys)、基於 TEE 的策略引擎、共享帳戶密鑰等。然而,這些方案都在某種程度上存在信任成本與權衡。
本標準概述了一種專為高頻交易實體之代理人設計的智能錢包,使其能在完全沙盒化(隔離)的環境中運作,同時仍能讓所有者(Owner)對該沙盒智能錢包擁有細粒度的控制權。
動機
透過代理人基礎設施作為錢包來實現自動化,是產業不可避免的趨勢。雖然代理人帶來了高度自主且便利的系統,但重要的是,這些應用必須同時納入安全機制。
會話密鑰(Session key)類的架構雖然具有共享所有者錢包的優點,但在安全態勢上存在限制,除非施加強制性的白名單機制來限制會話密鑰的存取,而這可能會限制代理人的執行能力。
基於 TEE 的策略引擎雖然提供了極大的便利,但完全依賴於中心化信任。
共享帳戶密鑰儘管是最直觀且方便的解決方案,但除非用戶明確批准每項操作,否則會賦予代理人對錢包的無限存取權,這與透過代理人實現自主自動化的目標相衝突。
本標準為代理人提出了一個介面,使其在與所有者帳戶隔離的沙盒環境中運作,同時所有者仍能維持對沙盒智能錢包的存取權。
本標準考慮的關鍵因素包括:
為代理人提供完全沙盒化的帳戶。
所有者帳戶能持續存取沙盒錢包。
具備時間限制且可選的權限檢查,且具備強制性。
多個代理人共享一個沙盒錢包。
代理人使用智能錢包時所產生的效益。
-
為代理人提供完全沙盒化的帳戶: 本標準將代理人的執行環境與所有者帳戶分離。這消除了代理人的安全漏洞或 AI 代理人的幻覺對所有者帳戶造成非預期影響的可能性。此外,會話密鑰這種基於細粒度權限且共享所有者錢包的方法,除非採用白名單驅動,否則本質上會帶來權限規避問題。沙盒化方法使本標準免於這些疑慮。
-
所有者帳戶能持續存取沙盒錢包: 所有者帳戶與沙盒錢包之間的關係是單向的。所有者帳戶有權提取資產,或移除代理人密鑰對沙盒錢包的存取權;而沙盒錢包對所有者帳戶不具備任何權利。
-
具備時間限制且可選的權限檢查,且具備強制性: 雖然沙盒帳戶環境本身已提供了有限的執行邊界,但本標準在每次代理執行中加入了時間限制與可選的權限檢查,可用於實施策略或額外的安全措施。
-
多個代理人共享一個沙盒錢包: 多個代理人可以根據用戶的需求,共享單個沙盒錢包,並共用相同的資產、鏈上地址聲譽及交易歷史。
-
代理人使用智能錢包時所產生的效益:
Gas 抽象 (Gas Abstraction)
i. 代理人同樣面臨原生 Gas 的需求。智能錢包提供的 Gas 抽象將有利於代理人的執行與投資組合管理。
- 鏈上條件執行與複雜交易操作
i. 透過檢查和多層級複雜交易實現鏈上條件執行,需要智能合約來批次處理並分層設定執行前/後的狀態條件。智能錢包能有效協助滿足這些需求。
- 並行執行
i. 在高頻交易環境中,代理人需要能夠並行執行多筆交易。但在多個代理人共享錢包或單一錢包進行高頻交易時,管理一維的線性 Nonce 會非常複雜。這可以透過智能錢包的二維 Nonce 或其他自定義機制來簡化。
規範
本文件中的關鍵字「必須 (MUST)」、「不得 (MUST NOT)」、「要求 (REQUIRED)」、「應 (SHALL)」、「不應 (SHALL NOT)」、「應該 (SHOULD)」、「不應該 (SHOULD NOT)」、「推薦 (RECOMMENDED)」、「不推薦 (NOT RECOMMENDED)」、「可以 (MAY)」和「可選 (OPTIONAL)」應按照 RFC 2119 和 RFC 8174 中的描述進行解釋。
沙盒智能錢包必須(MUST)實作以下介面:
/// @title 沙盒智能錢包標準
interface SandboxedSmartWallet {
struct Agent {
address agentKey;
uint256 validityTimestamp; // 打包 ( uint128 validAfter + uint128 validUntil )
Check[] checkers;
}
struct Check {
address to;
bytes termsData;
}
event AgentRegistered(Agent calldata);
event AgentRemoved(Agent calldata);
/// @dev 將代理人註冊到智能錢包。
/// 僅能由所有者(owner)調用。
/// 成功註冊代理人後,函數應發出 AgentRegistered() 事件。
/// 如果正在註冊的 agentKey 已存在且處於活躍狀態,函數應回退(revert)。
///
/// @param agents 要註冊的代理人列表。
function registerAgents(Agent[] calldata agents) external;
/// @dev 從智能錢包中移除代理人。
/// 僅能由所有者(owner)調用。
/// 成功移除代理人後,函數應發出 AgentRemoved() 事件。
/// 即使 agentKey 的時間有效期已過或尚未生效,
/// 只要 agentKey 存在,函數就不應回退。
///
/// @param agents 要移除的代理人列表。
function removeAgents(Agent[] calldata agents) external;
/// @dev 返回代理人列表。
/// 返回完整的代理人列表,不論其時間有效期為何。
///
/// @return agents 註冊到此智能錢包的代理人。
function getAgents() external view returns (Agent[] memory);
/// @dev 返回給定的 agentKey 是否處於活躍狀態(已註冊且在有效期內)。
/// @return bool 表示代理人是否活躍的值。
function isAgentActive(address agentKey) external view returns (bool);
struct Execution {
address target;
uint256 value;
bytes data;
}
/// @dev 觸發代理執行。可由任何實體中繼。
/// 執行簽名的時間有效期(如有)可與 signature 參數一起編碼。
/// signature 參數包含來自 agentKey 的簽名。
///
/// @param execs 要執行的執行結構體數組。
/// @param signature 已簽名執行的簽名。
function invokeAgentExec(Execution[] calldata execs, bytes calldata signature) external;
/// @dev 返回沙盒智能錢包的所有者。
/// 所有者有權執行任意操作,
/// 包括從錢包中提取全部資產。
///
/// @return 所有者的地址。
function owner() external view returns (address);
/// @notice 只有 owner() 返回的地址才能調用此函數。
/// @dev 所有者的執行路徑。所有者可以提取資產,
/// 或從此錢包執行任意操作。
///
/// @param execs 要執行的執行結構體數組。
function executeFromOwner(Execution[] calldata execs) external;
}
合約可以(MAY)實作 ERC-165。
檢查器(Checker)智能合約必須(MUST)實作以下介面:
/// @title Checker。SandboxedSmartWallet 的執行前/後檢查器
interface Checker {
/// @dev 在執行前調用。根據 termsData 驗證 execs。
///
/// @param execs 要執行的執行結構體數組。
/// @param termsData 概述有效性條款的 calldata。
/// @return bool 表示檢查成功或失敗的值。
function preCheck(Execution[] calldata execs, bytes calldata termsData) external returns (bool);
/// @dev 在執行後調用。根據 termsData 驗證 execs。
///
/// @param execs 要執行的執行結構體數組。
/// @param termsData 概述有效性條款的 calldata。
/// @return bool 表示檢查成功或失敗的值。
function postCheck(Execution[] calldata execs, bytes calldata termsData) external returns (bool);
}
原理說明
-
SandboxedSmartWallet 的介面僅保留了代理操作的基本要素。額外的功能(例如基於 ERC-4337 的 Gas 抽象等)留給錢包開發者根據其偏好的技術棧自行決定。
-
初始引導過程是將初始資金從所有者錢包轉移到 SandboxedSmartWallet。不建議使用代幣授權(Token approval)模式,以確保 SandboxedSmartWallet 無法在邏輯或帳戶層級干擾或影響所有者錢包。
-
引入了基於時間的有效窗口,使代理人在存取 SandboxedSmartWallet 中的用戶資產時具有有限的時間邊界。
-
強制要求引用 ERC-173 owner() 的標準介面,以便更好地與基於所有權的工具/SDK 兼容。
-
透過 executeFromOwner() 介面,所有者錢包在任何時間點都可以提取資產或執行任意操作。這建立了一種單向關係,即只有所有者錢包可以影響 SandboxedSmartWallet,反之則不然。
向後兼容性
待定
安全考量
-
SandboxedSmartWallet 應對 invokeAgentExec() 的調用實施簽名重放攻擊保護,使 agentKey 的簽名不可重放。
-
應嚴格限制代理人在 validityTimestamp 有效期之外調用 SandboxedSmartWallet。
-
isAgentActive() 應僅在 validityTimestamp 包含當前 block.timestamp 時返回 true。
-
強烈建議為 invokeAgentExec() 增加具備時間限制的簽名。
-
對於 Checker 的 termsData 構成,建議執行白名單式的強制檢查,而非黑名單式,以獲得更強的強制執行效力。
-
建議 executeFromOwner() 始終對所有者錢包開放以執行操作。然而,本標準並未對此強制規定特定行為。
-
SandboxedSmartWallet 可以選擇性地實施基於 ERC-173 或 ERC-8023 的所有權機制,以實現安全的所有權管理。
版權
1 則貼文 - 1 位參與者