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

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

У 2D один block producer и один или более независимых верификаторов. Модель доверия проще, чем набор валидаторов, но границы, где входят недоверенные данные, всё равно нужно защищать. Эта страница документирует рассмотренные векторы атак и как каждый из них обрабатывается.

Четыре границы, где недоверенные данные попадают в систему:

  1. Пользователь → RPC — кошельки отправляют подписанные транзакции через eth_sendRawTransaction или /wallet/broadcasttransaction. На входе недоверенный hex, любого размера и содержания.
  2. RPC → executor — провалидированные транзакции сидят в pending_transactions, пока producer их не заберёт. Executor заново проверяет identity отправителя по подписи.
  3. Producer → верификатор — верификатор получает блоки по Erlang distribution. Не доверяет ничему: повторно исполняет каждую транзакцию, пересчитывает каждый хэш.
  4. Пользователь → precompile — calldata к precompile-контрактам (HTLC, будущие настройки аккаунта) парсится и валидируется в каждом контракте.

Каждая транзакция проходит несколько проверок до попадания в pending pool:

ПроверкаЧто ловит
Hex decodeНекорректный input, не-hex символы
Лимит размера (128 КБ)DoS через огромные payload. Проверяется до декодирования.
RLP / protobuf decodeСтруктурно невалидные транзакции
Chain IDCross-chain replay (tx подписана для Ethereum mainnet, отправлена на 2D)
Восстановление подписиНевалидные подписи, malleable подписи (EIP-2 s-value)
Валидация nonceУстаревшие nonce отклоняются (nonce < nonce аккаунта). Future nonce ограничен +100.

Некорректные адреса и topics в eth_getLogs возвращают ошибку, а не крашат handler.

У каждого аккаунта последовательный nonce. Executor проверяет, что nonce транзакции точно совпадает с текущим nonce аккаунта. Транзакция не может выполниться дважды, потому что nonce инкрементируется после каждого выполнения.

Cross-chain replay заблокирован и на уровне RPC, и в executor: транзакции должны нести правильный chain ID (11565 для 2D). Pre-EIP-155 транзакции (без chain ID) отклоняются.

Дублирование хэшей транзакций обрабатывается через ON CONFLICT DO NOTHING при вставке. Повторная отправка той же подписанной транзакции не имеет эффекта.

Все транзакции бесплатны (fee = 0). Спам предотвращается экспоненциальной задержкой на уровне block producer. Подробности в разделе Бесплатные транзакции.

Throttle работает на уровне SQL: адреса, превысившие порог, исключаются из запроса к pending полностью. Один спамер не может заблокировать транзакции других пользователей (защита от head-of-line blocking).

Устаревшие pending-транзакции (старше 10 минут) автоматически очищаются.

Identity отправителя проверяется криптографически, никогда не берётся из пользовательского input:

  • Ethereum-транзакции: sender восстанавливается из ECDSA-подписи через secp256k1 recovery. Восстановленный адрес используется для всех операций с балансом и nonce.
  • Tron-транзакции: подпись хранится рядом с raw protobuf. При исполнении sender заново выводится из sha256(raw_data) + signature и сравнивается с сохранённым адресом. Расхождения отклоняются.

Компоненты подписи (r, s) длиннее 32 байтов отклоняются до padding. High-s подписи (EIP-2 malleability) отклоняются и на уровне RPC, и в executor.

Верификатор ничему не доверяет от producer. Для каждого блока он независимо:

  • Вычисляет хэши транзакций из raw-байтов (не доверяет заявленным хэшам producer)
  • Пересчитывает state root по своей базе данных
  • Проверяет transactions root, state root и block hash
  • Для genesis: фиксирует канонические timestamp и transactions root по известным константам

Расхождение в любом из этих значений останавливает верификатор. Подробности в разделе Запуск верификатора.

Append-only история защищена PostgreSQL-правилами, которые отбрасывают UPDATE и DELETE операции на таблицах blocks и transactions. State-схема использует SERIALIZABLE isolation для всех блоков, предотвращая race conditions между конкурентными транзакциями.

  • Приватность: балансы и суммы переводов видны любому, кто запустит верификатор. Приватный слой в разработке.
  • HSM block signing: ключ подписи producer сейчас программный. Поддержка hardware security module запланирована.