零点课堂 | 账户抽象的动机、历史和分析(3)
代价是什么?——硬币的两面
毫无疑问,假设账户抽象成功部署,可以带来新的功能特性,但也一定有取舍,不可能得到美好的东西,但不付出什么代价。过去五年的讨论给了我们足够的经验,其负面影响甚至由于其复杂性而难以分析。尽管如此,本文将试图系统讨论其潜在收获和代价,以便读者公允地判断。「账户抽象的收获」参考了核心开发者Peep an EIP文档[7]。
账户抽象的收获
(1)主动发送事务的智能合约账户。
智能合约账户可以无需EOA触发而主动发送事务,减少了对运营商的依赖,且gas消耗更少。
(2)提高混币器的隐私性。
现阶段,用户从类似Tornado.cash的混币器中提款仍需要依赖一个EOA账户发送事务,这个EOA账户是暴露隐私的脆弱环节。实现多租户的账户抽象后,任何人提取代币时,均无需额外支付费用,而直接从提款金额中扣除。
(3)使用其它代币支付手续费。
现阶段,用户必须使用ETH支付网络的手续费,在账户抽象实现之后,用户可以使用其它token支付手续费。但这不意味着在协议层矿工会接受非ETH作为手续费,而是通过和DEX交互换取ETH支付手续费。
(4)减少链上无效套利交易,提高可扩展性。
现阶段,在链上发现套利机会时,可能存在多个套利者同时发起套利交易,而首笔成功的套利事务会让其余事务的套利行为失效,但这些事务仍然会被打包在以太坊中(如果gasprice足够,且没有使用相同nonce替换该事务),这导致以太坊上存在大量的“垃圾”事务。而实现账户抽象之后,由于可以在账户权限验证阶段进行价格判断,那么套利者无需为失败的套利行为付费,链上也不会包含失败的套利事务,可以有效提高链的可扩展性。
账户抽象的代价
(1)加大内存池验证事务有效性的开销
在现阶段,节点收到一笔事务时,很容易判断其有效性,并将其载入内存池。节点只需要判断三件事:签名的有效性、nonce的合理性(账户当前nonce加1或合理的数值)、账户的余额,如果其中任意一条不满足,节点可以选择丢弃该事务。非法事务并不会支付手续费,节点是免费“验证”,由于验证ECDSA的签名非常简单,开销极低,目前网络的安全性不会受到挑战。
当引入账户抽象后,判断一笔事务的有效性的难度大了很多,节点需要为无效事务的验证花费更多计算资源,而不能从中收取任何费用。有关DOS攻击,参见[8]
(2)加大内存池确保事务有效性的开销
现阶段,一旦节点验证某笔事务的有效性,除非该账户使用相同nonce发送新的事务并被打包,否则这笔载入内存池的事务将永远有效,直到被打包进某个区块(也可能因为gasprice太低而一直没有打包)。而账户抽象之后,判断事务的有效性的难度提高了,内存池中的多笔事务在被打包前可以同时有效,但由于其有效性可能依赖全局状态,存在其中某一笔事务执行后剩余事务全部失效的可能性。因此,需要建立新的内存池规则,以避免这种情况的出现。
(3)引入新的事务类型、计费方式、挖矿和广播策略
首先,引入了新的事务类型。在EIP-86/208的讨论过程中,一度有一种倾向是“消灭”EOA账户,或者说把EOA账户包裹在一个智能合约账户内,这样链上的基本账户类型和事务类型都只有一种。而在本提案中,EOA账户得以保留,即存在两种类型的账户——EOA和AA,也有两种事务类型。同时,AA事务调用其它合约时必须加上前缀,以防止EOA账户发起对AA账户状态的修改,影响事务有效性的判断,这可能会带来兼容性的问题。
其次,计费方式发生了变化。现阶段,矿工无需关心事务的内容,只需要确认事务的发起方的ETH余额大于gaslimit*gasprice,就可以保证收到手续费。而在账户抽象之后,如何保证矿工可以收到手续费呢?本提案将一笔事务分拆成两个部分——验证阶段和执行阶段,用一个新的操作符PAYGAS间隔。在验证阶段,完成对账户权限的验证,在此阶段不允许调用外部数据或操作账户余额。与现阶段的方法一致,验证通过则支付手续费并开始执行事务,即使事务在执行阶段回滚,也仍然会被包含在区块中且支付费用,但验证不通过则丢弃该非法事务。
再者,挖矿和广播策略变得更加复杂。为了保护内存池和矿工的安全,推荐的挖矿策略更加保守。每个账户的待处理事务只保留一个,不再保留更高nonce的事务;对验证阶段设置gas的容量上限;在AA账户发起的事务被打包进入区块之后,需要丢弃掉内存池所有对此账户进行操作的事务。
为了避免前2条代价造成的潜在影响,以太坊协议层需要做相应的技术改动。
重新评估「收获」?
要评估账户抽象的必要性,首先不妨来回顾其“收获”。“收获”无非分为两种类型——原来不能做的,现在可以做了;比原来做得更好了。
(1)主动发送事务的智能合约账户。
智能钱包可以做到这件事情,此收获属于一种改进。由于事务的有效性依赖于合格的签名(或其它凭证),而非发送事务的EOA账户,因此**任何EOA账户**都可以提交事务,不存在信任或可靠性风险。由于无需转发事务,更少的gas消耗是一个合理的“收获”,但能达到整体的最优吗?换句话说,在引入了如此复杂的技术改动之后,针对相同的事务内容,计算机在相同时间内可以处理更多的AA事务还是EOA事务?
结论:一种需要技术验证的改进。
(2)提高混币器的隐私性。
目前Tornado.cash使用运营商的模式,替代用户提交取款的收据。与智能钱包的运营商不同,隐私运营商可能不够稳定和 ,任何人可以替代提交事务,但隐私场景下的运营商可靠性会低于通用场景,可能造成服务不可用。不过,这需要在多租户阶段才能实现,而目前多租户模式的方案的可行性、安全性仍然需要验证。
结论:一种提高服务可用性的改进。但不知道能否上线,何时可以上线。
(3)使用其它代币支付手续费。
现在智能钱包在做类似的事情,例如Argent、MYKEY都允许用户使用DAI支付手续费,但这一操作并非原子的。使用稳定币等资产通过DEX兑换ETH支付手续费,乍看解决了原来不能解决的问题,但我想表达的是,真实需求并非是技术完备性,而是使用稳定的货币来对抗不稳定的手续费(ETH价格波动、gasprice价格波动、gas消耗不确定)。使用链上事务直接置换手续费,有一种每次使用手机联网前,先买充值卡充话费的感觉,似乎回到了投币电话的时代。何况这笔事务还有巨大的失败风险,因为链上状态的改变可能影响价格。当然,这并不是说投币电话没有用处。
结论:一种可以实现原子化使用非ETH资产支付手续费的改进。但不解决价格波动问题,真实需求存疑,且计费方式效率低下。