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

P2P-сети

Savitri Network использует libp2p 0.55 для всей одноранговой коммуникации.

Стек транспорта

УровеньТехнология
ТранспортTCP
ШифрованиеПротокол Noise
МультиплексированиеYamux
ОбнаружениеKademlia DHT
Паб/СубGossipsub
ИдентификацияКлючи узлов Ed25519

Топики Gossipsub

ТопикИздательПодписчикНазначение
/savitri/tx/1LightnodesLightnodes, MasternodesТрансляция транзакций
/savitri/block/1LightnodesВсе нодыТрансляция блоков
/savitri/consensus/cert/1LightnodesMasternodes, ObserverСертификаты принятия блоков
/savitri/peer_registry/1Все нодыMasternodesKeepalive / регистрация узлов
/savitri/lightnode/group/announce/1MasternodesLightnodesНазначение групп
/savitri/group/{id}/electionЧлены группыЧлены группыВыборы внутри группы

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

ПараметрLightnodeMasternode
mesh_n88
mesh_n_high1212
mesh_n_low44
mesh_outbound_min33
connection_handler_queue_len50 00050 000
max_transmit_size256 КБ256 КБ
flood_publishfalsetrue (все подписчики)

Сжатие сообщений

ФорматСтатусПрименение
snapВключеноОбщие P2P-сообщения
lz4ВключеноПути с высокой пропускной способностью
zstdОтключено на MSVCНе используется на Windows

Активность узлов

Lightnode

  • Публикация PoU-оценки: публикуется через gossipsub каждые 60 секунд
  • Зонды задержки: каждые 30 секунд через прямой P2P
  • Heartbeat: публикация gossipsub на /savitri/peer_registry/1

Masternode

  • Обновление last_seen: обновляется при ЛЮБОМ gossipsub-сообщении от узла
  • Тайм-аут неактивности: 600 секунд (настраивается в конфигурации MN)
  • cleanup_inactive(): удаляет ноды, превысившие тайм-аут
  • Обработчик SlowPeer: отключает узлы с переполненными очередями отправки

Observer

  • Heartbeat каждые 30 секунд: публикует на /savitri/peer_registry/1
  • Подписывается на: /savitri/consensus/cert/1 и /savitri/block/1

Начальная загрузка

Начальные узлы настраиваются в config/bootstrap_nodes.json:

[
{
"peer_id": "12D3KooW...",
"address": "/ip4/3.120.x.x/tcp/4001"
}
]

При запуске ноды подключаются к начальным узлам и обнаруживают дополнительных узлов через Kademlia DHT.

Прямой P2P (запрос-ответ)

Некоторые операции используют прямую P2P-коммуникацию вместо gossipsub:

ОперацияПротокол
Зонды задержкиПрямой запрос-ответ
PoU ACKТочка-точка ответ
Кандидаты на выборахПрямой P2P

Это позволяет избежать накладных расходов O(N^2) при широковещательной рассылке для операций, которым нужно достичь только конкретных узлов.

Сетевые порты

ПортПротоколСервис
4001TCPP2P (libp2p) по умолчанию
8333TCPP2P (альтернативный)
8545HTTPRPC (JSON-RPC 2.0)
8546WSWebSocket
9090HTTPМетрики Prometheus

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

config/development.toml

[network]
max_peers = 10
block_time_secs = 2
max_tps = 100
group_size = 3

config/production.toml

[network]
max_peers = 50
block_time_secs = 5
max_tps = 1000
group_size = 7
slashing_enabled = true

Фильтрация логов

Для уменьшения объёма подробных логов gossipsub:

RUST_LOG=info,libp2p_gossipsub::behaviour=error

Это подавляет предупреждения об очереди отправки, содержащие полные полезные нагрузки сообщений (по 1–2 КБ, что приводит к логам объёмом 120 МБ+).