01 / 11 screenshot-2026-09-10-at-08.31.17-2.png
Экран 1 из 11 Экран 2 из 11 Экран 3 из 11 Экран 4 из 11 Экран 5 из 11 Экран 6 из 11 Экран 7 из 11 Экран 8 из 11 Экран 9 из 11 Экран 10 из 11 Экран 11 из 11

P2P-платформа: сделки, TON и Jetton

Кейс · P2P / FinTech · Laravel · TON / Jetton

P2P-платформа для обмена криптоактивов между людьми: объявления, сделки, реквизиты, чат, споры, внутренние балансы и связь с отдельным TON-сервисом GRAM. Главная инженерная задача — сохранить финансовую согласованность, когда пользовательские действия, очередь и блокчейн идут в разном темпе.

2 контура: P2P и GRAM
P2P переходы сделки
2 потока депозитов: TON и Jetton
API v2 для клиента

Что делает сама платформа

Пользователь размещает объявление о покупке или продаже, задаёт курс, лимиты и окно оплаты. Второй участник открывает сделку, видит сохранённые реквизиты и общается в чате. Затем следуют подтверждение участия, отметка об оплате, отпуск криптоактива либо спор. У администратора есть инструменты для разбора споров и вывода средств.

Это отдельное Laravel-приложение с Inertia и Vue, а не только кошельковый микросервис. У него собственные модели объявлений, сделок, балансов, банковских реквизитов и истории операций, веб-интерфейс и REST API v2.

Где появляется риск двойного расхода

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

После оплаты только продавец криптоактива может выполнить release, и только для сделки в статусе paid. В той же транзакции списывается его замороженный баланс и пополняется баланс покупателя. При отмене лимит объявления возвращается, а заморозка снимается по правилам состояния сделки.

Объявление

Курс, доступный объём, минимальная сумма, срок оплаты и статус.

Сделка

Черновик → подтверждение → оплата → release, отмена либо спор.

Деньги

Доступный и замороженный баланс меняются в транзакциях БД.

Почему кошельки вынесены в GRAM

P2P управляет обязательствами перед пользователями; GRAM отвечает за TON-кошельки и сетевые операции. Между ними проходит подписанный межсервисный API. В коде платформы есть отдельные обработчики TON- и Jetton-депозитов, сервисы вывода, журнал операций и процедуры сверки. Сетевое событие нельзя автоматически приравнять к пользовательскому балансу: сначала нужны проверка происхождения, уникальности и точной суммы.

Для TON идентификатор депозита строится из сети, адреса кошелька, LT транзакции и нормализованного хеша. Запрос сверяется с Idempotency-Key. Повтор того же события возвращает прежний результат, а попытка использовать тот же идентификатор с другими данными вызывает конфликт. Зачисление, создание записи депозита и запись в ledger выполняются внутри одной транзакции БД.

Jetton учитывается в atomic units, чтобы не терять точность при дробных количествах. При выводе система сначала резервирует сумму; подтверждение списывает резерв и баланс, отказ освобождает резерв. Для каждого перехода есть ключ идемпотентности в журнале.

Безопасность и эксплуатация

В приложении предусмотрены подтверждение почты, 2FA, PIN для чувствительных операций, восстановление доступа, Telegram-интеграция и административные настройки. Laravel Reverb обслуживает события в реальном времени; очереди, планировщик, MySQL, Redis и Nginx запущены отдельными Docker-сервисами.

Аудит развёрнутого экземпляра 22 сентября 2026 года показал testnet-конфигурацию без пользователей, сделок и депозитов. Часть интеграционных флагов TON/Jetton отключена; поэтому этот кейс описывает реализованную архитектуру и сценарии в исходном коде, а не подтверждённый оборот работающей биржи. Метрики нагрузки и коммерческого результата не заявлены.

Инженерный результат

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

Подробнее о связанных узлах: создание и привязка кошельков, приём TON-депозитов, сбор средств и казначейство. Отдельные заметки о механике платформы опубликованы в разделе Crypto / FinTech.