Что такое подтверждения транзакции и сколько ждать
Подтверждение — каждый новый блок, добавленный в блокчейн после блока с вашей транзакцией; чем их больше, тем меньше шанс, что транзакцию отменят.
Когда транзакция попадает в блок, она получает первое подтверждение. Каждый следующий блок поверх неё добавляет ещё одно. Подтверждения нужны потому, что в некоторых блокчейнах последние блоки могут быть заменены: если сеть временно разделилась, одна из веток «проигрывает», и её транзакции возвращаются в очередь или исчезают. Это называется реорганизацией (reorg).
В Bitcoin блоки появляются в среднем раз в десять минут, а безопасность растёт с каждым подтверждением; давняя договорённость — считать транзакцию надёжной после шести подтверждений, хотя для небольших сумм многие сервисы довольствуются меньшим. В сетях с детерминированной финальностью важнее не число блоков, а момент, когда блок признан финальным: в Ethereum после перехода на Proof-of-Stake это происходит через две эпохи, порядка тринадцати минут; в Solana у транзакций есть уровни processed, confirmed и finalized; в TON финальность наступает за секунды.
Для продавца подтверждения — это баланс между скоростью и риском. Зачислить оплату при нулевом подтверждении (транзакция ещё в мемпуле) удобно, но опасно: её можно заменить или вытеснить. Ждать слишком долго — значит заставлять клиента смотреть на экран загрузки. Поэтому платёжные сервисы задают порог для каждой сети отдельно и показывают клиенту, что платёж найден и ожидает подтверждения.
Типичные ошибки интеграции: выдавать товар по факту появления транзакции в мемпуле, доверять одному узлу (он может отставать или ошибаться), не обрабатывать ситуацию, когда транзакция была в блоке, а после реорганизации пропала.
В Moonvex платёж зачисляется только после того, как его подтвердят два независимых провайдера узлов; о смене статуса магазин узнаёт через вебхук.
Что учесть при интеграции
- Не выдавайте товар по неподтверждённой транзакции.
- Задавайте порог подтверждений отдельно для каждой сети.
- Сверяйте данные минимум с двумя источниками.
- Показывайте клиенту статус «платёж найден, ждём подтверждения».