Чотири інтернети: Reticulum, I2P, Yggdrasil і Nostr поруч
Reticulum, I2P, Yggdrasil і Nostr постійно ставлять в один ряд — і дарма. Це не конкуренти: вони лагодять різні поверхи одного будинку. Один замінює радіо й маршрутизацію, другий ховає, хто з ким говорить, третій роздає адреси, четвертий забирає акаунт у платформ.
Кожен із чотирьох лагодить свою поломку
Спершу — найкоротша версія, з дитячою аналогією. Далі кожен розібраний окремо, зі схемою, яка показує, що саме відбувається з повідомленням.
коли немає нічого
Reticulum
Повний мережевий стек для поганих каналів: рація, дріт, LoRa. Не потребує ні IP, ні провайдера, ні швидкості.
Записки передають з рук у руки через увесь двір — і ніхто по дорозі не може відкрити конверт.
коли треба сховатися
I2P
Анонімна мережа поверх звичайного інтернету. Ховає не зміст (його ховає будь-який TLS), а хто з ким говорить.
Записку передають через шістьох дітей, і кожен знає лише того, хто дав, і того, кому віддав.
коли треба просто зв'язок
Yggdrasil
Самоорганізована IPv6-мережа. Дає адресу з власного ключа — і всі звичайні програми працюють поверх неї без змін.
Кожному видали власне ім'я, яке неможливо підробити, і двір сам вигадав, як до кожного дійти.
коли дістала платформа
Nostr
Взагалі не мережа, а формат підписаних повідомлень. Ідентичність — ключ, а не акаунт на чужому сервері.
Записку підписують своїм підписом і вішають копії на три дошки. Одну зірвали — решта висять.
Вони не конкуренти — вони на різних поверхах
Порівнювати Nostr із Reticulum — однаково що порівнювати «Інстаграм» з оптоволокном. Ось що кожен бере на себе, а що позичає в готового інтернету.
Reticulum
З 2016 року · Python, Reticulum License · автор Mark Qvist · їде по LoRa, радіо, дроту, TCP
Двір, де немає головного дорослого. У кожного своя печатка, яку не підробиш. Записку кладуть у запечатаний конверт і передають з рук у руки. Якщо адресат пішов додому, конверт чекає в когось у кишені, поки той повернеться.
Reticulum — не «ще один месенджер», а повний мережевий стек, написаний з нуля для каналів, на яких звичайний інтернет просто не заводиться. Він не знає, що таке IP-адреса, порт чи DNS. Жодного центрального реєстру: адресу генерують самі, і ніхто не може її ні видати, ні відібрати.
Адреса (destination) — 16 байт зрізаного SHA-256 від публічного ключа й імені застосунку. Щоб вузол знайшли, він кидає в ефір announce; транзитні вузли запам'ятовують, у який бік до нього йти, і таблиця шляхів будується сама. Шифрування ввімкнути не можна — воно вже ввімкнене й вимкненню не підлягає. Детально — у розборі Reticulum.
Що всередині
- адреса — 16 байт (128 біт) зрізаного SHA-256 від ключа й імені застосунку
- крипто — X25519 для обміну, Ed25519 для підписів, AES-256-CBC + HMAC-SHA256; на лінках — ефемерні ключі, тобто forward secrecy
- MTU — 500 байт: не недогляд, а дизайн, усе має пролізти в кадр LoRa
- носій — LoRa (RNode), packet radio / AX.25, серійний кабель, TCP, UDP — і навіть I2P
- офлайн — LXMF і propagation nodes: пошта чекає адресата
- застосунки — Sideband (месенджер), MeshChat, Nomad Network (щось на кшталт BBS)
Плюси й мінуси
- ✓ Єдиний із чотирьох, хто виживе, коли інтернету немає взагалі
- ✓ Шифрування не має вимикача — «відкритого режиму» просто не існує
- ✓ Адресу не треба ні в кого просити: згенерував ключ — маєш адресу
- ✕ Не анонімний: транзитні вузли бачать хеш призначення, а announce узагалі публічний
- ✕ Швидкість — кілобайти. Фото ще доїде, відео — ні
- ✕ Для справжньої автономності потрібне залізо: RNode на LoRa
- ✕ Екосистема маленька, багато чого доводиться робити руками
I2P
З 2003 року · Java-роутер і i2pd на C++ · часникова маршрутизація · мережа в собі
Записку передають через шістьох дітей, і кожен знає лише двох: хто дав і кому віддати. А відповідь іде зовсім іншою дорогою. Ніхто, навіть якщо підгляне, не складе картинку «цей писав цьому».
I2P ховає не зміст — зміст ховає будь-який TLS. Він ховає метадані: хто з ким, коли й скільки. Досягається це двома трюками. Перший — шари шифру: повідомлення загорнуте так, що кожен наступний вузол знімає лише свій шар і бачить рівно одну адресу — наступного. Другий — односторонні тунелі: запит іде одним ланцюжком, а відповідь повертається іншим, тож навіть той, хто бачить обидва кінці, не зшиє їх разом.
Найчастіше I2P плутають із Tor. Різниця в меті: Tor заточений виходити у звичайний веб (і має для цього централізовані directory authorities), а I2P — самодостатня мережа всередині себе: сайти .i2p, торенти, пошта, IRC. Виходи назовні (outproxy) тут рідкість і не є задумом. І ще: у Tor є окремі relay-вузли, а в I2P кожен учасник сам є роутером і несе чужий трафік — тому власний губиться серед транзитного.
Що всередині
- адреса — Destination (387+ байт, у base64 — 516 символів), назовні — короткий хеш у base32:
ukeu3k5o…q3a.b32.i2p. DNS немає, людські імена дають підписні адресні книги - тунель — односторонній, 3 хопи за замовчуванням, перебудовується кожні 10 хвилин
- каталог — netDb, Kademlia-подібна DHT: RouterInfo (де роутери) і LeaseSet (де зараз вхідні тунелі адресата)
- транспорт — NTCP2 (TCP) і SSU2 (UDP), обидва зашифровані й обфусковані
- часник — кілька повідомлень («зубчиків») пакуються в один шифрований garlic-конверт
- застосунки — eepsites, i2psnark (торенти), пошта, IRC — усе всередині мережі
Плюси й мінуси
- ✓ Найсильніше з чотирьох ховає метадані: хто з ким і коли
- ✓ Немає централізованих довідників — каталог тримає вся мережа разом
- ✓ Кожен несе чужий трафік, тож власний не стирчить
- ✕ Повільний: сотні мілісекунд затримки, скромна смуга
- ✕ Перші 10–20 хвилин після старту роутер «розганяється» і майже нічого не тягне
- ✕ Анонімність легко зламати самому: досить увійти у свій звичайний акаунт
- ✕ Потребує звичайного інтернету — на голому радіо не поїде
Yggdrasil
З 2017 року · Go · світове дерево з IPv6 · звичайні програми працюють без змін
Кожному видали власне ім'я, яке неможливо підробити — воно виросло просто з ключа. А двір сам, без вихователя, домовився, як до кожного дійти: намалював дерево стежок і тримає його в голові.
Yggdrasil розв'язує найнудніше й найважливіше питання: як знайти одне одного, коли немає провайдера, NAT, білих IP і адміністратора, який роздає адреси. Відповідь — адреса і є ключ. Ed25519-ключ проганяють через перетворення й отримують IPv6-адресу з діапазону 0200::/7. Ніхто її не видавав і ніхто не відбере.
Далі мережа сама будує з усіх учасників дерево (spanning tree) і вміє знайти дорогу до будь-якої адреси, а з версії 0.5 ще й шукає коротші прямі шляхи замість того, щоб ганяти все через корінь. Сусіди знаходяться автоматично мультикастом у локальній мережі або прописуються вручну — публічні вузли через TCP, TLS, QUIC.
Головна практична цінність: у системі просто з'являється мережевий інтерфейс. ssh, http, Syncthing, домашній NAS — усе це працює поверх Yggdrasil без жодних змін, ніби на кожному пристрої білий IP. Але це не анонімність: сусіди бачать і справжній IP, і публічний ключ.
Що всередині
- адреса — IPv6 з
0200::/7, обчислена з Ed25519-ключа; на підмережу видається/64з0300::/8 - маршрут — глобальне дерево (spanning tree) плюс пошук шляху; з v0.5 — прямі маршрути повз корінь
- сусіди — автопошук мультикастом у локальній мережі або ручний пірінг: TCP, TLS, QUIC, WebSocket
- шифр — наскрізний між кінцевими ключами; транзитний вузол несе, але не читає
- інтерфейс — звичайний
tunу системі: усі програми бачать просто IPv6 - керування —
yggdrasilctl getSelf,getPeers
Плюси й мінуси
- ✓ Нічого не треба переписувати: усі наявні програми працюють одразу
- ✓ Адреса вічна й власна — ні NAT, ні зміна провайдера її не рухають
- ✓ Найпростіший спосіб «зшити» свої пристрої й пристрої друзів в одну мережу
- ✕ Зовсім не анонімний: сусіди бачать IP і ключ
- ✕ Трафік їде через чужі добровільні вузли — швидкість залежить від них
- ✕ Потрібен хоча б один сусід зі зв'язністю; сам по собі вузол нікуди не дійде
- ✕ Мережа ще молода, маршрутизація у великих масштабах — відкрите питання
Nostr
З 2020 року · «Notes and Other Stuff Transmitted by Relays» · автор fiatjaf · WebSocket і JSON
Записку підписують власним підписом, який не підробиш, і вішають копії на три дошки оголошень. Одну дошку прибрали — записка висить на двох інших, і всі, хто знає підпис, її знайдуть.
Nostr — найпростіший із чотирьох і єдиний, хто взагалі не є мережею. Він їде по звичайному інтернету, звичайним WebSocket. Усе, що він вигадав, — два правила. Перше: особистість — це пара ключів secp256k1, а не рядок у чиїйсь базі. Друге: повідомлення («подія») — це JSON із полями kind, content, tags, підписаний цим ключем; його id — SHA-256 від нього самого.
Релеї — навмисно тупі сервери: прийняти, зберегти, віддати за фільтром. Вони не спілкуються між собою — копії по кількох релеях розкладає сам клієнт. Звідси вся магія: якщо релей забанив, береться інший, і підписники нікуди не діваються, бо вони підписані на ключ, а не на акаунт на сервері.
За це теж є ціна. Релей бачить IP і всі події — анонімності тут нуль (хіба що поверх Tor). Спам стримують лише політикою релея, платними релеями й мережею довіри. А втрата приватного ключа nsec незворотна: «відновити доступ» нема в кого.
Що всередині
- ключі — secp256k1; публічний —
npub1…, приватний —nsec1…(кодування bech32, NIP-19) - подія —
{id, pubkey, created_at, kind, tags, content, sig};id— SHA-256 від канонічної форми, підпис — Schnorr (BIP-340) - види —
0профіль,1допис,3підписки,7реакція,30023лонгрід - релей — WebSocket-сервер на три основні команди:
EVENT,REQ,CLOSE - приватні — старі DM (kind 4) світять метаданими; сучасні — NIP-17 поверх шифрування NIP-44
- гроші — zaps через Lightning (NIP-57): чайові прямо в стрічці
Плюси й мінуси
- ✓ Ідентичність не належить платформі: підписники прив'язані до ключа
- ✓ Релей піднімається за п'ять хвилин, клієнтів десятки
- ✓ Швидко й звично — це ж просто WebSocket поверх звичайного інтернету
- ✕ Анонімності нуль: релей бачить IP і все написане
- ✕ Втратив
nsec— втратив особистість назавжди, відновлювати нема в кого - ✕ Спам стримують лише політика релея, платні релеї й мережа довіри
- ✕ Помер інтернет — помер і Nostr: власного транспорту в нього немає
Одні й ті самі питання — чотири різні відповіді
| питання | Reticulum | I2P | Yggdrasil | Nostr |
|---|---|---|---|---|
| Що це по суті | Повний мережевий стек з нуля | Анонімний оверлей поверх інтернету | Оверлейна IPv6-мережа | Формат підписаних повідомлень |
| Адреса: звідки береться | 16 байт хешу від ключа | …q3a.b32.i2p — хеш Destination | IPv6 з 0200::/7, обчислена з ключа | npub1… — публічний ключ |
| Транспорт: по чому їде | LoRa, радіо, дріт, TCP, UDP | NTCP2 / SSU2 поверх інтернету | TCP, TLS, QUIC, WS і мультикаст у локальній мережі | WebSocket поверх звичайного HTTPS |
| Без інтернету: сценарій «усе впало» | так — радіо самодостатнє | ні | лише в локальній мережі | ні |
| Ховає, хто з ким: метадані | частково — хеші видно транзиту | так, це і є мета | ні — сусіди бачать IP і ключ | ні — релей бачить усе |
| Шифрування: чи є вимикач | Завжди, вимикача немає | Шарами, на кожному хопі | Наскрізне між ключами кінців | Підпис — завжди; шифрування — лише в приватних |
| Доставка офлайн: адресата немає в мережі | так — propagation node тримає | ні | ні | так — релей тримає подію |
| Звичайні програми: ssh, http, rsync | ні — треба писати під RNS | через тунелі й проксі | так — це просто IPv6 | ні — свої клієнти |
| Швидкість: чого чекати | Кілобайти. Текст і дрібні файли | Сотні мс затримки, скромна смуга | Майже як звичайний інтернет | Як звичайний WebSocket |
| Головний біль: чим платять | Потрібне залізо, застосунків мало | Повільно, роутер розганяється 10–20 хв | Учасника видно; швидкість залежить від чужих вузлів | Втратив ключ — втратив особистість |
| Коли це вибір | Гори, село, аварія, радіоаматорство | Треба, щоб ніхто не знав, хто з ким говорив | Зшити свої й дружні пристрої в одну мережу | Забрати свою аудиторію в платформ |
Ніхто не виграє за всіма трьома осями — і це не випадковість
Анонімність купується затримкою, автономність — швидкістю, зручність — залежністю від чужої інфраструктури. Кожен із чотирьох свідомо обрав, чим платити.
Оцінки якісні, не виміряні: вони показують напрямок компромісу, а не бенчмарк. Найцікавіше тут те, що жодна точка не стоїть праворуч на всіх трьох шкалах.
Вони складаються один в одного
Оскільки кожен займає свій поверх, обирати «або-або» не треба. Ось три комбінації, які реально працюють, і одна, яка не поїде.
Reticulum → поверх I2P
Серед носіїв Reticulum є інтерфейс I2P. Тобто радіостек можна пустити анонімним тунелем, поки інтернет ще є: виходить і незалежна адресація, і приховані метадані. А коли інтернет зникне, той самий стек переходить на радіо — і адреса лишається тією ж.
Nostr-релей → усередині Yggdrasil або I2P
Релею не потрібні ні білий IP, ні домен, ні сертифікат: він живе на Yggdrasil-адресі або як .b32.i2p. Блокувати просто нема чого — немає ні IP, ні DNS-запису, які можна внести в список.
Yggdrasil → поверх будь-чого
Yggdrasil байдуже, яким дротом приїхали до сусіда: TCP, TLS, QUIC, WebSocket — а отже й через Tor чи I2P. Мережа бачить лише «є лінк до сусіда», а що під ним — її не обходить.
IPv6 (тобто Yggdrasil) поверх Reticulum. IPv6 за стандартом вимагає MTU щонайменше 1280 байт, а в Reticulum він 500. Це не питання налаштувань, а різні світи: один рахує байти, другий припускає, що кадр великий.
Кожен пробується за вечір
Reticulum
# сам стек
pip install rns
rnsd
# месенджер: Sideband
# (Android / iOS / десктоп)
# для радіо потрібен RNode
Детальний запуск — у розборі Reticulum.
I2P
apt install i2pd
# консоль i2pd: http://127.0.0.1:7070
# Java-роутер: http://127.0.0.1:7657
# дати йому 15 хвилин розігрітися
Yggdrasil
# пакет із репозиторію проєкту;
# конфіг з'явиться сам: /etc/yggdrasil.conf
apt install yggdrasil
# вписати публічний пір у Peers, потім:
systemctl restart yggdrasil
yggdrasilctl getSelf # тут власна IPv6
Nostr
# ставити нічого не треба:
# Damus — iOS
# Amethyst — Android
# snort.social — веб
# nsec1… — одразу в менеджер паролів
- LoRa зблизька — фізичний рівень: чирп, spreading factor, час в ефірі, дальність
- Meshtastic зблизька — готовий чат на «сирій» LoRa: керований флуд, канали, ролі вузлів
- Reticulum зблизька — мережевий стек, де адреса — це ключ, а LoRa — лише один із носіїв
