Модель безопасности
У 2D один block producer и один или более независимых верификаторов. Модель доверия проще, чем набор валидаторов, но границы, где входят недоверенные данные, всё равно нужно защищать. Эта страница документирует рассмотренные векторы атак и как каждый из них обрабатывается.
Trust boundaries
Заголовок раздела «Trust boundaries»Четыре границы, где недоверенные данные попадают в систему:
- Пользователь → RPC — кошельки отправляют подписанные транзакции через
eth_sendRawTransactionили/wallet/broadcasttransaction. На входе недоверенный hex, любого размера и содержания. - RPC → executor — провалидированные транзакции сидят в
pending_transactions, пока producer их не заберёт. Executor заново проверяет identity отправителя по подписи. - Producer → верификатор — верификатор получает блоки по Erlang distribution. Не доверяет ничему: повторно исполняет каждую транзакцию, пересчитывает каждый хэш.
- Пользователь → precompile — calldata к precompile-контрактам (HTLC, будущие настройки аккаунта) парсится и валидируется в каждом контракте.
Валидация на уровне RPC
Заголовок раздела «Валидация на уровне RPC»Каждая транзакция проходит несколько проверок до попадания в pending pool:
| Проверка | Что ловит |
|---|---|
| Hex decode | Некорректный input, не-hex символы |
| Лимит размера (128 КБ) | DoS через огромные payload. Проверяется до декодирования. |
| RLP / protobuf decode | Структурно невалидные транзакции |
| Chain ID | Cross-chain replay (tx подписана для Ethereum mainnet, отправлена на 2D) |
| Восстановление подписи | Невалидные подписи, malleable подписи (EIP-2 s-value) |
| Валидация nonce | Устаревшие nonce отклоняются (nonce < nonce аккаунта). Future nonce ограничен +100. |
Некорректные адреса и topics в eth_getLogs возвращают ошибку, а не крашат handler.
Replay и nonce-защита
Заголовок раздела «Replay и nonce-защита»У каждого аккаунта последовательный nonce. Executor проверяет, что nonce транзакции точно совпадает с текущим nonce аккаунта. Транзакция не может выполниться дважды, потому что nonce инкрементируется после каждого выполнения.
Cross-chain replay заблокирован и на уровне RPC, и в executor: транзакции должны нести правильный chain ID (11565 для 2D). Pre-EIP-155 транзакции (без chain ID) отклоняются.
Дублирование хэшей транзакций обрабатывается через ON CONFLICT DO NOTHING при вставке. Повторная отправка той же подписанной транзакции не имеет эффекта.
Anti-spam throttle
Заголовок раздела «Anti-spam throttle»Все транзакции бесплатны (fee = 0). Спам предотвращается экспоненциальной задержкой на уровне block producer. Подробности в разделе Бесплатные транзакции.
Throttle работает на уровне SQL: адреса, превысившие порог, исключаются из запроса к pending полностью. Один спамер не может заблокировать транзакции других пользователей (защита от head-of-line blocking).
Устаревшие pending-транзакции (старше 10 минут) автоматически очищаются.
Верификация подписей
Заголовок раздела «Верификация подписей»Identity отправителя проверяется криптографически, никогда не берётся из пользовательского input:
- Ethereum-транзакции: sender восстанавливается из ECDSA-подписи через
secp256k1recovery. Восстановленный адрес используется для всех операций с балансом и 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 запланирована.