Перейти до основного вмісту

Чотири інтернети: Reticulum, I2P, Yggdrasil і Nostr поруч

· 12 хв. читання
UR3PKI
Software Engineer

Reticulum, I2P, Yggdrasil і Nostr постійно ставлять в один ряд — і дарма. Це не конкуренти: вони лагодять різні поверхи одного будинку. Один замінює радіо й маршрутизацію, другий ховає, хто з ким говорить, третій роздає адреси, четвертий забирає акаунт у платформ.

500 байтMTU Reticulum. Він живий на каналі 300 біт/с — там, де TCP/IP навіть не стартує
3 + 3Стільки чужих вузлів між клієнтом і сайтом в I2P: його вихідний тунель плюс вхідний тунель сайту
0200::/7Діапазон Yggdrasil. IPv6-адреса тут — відбиток публічного ключа
0Скільки релеї Nostr знають одне про одного. Копії розсилає сам клієнт

Кожен із чотирьох лагодить свою поломку​

Спершу — найкоротша версія, з дитячою аналогією. Далі кожен розібраний окремо, зі схемою, яка показує, що саме відбувається з повідомленням.

коли немає нічого

Reticulum

Повний мережевий стек для поганих каналів: рація, дріт, LoRa. Не потребує ні IP, ні провайдера, ні швидкості.

Записки передають з рук у руки через увесь двір — і ніхто по дорозі не може відкрити конверт.

коли треба сховатися

I2P

Анонімна мережа поверх звичайного інтернету. Ховає не зміст (його ховає будь-який TLS), а хто з ким говорить.

Записку передають через шістьох дітей, і кожен знає лише того, хто дав, і того, кому віддав.

коли треба просто зв'язок

Yggdrasil

Самоорганізована IPv6-мережа. Дає адресу з власного ключа — і всі звичайні програми працюють поверх неї без змін.

Кожному видали власне ім'я, яке неможливо підробити, і двір сам вигадав, як до кожного дійти.

коли дістала платформа

Nostr

Взагалі не мережа, а формат підписаних повідомлень. Ідентичність — ключ, а не акаунт на чужому сервері.

Записку підписують своїм підписом і вішають копії на три дошки. Одну зірвали — решта висять.

Вони не конкуренти — вони на різних поверхах​

Порівнювати Nostr із Reticulum — однаково що порівнювати «Інстаграм» з оптоволокном. Ось що кожен бере на себе, а що позичає в готового інтернету.

що протокол бере на себеносійрадіо, дрітсусідиз ким лінкмаршрутяк знайтихто тиідентичністьшифрe2eапкащо шлешReticulumувесь стек — від радіохвилі до месенджераYggdrasilсусіди, маршрут, адреса з ключа, шифртвої звичайніI2Pанонімний маршрут + шари шифрусвої сайтиNostrключподіїусе це бере в готового інтернетуПунктир = покриває частково. Reticulum — єдиний, хто не спирається на чужу мережу взагалі.
Читати так: чим ширша смуга, тим більше протокол замінює собою. Nostr — «дірявий»: він бере лише ідентичність і формат повідомлення, а доставку цілком лишає звичайному інтернету. Тому Nostr працює всередині Yggdrasil або I2P, а не замість них.

Reticulum​

З 2016 року · Python, Reticulum License · автор Mark Qvist · їде по LoRa, радіо, дроту, TCP

Двір, де немає головного дорослого. У кожного своя печатка, яку не підробиш. Записку кладуть у запечатаний конверт і передають з рук у руки. Якщо адресат пішов додому, конверт чекає в когось у кишені, поки той повернеться.

Reticulum — не «ще один месенджер», а повний мережевий стек, написаний з нуля для каналів, на яких звичайний інтернет просто не заводиться. Він не знає, що таке IP-адреса, порт чи DNS. Жодного центрального реєстру: адресу генерують самі, і ніхто не може її ні видати, ні відібрати.

Адреса (destination) — 16 байт зрізаного SHA-256 від публічного ключа й імені застосунку. Щоб вузол знайшли, він кидає в ефір announce; транзитні вузли запам'ятовують, у який бік до нього йти, і таблиця шляхів будується сама. Шифрування ввімкнути не можна — воно вже ввімкнене й вимкненню не підлягає. Детально — у розборі Reticulum.

одне повідомлення, чотири вузлиТИтелефон+ RNodeсусідпросторетранслюєвузолpropagation node:тримає поштудругбув офлайн —увімкнув рацію~300 біт/счекає, поки адресат офлайнвідкрито тільки тутадреса = 16 байт хешу від публічного ключа:<a4f1c8e0 7b2d9431 5fa6c70e 88d29d2c>жоден вузол по дорозі не має ключа —він бачить лише, кому передати далі
Ключове: вузол-сховище тримає зашифрований конверт, але відкрити його не може. Саме тому 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 кожен учасник сам є роутером і несе чужий трафік — тому власний губиться серед транзитного.

запит іде вгорі, відповідь — унизутвій вихідний тунельвхідний тунель сайтутвій вхідний тунельвихідний тунель сайтуТИсайт.b32.i2pnetDb (розподілена DHT)де зараз вхідні тунелі сайтукільця = шари шифру. кожен вузол знімає рівно свійі бачить лише сусідів — ніколи обидва кінці
Ключове: на один запит витрачається шість чужих вузлів, і кожен тунель живе всього 10 хвилин, після чого будується заново. Саме за це й доводиться платити затримкою.

Що всередині

  • адреса — 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, і публічний ключ.

ключ стає адресою, дерево знаходить дорогуed25519 pub3f9c1d40…c7a17b200:7a1e:9c33:88f1::1одна функція, жодного реєстру: адресу не видають — її обчислюють. підробити = підробити ключпрямий шлях, знайдений у v0.5 — повз корінькорінь дереватидругтвій ноутйого серверпакет лізе вгору по гілкахі спускається до адресатаssh, http, rsync —усе працює як є
Ключове: адреса не прив'язана ні до провайдера, ні до місця. Пристрій переїхав з Wi-Fi на мобільний інтернет — адреса та сама, з'єднання живе далі.

Що всередині

  • адреса — 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 незворотна: «відновити доступ» нема в кого.

клієнт розкладає копії самkind: 1content: "gm"sigТИтвій ключnsec1…relay.damus.ionos.lolrelay.snort.socialзберігаєзберігаєзберігає✕ забанивабо просто впавЧИТАЧподія дійшла ✓релеї не знають одне про одного —між ними немає жодної лініїпідписка йде на ключnpub1qqs…7x2v
Ключове: між релеями немає ані однієї лінії — і це не спрощення схеми, а сам протокол. Саме тому забанити людину в Nostr неможливо: можна забанити лише її копію на своєму сервері.

Що всередині

  • ключі — 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: власного транспорту в нього немає

Одні й ті самі питання — чотири різні відповіді​

питанняReticulumI2PYggdrasilNostr
Що це по сутіПовний мережевий стек з нуляАнонімний оверлей поверх інтернетуОверлейна IPv6-мережаФормат підписаних повідомлень
Адреса: звідки береться16 байт хешу від ключа…q3a.b32.i2p — хеш DestinationIPv6 з 0200::/7, обчислена з ключаnpub1… — публічний ключ
Транспорт: по чому їдеLoRa, радіо, дріт, TCP, UDPNTCP2 / SSU2 поверх інтернетуTCP, TLS, QUIC, WS і мультикаст у локальній мережіWebSocket поверх звичайного HTTPS
Без інтернету: сценарій «усе впало»так — радіо самодостатнєнілише в локальній мережіні
Ховає, хто з ким: метаданічастково — хеші видно транзитутак, це і є метані — сусіди бачать IP і ключні — релей бачить усе
Шифрування: чи є вимикачЗавжди, вимикача немаєШарами, на кожному хопіНаскрізне між ключами кінцівПідпис — завжди; шифрування — лише в приватних
Доставка офлайн: адресата немає в мережітак — propagation node тримаєнінітак — релей тримає подію
Звичайні програми: ssh, http, rsyncні — треба писати під RNSчерез тунелі й проксітак — це просто IPv6ні — свої клієнти
Швидкість: чого чекатиКілобайти. Текст і дрібні файлиСотні мс затримки, скромна смугаМайже як звичайний інтернетЯк звичайний WebSocket
Головний біль: чим платятьПотрібне залізо, застосунків малоПовільно, роутер розганяється 10–20 хвУчасника видно; швидкість залежить від чужих вузлівВтратив ключ — втратив особистість
Коли це вибірГори, село, аварія, радіоаматорствоТреба, щоб ніхто не знав, хто з ким говоривЗшити свої й дружні пристрої в одну мережуЗабрати свою аудиторію в платформ

Ніхто не виграє за всіма трьома осями — і це не випадковість​

Анонімність купується затримкою, автономність — швидкістю, зручність — залежністю від чужої інфраструктури. Кожен із чотирьох свідомо обрав, чим платити.

МАЛОБАГАТОВиживе без інтернетусвоє радіо, свої адресиNostrI2PYggdrasilReticulumХоває, хто з ким говоритьне зміст, а метаданіYggdrasilNostrReticulumI2PШвидкість і зручністьчи працюють звичні речіReticulumI2PYggdrasilNostr

Оцінки якісні, не виміряні: вони показують напрямок компромісу, а не бенчмарк. Найцікавіше тут те, що жодна точка не стоїть праворуч на всіх трьох шкалах.

Вони складаються один в одного​

Оскільки кожен займає свій поверх, обирати «або-або» не треба. Ось три комбінації, які реально працюють, і одна, яка не поїде.

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 — лише один із носіїв