账户抽象:过去、现在与未来

了解以太坊中的账户抽象——它的含义及其重要性。

阅读时长:15 分钟
账户抽象:过去、现在与未来

即便熊市持续肆虐,也鲜有人怀疑加密货币会就此消亡——以 MetaMask 为例,此类钱包已拥有数百万用户。然而,一个问题始终萦绕不去:"我们该如何将下一个十亿用户带入 web3?"

不同的人对这个问题会给出不同的答案。但有一点大家都认同——尤其是改善用户与区块链应用交互体验的必要性。若不能让 web3 变得更加用户友好,人们就几乎没有动力放弃每天使用的 web2 应用。

"账户抽象"是一项旨在改善用户与以太坊交互体验的提案,正日益成为加密社区热议的话题。不过,你可能会想:"账户抽象究竟是什么?我为什么要关注它?"

本文旨在帮助你理解账户抽象,将其过去、现在与未来置于完整的背景下加以阐释。我们将解答你对这一话题可能存在的所有疑问——具体涵盖账户抽象的主体、内容、原因、方式与时间。

以下是核心要点速览:

  • 可编程的自托管账户("智能账户")能够降低新用户加入 web3 生态系统的门槛。然而,以太坊设计上的限制阻碍了智能账户的广泛采用与应用。

  • 账户抽象引入了重大变革,为无需信任、抗审查的智能账户的广泛普及铺平了道路。目前,业界正在考量实现账户抽象的多种方案——每种方案各有其独特优势与权衡取舍。

  • MetaMask 正通过其无许可创新平台 MetaMask Snaps 推动账户抽象的普及。借助 MetaMask Snaps,开发者可以扩展 MetaMask 的功能,将账户抽象的优势带给全球加密用户。

什么是账户抽象?

与 web3 中的任何新概念一样,账户抽象并不容易定义。不过,我们可以先拆解与以太坊账户抽象讨论相关的各类术语,从而更好地理解它:

  1. 抽象 (名词):计算机科学中一个(相当复杂的)术语,大致意思是隐藏系统或应用程序的信息,使其在对后台运行流程了解较少的情况下也能被使用。也可定义为*"通过提供简化操作的接口来隐藏系统复杂性的过程。"*

  2. 账户 (名词):用户在区块链上的表示,可以发送或接收交易,并与其他链上账户进行交互。以太坊有两种类型的账户:外部拥有账户(EOA)和合约账户(又称"智能合约")。

2a. 外部拥有账户(EOA):使用钱包软件(如 MetaMask)生成、由一对公私钥进行管理的以太坊账户。EOA 是"主动的"(可以发起交易并为 EVM 执行支付 gas 费用)。但它仅限于执行基本操作——例如发送以太币或与合约交互。

2b. 合约账户:以智能合约形式部署的以太坊账户,由代码中编写的逻辑控制(而非私钥)。合约账户是"被动的":它只能响应来自 EOA 的交易而发送交易,且无法支付 gas 费用。但它是可编程的,可以根据存储在该地址的代码执行任意逻辑。

  1. 钱包 (名词):用于管理以太坊账户资金的界面——钱包的运作方式取决于其关联的账户类型。像 MetaMask 这样的基于 EOA 的钱包需要私钥来授权交易。而智能合约钱包则与合约账户相关联,可以使用任意逻辑来授权交易(例如使用多签方案)。

有了这些定义,我们现在可以正式定义账户抽象了。

账户抽象的定义

账户抽象是一项旨在提升以太坊账户管理和行为灵活性的提案。我们通过引入账户合约来实现这一目标:这是一种专用智能合约,用于定义和管理用户的以太坊账户(现称为智能账户)。

通过账户抽象,你可以使用智能合约钱包享受对资金的可编程访问,而无需完全依赖私钥来保障安全。这之所以可行,是因为你的智能账户可以为资金支出和资产转移设定自定义规则。

那么,"抽象"在这一切中扮演什么角色?

从网络层面来看,"账户抽象"意味着账户类型的细节对以太坊协议是不可见的。每个账户(包括自托管账户)都只是一个智能合约,用户可以自由决定各个账户的管理和运作方式。

从用户层面来看,"账户抽象"意味着与以太坊账户交互的某些技术细节被隐藏在更高层级的界面之后。这改善了钱包设计,并显著降低了使用 web3 应用的复杂性。

这一澄清十分必要,因为围绕账户抽象的困惑往往源于不清楚(a)什么被抽象了,以及(b)抽象发生在哪里。账户并不一定是从用户那里被抽象掉的(即便它们是从协议层面被抽象的)。你仍然拥有用于接收资金的钱包地址,以及确保只有你才能动用这些资金的签名密钥。

从你的角度来看,账户抽象更像是使用一个智能账户,它将与区块链交互的某些细节抽象化了。作为参考,以下是一位初次使用者与 dapp 交互时的体验:

借助账户抽象,钱包开发者可以构建在后台处理这些流程的系统,从而简化 web3 的使用体验(简而言之:钱包变得"隐形")。部分使用场景(我们稍后将详细介绍)包括:无需存储助记词/私钥、无需为交易支付 gas 费用,甚至无需自行设置链上账户。

账户抽象的优势

如前所述,账户抽象消除了使用 web3 钱包和与 dapp 交互时的大部分摩擦。这使 web3 更接近 web2 的理想状态——无论是新手还是资深用户,都能享受同等程度的灵活性、安全性和易用性。

尤其值得关注的是,账户抽象对自托管的未来具有深远影响。借助账户合约提供的功能,使用 web3 钱包将如同使用银行账户或应用程序,却无需信任任何银行。

在接下来的章节中,我们将探讨账户抽象的不同维度,并讨论它们如何改善以太坊的使用体验。具体而言,我们将介绍签名抽象、费用抽象和nonce 抽象。

签名抽象

目前,你的 EOA 发出的交易必须包含由账户私钥通过椭圆曲线数字签名算法(ECDSA)生成的签名才能有效。这赋予了大多数 EOA 一个简单的安全模型:只要私钥掌握在用户手中,资金就是安全的。但这也存在若干局限:

  1. EOA 出了名地难以保护,尤其是恶意行为者总在不断演化出新的私钥攻击手段。 在 MetaMask,我们亲眼目睹了网络钓鱼、社会工程学、欺骗、恶意软件注入等类似攻击对 web3 用户安全构成的挑战。

  2. 自托管可能感觉像一项极限运动。 与普通银行账户不同,一旦助记词/私钥丢失,你无法"找回"EOA 钱包。这对新用户来说是一大难题——他们必须面对在毫无补救措施的情况下彻底失去以太坊账户中所有资产的风险。

签名抽象通过移除 ECDSA 签名作为非托管账户默认授权机制来解决这些问题。用户可以自定义授权钱包发起交易的规则。换句话说,你可以决定什么样的交易才算有效。

实现签名抽象为更高级的授权方案开辟了可能性。这样一来,使用 web3 钱包的体验将与 web2 银行应用相媲美,甚至更胜一筹。以下是一些使用场景:

  1. 交易限额: 与你的智能账户关联的钱包可以拒绝超出预设限额的交易(或要求额外授权)。听起来很熟悉?没错——银行早已这样做,以保护你的账户和信用卡免受欺诈、未授权使用及其他安全风险。

  2. 多方审批: 你可以将账户的部分控制权委托给可信方,即"守护人"。守护人可以是朋友、家人、服务提供商,甚至是你自己拥有的另一台设备(例如硬件钱包)。这样,你就可以为钱包启用 web2 风格的多因素认证(MFA),要求守护人批准从智能账户提取资金的交易。

  1. 密钥轮换与撤销: 使用智能账户,如果之前的签名密钥丢失或被盗,你可以生成新的签名密钥。为了进一步提升安全性,你可以让守护人在恢复过程中冻结你的账户,并要求其批准密钥轮换/撤销流程(即社交恢复)。这类似于信用卡丢失或被盗时,你可以冻结信用卡而不会失去对银行账户的访问权限。

  2. 可信会话: 你是否厌倦了在浏览器中与 dapp 交互时需要批准每一个操作?没问题!你可以用智能账户为 dapp 创建特殊的"会话密钥",让其在特定时间段内自动签署交易。这意味着你可以与 dapp 交互——比如玩区块链游戏——而无需被钱包弹窗不断打扰。

从高层次来看,会话密钥基于一个控制你的账户与 dapp 之间交互的智能合约。你始终掌控会话密钥,并可以规范 dapp 的签名权限,例如它最多可以从你的余额中扣除多少,或者它可以调用哪些函数。

  1. 自动付款: 与会话密钥的理念类似,你可以授权服务提供商按照预定规则从你的智能账户"拉取"资金。这使得使用 web3 钱包设置定期付款和订阅成为可能。你能想象用以太坊账户支付 Netflix 订阅费或水电费吗?

费用抽象

目前,每笔以太坊交易都必须包含"gas 费用",表明发送方 EOA 愿意为执行支付多少费用。Gas 费用以以太坊的原生代币以太币计价。这带来了一些问题,尤其对于新用户而言——他们需要先获取 ETH 才能发送交易。

账户抽象并不能消除支付 gas 费用的需求,但它将用户选择如何以及何时支付 gas 的细节抽象化了(费用抽象)。例如,账户抽象支持"赞助交易",即由另一个账户代为支付用户交易的 gas 费用。赞助交易的部分优势包括:

  1. 非 ETH gas 支付: 你是否曾希望能用钱包中的 ERC-20 代币支付交易费用?通过赞助交易,你可以找一个持有 ETH 的中继者预先垫付交易费用,然后用 DAI 或 USDC 等其他代币偿还。

  1. 无 gas 交易: Dapp 开发者可以赞助交易,为以太坊新用户降低入门门槛。你实际上可以在对"gas"一无所知的情况下使用 web3 应用,享受与 web2 应用相同的一键式体验。

  1. 社交登录:Dapp 可以代你部署合约钱包,解决在发送链上交易前需要先设置钱包的痛点。更棒的是:钱包可以使用身份验证基础设施(例如 Web3Auth 和 WebAuthn),让用户使用现有凭证(如电子邮件地址或 Facebook/Twitter 账号)创建 web3 账户。

Nonce 抽象

以太坊上的智能账户还有另一项特殊功能:交易批处理。通过批量交易,你可以将多个操作合并为一笔链上交易,从而降低与 dapp 交互的成本和复杂性。以下是交易批处理重要性的原因:

你的 EOA 存储着一个称为"nonce"的值,用于记录你已发送的交易数量(可以把它理解为交易计数器)。新交易必须将 nonce 严格递增 1 才能有效——这条规则防止他人"重放"同一笔交易来盗取你的资金(是的,这种情况确实会发生)。

但这里有个问题。Nonce 强制你以先进先出(FIFO)的方式处理交易。假设你有两笔交易(A 和 B),nonce 分别为 0 和 1。在这种情况下,你需要先发送交易 A,等待其执行确认后,才能发送 B。

在 A 仍处于待处理状态时发送 B,后者将直接被拒绝,因为 nonce 会超出规定范围(EOA 当前 nonce + 1)。事实上,这也是你在使用钱包时出现"卡住的交易"的一大原因。

Nonce 抽象允许你创建自定义的重放保护机制(而非由以太坊协议强制执行严格的交易排序)。例如,你可以采用允许并行处理多笔交易的 nonce 方案。这将解决交易堵塞/卡住的问题,并显著改善与 dapp 的交互体验。

话虽如此,nonce 抽象在实践中难以实现,并可能破坏对安全性和用户体验至关重要的某些不变量(例如交易哈希的唯一性)。这正是交易批处理发挥作用的地方:

由于智能账户可以同时处理多笔交易,对复杂 nonce 抽象方案的需求在很大程度上消失了。回到之前的例子,我们可以将交易 A 和 B 视为一个假设性单一操作的两个步骤,例如在 Uniswap 上进行资产兑换:

  • 交易 A:授权 Uniswap 合约访问你的代币

  • 交易 B:完成代币兑换

通过交易批处理,你可以将授权与兑换的工作流合并为一笔交易。结果:更低的 gas 费用,以及使用 dapp 时更短的等待时间。很酷,对吧?

账户抽象的"实现方式"

至此,你已经了解账户抽象允许我们为用户账户添加自定义功能和授权策略。但我们还没有真正探讨这一切是如何实现的。本节将讨论在以太坊上实现抽象的不同方案(如果这听起来不够吸引人,可以直接跳到下一节)。

实现账户抽象通常有两种公认的方式:(a)让 EOA 执行 EVM 代码,以及(b)允许智能合约发起交易。因此,你会发现许多账户抽象提案要么希望 EOA 表现得像智能合约,要么希望合约账户能像 EOA 一样行动。

这自然引出了一些问题:

  • "这两种方式究竟有何不同?"

  • "我们采用哪种方式重要吗?"

账户抽象:方案一(升级 EOA 以执行代码)

通过赋予 EOA 执行代码的能力,我们可以为用户控制的账户添加复杂功能。这将大幅增强 EOA 的能力,将其转变为智能账户,为原生账户抽象奠定基础。重要的是,这种方式让你无需承担部署新合约账户的成本,即可享受可编程钱包的优势。

将 EOA 升级为合约账户的部分方案,涉及将 EOA 交易的数据载荷视为 EVM 字节码。其他方案则涉及将 EOA 的控制权委托给一个特殊的账户合约,由其代表 EOA 发起交易。在后一种情况下,同一个账户合约可以被不同的 EOA 复用,从而减少对不同合约钱包实现的需求。

以下信息图展示了"使 EOA 可编程"阵营中的不同账户抽象提案,包括其主要特性和实施状态:

账户抽象:方案二(升级智能合约)

采用这种方案,我们升级合约账户,使其能够批准交易并支付 gas 费用(就像 EOA 一样)。这通过引入能够像 EOA 一样行动的"超级合约"(即账户合约)提供了实现账户抽象的另一条路径。此外,它还解决了以太坊中一个迫切的问题:协议层面缺乏对合约钱包的支持。

你看——一些智能合约钱包今天已经存在,并提供了账户抽象的诸多优势。但使用这些钱包可能极为困难,因为以太坊将智能合约视为"二等公民",要求所有交易都必须从 EOA 发起。

这一限制也意味着智能合约钱包缺乏像 MetaMask 这样的 EOA 钱包所具备的无需信任和自托管特性。作为参考,让我们来看看创建和使用智能合约钱包的流程:

  • 部署一个新的合约账户

  • 发送交易以调用钱包合约上的函数

问题已经显而易见:你现在需要管理两个钱包。为什么?一个(预先充值了 ETH 的)EOA 需要承担部署钱包和后续调用必要函数的费用。

中继者应运而生:EOA 可以代为支付你的钱包交易费用,以换取一定报酬。智能合约钱包提供商通常会运行中继者来为用户补贴交易费用。也就是说,中继者从其钱包中支付 ETH 来覆盖你的交易费用,然后通过其他方式收回成本——也许是以法币或其他代币的形式。

这套系统在大多数情况下运作良好:你可以创建和使用合约钱包,而无需过多担心支付 gas 的复杂性。然而,这也需要信任中继者不会审查或篡改你的交易。

但这是加密世界,我们喜欢无需信任的系统。

通过让合约账户批准交易并支付 gas 费用,账户抽象使创建和使用智能合约钱包的过程更加无需信任。具体而言,它允许任何运行中继者的人代表你执行交易。你只需签署一条消息,授权中继者在执行交易后从你的钱包余额中扣除费用:

现在,使用智能合约钱包的流程看起来有所不同:

  • 部署钱包合约?通过使用反事实部署工作流,你可以在部署合约账户之前向其发送资金,并从钱包余额中支付中继者 EOA 的部署费用。

  • 与钱包合约交互?在链下签署一条消息,让中继者调用你的账户合约。该消息将包含一条指令,要求账户合约偿还中继者的 gas 费用。

这种实现无需信任和抗审查智能账户的理念,是该类别中许多账户抽象提案的核心。例如,ERC-4337——迄今最受欢迎的账户抽象提案——通过引入一个备用内存池来去中心化中继者,用户可以在该内存池中提交合约钱包交易以供处理。

在这种情况下,中继者(称为"bundler")可以相互竞争来执行智能账户交易,从而降低审查风险或对钱包提供商的过度依赖。以下信息图展示了"赋予智能合约 EOA 特性"阵营中的不同账户抽象提案,包括其主要特性和实施状态:

账户抽象的未来

自 Vitalik Buterin 首次提出这一概念多年后,关于实现账户抽象的最佳方式仍存在一些分歧。例如,实施 EIP-3074 和 EIP-5003 将使现有 EOA(包括 MetaMask 用户)能够升级为智能账户。但这些提案需要硬分叉,鉴于社区目前专注于更紧迫的升级,这在短期内似乎并不可行。

相比之下,EIP-4337 获得了广泛支持,因为它无需对以太坊协议进行大规模改动即可实现账户抽象。但对于目前使用基于 EOA 钱包的用户而言,这意味着需要将资产从 EOA 迁移到新部署的合约账户——考虑到当前以太坊高昂的 gas 费用,这可能是一个复杂且成本高昂的过程。

在 MetaMask,我们相信账户抽象是为 web3 新用户提供无缝入门体验的关键。我们也深知,EOA 无法保障加密货币的大规模普及(正如以太坊基金会研究员 Yoav Weiss 生动地指出:"下一个十亿用户不会把 12 个单词写在纸上。")。

因此,我们已开始思考如何在不影响用户熟悉和喜爱的 MetaMask 钱包体验的前提下,提供账户抽象的优势。这一努力的一部分包括借助 MetaMask Snaps——这一无许可创新平台允许开发者在现有 MetaMask 基础设施之上构建自定义功能。

借助 Snaps,开发者可以扩展你的 MetaMask 钱包功能,以支持不同的账户抽象使用场景。从会话密钥到基于 MetaMask 构建的完整智能账户集成——全部通过 Snaps 实现——我们已经看到开发者积极应对挑战,利用 MetaMask 让用户能够平等地访问账户抽象。

"不要让完美成为美好的敌人。"——伏尔泰

当前的账户抽象提案——即便略有不足——也是在以太坊上实现无需信任、抗审查智能账户的重要一步,值得获得充分支持。引用我们团队成员 Taylor Monahan 的话:"一个已落地的半成品方案,仍胜过一个未落地的完美方案。"

这也是为什么我们关于账户抽象的下一篇文章将深入探讨 ERC-4337 的细节。重要的是,我们将讨论 web3 开发者如何借助 MetaMask,一行代码一行代码地开始构建账户抽象的未来,并将下一个十亿用户带入这个生态。

敬请期待!

特别感谢 Patrick McCorry、Simon Brown、Mirko Garozzo、Christian Montoya、Oliver Renwick 和 Megan Dias 对本文早期草稿提供的反馈意见。同时感谢 Clarissa Watson 和 Francesco Andreoli 在项目初期给予的指导与支持。

AI 翻译。可能包含错误。请务必核实信息。

评价此翻译