
ERC-8199:用於安全代理自動化的沙盒智能錢包
本標準提出了一種沙盒智能錢包接口,讓人工智慧代理能在與主帳戶隔離的環境中運作,同時確保所有者擁有精細的控制權與具時效性的權限檢查。
用於安全代理自動化的沙盒智慧錢包
摘要
透過錢包中的代理(Agents)實現自動化是產業發展的方向,目前已有許多關於如何安全地將訪問權限/資產委託給代理的討論與提案。這包括會話密鑰(Session keys)、基於 TEE 的策略引擎、共享帳戶密鑰等。然而,這些方案都在一定程度上存在信任成本與權衡。
本標準概述了一種專為高頻交易實體代理設計的智慧錢包,使其能在完全沙盒化(分離)的環境中運行,同時仍能讓所有者對該沙盒智慧錢包擁有細粒度的控制權。
動機
透過代理基礎設施作為錢包實現自動化是產業不可避免的趨勢。雖然代理帶來了高度自主且便利的系統,但這些應用的採納必須同時納入安全機制。
類似會話密鑰(Session key)的架構雖然具有共享所有者錢包的優勢,但在安全態勢上存在局限性,除非施加強制性的白名單機制來限制會話密鑰的訪問。而這可能會限制代理執行任務的能力。
基於 TEE 的策略引擎雖然提供了極大的便利,但完全依賴於中心化信任。
共享帳戶密鑰儘管是最直觀且方便的解決方案,但除非用戶明確批准每項操作,否則會賦予代理對錢包的無限訪問權。這與透過代理實現自主自動化的目標相衝突。
本標準為代理提出了一個接口,使其在與所有者帳戶分離的沙盒環境中運行,同時所有者能夠保持對沙盒智慧錢包的訪問權限。
本標準考慮的關鍵因素包括:
為代理提供完全沙盒化的帳戶。
所有者帳戶持久擁有訪問沙盒錢包的權限。
具備時間限制且可選的權限檢查,且具備強制性。
多個代理共享一個沙盒錢包。
當代理也使用智慧錢包時所產生的效益。
-
為代理提供完全沙盒化的帳戶: 本標準將代理的執行環境與所有者帳戶分離。這消除了安全漏洞或 AI 代理的幻覺意外影響所有者帳戶的可能性。此外,會話密鑰、基於細粒度權限且共享所有者錢包的方法,除非施加白名單驅動機制,否則本質上會帶來權限規避問題。這種沙盒化方法使本標準免於這些疑慮。
-
所有者帳戶持久擁有訪問沙盒錢包的權限: 所有者帳戶與沙盒錢包之間的關係是單向的。所有者帳戶有權提取資產,或移除代理密鑰對沙盒錢包的訪問權。而沙盒錢包對所有者帳戶不具備任何權利。
-
具備時間限制且可選的權限檢查,且具備強制性: 雖然沙盒帳戶環境本身已在執行上給予了限制邊界,但本標準在每次代理執行中施加了時間限制且可選的權限檢查,可用於策略或額外的安全措施。
-
多個代理共享一個沙盒錢包: 多個代理可以根據用戶的需求,共享單個沙盒錢包,共享相同的資產、鏈上地址聲譽及交易歷史。
-
當代理也使用智慧錢包時所產生的效益:
Gas 抽象
i. 代理同樣面臨原生 Gas 的需求。智慧錢包提供的 Gas 抽象將有利於代理的執行與投資組合管理。
- 鏈上條件執行與複雜交易操作
i. 透過檢查和多層級複雜交易實現的鏈上條件執行,需要智慧合約來進行批處理,並對前置/後置狀態進行條件分層。智慧錢包可以充分協助滿足這些需求。
- 並行執行
i. 在高頻交易環境中,代理需要能夠並行執行多筆交易。但在多個代理共享錢包或單個錢包進行高頻交易時,管理一維的線性 Nonce 可能會非常複雜。這可以透過智慧錢包的二維 Nonce 或其他自定義機制來簡化。
規範
本文件中的關鍵字「必須」(MUST)、「不得」(MUST NOT)、「要求」(REQUIRED)、「應當」(SHALL)、「不應當」(SHALL NOT)、「應該」(SHOULD)、「不應該」(SHOULD NOT)、「推薦」(RECOMMENDED)、「不推薦」(NOT RECOMMENDED) 及「可以」(MAY) 應按照 RFC 2119 和 RFC 8174 中的描述進行解釋。
沙盒智慧錢包必須實現以下接口:
/// @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 向智慧錢包註冊代理。
/// 僅能由所有者調用。
/// 成功註冊代理後,該函數應發出 AgentRegistered() 事件。
/// 如果正在註冊的 agentKey 代理已存在且處於活動狀態,則該函數應回退(revert)。
///
/// @param agents 要註冊的代理數組。
function registerAgents(Agent[] calldata agents) external;
/// @dev 從智慧錢包中移除代理。
/// 僅能由所有者調用。
/// 成功移除代理後,該函數應發出 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;
}
合約可以實現 ERC-165。
Checker 智慧合約必須實現以下接口。
/// @title Checker。SandboxedSmartWallet 的執行前/後檢查器
interface Checker {
/// @dev 在執行前調用。根據 termsData 驗證 execs。
///
/// @param execs 要執行的執行結構數組。
/// @params termsData 概述有效性條款的 calldata。
/// @return bool 指示檢查成功/失敗的值。
function preCheck(Execution[] calldata execs, bytes calldata termsData) external returns (bool);
/// @dev 在執行後調用。根據 termsData 驗證 execs。
///
/// @param execs 要執行的執行結構數組。
/// @params 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。
-
只有當 validityTimestamp 在當前 block.timestamp 範圍內時,isAgentActive() 才應返回 true。
-
強烈建議為 invokeAgentExec() 添加具備時間限制的簽名。
-
對於 Checker 的 termData 組成,建議執行白名單風格的強制檢查,而非黑名單風格,以實現更強的強制執行檢查。
-
建議 executeFromOwner() 始終對所有者錢包開放以執行操作。然而,本標準並未對此行為做出強制規定。
-
SandboxedSmartWallet 可以選擇性地施加基於 ERC-173 或 ERC-8023 的所有權機制,以實現安全的所有權管理。
版權
1 則貼文 - 1 位參與者