Ниже — цельная спецификация и дорожная карта до функциональной иерархической hybrid-сети, развиваемой в репозитории ASlava12/overlay, а не в новом проекте.
Сразу важная оговорка:
“Запускать на триллионах устройств” — это не то, что можно честно доказать лабораторно на ранних этапах. Реалистичная цель спецификации — построить архитектуру, которая не упирается концептуально в 10⁶–10⁹ и не содержит решений, которые гарантированно ломаются при дальнейшем росте. Практическая проверка пойдёт через devnet → cluster → geo-distributed pilot → large simulation.
Эти вещи фиксируются сразу и не пересматриваются без очень веской причины.
node_id = BLAKE3(public_key) // 32 bytes
Это уже соответствует текущему overlay, где NodeId::from_public_key() считает 32-байтный BLAKE3 от публичного ключа.
Если участники узнают друг друга по публичным ключам, то:
node_addr := node_id
Отдельного “магического” адреса узла не нужно.
node_id— глобальный стабильный адрес узла- текущая достижимость — отдельные attach/gateway/mailbox records
- transport endpoint — отдельный runtime state, не часть identity
app_id = BLAKE3-derive_key(
"overlay.app_id.v1",
node_id || ns_len(u32 BE) || app_namespace || name_len(u32 BE) || app_name
)
Length-prefix'ы обязательны (Epic 452): без них ("foo","bar") и ("fo","obar")
давали бы одинаковый digest. Domain separator "overlay.app_id.v1" исключает
коллизии с другими BLAKE3-хешами протокола.
Адрес конечной точки приложения:
AppAddress {
node_id: [u8; 32],
app_id: [u8; 32],
endpoint_id: u32,
}
content_id = BLAKE3(content_bytes)
или с domain separation:
content_id = BLAKE3(app_id || content_type || payload)
Сеть обязана быть разделена на роли:
leaf— мобильный/слабый узелcore— полноправный участник сети
И на плоскости:
- transport plane
- session/security plane
- overlay control plane
- discovery plane
- delivery plane
- local mesh plane
- application plane
Слабый/мобильный/периодически оффлайновый узел.
Свойства:
- может не иметь публичной достижимости
- не участвует в DHT
- не хранит чужие записи
- работает через Core-ноды и mailbox
Полноправный участник сети. Все Core-ноды равноправны.
Свойства:
- участвует в DHT (K=20), relay/forwarding
- gateway: публикует attachment records leaf-узлов (по умолчанию вкл, отключается через конфиг)
- хранит mailbox shards для офлайн-получателей
- NAT relay для leaf-узлов за NAT
- mesh bridge (опционально, по конфигу)
- PoW ≥ 24 бит, высокий uptime
Это важно для плана внедрения.
Сейчас проект уже содержит:
- workspace с
overlaycore - transport registry и backends:
tcp,tls,quic,websocket,unix,socks - runtime узла с listeners, outbound peers, sessions, metrics, admin
- JSON handshake с
public_key,nonce,node_id - config model с
NodeId,PeerId,ListenId, transport/global/identity settings - crypto и identity PoW policy
Сейчас это foundation runtime, а не полноценно layered overlay-network stack. Именно поэтому дорожная карта ниже начинается с разделения planes и нового протокола.
Текущий JSON-handshake должен быть заменён на бинарный overlay protocol; нынешний handshake полезен только как временный bootstrap/legacy режим.
FrameHeader {
magic: [u8; 4] // "OVL1"
version: u8 // 1
family: u8 // session/control/discovery/delivery/app
msg_type: u16
flags: u16
header_len: u16
body_len: u32
stream_id: u32
request_id: u32
}
Свойства:
- фиксированный заголовок
- компактный бинарный парсинг
- пригодно для TCP/QUIC/WS
- легко multiplex-ить
- удобно для bounded resource usage
После header — TLV extension block.
HELLOIDENTITYCAPABILITIESKEY_AGREEMENTSESSION_CONFIRMATTACHDETACHKEEPALIVE
PINGPONGNEIGHBOR_OFFERROUTE_PROBEROUTE_REPLYERROR
FIND_NODEFIND_VALUESTOREDELETEANNOUNCE_ATTACHMENTGET_ATTACHMENTGET_MAILBOX_SETGET_APP_ENDPOINT
MAILBOX_PUTMAILBOX_FETCHMAILBOX_ACKFORWARDDELIVERY_STATUS
APP_OPENAPP_DATAAPP_CLOSEAPP_SENDAPP_RECEIPT
HELLOIDENTITYCAPABILITIESKEY_AGREEMENTSESSION_CONFIRMATTACH
Разделить:
- identity
- secure session
- role negotiation
- attachment
Минимум:
IdentityFrame {
algo: u8
public_key_len: u16
public_key: bytes
node_id: [u8; 32]
nonce_len: u8
nonce: bytes
}
CapabilitiesFrame {
roles_supported: bitset
transports_supported: bitset
can_store: bool
can_relay: bool
can_mailbox: bool
can_gateway_local_mesh: bool
can_participate_dht: bool
can_accept_app_streams: bool
max_frame_size: u32
max_streams: u16
}
AttachFrame {
role: u8
realm_id: u32
attach_epoch: u32
mailbox_preference_count: u8
gateway_preference_count: u8
flags: u16
}
AttachmentRecord {
node_id: [u8; 32]
role: u8
realm_id: u32
epoch: u32
gateway_count: u8
mailbox_count: u8
gateways: GatewayRef[]
mailboxes: MailboxRef[]
expires_at: u64
seq_no: u64
signature: bytes
}
Это не identity и не transport endpoint. Это текущее состояние достижимости.
GatewayRef {
gateway_node_id: [u8; 32]
priority: u16
weight: u16
flags: u16
}
MailboxRef {
mailbox_node_id: [u8; 32]
shard_id: u32
priority: u16
flags: u16
}
AppEndpointRecord {
node_id: [u8; 32]
app_id: [u8; 32]
endpoint_id: u32
epoch: u32
flags: u16
capabilities: u32
expires_at: u64
signature: bytes
}
DhtValue {
key: [u8; 32]
kind: u8
epoch: u32
ttl_secs: u32
seq_no: u64
body_len: u32
body: bytes
signature_len: u16
signature: bytes
}
DHT участвует только в:
core- части
gateway
leaf не участвует в ownership.
- attachment records
- mailbox set records
- gateway set records
- app endpoint records
- capability descriptors
- прямые live transport endpoints leaf-узлов
- горячий presence
- transient route cache
- внутренние local mesh links
Обычный XOR-space.
distance(a, b) = a XOR b
- node routing key =
node_id - attachment key =
BLAKE3("attach" || node_id) - mailbox key =
BLAKE3("mailbox" || node_id || epoch) - app endpoint key =
BLAKE3("app" || node_id || app_id || endpoint_id)
Триллион устройств не означает триллион DHT-owners online.
Большая часть должна быть leaf, attach-only, mailbox-backed.
Это строится раньше DHT, потому что доставляемость важнее красивого lookup.
Если адресат reachable сейчас:
- sender → gateway/mailbox/core → target
Если адресат offline/intermittent:
- sender пишет в mailbox set
- recipient later fetches backlog
Если адресат в локальном realm:
- gateway/relay доставляет по local mesh plane
Положить зашифрованный envelope.
Забрать сообщения после seq/offset.
Подтвердить приём и удалить backlog, если политика позволяет.
DeliveryEnvelope {
recipient_node_id: [u8; 32]
app_id: [u8; 32]
endpoint_id: u32
content_id: [u8; 32]
created_at: u64
ttl_secs: u32
payload_len: u32
payload: bytes
}
Для:
- Bluetooth
- Wi-Fi Direct
- local ad-hoc/LAN
- other constrained links
Local mesh plane не обязан знать глобальную DHT.
Он должен уметь:
- обнаруживать локальных соседей
- forward-ить пакеты по realm
- прикреплять leaf к gateway
- буферизовать low-power узлы через friend/gateway semantics
LocalLink
MeshNeighborProvider
MeshForwarder
GatewayBridge
RealmMembership
Сначала это реализуется через simulation/in-memory/UDP, а потом подключаются реальные BLE/Wi-Fi backends.
Vivaldi не используется как:
node_id- DHT placement key
- ownership-space identifier
Только для:
- выбора ближайшего gateway
- выбора порядка обращения к mailbox replicas
- ранжирования соседей/relays
- route scoring
Это только performance optimization. Не trust anchor.
- Rust
- Tokio
Порядок приоритета:
- QUIC
- TLS/TCP
- WS/WSS
- Unix
- SOCKS-wrapper
- BLE/Wi-Fi-local through mesh plane
Текущий transport layer уже даёт хороший фундамент для этого.
- свой бинарный framing
- TLV / varint
- без JSON в hot path
- существующая identity-model остаётся
- session-layer выносится отдельно
- Ed25519 default
- Falcon512 optional, как уже подготовлено в config model
Ниже — дорога до работающей сети.
Зафиксировать неизменяемые сущности и vocabulary.
- зафиксировать
node_id = BLAKE3(pubkey) - зафиксировать
node_addr == node_id - зафиксировать
app_idформулу - утвердить роли
leaf/core - утвердить plane model
- утвердить что Vivaldi не участвует в ownership
Документ docs/architecture/foundation.md
- все ключевые термины и идентификаторы описаны
- больше нет спорных трактовок
node_addr
Уйти от JSON-handshake к компактному binary wire protocol.
- добавить
proto/header.rs - добавить
proto/family.rs - добавить
proto/codec.rs - добавить TLV extension support
- добавить bounded decoding
- добавить frame fuzzer/property tests
Новый пакетный протокол OVL1
- два узла обмениваются бинарными
HELLO/IDENTITY - JSON-handshake остаётся только как legacy-mode
- все новые integration tests используют новый codec
Разделить identity, session security и attach negotiation.
- реализовать
HELLO - реализовать
IDENTITY - реализовать
CAPABILITIES - реализовать
KEY_AGREEMENT - реализовать
SESSION_CONFIRM - реализовать
ATTACH - сделать session manager отдельно от node runtime
Узлы устанавливают сессии с role/capability negotiation
- есть machine-readable session FSM
- runtime создаёт session objects, а не просто “raw connected streams”
- роли и способности доступны после handshake
Разрезать текущий NodeRuntime на сервисы.
- вынести
TransportRuntime - вынести
SessionRegistry - вынести
MetricsHttp - вынести
OutboundConnector - вынести
ListenerSupervisor - сделать orchestration shell
Нет монолитного runtime-файла с логикой всех planes
runtime.rsстановится тонким оркестратором- listeners/peers/sessions обслуживаются отдельными subsystems
Ввести role-based behaviour.
- добавить
NodeRole - расширить config
- ввести role-based capability set
- запретить
leafучаствовать в DHT ownership - разрешить
gatewaybridge behaviour - добавить tests per role
Один и тот же бинарник умеет работать в ролях leaf/core
- роль влияет на доступные протоколы и storage behaviour
- в CLI/runtime видна активная роль узла
Сделать сеть полезной до DHT.
- реализовать
MAILBOX_PUT - реализовать
MAILBOX_FETCH - реализовать
MAILBOX_ACK - реализовать
FORWARD - реализовать backlog queue
- реализовать TTL/cleanup
- добавить end-to-end tests sender → mailbox → recipient
Сообщения доставляются online и offline через mailbox
- leaf может получать backlog после reconnect
- gateway/core может выступать mailbox
- есть delivery receipts статуса transport/delivery
Адресовать не только узлы, но и приложения/endpoint-ы.
- реализовать
app_id - реализовать
AppAddress - добавить app router
- добавить endpoint registry
- реализовать
APP_OPEN/APP_DATA/APP_CLOSE - сделать минимальное demo app API
На узле можно принимать сообщения разным приложениям
- приложение регистрирует
(app_id, endpoint_id) - доставка идёт до конкретного app endpoint
Сделать жизнеспособную hybrid-сеть без DHT.
- gateway attachment table
- leaf attach/detach/reattach
- friend-like buffering для low-power leaf
- heartbeat/lease
- local reachability abstraction
- tests: leaf behind gateway still receives messages
Leaf за gateway полноценно работает без публичной достижимости
- leaf attach survives reconnect
- gateway хранит attachment leases
- delivery через gateway работает стабильно
Перед DHT дать ограниченно работающий discovery-plane.
- static core directory
- bootstrap set config
- attachment lookup через static core map
- mailbox lookup без Kademlia
- app endpoint lookup без Kademlia
Небольшая сеть уже живёт без полноценного DHT
- 10–100 core/gateway nodes can resolve targets through bootstrap directory
- delivery работает на нескольких доменах
Добавить стабильный discovery plane.
- bucket table
FIND_NODEFIND_VALUESTOREDELETE- replication policy
- TTL/republish
- attachment keying
- mailbox keying
- app endpoint keying
- anti-sybil admission hooks using identity policy/PoW base
Core nodes держат DHT, leaf туда не лезут
- attachment/mailbox/app lookup работает через Kademlia
- recovery после выпадения части core узлов не ломает discovery
- DHT integration tests проходят в churn simulation
Ввести local mesh plane без привязки к BLE с первого дня.
LocalLinktraitMeshNeighborProviderMeshForwarderGatewayBridge- simulated local realm backend
- UDP realm backend
- realm-scoped addressing
Можно тестировать mesh behaviour без BLE hardware
- в testnet есть локальные сегменты за gateway
- relay chain внутри realm работает
Подключить настоящие local links.
- BLE transport backend
- Wi-Fi Direct / LAN peer discovery backend
- local advertisement beacons
- duty-cycle aware forwarding
- low-power leaf policy
Реальные mesh-сегменты подключаются к overlay
- leaf без интернета, но с BLE/Wi-Fi-hop path, получает delivery через gateway chain
- есть smoke tests на реальном железе
Повысить производительность, не меняя identity/ownership model.
- RTT probes
- Vivaldi-like optional coordinate subsystem
- neighbor scoring
- preferred gateway ranking
- replica ordering
- route cache
- path diversity
Сеть быстрее, но архитектурно остаётся той же
- median delivery latency падает на benchmark scenarios
- optimization can be switched off without loss of correctness
Добиться компактных записей и bounded resource usage.
- fixed-size structs where possible
- varint/TLV audit
- max frame size enforcement
- zero-copy decode where safe
- compact record formats
- benchmark memory footprint
- benchmark bandwidth overhead
Сеть не распухает на control traffic
- protocol budget documented
- per-frame and per-record size budgets enforced in tests
Сделать сеть живучей под hostile conditions.
- per-role rate limits
- mailbox quotas
- attachment quotas
- identity PoW integration
- replay windows
- invalid frame bans
- reputation hooks
- admission policy for DHT participants
Сеть переживает базовые spam/sybil/resource exhaustion scenarios
- abuse tests показывают bounded degradation
- leaf/gateway/core policies различаются
Сделать сеть управляемой.
- metrics per plane
- admin API per service
- session tracing
- DHT health metrics
- mailbox backlog metrics
- realm/gateway metrics
- structured logs
- debug dump of role state
Сеть можно дебажить не вслепую
- core/gateway/leaf видны в metrics/admin
- можно быстро понять, где сломался delivery/discovery/mesh
Довести overlay от текущего состояния до нового без полной остановки разработки.
- legacy handshake compatibility feature flag
- migration path old runtime → new session/runtime
- config upgrader
- docs rewrite
- deprecation plan for old admin/state assumptions
Переход контролируемый, а не “big bang rewrite”
- старые integration tests либо удалены сознательно, либо завернуты в legacy mode
- новый stack является default
Вывести сеть в реально запускаемое состояние.
- 2-node binary protocol bringup
- leaf ↔ gateway ↔ core messaging
- mailbox offline delivery
- app addressing
- static discovery network
- core-only DHT
- simulated local mesh
- real local transport
- geo-distributed pilot
- large-scale simulation
Не “куча модулей”, а живая сеть
- есть devnet scripts
- есть pilot deployment guide
- есть benchmark harness
Самый рациональный порядок:
- Эпик 0
- Эпик 1
- Эпик 2
- Эпик 3
- Эпик 4
- Эпик 5
- Эпик 6
- Эпик 7
- Эпик 8
- Эпик 9
- Эпик 10
- Эпик 11
- Эпик 12
- Эпик 13
- Эпик 14
- Эпик 15
- Эпик 16
- Эпик 17
Это путь “delivery-first, discovery-later, optimization-last”.
Можно временно ломать:
- текущий JSON-handshake
- текущую модель configured peers as the main networking model
- часть старого runtime/admin assumptions
- старые debug-only session semantics
Нельзя ломать без очень веской причины:
node_id = BLAKE3(pubkey)- transport abstraction layer as foundation
- role/plane separation после утверждения
- принцип “Vivaldi не участвует в ownership”
Это не значит, что на одном этапе будет доказан 10¹²-node deployment.
Это значит, что:
leafсоставляют подавляющее большинствоcore— малая стабильная подсистемаgatewayиmailboxотделяют достижимость от identity- DHT хранит только необходимые control/discovery records
- контрольный трафик не зависит линейно от общего числа устройств
- local mesh не затягивается в global DHT ownership
Именно так архитектура остаётся принципиально масштабируемой.
Для ASlava12/overlay правильная спецификация выглядит так:
стабильный
node_id = BLAKE3(pubkey),node_addr == node_id, собственный бинарный overlay protocol, ролиleaf/core, delivery-first architecture, core-only DHT, local mesh как отдельный plane, Vivaldi только как optimization hint.
Это даёт:
- работающую mixed internet + mesh сеть,
- offline delivery,
- app addressing,
- ремонтопригодную архитектуру,
- путь к очень большому масштабу без концептуально самоубийственных решений.
Следующий самый полезный шаг — перевести это в RFC-style документ для репозитория: docs/rfcs/0001-hybrid-overlay-architecture.md с exact packet formats и milestone checklist.