P2P-сети
Savitri Network использует libp2p 0.55 для всей одноранговой коммуникации.
Стек транспорта
| Уровень | Технология |
|---|---|
| Транспорт | TCP |
| Шифрование | Протокол Noise |
| Мультиплексирование | Yamux |
| Обнаружение | Kademlia DHT |
| Паб/Суб | Gossipsub |
| Идентификация | Ключи узлов Ed25519 |
Топики Gossipsub
| Топик | Издатель | Подписчик | Назначение |
|---|---|---|---|
/savitri/tx/1 | Lightnodes | Lightnodes, Masternodes | Трансляция транзакций |
/savitri/block/1 | Lightnodes | Все ноды | Трансляция блоков |
/savitri/consensus/cert/1 | Lightnodes | Masternodes, Observer | Сертификаты принятия блоков |
/savitri/peer_registry/1 | Все ноды | Masternodes | Keepalive / регистрация узлов |
/savitri/lightnode/group/announce/1 | Masternodes | Lightnodes | Назначение групп |
/savitri/group/{id}/election | Члены группы | Члены группы | Выборы внутри группы |
Конфигурация Gossipsub
| Параметр | Lightnode | Masternode |
|---|---|---|
mesh_n | 8 | 8 |
mesh_n_high | 12 | 12 |
mesh_n_low | 4 | 4 |
mesh_outbound_min | 3 | 3 |
connection_handler_queue_len | 50 000 | 50 000 |
max_transmit_size | 256 КБ | 256 КБ |
flood_publish | false | true (все подписчики) |
Сжатие сообщений
| Формат | Статус | Применение |
|---|---|---|
| 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) при широковещательной рассылке для операций, которым нужно достичь только конкретных узлов.
Сетевые порты
| Порт | Протокол | Сервис |
|---|---|---|
| 4001 | TCP | P2P (libp2p) по умолчанию |
| 8333 | TCP | P2P (альтернативный) |
| 8545 | HTTP | RPC (JSON-RPC 2.0) |
| 8546 | WS | WebSocket |
| 9090 | HTTP | Метрики 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 МБ+).