MetaMask官方下载网址:https://metamka.com
了解以太坊中的账户抽象——它的含义以及它为什么重要。
即使熊市肆虐,也很少有人怀疑加密货币会继续存在——例如,像 MetaMask 这样的钱包已经拥有数百万用户。但是,问题仍然存在:“我们如何才能将下一个十亿用户引入 web3?”
这个问题的答案因人而异。但每个人都同意一些观点,尤其是需要改善用户与区块链应用程序交互的体验。如果不让 web3 更加用户友好,人们就没有动力从他们每天使用的 web2 应用程序切换。
“账户抽象”是一项旨在改善用户与以太坊交互的提案,该提案日益成为加密社区讨论的主题。然而,你可能会想:“账户抽象到底是什么?我为什么要关心它?”
本文旨在帮助您理解账户抽象,将其过去、现在和未来置于背景中。我们将回答您关于该主题的所有问题,特别是账户抽象的谁、什么、为什么、如何和何时。
主要讨论要点简要总结:
可编程的自托管账户(“智能账户”)可以减少新用户加入 web3 生态系统的阻力。然而,以太坊的设计限制阻碍了智能账户的广泛采用和使用。
账户抽象化带来了重大变化,为广泛采用无需信任、不受审查的智能账户铺平了道路。人们正在考虑实施账户抽象化的不同方法,每种方法都有其独特的优势和弊端。
MetaMask 通过其无需许可的创新平台MetaMask Snaps支持采用账户抽象。借助 MetaMask Snaps,开发人员可以扩展 MetaMask,为全球加密用户带来账户抽象的好处。
什么是账户抽象?
与 web3 中的任何其他新概念一样,账户抽象很难定义。不过,我们可以通过首先解开与以太坊账户抽象讨论相关的各种术语来更好地理解它:
抽象 (n):计算机科学中的一个(相当复杂的)术语,大致意思是隐藏有关系统或应用程序的信息,这样就可以在不了解后台运行的进程的情况下使用它。也被定义为“通过提供简化操作的界面来隐藏系统复杂性的过程。”
账户 (n):用户在区块链上的代表,可以发送或接收交易并与其他链上账户交互。以太坊有两种类型的账户:外部拥有账户(EOA) 和合约账户(又称“智能合约”)。
2a.外部拥有账户 (EOA):使用钱包软件(如 MetaMask)生成的以太坊账户,由一对加密公钥和私钥管理。EOA 是“活跃的”(它可以发起交易并支付 EVM 执行的 gas 费用)。但是,它仅限于执行基本操作——例如发送 Ether 或与合约交互。
2b.合约账户:以太坊账户部署为智能合约,由代码编写的逻辑(而不是私钥)控制。合约账户是“被动的”:它只能响应来自 EOA 的交易发送交易,不能支付 gas 费用。但它是可编程的,可以根据存储在地址中的代码执行任意逻辑。
新的 EOA 与合约账户@2x
钱包 (n):用于管理以太坊账户资金的界面——钱包的运作方式取决于它所关联的账户类型。基于 EOA 的钱包(如 MetaMask)需要私钥来授权交易。而智能合约钱包则与合约账户相关联,可以使用任意逻辑来授权交易(例如使用多重签名方案)。
有了这些定义,我们现在可以定义帐户抽象。
定义帐户抽象
账户抽象是一项旨在提高以太坊账户管理和行为灵活性的提议。我们通过引入账户合约来实现这一目标:定义和管理用户以太坊账户(现在称为智能账户)的专用智能合约。
借助账户抽象,您可以使用智能合约钱包来享受可编程的资金访问,而不必仅依靠私钥来确保安全。这是可能的,因为您的智能账户可以有自定义的规则来花费硬币和转移资产。
那么,“抽象”与这一切是如何契合的呢?
从网络层面来看,“账户抽象”意味着账户类型的细节对以太坊协议是不可见的。每个账户(包括自托管账户)都只是一个智能合约,用户可以自由决定如何管理和运营单个账户。
从用户层面来看,“账户抽象”意味着与以太坊账户交互的某些技术细节被隐藏在更高级别的接口后面。这改善了钱包设计,并大大降低了使用 web3 应用程序的复杂性。
这一澄清是必要的,因为围绕账户抽象的困惑来自于不知道 (a)抽象的内容和 (b) 抽象发生在哪里。账户不一定是从用户中抽象出来的(即使它们是从协议中抽象出来的)。你仍然有一个钱包地址来接收资金,还有一个签名密钥来确保只有你可以花费这些资金。
从你的角度来看,账户抽象更像是使用一个智能账户,它抽象了一些与区块链交互的细节。从上下文来看,从首次用户的角度来看,与 dapp 的交互是这样的:
创建 EOA 并与 dapp@2x 交互的工作流程
通过账户抽象,钱包开发者可以创建在后台处理这些流程的系统,并简化使用 web3 的体验(TL;DR:钱包变得“隐形”)。一些用例(我们稍后会展开)包括:无需您存储种子短语/私钥,无需为交易支付 gas,甚至无需自己设置链上账户。
账户抽象的好处
如前所述,账户抽象消除了使用 web3 钱包和与 dapp 交互时的大部分摩擦。这使 web3 更接近 web2 的理想,所有用户(无论是新手还是经验丰富的用户)都可以从相同程度的灵活性、安全性和易用性中受益。
截图于 2023-04-25 下午 1.00.34
尤其是账户抽象化对于自我托管的未来有着重大影响。借助账户合约提供的功能,使用 web3 钱包就像使用银行账户或应用程序一样,无需信任银行。
在后续章节中,我们将讨论账户抽象的不同维度,并讨论它们如何改善以太坊的使用体验。具体来说,我们将讨论签名抽象、费用抽象和随机数抽象。
签名抽象
如今,来自 EOA 的交易必须具有由账户私钥使用椭圆曲线数字签名算法(ECDSA) 生成的签名才有效。这为大多数 EOA 提供了一个简单的安全模型:如果私钥仍在用户手中,资金就是安全的。但它也有几个限制:
众所周知,EOA 的安全性非常难以保证,尤其是恶意行为者总是在不断开发新的方法来窃取私钥。在 MetaMask,我们亲眼目睹了网络钓鱼、社交工程、欺骗、恶意软件注入和类似攻击对 web3 中的用户安全造成的挑战。
自我保管可能感觉像是一项极限运动。与普通银行账户不同,如果种子短语/私钥丢失,您无法“恢复” EOA 钱包。这给新用户带来了挑战,他们必须应对完全失去以太坊账户中持有的资产而无任何追索权的后果。
EOAs@2x 的安全相关缺陷
签名抽象通过删除 ECDSA 签名作为非托管账户的默认授权机制来解决这些问题。相反,用户可以定义授权钱包发起交易的自定义规则。或者,换句话说,你可以决定交易有效的含义。
实现签名抽象为更高级的授权方案提供了可能性。这样,使用 web3 钱包的感觉将与 web2 银行应用程序类似,甚至更好。以下是一些用例:
交易限制:如果金额超过预设限额,链接到智能账户的钱包可以拒绝交易(或要求额外授权)。听起来很熟悉?应该如此——银行已经这样做了,以保护您的账户和信用卡免受欺诈、未经授权的使用和其他与安全有关的原因。
多方批准:您可以将部分账户控制权委托给受信任的各方,即“监护人”。监护人可以是朋友、家人、服务提供商,甚至是您拥有的单独设备(例如硬件钱包)。因此,您可以通过要求监护人批准从您的智能账户中提取资金的交易,为您的钱包启用 web2 风格的多因素身份验证 (MFA)。
web3 钱包的多因素身份验证@2x
密钥轮换和撤销:使用智能账户,如果之前的密钥丢失或被盗,您可以生成新的签名密钥。为了提高安全性,您可以让监护人在恢复过程中冻结您的账户,并要求批准密钥轮换/撤销流程(即社交恢复)。这类似于如果您的信用卡放错地方/被盗,您可以冻结它,而不会失去对银行账户的访问权限
受信任的会话:您不喜欢在浏览器中与 dapp 交互时必须批准每个操作吗?太好了!您可以使用智能账户为 dapp 创建特殊的“会话密钥”,以便在特定时间段内自动签署交易。这意味着您可以与 dapp 交互(例如玩区块链游戏),而不会受到钱包弹出窗口的困扰。
使用带有会话密钥@2x 的 dapp
从高层次来看,会话密钥基于控制您的帐户与 dapp 之间交互的智能合约。您始终可以控制会话密钥,并且可以控制 dapp 的签名权限,例如它可以从您的余额中扣除多少钱或可以调用哪些函数。
用户如何“批准”可信会话@2x
自动付款:与会话密钥的理念类似,您可以批准服务提供商从您的智能账户中“提取”资金(受预定义规则约束)。这样就可以使用您的 web3 钱包设置定期付款和订阅。您能想象使用您的以太坊账户支付 Netflix 订阅或水电费吗?
费用提取
目前,每笔以太坊交易都必须收取“gas 费”,表示发送方 EOA 愿意为执行交易支付多少钱。gas 费以以太坊的原生代币 Ether 计价。这会带来问题,尤其是对于现在需要在发送交易之前获取 ETH 的新用户而言。
账户抽象化并不能消除支付 gas 费用的需要,但它抽象了用户选择支付 gas 费用的方式和时间的细节(费用抽象化)。例如,账户抽象化可以实现“赞助交易”,即另一个账户承担用户交易的 gas 费用。赞助交易的一些好处:
非 ETH gas 支付:您是否曾希望使用钱包中的 ERC-20 代币支付交易费用?通过赞助交易,您可以让中继者使用 ETH 来支付您的交易费用,然后使用 DAI 或 USDC 等其他代币偿还。
正常交易 vs 无 ETH 交易@2x
无 Gas 交易: Dapp 开发人员可以赞助交易并最大限度地减少新以太坊用户的入门障碍。您实际上可以在不了解“gas”的情况下使用 web3 应用程序,并享受 web2 应用程序提供的相同一键式体验。
正常交易 vs 无 gas 交易@2x
社交登录: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 抽象@2x
话虽如此,nonce 抽象在实践中很难实现,并且可能会破坏对安全性和用户体验至关重要的某些不变量,例如交易哈希唯一性)。这就是交易批处理发挥作用的地方:
由于智能账户可以同时处理多个交易,因此对复杂的 nonce 抽象方案的需求基本上消失了。回到前面的例子,我们可以想象交易 A 和 B 仅仅是一个假设操作的一部分,比如在 Uniswap 上交换资产:
交易 A:批准 Uniswap 合约访问你的代币
交易 B:完成代币交换
通过交易批处理,您可以将批准和交换工作流程合并为一笔交易。结果:使用 dapps 时,gas 费用更低,等待时间更短。很酷,不是吗?
交易批处理如何改善使用 DeFi dapp@2x 的工作流程
账户抽象的“方式”
到目前为止,您已经知道帐户抽象允许我们向用户帐户添加自定义功能和授权策略。但我们实际上还没有讨论过如何实现这些。本节讨论了在以太坊上实现抽象的不同方法(如果这听起来不太吸引人,请随意跳到下一节)。
实现账户抽象有两种普遍接受的方法:(a) 让 EOA 执行 EVM 代码和 (b) 允许智能合约发起交易。因此,您会发现许多账户抽象提案要么希望 EOA 表现为智能合约,要么希望合约账户表现为 EOA。
这自然会带来一些问题:
“这些方法到底有何不同?”
“我们采用哪种方法很重要?”
账户抽象:方法 1(升级 EOA 以执行代码)
通过赋予 EOA 执行代码的能力,我们可以为用户控制的账户添加复杂的功能。这增强了 EOA 并将其转变为智能账户,为原生账户抽象奠定了基础。重要的是,这种方法让您可以享受可编程钱包的好处,而无需承担部署新合约账户的成本。
将 EOA 升级为合约账户的一些方法涉及将 EOA 交易的数据有效负载视为 EVM 字节码。其他方法涉及将 EOA 的控制权委托给代表 EOA 进行交易的特殊账户合约。在后一种情况下,不同的 EOA 可以重复使用同一个账户合约,从而减少了对不同合约钱包实现的需求。
下面的信息图展示了“使 EOA 可编程”阵营中不同的账户抽象提案,包括其主要特征和实施状态:
账户抽象提案(I)@2x
账户抽象:方法 2(升级智能合约)
通过这种方法,我们升级了合约账户,使其能够批准交易并支付 gas 费(就像 EOA 一样)。这通过引入可以充当 EOA(即账户合约)的“增压合约”提供了实现账户抽象的另一种途径。此外,它解决了以太坊的一个紧迫问题:在协议层面缺乏对合约钱包的支持。
你看——如今已经存在一些智能合约钱包,它们提供了许多账户抽象的好处。但使用这些钱包可能非常困难,因为以太坊将智能合约视为“二等公民”,并要求所有交易都从 EOA 开始。
这一限制还意味着智能合约钱包缺乏 MetaMask 等 EOA 钱包的免信任性和自我托管性。为了便于理解,我们来看一下创建和使用智能合约钱包的流程:
部署新合约账户
发送交易以调用钱包合约上的函数
问题已经很明显了:你现在需要管理两个钱包。为什么? EOA(预先用 ETH 资助)需要承担部署钱包和随后调用必要功能的成本。
与智能合约钱包交互@2x
中继器:可以支付您钱包交易费用的 EOA。智能合约钱包提供商通常会运行中继器来补贴用户的交易。也就是说,中继器从其钱包中支付 ETH 来支付您的交易费用,并通过在其他地方向您收费(可能是法定货币或其他代币)来收回成本。
在大多数情况下,该系统运行良好:您可以创建和使用合约钱包,而不必担心支付 gas 的复杂性。但是,它还需要信任中继器不会审查或篡改您的交易。
但这是加密,我们喜欢无需信任的系统。
通过让合约账户批准交易并支付 gas 费用,账户抽象使创建和使用智能合约钱包的过程更加无需信任。具体来说,它允许任何运行中继器的人代表您执行交易。您只需签署一条消息,批准中继器在执行交易后从您的钱包余额中扣除资金:
现在使用智能合约钱包的流程看起来有些不同:
部署钱包合约?通过使用反事实部署工作流程,您可以在部署之前将资金发送到合约账户,并从钱包余额中向中继者的 EOA 支付部署费用。
与钱包合约交互?在链下签署一条消息,并让中继器调用您的账户合约。该消息将包含一条指示,指示账户合约退还中继器的 gas 费用。
通过中继器@2x 与智能合约钱包交互
这种实现无需信任、不受审查的智能账户的想法支撑了这一类别中的许多账户抽象提案。例如,ERC-4337(迄今为止最受欢迎的账户抽象提案)通过引入替代内存池来去中心化中继器,用户可以在其中提交合约钱包交易以供处理。
在这种情况下,中继器(称为“捆绑器”)可以竞争执行智能账户交易,从而降低审查或过度依赖钱包提供商的风险。以下信息图显示了“赋予智能合约 EOA 功能”阵营中的不同账户抽象提案,包括其主要功能和实施状态:
账户抽象提案(II)@2x
关于账户抽象的未来
在 Vitalik Buterin首次提出该概念多年后,关于实现账户抽象的最佳方式仍然存在一些分歧。例如,实施EIP-3074和EIP-5003将使现有的 EOA(包括 MetaMask 用户)能够升级到智能账户。但这些提议需要硬分叉,鉴于社区专注于更紧迫的升级,这目前似乎是不可行的。
相比之下,EIP-4337获得了广泛支持,因为它实现了账户抽象,而不需要对以太坊协议进行大规模更改。但对于目前使用基于 EOA 的钱包的用户来说,这意味着必须将资产从 EOA 转移到新部署的合约账户——鉴于目前以太坊的 Gas 费用很高,这可能是一个复杂且昂贵的过程。
账户抽象模因
在 MetaMask,我们认为账户抽象是为新的 web3 用户提供无缝入门体验的关键。我们还知道 EOA 无法保证加密货币的采用(“下一个十亿用户不会在纸上写 12 个字”,正如以太坊基金会研究员 Yoav Weiss 生动地指出的那样。)
因此,我们开始思考如何在不损害用户熟知和喜爱的 MetaMask 钱包的情况下实现账户抽象化。这项工作的一部分包括转向MetaMask Snaps — 这是一个无需许可的创新平台,允许开发人员在现有 MetaMask 基础设施之上构建自定义功能。
使用 Snaps,开发人员可以扩展 MetaMask 钱包的功能,以支持不同的帐户抽象用例。从会话密钥到使用 MetaMask 构建的完整智能帐户集成(全部使用 Snaps 构建),我们已经看到开发人员迎接挑战,使用 MetaMask 实现用户对帐户抽象的民主化访问。
MetaMask 喜欢帐户抽象@2x
“不要让完美成为优秀的敌人。”——伏尔泰
当前的账户抽象化提案(即使略有瑕疵)是朝着在以太坊上实现无需信任、不受审查的智能账户迈出的一大步,值得得到足够的支持。引用我们自己的一位 Taylor Monahan 的话,“交付的半成品解决方案仍然比未交付的完美解决方案要好。”
这就是为什么我们下一篇关于账户抽象主题的文章将深入探讨 ERC-4337 的细节。重要的是,我们将讨论 web3 开发人员如何开始构建账户抽象的未来,并使用 MetaMask 一行一行地引入下一个十亿用户。
敬请关注!
特别感谢 Patrick McCorry、Simon Brown、Mirko Garozzo、Christian Montoya、Oliver Renwick 和 Megan Dias 对本文早期草稿的反馈。我还要感谢 Clarissa Watson 和 Francesco Andreoli 在项目早期阶段提供的指导和支持。