Перейти к содержимому

Реорганизация цепочки и подтверждённый платёж

16 авг. 2026 г. 6 мин чтения Claude C. Claude C.
Две ветки блоков расходятся, короткая гаснет, один блок выпадает из неё

Кратко

Реорганизация цепочки отбрасывает часть недавней истории блокчейна, и подтверждённый криптоплатёж, который жил только в отброшенных блоках, перестаёт входить в цепочку. Никто ничего не отменял: пропала запись, а средства остались там, где их видит победившая ветка. Зачисление мерчанта такое событие не трогает — платёж остаётся зачисленным, а недостачу Paymos записывает на свои счета как убыток от реорганизации. Если транзакция позже вернётся в цепочку, разворачивается тот же убыток платформы, а не баланс мерчанта.

Реорганизация цепочки отбрасывает часть недавней истории. Блоки проигравшей ветки исчезают, и транзакция, которая жила только в них, больше не входит в цепочку. Никто ничего не отменял и не возвращал: пропала запись, а средства остались там, где их видит победившая ветка.

Для бизнеса вопрос ровно один. Может ли заказ, который вы уже отгрузили, оказаться неоплаченным? В Paymos — нет: подтверждённый платёж остаётся зачисленным мерчанту, а недостачу платформа записывает на свои счета как убыток от реорганизации.

Ниже — что из этого следует для вашей системы заказов. Механику самих подтверждений разбирает руководство по подтверждениям, а устройство политики — ступенчатые подтверждения.

Что реорганизация делает с платежом?

Она убирает запись, а не средства. Плательщик подписал перевод, перевод попал в блок, а затем сеть выбрала ветку истории, в которой этого блока нет. С точки зрения цепочки платежа больше не было. Средства при этом никуда не двигались: они там, где их показывает победившая ветка, — как правило, всё ещё в кошельке плательщика.

Чаще всего всё решается само собой. Та же транзакция попадает в один из следующих блоков: она действительна, и отклонять её сети незачем. Опасный случай узкий — платёж уже был подтверждён, вы на это подтверждение отреагировали, а блок с ним оказался отброшен.

Может ли пропасть платёж, который Paymos уже подтвердил?

Подтверждение — может, зачисление — нет. Paymos подтверждает платёж раньше финальности протокола, на глубине, выбранной по сети и сумме. Это осознанный выбор в пользу скорости оплаты: ждать абсолютной финальности в каждой сети означало бы сделать часть платежей неприемлемо медленными на странице оплаты. У выбора есть цена, и её стоит называть прямо — блок уже подтверждённого платежа изредка может оказаться отброшенным.

Цену этого выбора не перекладывают на мерчанта. Когда блок подтверждённого платежа исчезает, зачисление остаётся ровно таким, каким было, а недостача записывается на счета платформы. Правило стоит прямо в коде проводки, рядом с самой записью: мерчанта не трогают, его зачисление уцелело, разворачивать его нельзя и удваивать нельзя.

Кто несёт этот убыток?

Его несёт платформа. Решение подтвердить платёж на такой-то глубине, в такой-то сети, для такой-то суммы принимает процессор — ради того, чтобы плательщик не ждал. Когда решение оказывается неверным, средств действительно нет, и разрыв должен лечь на чей-то баланс. Положить его на мерчанта означало бы поставить ответственность бизнеса в зависимость от чужой оценки риска: её делал не он и увидеть её он не может.

Это политика, а не закон природы. И спросить о ней стоит у любого процессора, прямым текстом: когда вы подтверждаете раньше финальности, а цепочка с вами не соглашается — чей баланс двигается? Там, где над этим не думали, ответа не будет. Там, где думали, назовут счёт.

Как бизнес узнаёт, что это случилось?

На платёжных каналах — вебхуком. payment_channel.deposit.reorged — одно из трёх событий депозита, рядом с confirming и confirmed, и приходит по той же подписке. Список событий и их значения собраны в справочнике по вебхукам.

Читать это событие стоит как операционный сигнал, а не как бухгалтерскую проводку. Баланс не менялся, поэтому в учёте делать нечего. Событие говорит другое: конкретный заказ был закрыт по свидетельству, которого больше нет в цепочке. Это важно, если отправка физическая и её ещё можно остановить, и почти не важно, если покупатель получил доступ в момент оплаты.

Что должна делать система заказов?

Как правило — ничего нового. Порядок в вашей системе уже такой, какой нужен: заказ не оплачен, затем подтверждён, затем исполнен. Реорганизация не добавляет к этому четвёртого состояния — баланс не меняется, сводить нечего.

Одно исключение всё же есть. Если товар дорогой и физически отгружается, держите короткое окно между подтверждением и отправкой: тогда у вас останется время отреагировать на событие. Если товар не дорогой и не физический, делать не нужно ничего. Обработка реорганизаций в оплате цифровой выдачи не окупится, а убыток, от которого она защищает, всё равно не ваш.

Почему запись о переводе не удаляют?

Потому что именно так рождаются двойные зачисления. Естественный порыв — убрать строку: платежа не было, значит и записи быть не должно. Здесь всё наоборот. Перевод помечают выпавшим из цепочки и не удаляют никогда.

Смысл виден в момент, когда транзакция возвращается. Не будь исходной записи, повторное включение пришло бы как совершенно новый платёж, и за один перевод мерчанта зачислили бы дважды. Та же запись означает, что возвращение узнают как тот же самый платёж, а не как ещё один. Две записи на один платёж запрещены — ровно по этой причине.

Когда считается, что блок действительно исчез?

Только когда это подтверждает финальность протокола. Сети меняют последний блок постоянно: узел видит один последний блок, через секунду другой, и при этом ничего не сломано и ни одна транзакция не потеряна. Если считать реорганизацией каждую такую смену, отметки о выпавших платежах пойдут потоком, и через неделю на них перестанут смотреть.

Поэтому признак один: блока нет в финализированной цепочке. В Ethereum, например, финальность — отдельное состояние протокола: чтобы развернуть финализированный блок, атакующему пришлось бы расстаться минимум с третью всего ETH, размещённого в стейкинге.

Ниже финализированной высоты автоматики нет. Если реорганизация всё-таки уходит туда, её не сводят на ходу — сканирование этой сети останавливают. Нарушение правил протокола не разбирают без человека.

Что будет, если транзакция вернётся в цепочку?

Убыток разворачивают, и в эту сторону мерчанта тоже не трогают. Вернувшийся перевод — та же запись, а не новая: депозит снова становится confirming и заново набирает подтверждения. Убыток от реорганизации разворачивается на тех же счетах платформы, которые его приняли: средства вернулись, значит убыток сходится в ноль, а комиссия по платежу признаётся заново.

Баланс мерчанта не двигается: он не двигался и в первый раз. На один платёж приходится одно зачисление, и оно остаётся одним, что бы за это время ни сделала цепочка. Ради этого вся конструкция и устроена так.

Как проверить свой обработчик заранее?

Симулировать событие в песочнице. Симуляция депозита принимает стадию, и reorged — одна из трёх, вместе с confirming и confirmed. Параметры вызова описаны в симуляции депозита канала.

Сделать это стоит один раз, и причина к реорганизациям отношения не имеет. Так вы недорого выясните, что ваш обработчик делает с событием, которого не ждал. Интеграции обычно пишут под нормальный ход дел, а первое необычное событие встречают уже на реальных платежах. Лучше встретить его во вторник днём, когда на кону ничего нет.

Что меняется при выпадении блока и при возврате транзакции
ОбъектБлок отброшенТранзакция вернулась
Запись о переводеПомечена выпавшей, не удаленаТа же запись снова в цепочке
Зачисление мерчантуОстаётся как былоОстаётся как было
Убыток от реорганизацииЗаписан на счета платформыРазвёрнут, сходится в ноль
Состояние депозитаreorgedСнова confirming
Что делать бизнесуПроверить, не ушла ли отгрузкаНичего

Частые вопросы

Что будет с балансом, если блок с моим платежом отбросят?

Ничего. Зачисление остаётся у мерчанта, а недостачу Paymos записывает на свои счета как убыток от реорганизации.

Как понять, что блок действительно исчез, а не просто отстал?

По финальности протокола. Перевод помечают выпавшим только тогда, когда финальность подтверждает, что блока нет в финализированной цепочке. Смены последнего блока для этого мало.

Сообщит ли Paymos о реорганизации?

На платёжных каналах — да. Событие payment_channel.deposit.reorged приходит по той же подписке, что confirming и confirmed.

Можно ли проверить обработчик до того, как это случится?

Да. Симуляция депозита в песочнице принимает стадию reorged — одну из трёх, вместе с confirming и confirmed.

Стоит ли ждать дольше, чтобы не попасть под реорганизацию?

Глубина подтверждения уже выбрана по сети и сумме платежа. Собственная задержка поверх неё чаще стоит конверсии, чем даёт защиту.

Что делать, если заказ уже отгружен?

Баланс от этого не меняется, поэтому в учёте делать нечего. Событие — повод проверить, можно ли ещё остановить физическую отправку.

Когда НЕ стоит использовать отдельную обработку реорганизаций

  • Если товар выдаётся мгновенно и почти ничего не стоит воспроизвести, отдельная ветка на реорганизацию не окупится: заказ уже закрыт, а баланс от такого события не двигается.
  • Если политика подтверждений для вашей сети и суммы и так ждёт дольше практической глубины реорганизации, собственная задержка сверху не даёт ничего и стоит конверсии.
  • Если вы опасаетесь, что платёж отменит сам покупатель, это другая задача. У блокчейн-перевода нет механизма возвратного платежа, и реорганизация к решению покупателя отношения не имеет.
  • Если интеграция ещё не обрабатывает повторную доставку событий идемпотентно, начинать с ветки на реорганизацию рано: сначала нужно, чтобы повторное событие подтверждения не выдавало заказ второй раз.

Источники

  1. 1. Финальность в proof-of-stake Ethereum (Ethereum Foundation) (accessed 2026-08-16)
  2. 2. Paymos: события вебхуков платёжных каналов (accessed 2026-08-16)
  3. 3. Paymos: симуляция депозита канала в песочнице (accessed 2026-08-16)

Последняя проверка: 16 авг. 2026 г.

#реорганизация-цепи#финальность-блокчейна#вебхуки#расчёты
Поделиться