跳转到内容

AIP-123:无序交易

AIP-123 引入无序交易。这类交易用 nonce 而不是序列号来防止重放,因此可以按任意顺序执行,也不需要链上的 0x1::account::Account 资源。

携带 nonce 的负载布局见 AIP-129。 REST API 使用的编码见 交易负载与 BCS

基于序列号的交易要求发送者的下一个序列号精确匹配。这会强制同一账户的提交串行化,也是无状态账户在发送第一笔序列号交易时创建 Account 资源的原因。

无序交易用 nonce 替代该计数器。链会保存近期的 (sender, nonce) 对,并拒绝重复 nonce。客户端可以从多台机器提交,而无需协调序列号。

它与序列号的重放保护有何不同?

Section titled “它与序列号的重放保护有何不同?”
  • 基于序列号的交易仅在交易序列号等于账户当前序列号时执行,并且按顺序执行。
  • 无序交易在 (sender, nonce) 尚未被记录时执行,可以按任意顺序提交。

(sender, sequence number) 可以唯一标识一笔已提交的序列号交易。(sender, nonce) 不能唯一标识一笔已提交的无序交易,因为在旧条目被垃圾回收后,同一个 nonce 可以再次使用。

没有 0x1::account::Account 资源的无状态账户,以及已经拥有该资源的账户,都可以发送无序交易。

无状态发送者在轮换密钥之前只能使用默认的 Ed25519 认证路径。轮换密钥会创建 Account 资源。

选择一个随机的 u64。在 (address, nonce, expiration T) 的交易提交后,同一对在被垃圾回收前不能重用。链上重叠间隔为 100 秒,因此不要用小于或等于 T + 100 秒的新过期时间重用该对。建议每笔交易都使用新的随机 nonce。

无序交易的过期时间最多只能是未来 60 秒。请把过期时间保持在该窗口内。更长的过期时间会被丢弃,状态为 TRANSACTION_EXPIRATION_TOO_FAR_IN_FUTURE。基于序列号的交易没有这个 60 秒上限。

可以。基于序列号的交易仍然有效。如果应用要求同一发送者按顺序执行,请继续使用序列号交易。

无状态账户提交序列号为 0 的序列号交易时会创建 Account 资源,之后不再是无状态账户。无状态账户上大于 0 的序列号会被丢弃。

VM 状态为 NONCE_ALREADY_USED。详见 错误码

GET /transactions/by_hash/{hash} 仍然可用。过去通过轮询 GET /accounts/{address}、并根据序列号推断进度的客户端,不能把该方法用于无序交易。节点还提供 GET /accounts/{address}/transaction_summaries,返回哈希、版本以及重放保护值(nonce 或序列号)。