Поднимаем сайт в сети .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.

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


ссылка на оригинал статьи https://habr.com/ru/articles/848750/