[TOC]
AIP-52 - 为代付交易(Sponsored Transactions)自动创建账户
一、概述
现阶段,区块链用户需要先创建账户才能进行交易。为了让账户的创建变得更简单快捷,本提案(AIP)建议,当支付交易 Gas 费的人不是交易的主要签名者,并且主要签名者还没有账户时,允许通过代付的方式来创建账户。
1. 目标
这个 AIP 使得代付交易更容易,它让代付交易无需预先检查账户是否已经存在。这样一来,能显著提升开发者在 Aptos 上的工作体验。
二、替代方案
尽管有关于账户 v2(例如默认去除链上状态)的讨论仍在进行中,但这些功能在主网上的实现至少还需6个月时间。当前采取的方案意在为代付交易开启无状态的支持功能,而不干扰账户 v2 据此定制的时间线。
三、规范
1. 当前的代付交易流程(从主要签名者的角度来看):
- 目前的初始检查(prologue evaluates)会确定账户是否存在,以及序列号是否设置正确。
- 在交易执行期间,虽然任何框架都可能会试图访问账户数据,但对于绝大多数涉及获取对象的交易,这些数据并非必须。然而,对于一些较为传统的数据类型,账户数据则是必要的。特别是对于 TokenV1 和 CoinV1,它们需要访问
GUID(全局唯一标识符)生成器来获得编号。 - 结尾部分递增序列号
2. 建议的流程:
- 假设未创建的账户序列号为 0。
- 在执行过程中,如果是代付交易,请检查账户是否存在,如果不存在,则显式创建它。然后执行交易。
- 结尾部分保持不变。
3. 错误情况:
在一些特定情况下,一个交易即使记录在区块链中也可能执行失败。这种情况下,该交易被视为中止,发送者需要为此次交易支付 Gas 费,同时发送者账户的序列号会增加。若交易得到代付,那么费用由代付者支付,但发送者账户的序列号还是会增加。此 AIP 必须解决一个特殊情形:账户尚未建立。在这类情况中,无法真正地从发送者账户收取费用,因为它没有一个合法的账户或序列号来进行追踪。针对这些情况,可采取如下几种解决方案:
- 放弃交易,即不将其提交到区块链。这不是一个好的解决方案,因为这会打开拒绝服务攻击的大门。交易的发送者可以运行 I/O 或执行密集型的交易,并在交易结束时中止。付费人将永远不会被收费,但区块链系统已经完成了重要的处理工作。
- 先执行账户创建操作并在失败的情况下按规定收费。不过,遗憾的是,由于当前的程序架构,要实现这样的方案需要对代码库进行大规模的改动,特别是需要对交易的处理过程进行重要的代码重构。具体来说,需要围绕事务会话进行重大的重构。
- 不管什么情况都创建账户。不幸的是,这样做会使得攻击者可以支付最低的燃料费来占用存储,并可能导致一种相当便宜的方式来耗尽 Aptos 的存储空间。
- 我们规定,在序列号为 0 的被代付的交易中,负责支付费用的一方必须承担两个存储位置的费用以及不少于当前市场 gas 单价的十倍。这样做的目的是确保交易为创建账户支付了充足的费用,防止通过终止交易程序的方式来节省创建账户的成本。
尽管第四个选项并不是最理想的解决办法,但选择其他的替代方案将会推迟如 AptosVM 等其他项目的大规模重构工作。因此,在这次更新之后,我们预见这一解决方案最终只会是留存在不常维护的遗留代码里面。
与此同时,还存在一个相关的挑战:如果账户被删除,是否允许用户通过之前的存款来申请退款。
- 启用退款机制使得代码升级过程更加简单,同时通过确保存储成本可以得到补偿,从而鼓励用户将账户从 accountV1 升级到 accountV2。此外,技术团队还可以确保只有在创建新的 accountV2 时,旧的 accountV1 才会被删除。
- 通过取消退款功能,我们就无需担心退还的资源使用费用并未通过相应的收费来合理化。这种风险实在是微乎其微,因为除了完备的集成测试以外,我们还能在交易的验证与执行过程中进行再次确认。
选项 1 是更可行的路径,因为它既改进了迁移到账户 v2 的路径,又限制了需要编写的新代码量。
四、参考实现
五、测试(可选)
这是一个 API 测试的链接,用于全面验证账户从不存在到创建、使用的整个过程。测试完成后,将以账户已经存在的前提下重复执行同一测试。
六、风险和缺点
对赞助的交易可能会有微小的性能影响,但这种情况不大可能发生,因为存储访问操作已经过缓存,并且这部分成本相较于初始检查来说不占主导。不过即便如此,由于这种行为对于提升开发者的使用体验至关重要,这种成本是可以接受的。而且,当我们启用 accountV2 同时逐步淘汰 accountV1 时,这样的检查将不再必要。
使用代付交易的应用程序开发人员应该意识到,他们的交易成本可能会更高,因为账户创建现在是隐含的。可以通过假设所有交易都会导致更高的成本、利用模拟或显式收取预期操作的 Gas 数量来减轻这种情况。
最大的缺点是我们引入了一个次优的解决方案,无论是在以尽力而为的 Gas 收费方式还是在存储押金检查方面。
这个方案最大的不足之处在于,我们引入的是一个非最优的解决策略,这不仅体现在我们尽最大努力确定的 Gas 费用上,也体现在我们如何核对存储押金(storage deposits)的方式上。
七、时间表
该 AIP 的预期时间表是在1.9 版发布,或者如果 1.9 版基于外部产品需求而延迟,则会提前发布。
请注意,一旦 AccountV2 发布并且有效地满足了链上账户在使用前必须创建的需求,我们将会停用此功能。AccountV2 的预期发布时间是在 2024 年下半年的某个时期。