StableOps
常见问题

付款已 confirmed,却又被回滚了

为什么 detected/confirmed 的订单会回退到 reverted,以及为什么应当在 payment.finalized 上履约。

付款是可能回退的。已经到达 detectedconfirmed 的订单仍可能回滚到 reverted 并发出 payment.reverted webhook。这是预期行为,不是 bug。状态机之所以把 confirmedfinalized 分开,正是为此。

订单为什么会回滚

当订单匹配到的转账不再有效时,StableOps 会将其标记为 reverted

  • 重组(reorg):一条竞争链成为规范链,包含该转账的区块被丢弃。StableOps 通过把实时回执(receipt)的区块哈希与事件首次摄入时存下的区块哈希做比对来检测:若两者不再一致,该事件即无效。
  • 回执失败:交易回执报告失败(例如合约调用 revert),转账实际并未转移资金。

为什么不能在 confirmed 上履约

各阶段含义不同:

  • detected:在链上以 0 确认被看到。不要履约。
  • confirmed:确认数已足够、回滚不太可能,但尚未达到该链的最终性保证,仍存在残余的重组风险。
  • finalized:已达最终性,转账不可被回滚。这是发货的推荐时点。

请在 payment.finalized 上履约,除非你的产品已明确接受在 payment.confirmed 上行动所带来的残余重组风险。

如何处理 payment.reverted

把它当作此前任何乐观处理的逆操作:

  • 如果你只在 payment.detected / payment.confirmed 上更新了 UI,请回滚这些 UI,并提示客户重新付款或等待重新确认。
  • 如果你在 finalized 之前发放了任何有价值的东西,这条事件就是提醒你把它追回。
  • 幂等地处理该事件。投递可能被重试,重复处理一次必须是安全的。

相关

这篇文档怎么样?

最后更新

本页内容