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

Модель безопасности

Криптографические примитивы

ПримитивАлгоритмПрименение
ПодписиEd25519 (ed25519-dalek)Подпись транзакций, подпись блоков
Хеширование блоковSHA-512Хеш блока с доменным тегом "BLK"
Хеширование транзакцийSHA-256Хеш сообщения для подписи
Хеширование состоянияBLAKE3Вычисление корня состояния
Хеширование хранилищаKeccak256Вычисление адресов слотов хранилища контрактов
Сжатиеsnap, lz4Сжатие сообщений P2P

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

Уровень P2P

  • Шифрование: протокол Noise libp2p (аутентифицированное шифрование)
  • Мультиплексирование: Yamux
  • Идентичность: ключи узла Ed25519
  • Максимальный размер передачи: 256 КБ на сообщение

Уровень RPC

  • TLS: не терминируется сервером RPC. В продакшен-развёртываниях необходимо использовать обратный прокси с терминацией TLS.
  • CORS: ограничен источниками localhost. Для продакшена настройте разрешённые источники.
  • Лимит тела запроса: максимум 1 МБ.

Ограничение частоты запросов

УровеньЛимитОкно
Глобальный RPC200 зап/сСкользящее окно 1 секунда
RPC на IP50 зап/сСкользящее окно 1 секунда
Размер пакета100 запросовНа HTTP-запрос
Сканирование хешей блоков1000 блоковНа вызов chain_getBlockByHash

Валидация входных данных

RPC

  • Версия JSON-RPC должна быть точно "2.0"
  • Сообщения об ошибках санируются перед отправкой клиентам
  • Внутренние ошибки возвращают общие сообщения (без трассировок стека или внутренних форматов)
  • Детали отклонения мемпула исключаются из ответов с ошибками

Мемпул

  • Валидация nonce: требуются последовательные nonce (допуск пробела до 5000 для восстановления от пиков)
  • Проверка баланса: отправитель должен иметь достаточный баланс для суммы + комиссии
  • Верификация подписи: подпись Ed25519 проверяется перед приёмом
  • Система квот: лимиты на класс (Financial: 50 тыс., IoT: 100 тыс., Global: 100 тыс.)
  • Ограничение на отправителя: максимум 512 ожидающих транзакций на отправителя

Конвейер транзакций

Проверки без состояния (выполняются первыми):

  1. Проверка формата подписи
  2. Верификация подписи Ed25519
  3. Проверка вывода публичного ключа → адрес

Проверки с состоянием (выполняются после прохождения проверок без состояния):

  1. Nonce >= nonce аккаунта
  2. Баланс >= сумма + комиссия
  3. Аккаунт не в чёрном списке

Атомарная фиксация: вычет баланса и увеличение nonce происходят атомарно.

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

Кворум BFT

  • Кворум: 2f+1 (67%) валидаторов должны подписать Block Acceptance Certificate
  • Устойчивость к Byzantine-сбоям: до f = (n-1)/3 byzantine-узлов
  • Верификация сертификата: мастерноды проверяют все подписи аттестации

Защита PoU от манипуляций

  • Сглаживание оценки: экспоненциальное скользящее среднее предотвращает манипуляцию оценкой через временное поведение
  • Ротация предложителей: после 50 блоков предложитель должен уступить место (предотвращает монополию)
  • Минимальный порог оценки: оценка < 300 лишает права на вознаграждения

Безопасность выборов

  • Детерминированные идентификаторы групп: основаны на эпохе, а не на системном времени (предотвращает разногласия мастернод)
  • Дедупликация выборов: фиксируется только первый результат за раунд
  • Мягкое отклонение неизвестных групп: мастерноды предупреждают, но продолжают обработку для неизвестных идентификаторов групп

Управление ключами

Кошелёк SDK

  • Зерование: приватные ключи зеруются при Drop (через крейт zeroize)
  • Без сохранения: кошелёк SDK не сохраняет ключи на диск
  • Принудительный HTTPS: удалённые RPC-эндпойнты по умолчанию требуют HTTPS

Кран (Faucet)

  • Ключи по кругу: 10 пар ключей чередуются для предотвращения конкуренции nonce
  • Сериализованные заявки: мьютекс faucet_lock предотвращает гонки условий TOCTOU
  • Лимиты заявок: 5 SAVT за заявку, 24-часовое ограничение на адрес

Безопасность узлов

Жизнеспособность узлов

  • Keepalive gossipsub: публикация оценки PoU через gossipsub обновляет last_seen
  • Тайм-аут бездействия: 600 секунд (настраивается) перед удалением узла
  • Отключение SlowPeer: узлы отключаются при переполнении очереди отправки gossipsub

Ограничения ресурсов

  • Очередь обработчика соединений: 50 000 сообщений (LN + MN)
  • Сетка gossipsub: mesh_n=8, mesh_n_high=12, mesh_n_low=4
  • Размер стека: 8 МБ для предотвращения переполнения стека
  • Память: ограниченные пулы мемпула с обратным давлением

Ответственное раскрытие

Сообщайте об уязвимостях безопасности через процесс ответственного раскрытия проекта. Не создавайте публичные задачи для ошибок безопасности.