StableOps
常見問題

付款已 confirmed,卻又被回滾了

瞭解已進入 detected 或 confirmed 的付款為何仍可能因區塊重組回退到 reverted,StableOps 如何用交易收據和區塊雜湊識別變化,以及商戶為什麼應等待 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 之前發放了任何有價值的東西,這條事件就是提醒你把它追回。
  • 冪等地處理該事件。投遞可能被重試,重複處理一次必須是安全的。

相關

這篇文件怎麼樣?

最後更新

本頁內容