Сеть
Parano1d использует libp2p для идентификации пиров, обнаружения, ретрансляции и синхронизации. Публичный сетевой протокол имеет идентификатор:
/noid/mainnet/860e70453390bf81/1
Стандартный P2P-интерфейс принимает TCP-соединения на порту 9600.
JSON-RPC — отдельный локальный
административный интерфейс на 127.0.0.1:9601.
Идентификатор пира и полномочия в консенсусе
Каждая нода сохраняет Ed25519-идентификатор пира libp2p. Этот идентификатор аутентифицирует сетевые сессии и даёт пиру стабильный ID после перезапуска.
Этот идентификатор не имеет полномочий в консенсусе. Он не может потратить UTXO, подписать блок или повлиять на проверку доказательства. Владение в кошельке, корректность блока и proof of work используют бинарный стек консенсуса.
Обнаружение пиров
Ноды объединяют три источника обнаружения:
- встроенные DNS-сиды для первого подключения к публичным пирам;
- Kademlia для дальнейшего обнаружения;
- mDNS для пиров в локальной сети.
Успешные адреса пиров сохраняются и используются повторно. Хранилище пиров содержит до 500 пиров и ограничивает число запоминаемых адресов одного пира.
GossipSub поддерживает сеть распространения из четырёх соседей, а автоматическое управление топологией стремится поддерживать восемь обычных соседей для загрузки точных объектов и замены недоступных источников. Это целевой минимум, а не предел общего числа соединений. Не более четырёх невыбранных входящих пиров засчитываются в него, поэтому нода самостоятельно выбирает как минимум четырёх обычных соседей. DNS-сиды дают первые два пути и заменяются стабильными обычными пирами без предварительного падения ниже цели. Обнаружение использует случайный сдвиг по идентификатору, один активный поиск и экспоненциальную задержку повторов.
Встроенные имена сидов сначала разрешаются системным DNS, в том числе через настроенные VPN-резолверы. DNS-мультиадрес сохраняется для последующего повторного разрешения A/AAAA.
DNS-записи указывают на сетевые адреса, а не на состояние цепочки. Если публичный адрес не изменился, обновление ПО или сброс ноды не требуют менять DNS-имя.
Gossip
GossipSub передаёт логические транзакции и небольшие объявления блоков по принципу header-first. Тела блоков и рекурсивные terminal proofs не конкурируют с заголовками: они загружаются затем по точному идентификатору содержимого через типизированный протокол «запрос — ответ». Размер сообщений GossipSub жёстко ограничен, поэтому пир не может превратить обычную ретрансляцию в неограниченное выделение памяти.
Транзакция ретранслируется только после того, как локальный мемпул проверил её каноническую структуру, авторизацию и текущие конфликты. Получение сообщения GossipSub никогда не равнозначно принятию данных консенсусом.
Для транзакций, допущенных в локальный мемпул, GossipSub дополняется ограниченной прямой отправкой. Если подключено не более восьми пиров, нода отправляет транзакцию каждому из них. При большем числе соединений она напрямую отправляется случайной группе не более чем из четырёх пиров, а GossipSub остаётся основным путём распространения по сети. В небольшой сети это обеспечивает полный первый шаг ретрансляции, не превращая большую сеть в рассылку каждому пиру.
Протоколы «запрос — ответ»
Типизированные обмены обслуживают:
- пакеты заголовков;
- сохранённые тела блоков и рекурсивные терминальные доказательства вершин суффиксов;
- небольшие заголовки снимков, страницы манифеста и сегменты
State; - перечень недавних транзакций мемпула и отсутствующие логические транзакции.
При прямой синхронизации нода запрашивает не более 512 заголовков за раз. На
этапе подготовки снимка заголовки передаются пакетами до 4 096 штук. Каждый
пакет сжимается с помощью zstd. Размер сжатых данных и результат распаковки
жёстко ограничены. После распаковки пакет занимает не более 0,83 МиБ и содержит
канонические заголовки размером 212 байт каждый. Затем заголовки без изменений
поступают в прежний тракт проверки и хранения.
Сам State передаётся как небольшой заголовок манифеста, ограниченные страницы
описателей и отдельно аутентифицированные сегменты. Один неизменяемый план может
получать точные объекты от разных пиров; потеря source не уничтожает уже
проверенный прогресс.
Сверка мемпулов запрашивает не более 128 транзакций и 16 MiB на ответ. После частичного ответа дозагрузка продолжается по одному каналу, согласованному со скоростью обработки, с использованием не более четырёх выбранных источников. Запросы к одному источнику разделены как минимум 30 секундами. Время ожидания, число неудач и объём просмотра ограничены. Дозагрузка останавливается при заполнении локального мемпула и не опрашивает простаивающие сиды периодически. Произвольное входящее соединение не запускает новую дозагрузку, но уже разрешённая может продолжаться через сохранившееся аутентифицированное соединение. Для пиров без дополнительного протокола продолжения используется прежний обмен.
Побайтово одинаковые доставки через gossip и прямой канал объединяются до расходования квоты повторов. Это не кеш корректности: обычная локальная проверка обязательна, а ранее принятые записи, отсутствующие в мемпуле, могут рассматриваться снова. Успешно принятые транзакции распространяются обычным порядком. Отключившийся или неотвечающий источник не занимает канал бессрочно.
Выбор сида привязан к его аутентифицированному настроенному идентификатору, а не к одному сокету. Переподключение и встречные соединения сохраняют этот выбор. Оставшийся транспорт сида отключается только после стабильной замены обычными пирами. Произвольный входящий пир не может объявить себя выбранным.
Границы ресурсов
Публичная сеть ограничена на нескольких уровнях:
- независимые бюджеты размера действуют для входящих и исходящих ответов;
- размеры блоков и сообщений GossipSub ограничены;
Stateсегментирован;- число адресов и записей в хранилище пиров ограничено;
- повторяющееся некорректное поведение штрафуется;
- соединения распределяются по сетевым группам.
Для исходящих соединений допускается не более двух пиров из одной сетевой группы. Во входящих соединениях допускается не более 32 идентификаторов пиров с одного IP-адреса и 96 соединений из одной сетевой группы. После первых 96 входящих соединений оставшиеся позиции резервируются для ещё недостаточно представленных групп; каждая такая группа может занять не более восьми резервных позиций. Эти пределы позволяют работать пользователям за общими выходами VPN и операторского NAT, но не дают одному диапазону хостинга занять все входящие соединения.
Они не заменяют разнообразную публичную топологию. Инфраструктура начальных пиров и майнинговая инфраструктура должны размещаться в независимых сетях и управляться разными операторами.
Сетевой порог майнинга
Для обычного майнинга нужен один аутентифицированный пир. Это не позволяет оставленной без присмотра ноде продолжать изолированное представление цепочки только потому, что пропала связь.
Порог является операционной защитой, а не голосованием. Пиры не одобряют блок и не могут сделать некорректный переход приемлемым. После подключения майнер следует локальной проверке доказательств и консенсусу накопленной работы.
Границы интерфейсов
P2P-порт 9600 предназначен для публичного доступа, RPC-порт 9601 — нет. RPC
включает методы кошелька и управления процессом и не имеет публичного
транспортного слоя аутентификации; оставляйте его на локальном интерфейсе
обратной петли (loopback) либо за
аутентифицированным приватным туннелем.
Параметры развёртывания приведены в разделе «Конфигурация», а данные протоколов синхронизации — в разделе «Синхронизация».