Поднимаем сайт в сети .ton и разбираемся с работой TON DNS

Многие,  наверное,  слышали о криптовалюте TON. Как у многих существующих криптовалют,  у неё есть достаточно обширная инфраструктура,  один аспект из которой — поднятие сайтов в сети .ton,  о чём я сегодня и хочу рассказать.

Нафига, а главное зачем?

Кто знаком с сайтами .onion?  Если вкратце,  это сайты в сети TOR,  из плюсов у которых — заявляемая невозможность отследить ни заходящего (посетителя) ни раздающего (сервер). Но у них есть 3 больших проблемы:

  1. Сложность с заходом. Обычному пользователю придётся установить браузер TOR, запустить его, (в случае захода из РФ) подключиться к relay и много других танцев с бубном, что для обычного обывателя непосильная задача

  2. Скорость работы. Поскольку весь трафик идёт через 4 других ноды, а их количество ограничено и геолокация разбросана по всему миру, добиться нормального подключения бывает достаточно сложно.

  3. Нечитабельные домены. В обычном интернете я могу вбить habr.com в любом браузере на любом устройсте и мне откроется сайт хабра. В случае же onion сети запомнить 57 случайных символов не представляется возможным

Как дела с этим обстоят в сети TON

Тон тоже является похожей децентрализованной сетью, но там с этим дела обстоят в разы лучше:

  • Для того чтобы открыть домен, не обязательно скачивать никакие дополнительные программы — достаточно открыть его в telegram (можно переслать себе в личном сообщении и кликнуть), который есть практически у каждого пользователя.

  • Чтобы открыть сайт из браузера можно добавить в конец домена .sc или .run (например,  foundation.ton.sc). Обратите внимание, что GoodByeDPI/РКН/Другие гады по неизвестной причине у некоторых блокируют доступ к этим доменам.

  • Не обязательно запоминать длинный нечитабельный публичный ключ, как это происходит в случае .onion сетей. Для любого ADNL адреса (читать — IP в сети TON) можно создать читабельный домен в .ton и привязать его к сайту.

Теория

Запихнул её под спойлеры;  если ваша цель — поднятие сайта,  то можно не вникать.

Принцип работы DNS

DNS в тоне «децентрализованный»,  и базируется на смарт-контрактах.

Для простоты давайте представим «смарт-контракт»,  как class с данными,  гетерами и сетерами.

  • Гетеры у любого смарт-контракта любой желающий может вызывать условно-бесплатно в случае своей ноды, в случае использования API накладываются rate limit’ы самого API.

  • За хранение данных (в том числе кода самого контракта) и вызывания сетеров (посылание сообщений) блокчейн берет комиссию, которые в нашем случае не будут превышать в сумме 0.1$.

Алгоритм поиска записи в DNS

Теперь представим ситуацию,  что нам нужно сделать resolve домену first.alice.ton (узнать,  какой тоновский IP у этого домена).

Алгоритм состоит из нескольких шагов:

  1. Перевод домена в машинно-читаемый вид. Если вкратце, то происходит '\0' + string.split('.').reverse().join('\0') + '\0' — строка разбивается по точке, элементы переворачиваются и объединяются знаком \0, в конец добавляется \0 и в начало (по желанию) тоже может добавляться \0.

    Тем самым наш домен превращается в \0ton\0alice\0first\0.

  2. Запрос на resolve посылается на главный смарт-контакт,  ссылка на который записана в настройках блокчейна, у которого вызывается getter dnsresolve с 2 мя параметрами: доменом и типом записи (об этом чуть позже).

  3. Этот смарт контракт «откусывает» начальную часть домена (\0ton) и посылает наш запрос на смарт-контракт, отвечающий за доменную зону .ton.

  4. Посылается запрос на смарт-контракт, отвечающий за доменную зону .ton, но ему передается уже откусанный домен \0alice\0first\0.

  5. Этот смарт-контракт также «откусывает» свою часть домена — \0alice и посылает запрос на смарт-контракт, отвечающий за домен .alice

  6. Процесс повторяется до тех пор, пока какой-нибудь конракт не выплюнет нам тоновский IP или же не случится ошибка (домена или не существует; или запись не найдена).

Типы записей

В DNS TON на данный момент есть 4 типа записей (в теории, туда можно записать что угодно, т.к. они хранятся в словаре):

  • site — запись, которая содержит тоновский IP сайта (или адрес в сети TON Storage для статических сайтов, но ради простоты мы не будем рассматривать данную категорию тут)

  • storage — запись на децентрализованное хранилище TON Storage, которое может использоваться для хранения файлов

  • wallet — запись на кошелек в сети TON, для привязки кошелька читаемому домену (например, домен zero-address.ton ведет к кошельку с нулевым адресом)

  • dns_next_resolver — «ссылка» на другой смарт-контракт, на который будет перенаправляться запрос.

В случае поднятия сайта,  нас интересует только тип site.

Принцип работы «тоновских IP» — ADNL адресов

Заместо IP для обращения к сайту используются ADNL адреса. Для простоты можно считать,  что ADNL адрес — это публичный ключ,  который генерируется на основе приватного (методы очень схожи с .onion адресами).

Любой узел в сети TON,  имея приватный ключ N,  может выдать себя за ADNL адрес A,  который соответствует этому приватному ключу.

Для подключения к сети (именно для публикации своего ADNL адреса,  для того,  для того,  чтобы на них ходить,  таких танцев с бубнами не нужно) нужно иметь белый IP,  хотя бы 1 любой открытый порт и «соединиться» с одной из нод,  уже находящихся в сети. Подробнее о протоколе читайте тут.

Все запросы идут по http,  т.к. весь трафик и так уже шифруется с помощью магии протокола ADNL.

Практика

Для поднятия сайта,  необходимо сделать несколько шагов:

  1. Покупка домена (в тоне они реализованы в виде NFT — т.е. до тех пор, пока вы им владеете, домен ваш)

  2. Поднятие сайта на традиционном http сервере

  3. Поднятие тон-прокси, для проксирования запросов на ваш сайт из сети тон.

  4. Создание записей в DNS TON

    1. Создание записи для главного домена

    2. Создание смарт-контракта для поддоменов, и создание записей там

0. Создание кошелька и покупка тонов

Для работы в сети тон необходимо иметь некадастриальный криптокошелек,  поддерживающий tonconnect. Для новичков советую скачать TonKeeper и пополнить его на 1.5 тон — этого должно хватить для запуска 1 го сайта

Покупка домена

  1. Переходим на сайт dns.ton.org

  2. Вводим интересующий нас домен (например,  thisismysite.ton).

    Обратите внимание,  чем больше символов в домене,  тем меньше они стоят. За 4х сивольные домены придётся выложить 100 TON (по текущему курсу ~ 600$),  за 5 — 50,  6 — 40,  7 — 30,  8 — 20,  9 — 10,  10 — 5,  11 и больше — 1 TON.

  3. Нажимаем на кнопку «Place bid to start auction», и ждём 1 час, пока домен не купится.

    В теории,  кто-то может перебить вашу ставку своей,  но на практике я ни разу с таким не сталкивался.

  4. Пока домен покупается переходим к следующему шагу

Поднятие сайта локально

Тут вы не ограничены в средствах — можете использовать любой фреймворк,  я люблю поднимать nginx на 127.0.0.1,  дабы никто извне не смог до него достучаться.

Поднимать можно на любом порту.

Создание конфига

Дальше необходимо сконфигурировать config.json файл с настройками. Для этого устанавливаем Ton reverse proxy:

wget https://github.com/ton-utils/reverse-proxy/releases/latest/download/tonutils-reverse-proxy-linux-amd64
chmod +x tonutils-reverse-proxy-linux-amd64

(бинари под mac/windows в репозитории так же присутствуют)

И запускаем его из консоли:

./tonutils-reverse-proxy-linux-amd64

Он создаст файл config.json в текущей директории,  выглядящий примерно так:

{
   "proxy_pass": "http://127.0.0.1:3000/", 
   "private_key": "Z+string=", 
   "external_ip": "1.2.3.4", 
   "listen_ip": "0.0.0.0", 
   "network_config_url": "https://ton.org/global.config.json", 
   "port": 11706
}

Там необходимо поменять:

  • proxy_pass — адрес вашего сервера, куда будет проксироваться трафик (в моем случае http://127.0.0.1:80/)

  • external_ip — белый IP, по умолчанию он будет равен IP вашего устройства (не забудьте поменять, если будете запускать на внешнем сервере)

  • port — порт, на котором будет слушать прокси. Можно указать любой, но необходимо пробросить его в firewall, и убедиться, что он доступен извне по вашему IP.

Создание DNS записей

Ещё раз запускаем tonutils-reverse-proxy с уже настроенным config.json и смотрим на то,  что нам выдала программа (пример output’а):

2024/09/25 17:15:24 Tonutils Reverse Proxy v0.3.3, build: 74841a4-2024-08-01
2024/09/25 17:15:25 Server's ADNL address is blablabla.adnl (214b9d44cf37e995dc9b50c4c3ae1bbd1eea8ee4a9912c2d12c3c491f22de982)
2024/09/25 17:15:25 Starting server on blablabla.adnl

Вот это значение в скобочках 214b9d44cf37e995dc9b50c4c3ae1bbd1eea8ee4a9912c2d12c3c491f22de982 — ваш ADNL адрес,  сгенерированный на основе private_key из config.json. Его необходимо будет использовать в записи site для вашего домена.

К сожалению,  на данный момент не существует «официального» способа для адекватного менеджмента поддоменов (dns.ton.org не считаем — он жрёт в 5 раз больше комиссий,  чем можно,  и не позволяет создавать поддомены) — в официальной документации предлагается куча кода смарт-контрактов (хотите поддомены — пишите свой смарт-контракт) и ссылка на стандарт,  поддающийся пониманию только в случае наличия 2-х высших образований и 48 часов свободного времени (утрирую,  но не сильно).

Поэтому я написал свой менеджер поддоменов — он сам является сайтом в сети тон,  расположенном на домене howtorunsite.ton (а также testnet.howtorunsite.ton),  весь source код в открытом доступе,  и в данной статье буду рассматривать его,  хотя при желании,  вполне можно написать свой вариант решения проблемы.

Прошу обратить внимание,  что моё решение поддерживает поддомены до 32 символов длиной (abra.babra.cadabra.ton) — длина каждой части между точками не должна превышать 256 бит (uint256)

Куда кого и как

  1. Переходим на сайт менеджера поддоменов (в случае тестнета добавляем testnet. перед доменом)

  2. Нажимаем на аватарку сверху слева и привязываем кошелек, сканируя QR код.

  3. Вводим свой домен и попадаем на страницу менеджмента поддомена 

    howtorunsiteton

    Интерфейс редактирования DNS для сайта howtorunsite.ton

  4. В поле TON Site вставляем ADNL адрес, который мы получили выше

  5. Нажимаем на кнопку Save и подтверждаем транзакцию

  6. Ждём 1–2 минуты, пока транзакция пройдет в блокчейне

  7. Пытаемся зайти на сайт по адресу http://yourdomain.ton через телеграм, или используем какое-нибудь прокси для обычного интернета (например, добавляя .run или .sc в конце)

А как же обещанные поддомены?

  1. Нажимаем на кнопку «Create subdomains contract» (или Reset subdomains contract, если он уже задан), и подтверждаем транзакцию.

  2. Ждём 1–2 минуты, пока транзакция пройдет в блокчейне (возможно, потребуется перезагрузка страницы)

  3. Нажимаем на кнопку «Add subdomain» и вводим имя поддомена (без точек) и значение TON SITE (ADNL адрес, если захотим, можем поднять поддомен на другом адресе — всё как в обычном DNS). В случае отсутствия у поддомена хотя бы 1 записи (wallet, site, storage, next_dns_resolver), он автоматически «почистится», так что не забываем сразу вписать хотя бы одно значение.

  4. Нажимаем на кнопку «Save» и подтверждаем транзакцию

Для создания поддомена у поддомена (second.first.alice.ton) необходимо повторить аналогичные шаги 8–11 рекурсивно для созданного поддомена

Для примера конфигурации можете посмотреть на конфигурацию сайта howtorunsite.ton (удалить или изменить можете не пытаться — это сделать может только владелец домена).

Если что,  все подробные инструкции есть снизу страницы.

Заключение

Сайты в сети .ton только не давно были придуманы,  и пока вообще не понятно,  что ожидает их в будущем. Возможно,  эта технология исчезнет,  но также не исключено, что через 5–10 лет обычные сайты канут в лету (шутка).

Стоит ли сейчас полностью отказываться от обычных сайтов и переходить на .ton?

Если Ваш проект не зависит напрямую от TON,  то ответ — нет. Сеть ещё не сталкивалась ни с ДДОС атаками,  ни с нормальным наплывом пользователей (а если вспоминать самый производительный в мире блокчейн тон,  который в моменты наплава пользователей ложился под нагрузкой, то перспективы не лучшие),  ни с другими трудностями,  так что лучше убедиться в её стабильности перед тем,  как полностью туда мигрировать.

Стоит ли их вообще поднимать?

Да,  как минимум концепция интересная. У .ton много преимуществ — они не подвластны регуляторам ввиду децентрализованности сети (как минимум,  так утверждается,  хотя в теории,  ваш смарт-контракт с доменом могут заморозить валидаторы,  так что совсем незаконный контент я бы поднимать там не стал);  у них децентрализованный DNS и интеграция с блокчейном TON.

В общем,  жду вашего мнения в комментариях,  а у меня всё.

© Habrahabr.ru