常见问题
付款已 confirmed,却又被回滚了
为什么 detected/confirmed 的订单会回退到 reverted,以及为什么应当在 payment.finalized 上履约。
付款是可能回退的。已经到达 detected 或 confirmed 的订单仍可能回滚到 reverted 并发出 payment.reverted webhook。这是预期行为,不是 bug。状态机之所以把 confirmed 和 finalized 分开,正是为此。
订单为什么会回滚
当订单匹配到的转账不再有效时,StableOps 会将其标记为 reverted:
- 重组(reorg):一条竞争链成为规范链,包含该转账的区块被丢弃。StableOps 通过把实时回执(receipt)的区块哈希与事件首次摄入时存下的区块哈希做比对来检测:若两者不再一致,该事件即无效。
- 回执失败:交易回执报告失败(例如合约调用 revert),转账实际并未转移资金。
为什么不能在 confirmed 上履约
各阶段含义不同:
detected:在链上以 0 确认被看到。不要履约。confirmed:确认数已足够、回滚不太可能,但尚未达到该链的最终性保证,仍存在残余的重组风险。finalized:已达最终性,转账不可被回滚。这是发货的推荐时点。
请在 payment.finalized 上履约,除非你的产品已明确接受在 payment.confirmed 上行动所带来的残余重组风险。
如何处理 payment.reverted
把它当作此前任何乐观处理的逆操作:
- 如果你只在
payment.detected/payment.confirmed上更新了 UI,请回滚这些 UI,并提示客户重新付款或等待重新确认。 - 如果你在
finalized之前发放了任何有价值的东西,这条事件就是提醒你把它追回。 - 幂等地处理该事件。投递可能被重试,重复处理一次必须是安全的。
相关
这篇文档怎么样?
最后更新