Pull to refresh

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

Level of difficultyEasy
Reading time9 min
Views6K

Многие, наверное, слышали о криптовалюте 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.

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

Tags:
Hubs:
Total votes 8: ↑8 and ↓0+11
Comments17

Articles