Настройка приема Ethereum платежей
Приём ETH звучит просто: пользователь отправляет транзакцию, деньги пришли. На практике вопрос "как я узнаю, что платёж пришёл и от кого" решается несколькими способами, и большинство быстрых реализаций имеют race conditions или проблемы с безопасностью. Мы, как команда с 5-летним опытом разработки блокчейн-решений, предлагаем надёжную архитектуру, исключающую потерю средств. Свяжитесь с нами для консультации. В этой статье мы разберём ключевые архитектурные решения: генерацию уникальных депозитных адресов через HD Wallet, мониторинг транзакций через вебхуки и алгоритмы подтверждения.
Архитектура: не делайте один адрес для всех
Наиболее надёжная схема — уникальный адрес на каждый заказ/пользователя. Это устраняет проблему атрибуции: не нужно сопоставлять суммы с заказами, не бывает коллизий когда два пользователя платят одинаковую сумму.
Реализация через HD wallet (BIP-44): один master private key, адреса деривируются детерминированно по индексу. Пользователю выдаётся адрес m/44'/60'/0'/0/{order_id}, средства с него пересылаются на горячий кошелёк после подтверждения. HD Wallet (BIP-44)
import { HDNodeWallet } from 'ethers' const masterWallet = HDNodeWallet.fromPhrase(process.env.MNEMONIC) function getDepositAddress(orderId: number): string { return masterWallet.deriveChild(orderId).address } Master mnemonic — в HSM или как минимум в зашифрованном виде в переменных окружения, никогда в коде.
Мониторинг входящих транзакций
Плохой способ — поллить eth_getBalance каждые N секунд. Медленно, дорого по RPC-запросам, пропускает транзакции при перезапуске.
Правильный способ — подписка на события через WebSocket RPC:
provider.on({ address: depositAddress }, (log) => { // Обработка входящего перевода }) Или через eth_subscribe newPendingTransactions — получаем уведомление до подтверждения, но статус pending нельзя считать финальным.
Для надёжного production решения — Alchemy Notify или QuickNode Streams: вебхуки при активности на адресах, работают даже если ваш backend перезапустился. Наш опыт показывает, что такая система в 10 раз быстрее polling по времени реакции.
Подтверждения и finality
На Ethereum после Merge finality наступает через ~2 эпохи (~12.8 минут). Для платежей:
| Сумма | Рекомендуемые подтверждения |
|---|---|
| < $100 | 1–3 блока (~15–45 сек) |
| $100–$10k | 6–12 блоков (~1.5–2.5 мин) |
| > $10k | 32–64 блока (до finality) |
Никогда не зачисляйте средства по pending транзакции — транзакция может быть заменена через EIP-1559 replacement или вытолкнута из mempool.
Работа с ERC-20 токенами
Если нужно принимать USDC/USDT поверх ETH — логика усложняется: Transfer событие вместо нативной транзакции. Необходимо слушать логи по ABI токена:
const filter = { address: USDC_CONTRACT, topics: [ ethers.id('Transfer(address,address,uint256)'), null, ethers.zeroPadValue(depositAddress, 32) ] } provider.on(filter, handleUsdcDeposit) Отдельно нужно учесть: USDT на Ethereum имеет нестандартный approve (возвращает void, а не bool) — это ломает стандартный ERC-20 интерфейс. Используйте SafeERC20 от OpenZeppelin или обрабатывайте оба случая.
Как избежать race conditions при приеме ETH?
Race condition возникает, когда два пользователя отправляют платежи одновременно с одинаковой суммой. Решение — уникальные адреса (описано выше). Дополнительно используйте блокировку на уровне базы данных при обработке транзакций. Например, используйте SELECT ... FOR UPDATE при зачислении средств.
Что делать, если пользователь отправил неверную сумму?
В таком случае не зачисляйте средства. Настройте возврат (sweeping) на адрес отправителя после определённого числа блоков. Либо свяжитесь с пользователем для уточнения. Мы гарантируем, что ваши средства не потеряются.
Что входит в настройку под ключ?
- Генерация уникальных deposit адресов через HD wallet
- Вебхук-мониторинг через Alchemy/QuickNode или self-hosted listener
- Логика подтверждений с настраиваемым порогом
- Автоматическая пересылка средств на основной кошелёк (sweeping)
- Базовый API для интеграции с вашим бэкендом (Node.js, Python, Go)
- Документация и поддержка на этапе запуска
Оцените наш проект: пишите на почту или в Telegram, получите консультацию в течение 1 дня. Закажите настройку прямо сейчас.
Опыт компании
Мы выполнили 30+ проектов по интеграции Ethereum платежей, суммарно обработано более $10 млн в криптовалюте. 5 лет на рынке блокчейн-разработки. Наши инженеры сертифицированы по Solidity и Rust.
Пошаговая инструкция для самостоятельной реализации
- Сгенерируйте мастер-сид (12-24 слова) и сохраните в HSM.
- Разверните сервер с ethers.js или viem.
- Реализуйте функцию getDepositAddress для генерации адреса.
- Подпишитесь на вебхуки от Alchemy Notify или QuickNode Streams.
- Установите порог подтверждений в зависимости от суммы.
- Настройте процесс sweeping — периодическую отправку балансов на основной кошелек.
Детали по настройке SafeERC20
Используйте библиотеку OpenZeppelin: SafeERC20.safeTransfer() и SafeERC20.safeApprove(). Это защищает от нестандартных реализаций токенов, таких как USDT, которые возвращают void вместо bool.







