交易没上链却先收到 pending:Stellar SEP-8 审批协议的五种回话 图 1
交易没上链却先收到 pending:Stellar SEP-8 审批协议的五种回话 · 图 1

在 Stellar 上转某些资产时,钱包不会直接把交易发到网络,而是先把它交给一个网址去审,审完再拿回来提交。承载这套对话的规范是 SEP-8,标题 Regulated Assets,状态 Active,版本 1.7.4,最早起草于 2018 年 8 月 22 日,更新记录停在 2022 年 2 月 21 日。它面向的正是“发行方或它委托的第三方必须逐笔审批”的资产,比如受监管要求的证券类资产。

钱包怎么知道这笔单要送审

规范把检测分成两步,别混着看。第一步判断资产是否需要授权:看发行方账户是否同时打开了需要授权与可撤销授权两个标志位,只有发行方这样才能随时授予和收回交易授权。第二步才判断它是不是 SEP-8 意义上的受监管资产:通过 SEP-1 定义的 stellar.toml 去发现审批服务,具体写在 [[CURRENCIES]] 段里,regulated 是布尔标记、缺省视为 false,approval_server 是给合法交易签名的服务网址,approval_criteria 是一段给人看的说明,交代这个服务的审批标准。也就是说,需要授权的资产不一定是受监管资产,两者的判断依据一个是链上标志位、一个是链下的发行方配置文件。

交易没上链却先收到 pending:Stellar SEP-8 审批协议的五种回话 图 2
交易没上链却先收到 pending:Stellar SEP-8 审批协议的五种回话 · 图 2

流程与分工:为什么服务不替你提交

完整链路是:钱包创建并签名交易,解析资产信息认出这是需要授权且受监管的资产,把交易发给审批服务,服务判定是否应当批准并在通过时以发行方账户补一个签名,钱包再按回话决定下一步。规范专门回答了“为什么审批服务不直接把交易提交上链”:签名与提交职责分离;一笔交易可能还需要更多受监管资产发行方的签名;钱包要能按提交报错的类型自行重建交易;服务代提交还会带来扩容上的额外基础设施。结论是——上链那一步始终留在钱包手里,出问题时的重试与重建也归钱包负责。

五种回话各是什么意思

所有回话都在顶层用 status 表明类型。success 表示交易合规且未修改就通过,回带原始的 base64 编码交易封套 XDR,里面既有你原来的签名也有发行方补的一个或多个签名,可选 message 是给人看的话。revised 表示交易被改过才合规,除了改过的交易外还必须给 message 解释改了什么。pending 表示发行方当下无法判定,附带 timeout 字段,单位是毫秒,指示等多久再把同一笔交易重投一次,取 0 表示无法确定等待时长。action_required 表示用户要先去做一件事,会给 action_url 与 message,还可给 action_method(GET 或 POST,缺省按 GET)以及一组取自 SEP-9 的 action_fields,允许客户端直接代填用户已有的资料;带敏感信息时服务应当用 POST,免得资料挂在网址上。rejected 则回 400 状态码加 error 说明为什么不合规且无法通过修改救回来。

revised 时重签前该看什么

规范对 revised 的边界写得相当克制:审批服务应当只通过追加操作来让交易合规,不能改变用户已含操作的意图;如果用户的操作没法靠“再加一个操作”救活,就应当直接拒绝而不是偷偷改。原文举了两个对照:用户要付款给一个未被授权的账户,服务可以补上授权类操作;但用户挂一张 1000 的买单而规则只允许 100,服务不该把金额改成 100,而应当拒绝。基于此,重签前的自检重点也就出来了:务必确认改过的交易里没有把你原始操作的源账户“认领”过去的新操作,规范明确要求用户在重新签名前检查修订后的交易,最佳实践一节还要求钱包在原始操作被改动时告警。同理,发行方也可以通过追加操作来强制收费,原文的例子是凡是涉及该代币的交易都顺带转 0.1 个给发行方账户,这类费用是审出来的,不在你原本屏幕上。

为什么交易里会多出授权与撤销操作

一份审批服务愿意签的交易,常见形态是把授权、转账、撤销授权排成同一笔交易:先由发行方授权账户 A 与资产 X,中间做挂单或支付,末尾再把授权状态收回。这么排是为了利用交易的原子性,避免用户的账户出现“已授权但仍敞着”而跑出不被批准的操作的空档。发行方若允许账户保留挂单,可以停在可维持负债的授权状态上而不是彻底撤销,细粒度控制由 CAP-18 提供。这些追加操作对用户来说就是屏幕上多出来的几行,看懂它们比看到就重签更重要。

站在用户一侧的判断顺序

pending 不是失败信号,也不是重开一笔新交易的理由,按回话里的等待时长重投同一笔交易即可;action_required 给的网页要先核对域名与协议,再考虑是否在里面提交资料;rejected 通常意味着对方规则与你的意图冲突,硬重试不会改变结果。规范本身也建议资产尽量别做成受监管资产,因为它给用户、发行方都带来实打实的运营与操作负担。整条链路上,交易是否合规由发行方或其委托方判断,钱包只负责如实展示改动,任何“审过了就一定安全”的理解都不成立。本文只提供识别与处置顺序,不构成投资建议。