P2P-сделка: лимит объявления, заморозка и release

Crypto / FinTech · P2P Engine

Что происходит между нажатием «Открыть сделку» и переводом криптоактива покупателю? На примере Laravel-платформы разбираем лимит объявления, заморозку баланса и переходы состояния.

Одно объявление, два одновременных покупателя

Если оба участника видят остаток 100 и запрашивают по 80, проверка на клиенте ничего не гарантирует. Контроллер P2P повторно читает объявление внутри транзакции MySQL с lockForUpdate(), проверяет статус и лимиты, уменьшает доступный объём и лишь затем создаёт черновик. Второй запрос получает актуальный остаток после первого. Когда объём становится меньше минимальной сделки, объявление закрывается.

Черновик не должен держать ликвидность бесконечно. Для неподтверждённого старта ставится отложенное задание отмены; при отмене объём объявления восстанавливается.

Оплата в фиате — сигнал, а не блокчейн-транзакция

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

Если участники не согласны, существует отдельный статус спора, чат и административный разбор. Нельзя считать кнопку «Я оплатил» доказательством банковского зачисления: это утверждение участника, требующее следующего действия по процессу.

Практическое правило

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

Полный кейс платформы →