AIP-115:无状态账户
AIP-115 介绍无状态账户。
什么是无状态账户?
Section titled “什么是无状态账户?”无状态账户是 Aptos 账户的一种新行为:账户无需显式创建 0x1::account::Account 资源也能运行。此类账户会先使用默认行为,只有在某项操作必须使用该资源时才创建它。该变化简化了账户管理,避免不必要的资源创建,使开发者和用户更容易与 Aptos 区块链交互。
它与普通账户有何不同?
Section titled “它与普通账户有何不同?”从技术上看,并不存在单独的账户类型。所有账户在底层都是相同的;区别在于,没有资源的账户会以默认值按“无状态”方式运行。账户资源只会在需要时按需创建。
它如何工作?
Section titled “它如何工作?”当账户签署第一笔使用序列号的交易时,不会创建 0x1::account::Account 资源。只有某项操作需要递增序列号时,才会创建该资源。
对于无序交易,根本不需要账户资源,因此也不会创建该资源。
技术细节常见问题
Section titled “技术细节常见问题”无状态账户的默认 auth_key 是什么?
Section titled “无状态账户的默认 auth_key 是什么?”如果 0x1::account::Account 资源不存在,auth_key 默认等于账户地址本身。这样账户无需资源即可签名并提交交易。
无状态账户的序列号是多少?
Section titled “无状态账户的序列号是多少?”如果账户资源不存在,序列号默认是 0。未来引入无序交易后,序列号可能会被完全取消。
何时会自动创建账户资源?
Section titled “何时会自动创建账户资源?”当某项操作需要链上状态时会创建该资源,例如:
- 轮换认证密钥。
- 使用依赖账户资源的能力或功能,例如序列号。
- 显式调用访问账户资源字段的函数。
创建账户资源是否会产生额外 gas 成本?
Section titled “创建账户资源是否会产生额外 gas 成本?”会。资源创建被延后,相应的 gas 与存储费用只会在实际创建时收取,而不是预先收取。
Move 层面的账户模块行为是否有变化?
Section titled “Move 层面的账户模块行为是否有变化?”0x1::account::exists_at 始终返回 true,因为所有链上账户地址都被视为有效,并默认视为存在。模块中没有用于检查底层账户资源是否真实存在的 Move 函数,目的是让这一行为对用户透明。因此,任何先检查账户是否存在、再尝试创建账户的逻辑现在都已过时。
用户能否预先强制创建账户资源?
Section titled “用户能否预先强制创建账户资源?”可以。用户可以按需显式调用 0x1::account::create_account_if_does_not_exist 等函数,手动创建该资源。
API 行为是否有变化?
Section titled “API 行为是否有变化?”如果依赖以下 API 行为,请相应调整。GET /accounts/{address} 不再返回“404 not found”;它会返回无状态账户前文所述的默认认证密钥和序列号。因此,如需检查账户资源是否存在,请请求 GET /accounts/{address}/resource/0x1::account::Account。
已有账户会受到影响吗?
Section titled “已有账户会受到影响吗?”不会。已创建资源的现有账户将继续按原有方式运行。无状态账户行为只适用于尚未创建资源的账户。
dApp / CEX 是否需要修改?
Section titled “dApp / CEX 是否需要修改?”可能需要。此前,应用通常调用在未找到账户资源时返回 404 错误的 API,以判断账户是否存在,并据此提示用户(例如“该账户不存在”)。在新模型中,所有地址都被视为有效,因此基于 404 的存在性检查不再可靠或有意义。不过,这种模式并未被禁止:开发者仍可提示用户,该账户可能尚未进行链上活动,因而还没有创建资源。
如果仍要检测账户是否关联资源,可使用第 9 个问题中的方法,或检查 sequence_number 是否为 0。但请注意,引入无序交易后,某些账户可能只提交从不创建资源的交易,这可能导致假阴性。
建议将应用设计为无论账户资源是否存在都能稳健运行,并避免把资源存在与否当作账户存在的代理。
示例:
- 钱包可能检查账户是否存在,以判断它是否为新账户并向用户显示提示。采用此项变化后,需要改用第 9 个问题所述的缓解方式。
- 托管钱包可能通过发送资金来为账户初始化 gas。采用此项变化后,它需要检查账户余额,而不只是检查账户是否存在。
它与无序交易兼容吗?
Section titled “它与无序交易兼容吗?”兼容。无序交易和无状态账户相辅相成。启用无序交易后,将不再需要序列号,从而实现真正的无状态使用方式。
未来所有账户都会变成无状态账户吗?
Section titled “未来所有账户都会变成无状态账户吗?”不会。无状态账户并不是一种新的账户类型;它只是让账户在需要账户资源前使用默认逻辑。这种延迟资源创建不会改变现有账户状态。所有账户默认都可以无状态方式运行,但在使用高级功能时仍会按需创建标准资源。