Skip to content

Безопасный криптовалютный эскроу на TRON

Notifications You must be signed in to change notification settings

Makar0n1/KeyShield

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KeyShield Escrow Bot

Безопасный P2P escrow-сервис на базе TRON блокчейна с multisig-кошельками для USDT TRC20.

Сайт: keyshield.me Telegram бот: @keyshield_bot


Содержание

  1. Обзор системы
  2. Архитектура
  3. Установка и настройка
  4. Конфигурация
  5. Telegram бот
  6. Процесс сделки
  7. Multisig кошельки
  8. Система комиссий
  9. Партнёрская программа
  10. Админ-панель
  11. Веб-сайт
  12. API эндпоинты
  13. База данных
  14. Безопасность
  15. Масштабирование
  16. Мониторинг и логирование

Обзор системы

KeyShield — это escrow-сервис для безопасных P2P сделок с криптовалютой. Покупатель замораживает средства в multisig-кошельке, продавец выполняет работу, после подтверждения — средства переводятся продавцу.

Ключевые особенности

  • Multisig кошельки — 2-of-3 подписи (покупатель + продавец или арбитр)
  • Автоматическое обнаружение депозитов — параллельная проверка до 8 сделок одновременно
  • Система споров — арбитраж с доказательствами (фото/видео/документы)
  • Партнёрская программа — реферальные ссылки с аналитикой и партнёрскими выплатами
  • Telegram бот — полный цикл сделки в чате
  • Deadline Monitor — автоматические рефанды при истечении дедлайна + 12ч grace period
  • Адаптивный веб-сайт — лендинг с мобильным меню и SEO-оптимизацией

Поддерживаемые активы

Актив Сеть Контракт
USDT TRC20 TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
TRX TRON Native

Архитектура

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Telegram Bot   │────▶│   Node.js API   │────▶│    MongoDB      │
│   (Telegraf)    │     │   (Express)     │     │                 │
└─────────────────┘     └────────┬────────┘     └─────────────────┘
                                 │
                                 ▼
                        ┌─────────────────┐
                        │  TRON Blockchain│
                        │   (TronWeb)     │
                        └─────────────────┘

Структура проекта

src/
├── bot/                    # Telegram бот
│   ├── handlers/           # Обработчики команд
│   │   ├── start.js        # /start и главное меню
│   │   ├── createDeal.js   # Создание сделки
│   │   ├── myDeals.js      # Мои сделки
│   │   ├── provideWallet.js # Ввод кошелька контрагентом
│   │   ├── dispute.js      # Споры
│   │   └── help.js         # Помощь
│   ├── keyboards/          # Inline-клавиатуры
│   └── utils/              # Утилиты (messageManager)
├── models/                 # MongoDB схемы
│   ├── Deal.js             # Сделка
│   ├── User.js             # Пользователь
│   ├── Transaction.js      # Транзакция
│   ├── MultisigWallet.js   # Multisig кошелёк
│   ├── Dispute.js          # Спор
│   ├── Platform.js         # Партнёрская платформа
│   └── AuditLog.js         # Аудит-лог
├── services/               # Бизнес-логика
│   ├── blockchain.js       # Работа с TRON
│   ├── dealService.js      # Сервис сделок
│   ├── depositMonitor.js   # Мониторинг депозитов
│   ├── deadlineMonitor.js  # Мониторинг дедлайнов
│   ├── disputeService.js   # Споры
│   ├── banService.js       # Бан пользователей
│   └── notificationService.js # Уведомления
├── web/                    # Веб-сервер
│   ├── server.js           # Express сервер
│   └── routes/             # API маршруты
│       └── partner.js      # Партнёрский API
├── config/                 # Конфигурация
│   ├── constants.js        # Константы
│   ├── database.js         # Подключение MongoDB
│   └── tron.js             # Настройки TRON
├── api/                    # API роуты
│   ├── routes/             # Маршруты
│   └── middleware/         # Middleware (auth, errorHandler)
└── index.js                # Точка входа

public/                     # Статические файлы сайта
├── index.html              # Главная страница
├── terms.html              # Условия использования
├── privacy.html            # Политика конфиденциальности
├── offer.html              # Публичная оферта
├── not-found.html          # Страница 404
├── admin.html              # Админ-панель
├── css/style.css           # Стили
├── js/main.js              # Скрипты
└── images/                 # Изображения

Установка и настройка

Требования

  • Node.js 18+
  • MongoDB 6+
  • TRON кошелёк с TRX для комиссий

Установка

# Клонировать репозиторий
git clone <repository-url>
cd keyshield

# Установить зависимости
npm install

# Скопировать конфигурацию
cp .env.example .env

# Настроить .env (см. раздел Конфигурация)

# Запустить
npm start

Запуск в production

# С PM2
pm2 start src/index.js --name keyshield

# Или с Docker
docker-compose up -d

Конфигурация

Переменные окружения (.env)

# MongoDB
MONGODB_URI=mongodb://localhost:27017/keyshield

# Telegram Bot
BOT_TOKEN=your_bot_token_here
BOT_USERNAME=your_bot_username

# TRON Configuration
TRON_FULL_NODE=https://api.trongrid.io
TRON_SOLIDITY_NODE=https://api.trongrid.io
TRON_EVENT_SERVER=https://api.trongrid.io
TRONGRID_API_KEY=your_trongrid_api_key

# Arbiter Wallet (главный кошелёк арбитра)
ARBITER_PRIVATE_KEY=your_private_key_hex
ARBITER_ADDRESS=your_tron_address

# Service Wallet (для сбора комиссий)
SERVICE_WALLET_ADDRESS=your_service_wallet

# API & Web
API_PORT=3000
WEB_PORT=3001

# Admin Panel
JWT_SECRET=your_jwt_secret
JWT_EXPIRES_IN=7d
ADMIN_USERNAME=admin
ADMIN_PASSWORD=secure_password

# Environment
NODE_ENV=production

# USDT Contract
USDT_CONTRACT_ADDRESS=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

# Deal Settings
MIN_DEAL_AMOUNT=50

# Commission
COMMISSION_RATE=0.05
MIN_COMMISSION_USDT=15
COMMISSION_THRESHOLD=300

# Monitoring
DEPOSIT_CHECK_INTERVAL=30000
MULTISIG_ACTIVATION_TRX=15

Telegram бот

Команды

Команда Описание
/start Регистрация и главное меню
/menu Главное меню
/help Справка
DEAL_XXXXXX Просмотр сделки по ID

Главное меню

🏠 Главное меню

├── 🛒 Создать сделку (как покупатель)
├── 💼 Создать сделку (как продавец)
├── 📋 Мои сделки
├── 💰 Мой кошелёк
└── ℹ️ Помощь

Процесс создания сделки

  1. Выбор роли — покупатель или продавец
  2. Ввод ID контрагента — Telegram ID или @username
  3. Название товара/услуги
  4. Описание (опционально, можно пропустить)
  5. Сумма в USDT
  6. Кто платит комиссию — покупатель / продавец / пополам
  7. Дедлайн — 24ч / 48ч / 72ч / 7 дней
  8. Адрес кошелька — для получения средств
  9. Подтверждение — генерация multisig-кошелька

Процесс сделки

Статусы сделки

waiting_for_seller_wallet  ──▶  Ожидание кошелька продавца
waiting_for_buyer_wallet   ──▶  Ожидание кошелька покупателя
waiting_for_deposit        ──▶  Ожидание депозита
locked                     ──▶  Средства заморожены
in_progress                ──▶  Работа ведётся
dispute                    ──▶  Открыт спор
completed                  ──▶  Успешно завершена
cancelled                  ──▶  Отменена
resolved                   ──▶  Решена арбитром
expired                    ──▶  Авто-рефанд (дедлайн + 12ч)

Жизненный цикл сделки

┌─────────────────┐
│  Создание       │
│  сделки         │
└────────┬────────┘
         ▼
┌─────────────────┐
│  Ожидание       │◀─── Контрагент указывает кошелёк
│  кошельков      │
└────────┬────────┘
         ▼
┌─────────────────┐
│  Ожидание       │◀─── Покупатель переводит USDT
│  депозита       │
└────────┬────────┘
         ▼
┌─────────────────┐
│  Заморожено     │◀─── Автоматическое обнаружение
│  (locked)       │
└────────┬────────┘
         │
    ┌────┴────┐
    ▼         ▼
┌───────┐ ┌───────┐
│Подтв. │ │ Спор  │
│работы │ │       │
└───┬───┘ └───┬───┘
    │         │
    ▼         ▼
┌───────┐ ┌───────┐
│Выплата│ │Арбитр │
│прод-цу│ │решает │
└───────┘ └───────┘

Действия сторон

Покупатель:

  • Подтвердить работу → выплата продавцу
  • Открыть спор → арбитраж
  • Отменить (до депозита)

Продавец:

  • Отметить "Работа сдана"
  • Открыть спор
  • Отменить (до депозита)

Multisig кошельки

Принцип работы

Для каждой сделки создаётся уникальный multisig-кошелёк с 3 ключами:

  • Временный ключ покупателя (генерируется системой)
  • Временный ключ продавца (генерируется системой)
  • Ключ арбитра (постоянный, из .env)

Порог подписей: 2 из 3

Сценарии выплат

Сценарий Подписи Результат
Успех Покупатель + Продавец Продавцу
Спор (продавец прав) Арбитр + Продавец Продавцу
Спор (покупатель прав) Арбитр + Покупатель Покупателю
Отмена Покупатель + Продавец Покупателю

Активация кошелька

После обнаружения депозита, кошелёк активируется:

  • Перевод 16.1 TRX для оплаты gas
  • Последовательная очередь (избегает конфликтов)
  • Запись затрат в operationalCosts

Deadline Monitor

Автоматический мониторинг дедлайнов сделок:

  1. Дедлайн истёк → Уведомление обеим сторонам
  2. +12 часов без действий → Автоматический рефанд покупателю
  3. Интервал проверки: каждые 5 минут
  4. Batch processing: 5 сделок за раз
// Grace period: 12 часов после дедлайна
GRACE_PERIOD_MS = 12 * 60 * 60 * 1000

// Статус после авто-рефанда
status: 'expired'

Система комиссий

Расчёт комиссии

// Базовая ставка: 5%
// Минимум: 15 USDT
// Порог: 300 USDT

if (amount <= 300) {
  commission = 15; // Фиксированная
} else {
  commission = amount * 0.05; // 5%
}

Примеры

Сумма сделки Комиссия
50 USDT 15 USDT
100 USDT 15 USDT
300 USDT 15 USDT
500 USDT 25 USDT
1000 USDT 50 USDT

Кто платит комиссию

  • buyer — покупатель (депозит = сумма + комиссия)
  • seller — продавец (получает сумма - комиссия)
  • split — пополам (каждый платит 50%)

Партнёрская программа

Создание платформы

// POST /api/partner/register
{
  "name": "CryptoForum",
  "email": "admin@cryptoforum.com",
  "website": "https://cryptoforum.com"
}

// Response
{
  "platform": {
    "code": "CRYPTOF",
    "apiKey": "pk_live_xxxxx",
    "referralLink": "https://t.me/bot?start=ref_CRYPTOF"
  }
}

Реферальная ссылка

https://t.me/keyshield_bot?start=ref_PLATFORMCODE

При переходе по ссылке:

  1. Пользователь привязывается к платформе
  2. Все его сделки учитываются в статистике
  3. Платформа получает % от комиссий (настраивается)

Статистика для партнёров

// GET /api/partner/stats
{
  "stats": {
    "totalUsers": 150,
    "totalDeals": 45,
    "completedDeals": 38,
    "totalVolume": 15420.50,
    "totalCommission": 771.02,
    "netProfit": 698.45,
    "platformEarnings": 69.85  // commissionPercent от netProfit
  }
}

Расчёт партнёрского вознаграждения

// Для каждой платформы:
platformNetProfit = platformCommission - (platformDeals × 16.1 TRX × 0.28)
platformPayout = platformNetProfit × (commissionPercent / 100)

// По умолчанию commissionPercent = 10%

Партнёрский кабинет

  • Личный кабинет партнёра: /partner
  • Авторизация по логину/паролю
  • Статистика: пользователи, сделки, объём, доход
  • Реферальная ссылка для привлечения

Админ-панель

Авторизация

// POST /api/admin/login
{
  "username": "admin",
  "password": "your_password"
}

// Response
{
  "token": "eyJhbGciOiJIUzI1NiIs..."
}

Эндпоинты

Метод Путь Описание
POST /api/admin/login Авторизация
GET /api/admin/stats Общая статистика
GET /api/admin/deals Список сделок
GET /api/admin/deals/:id Детали сделки
GET /api/admin/users Список пользователей
POST /api/admin/users/:id/ban Забанить
GET /api/admin/disputes Активные споры
POST /api/admin/disputes/:id/resolve Решить спор
GET /api/admin/platforms Партнёры
GET /api/admin/audit Аудит-лог

Веб-интерфейс

Доступен по адресу /admin

Финансовая статистика

Админ-панель отображает детальную финансовую статистику:

Показатель Описание
Валовая выручка Сумма всех комиссий с завершённых сделок
Расходы TRX 16.1 TRX × количество сделок
Расходы USDT TRX расходы × курс (0.28 USDT)
Чистая прибыль Выручка − Расходы
К выплате партнёрам Сумма партнёрских выплат
Чистейшая прибыль Чистая прибыль − Партнёрские выплаты

Управление спорами

  • Просмотр деталей спора с доказательствами
  • Галерея изображений с навигацией
  • Решение спора в пользу покупателя или продавца
  • Возврат сделки в статус "in_progress"
  • Отмена спора

Веб-сайт

Страницы

URL Страница
/ Главная (лендинг)
/terms Условия использования
/privacy Политика конфиденциальности
/offer Публичная оферта
/admin Админ-панель

Особенности

  • Адаптивный дизайн — корректное отображение на мобильных устройствах
  • Мобильное меню — фиксированное меню с анимацией, автозакрытие при клике на anchor-ссылки
  • SEO-оптимизация — мета-теги, Open Graph, canonical URLs
  • Clean URLs — роутинг через Express вместо .html расширений

Технологии

  • CSS Variables — темная тема, централизованные цвета
  • CSS Grid & Flexbox — адаптивная сетка
  • Vanilla JS — без зависимостей
  • Inter font — Google Fonts

API эндпоинты

Публичные

GET  /api/health              # Проверка статуса
GET  /api/stats/public        # Публичная статистика

Партнёрские (требуют API ключ)

POST /api/partner/register    # Регистрация платформы
GET  /api/partner/stats       # Статистика платформы
GET  /api/partner/users       # Пользователи платформы
GET  /api/partner/deals       # Сделки платформы

Админские (требуют JWT)

POST /api/admin/login         # Авторизация
GET  /api/admin/stats         # Полная статистика
GET  /api/admin/deals         # Все сделки
POST /api/admin/disputes/:id/resolve  # Решение спора

База данных

Коллекции

Коллекция Описание
users Пользователи Telegram
deals Сделки
transactions Транзакции блокчейна
multisigwallets Multisig кошельки
disputes Споры
platforms Партнёрские платформы
auditlogs Аудит-лог действий

Индексы

// Deal
{ status: 1, multisigAddress: 1 }  // depositMonitor
{ uniqueKey: 1, status: 1 }        // дубликаты
{ platformId: 1, status: 1 }       // партнёры
{ buyerId: 1 }
{ sellerId: 1 }
{ dealId: 1 }                      // unique

// User
{ telegramId: 1 }                  // unique
{ platformId: 1 }
{ blacklisted: 1 }

// Transaction
{ dealId: 1 }
{ txHash: 1 }

// Platform
{ code: 1 }                        // unique
{ apiKey: 1 }                      // unique

Безопасность

Хранение ключей

  • Приватные ключи хранятся в зашифрованном виде
  • Ключ арбитра только в .env (никогда в БД)
  • Временные ключи сделок удаляются после завершения

Защита от атак

Угроза Защита
Double-spend Подтверждение блока + проверка txHash
Race condition processedDeposits Set + double-check в БД
Memory leak Автоочистка Map каждые 30 минут
API abuse Rate limiting + JWT + API ключи
MITM HTTPS only + TronGrid HTTPS

Чеклист безопасности

  • Сменить ADMIN_PASSWORD
  • Сгенерировать новый JWT_SECRET
  • Использовать отдельный кошелёк арбитра
  • Настроить HTTPS
  • Ограничить доступ к MongoDB
  • Регулярные бэкапы БД

Масштабирование

Текущие лимиты

Метрика Значение
Параллельных проверок депозитов 8
TronGrid API requests/sec 10
Сессий в памяти 5000
Сделок в месяц 10,000+

Оптимизации (реализовано)

  1. Параллельная проверка депозитов

    • 8 сделок одновременно
    • Promise.allSettled для устойчивости
    • 1 сек задержка между батчами
  2. Очистка памяти

    • Автоудаление неактивных сессий (2+ часа)
    • Лимит 5000 записей
    • Интервал очистки: 30 минут
  3. Оптимизация запросов

    • Promise.all для параллельных запросов
    • .lean() для read-only операций
    • Compound индексы
  4. Очередь активаций

    • Последовательная обработка
    • 2 сек между активациями
    • Предотвращение конфликтов nonce

Будущие улучшения (при необходимости)

  • Redis для кэширования TronGrid ответов
  • Bull queue для фоновых задач
  • Кластерный режим Node.js
  • Ротация нескольких TronGrid API ключей

Мониторинг и логирование

Логи

# Депозит-монитор
🔍 Checking deposits for 15 deal(s) in batches of 8...
📦 Processing batch 1/2 (8 deals)...
💰 Deposit detected for deal DEAL_ABC123
✅ Deal DEAL_ABC123 marked as locked

# Активация
🔓 [Queue] Activating multisig TXxx... with 15 TRX
✅ [Queue] Activation successful: txhash...

# Очистка памяти
🧹 MessageManager cleanup: removed 45 inactive users, 120 active sessions

Аудит-лог

Все важные действия записываются в auditlogs:

  • Создание сделки
  • Обнаружение депозита
  • Подтверждение работы
  • Выплата
  • Открытие/закрытие спора
  • Решение арбитра
  • Бан пользователя

Метрики

// GET /api/admin/stats
{
  "deals": {
    "total": 1250,
    "active": 45,
    "completed": 1180,
    "disputed": 25
  },
  "volume": {
    "total": 125000,
    "today": 3500,
    "month": 45000
  },
  "users": {
    "total": 850,
    "active": 120,
    "blacklisted": 5
  }
}

FAQ

Что если покупатель не подтверждает работу?

Продавец открывает спор, прикладывает доказательства. Арбитр принимает решение в течение 24-48 часов.

Что если продавец не выполняет работу?

Покупатель открывает спор. Если работа не сдана до дедлайна и нет активности — возврат покупателю.

Минимальная сумма сделки?

50 USDT (настраивается в .env)

Сколько TRX нужно для работы?

На кошельке арбитра рекомендуется держать:

  • 15 TRX × количество активных сделок
    • запас на выплаты (~ 5 TRX на транзакцию)

Как добавить нового админа?

Изменить ADMIN_USERNAME и ADMIN_PASSWORD в .env, перезапустить сервис.


Поддержка

При возникновении проблем:

  1. Проверьте логи: pm2 logs keyshield
  2. Проверьте MongoDB: mongosh keyshield --eval "db.deals.countDocuments()"
  3. Проверьте баланс арбитра: TronScan

Документация обновлена: 5 декабря 2025

About

Безопасный криптовалютный эскроу на TRON

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •