零点课堂 | 账户抽象的动机、历史和分析(1)
概述
账户抽象[[Account Abstraction]]是以太坊上的一种待实现的技术方案,按现阶段设计,在实现账户抽象之后,一个智能合约账户也可以主动发起交易,而无需依赖“元交易”的机制。
背景
以太坊的账户有两种类型,一种是外部账户,另一种是合约账户。外部地址是由用户的公钥经过哈希运算后取的后20个字节,形为
0x76D836358E7A2BB0F26c32Ce61Dc8DD540b02F7D 。
目前的以太坊的事务类型只有一种,必须由外部地址发起,合约地址无法主动发起事务。因此,任何合约自身状态的改变,必须依赖于一个外部地址发起的事务,无论是一个多重签名账户,还是混币器,或是任何智能合约的配置变更,都需要由至少一个外部账户触发。这样的设计让以下两件事情无法完成。
无需以太的主动事务
由于事务必须由外部账户发送并支付费用,而该费用是用以太(ETH)为单位结算的,因此该外部地址必须持有以太。当然,这种说法并不严谨,当gasprice为0时,事务无需支付手续费。可这种情况非常极端(见 [1]) ,对于普通用户来说,这样的事务可能永远无法入块。
非secp256k1的原生验证方式
由于事务必须由外部账户发起,因此每笔事务的合法性检查就是在验证事务是否提供了该账户对应的合法的secp256k1签名。而如果要在验证中引入复杂逻辑(例如多重签名或社交恢复)或是采用不同的验证算法(例如Eddsa、BLS、secp256r1签名算法,使用这些签名算法是因为它们有特别的特性,或是对零知识证明友好,或是方便签名聚合减少带宽开销,或是与现有的硬件验证器兼容),则必须在智能合约层面实现。这也同时意味着,这种验证仍要由至少一个外部账户发起,并通过以太坊的secp256k1签名验证。
上述两条约束让普通用户很难使用以太坊。首先,无论使用以太坊上的什么应用,用户都必须持有以太(并承担以太价格波动的风险)。其次,用户需要处理复杂的费用逻辑,gas price, gas limit, 事务阻塞,这些概念对用户来说过于复杂。许多区块链钱包或应用试图通过产品优化提高用户体验,但效果甚微。
如何解决上述两个问题呢?
核心思路在于将“验证所有权”的操作由共识层下放到合约层,即不去检查事务的发送者是否与资产所有人一致,而是检查其是否提供了合法的凭据。具体的做法为:用户对事务内容进行签名,并将签名交由一个第三方操作上链,这个第三方我们在接下来的文章中用“运营商(operator)”来指代。这种事务被称为“元交易”。根据设计理念的不同,元交易方案大致分为两类:
以账户为中心——智能钱包
以账户为中心的方案的目标是为用户创建一个基于智能合约管理的账户,用户可以使用该账户与区块链上的任意合约交互。智能钱包的理念由来已久,但在近一年来有了长足的进展。根据「智能钱包趋势」的统计(注:作者为本人,特此声明),目前「智能钱包」的运营商超过10家,总用户数超过14万。其中大部分智能钱包采用了为用户代付链上手续费的运营策略,再通过其它方式向用户收取费用。
以账户为中心的方案本质上是一套区块链账户系统,通用性强,且可以提供包括账户恢复、大额审批、转账白名单等附加特性。智能钱包的运营者协助用户创建、管理区块链上的可编程身份,并提供事务上链服务。一般来说,智能钱包会为用户支付链上的gas费,同时通过中心化计费系统向用户收取费用。这套模式和传统世界里的账户服务很像,例如运营商支付基站、光纤等费用,而用户只要充值话费就可以使用通信服务,而无需关心底层复杂的逻辑。
智能钱包也有其掣肘。一是安全问题,二是费用问题。
安全:如果账户合约存在漏洞,那么所有用户的资产都会遭受风险。专业的代码编写、安全审计和形式化验证,都只能减少风险发生的可能,而不能保证它不会发生——Argent已经发生过。
费用:智能钱包的账户创建需要费用,而转账和任何调用任何合约都会比外部地址花费更多费用。这导致智能钱包的用户需要支付更高的事务费用,这影响了他们的使用体验
以资产为中心——无气通证
无气通证也存在其问题。从目前的使用情况来看,极少有人使用这种特性(需要数据支持)。在「智能钱包,不止元交易」一文中,我分析了可能的原因,其中之一在于没有办法建立有效的计费系统。
以资产为中心的方案提高了资产的可用性。不同于智能钱包需要创建智能合约账户,无气通证可以支持外部账户在不使用以太的情况下进行转账,反而是智能合约账户需要兼容更多规范(例如EIP-2126,让合约可以识别不同类型的签名格式),否则无法让无气通证的合约验证所有权。
以资产为中心的方案的目标是创建允许由第三方支付费用的资产,实现“无需gas的通证”。例如,DAI、USDC都可以允许任意外部地址使用元交易的方式发送资产。这些通证协议都使用EIP-712协议验证拥有者的合法性。