# Реєстрація домену в мережі I2P

Останнім часом, захопився дослідженням мережі I2P, зокрема:

=> setup-i2pd-with-i2p-network-connection-over-yggdrasil.gmi встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil
=> anonymous-torrents-with-i2psnark-over-i2pd.gmi обміном файлами через технологію BitTorrent
=> http://hc3fycfadz7fkapp62fqi6llioe46fvis6wuswfobl5ghc2u7snq.b32.i2p опублікував в ній сайт спільноти
=> m3u8-stream-proxy-with-ffmpeg-in-icecast.gmi налаштував ретрансляцію радіо eQtv
=> i2p-capsule-in-gemini-space-with-agate.gmi а також успішно інтегрував свій блог, що реалізує протокол Gemini

На цьому, думав завершити свій експеримент з налаштуванням інфраструктури, але довгий час залишалось питання стосовно доменів: усі відомі мені ресурси мали короткі адреси, які я знайшов у списку notbob.i2p, але цей сайт не відображає перманентні B32. Від того, про мої сервіси ніхто окрім мене не знає, від того крутити їх онлайн - сенсу мало. Трохи полиставши документацію, віднайшов деяку інформацію і організував перший домен для одного зі своїх проєктів у списку, що виявилось тривіально просто. Нижче опишу свій скромний досвід, можливо, він стане в нагоді початківцям.

## Набір утиліт i2pd-tools

Для адміністрування доменів I2P, нам знадобиться утиліта i2pd-tools:
=> https://github.com/PurpleI2P/i2pd-tools

В її репозиторії є детальна інструкція:
=> https://github.com/PurpleI2P/i2pd-tools?tab=readme-ov-file#i2pd-tools README.md#i2pd-tools

Збірка з початкового коду, на момент написання матеріалу, виглядає наступним чином:

``` bash
git clone https://github.com/PurpleI2P/i2pd-tools.git && cd i2pd-tools
git submodule init && git submodule update
git submodule update --init
git pull --recurse-submodules
make
```

Розглянемо декілька варіантів реєстрації доменів та відповідні утиліти з набору i2pd-tools.

## Майнинг семантичного префіксу для домена B32

Однією з опцій створення домену - може бути майнинг семантичного префіксу для хешу B32 (актуально для EDDSA-SHA512-ED25519). Цей спосіб вартий уваги до розгляду наступних опцій реєстрації, адже згенерувавши візуально зрозумілий префікс, такий сервіс буде простіше знайти в історії браузеру. До того ж це буде канонічний, перманентний ідентифікатор I2P, що згідно оригінальної парадигми, належатиме тільки вам.

Для цієї мети, в i2pd-tools, використовується утиліта vain:

``` bash
./vain domain -o mydomain.dat
```
* domain - бажаний префікс для адреси типу domain1ad...2u7adq.b32.i2p: чим більша його довжина - тим складнішою буде процедура видобутку
=> https://github.com/PurpleI2P/i2pd-tools?tab=readme-ov-file#time-to-generate-on-a-270ghz-processor README.md#time-to-generate-on-a-270ghz-processor
* mydomain.dat - шлях до файлу, куди буде записано знайдений ключ (тунелю)

Додатково можна вказати:
* -t (--threads) - кількість паралельних потоків для майнингу
* -r (--reg) - якщо потрібно генерувати по регулярному виразу замість статичного рядка

## Централізовані короткі домени

В цілому, класична технологія DNS в мережі I2P відсутня в принципі. Можливо є засоби інтеграції, але вони так чи інакше пов'язані з централізацією. Короткі домени в I2P - є також частково централізованими, але таких "центрів" як мінімум два:
=> http://stats.i2p stats.i2p - від команди роутера Java
=> http://reg.i2p reg.i2p - від команди роутера C++

Працюють вони за іншим принципом, аніж класичні DNS, але при тому так само виконують свою функцію надання семантичних адрес безкоштовно, хоч і з певними умовами стосовно цензури і терміну дії (умов пролонгації).

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

Працює така реєстрація за принципом автоматизованого створення реєстрів hosts.txt (http://reg.i2p/hosts.txt) що по суті являють собою індекс псевдонімів для хешу вашого тунелю (домену B32). Коли додається новий домен, він підписується приватним ключем власника тунелю, перевіряється системою реєстратора і за виконання умов - поширюється між іншими роутерами I2P, що підтримують цього реєстратора.

### Короткий домен другого рівня (2LD) з i2pd-tools/regaddr

Передбачається, що у вас є умовний сайт з ключем тунелю domain.dat, щоб згенерувати для нього підписаний запит на реєстрацію, виконуємо:

``` bash
./regaddr domain.dat domain.i2p > domain.txt
```
* domain.i2p - бажана адреса для domain.dat

### Короткий домен третього рівня (3LD) з i2pd-tools/regaddr_3ld

Тут майже те само що й для 2LD, але нам потрібно підписати піддомен третього рівня ключем власника домену другого рівня. Виконується така операція вже в три кроки, утилітою regaddr_3ld:

``` bash
./regaddr_3ld step1 sub_domain.dat sub.domain.i2p > step1.txt
./regaddr_3ld step2 step1.txt domain.dat domain.i2p > step2.txt
./regaddr_3ld step3 step2.txt sub_domain.dat > step3.txt
```
* sub.domain.i2p - бажана адреса для sub_domain.dat

### Реєстрація

Згенерувавши підписи, переходимо на сайти обраних реєстраторів:

=> http://reg.i2p/add
=> http://stats.i2p/i2p/addkey.html

Якщо ви користуєтесь роутером i2pd і бачите помилку:
> 403 Denied - Inproxy access denied. You must run I2P to access this site
- переключіть ваш роутер в режим проксі HTTP замість SOCKS
=> https://github.com/PurpleI2P/i2pd/issues/507

Заповнюємо форму, вказавши наш вміст файлів domain.txt і step3.txt відповідно до типу домену і слідуємо інструкціям. Звичайно, потрібно почекати декілька днів, поки заявку буде оброблено, а інші роутери мережі оновлять локальні реєстри. Щоб не чекати самому, можна скористатись посиланнями API, що надаються при реєстрації, для миттєвого оновлення вашого локального реєстру.

На прикладі реєстратора stats.i2p, статус домену можна перевірити на сторінці нових хостів:
=> http://stats.i2p/cgi-bin/newhosts.cgi

## Посилання

=> gemini://bbs.geminispace.org/s/I2P/34074 Дискусія на BBS
=> https://devzone.org.ua/post/reyestratsiia-domenu-v-merezi-i2p Веб-версія цього матеріалу з коментарями на DevZone