Поднимаем сайт в сети .ton и разбираемся с работой TON DNS
Многие, наверное, слышали о криптовалюте TON. Как у многих существующих криптовалют, у неё есть достаточно обширная инфраструктура, один аспект из которой — поднятие сайтов в сети .ton, о чём я сегодня и хочу рассказать.
Нафига, а главное зачем?
Кто знаком с сайтами .onion? Если вкратце, это сайты в сети TOR, из плюсов у которых — заявляемая невозможность отследить ни заходящего (посетителя) ни раздающего (сервер). Но у них есть 3 больших проблемы:
Сложность с заходом. Обычному пользователю придётся установить браузер TOR, запустить его, (в случае захода из РФ) подключиться к relay и много других танцев с бубном, что для обычного обывателя непосильная задача
Скорость работы. Поскольку весь трафик идёт через 4 других ноды, а их количество ограничено и геолокация разбросана по всему миру, добиться нормального подключения бывает достаточно сложно.
Нечитабельные домены. В обычном интернете я могу вбить 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 у этого домена).
Алгоритм состоит из нескольких шагов:
Перевод домена в машинно-читаемый вид. Если вкратце, то происходит
'\0' + string.split('.').reverse().join('\0') + '\0'
— строка разбивается по точке, элементы переворачиваются и объединяются знаком\0
, в конец добавляется\0
и в начало (по желанию) тоже может добавляться\0
.Тем самым наш домен превращается в
\0ton\0alice\0first\0
.Запрос на resolve посылается на главный смарт-контакт, ссылка на который записана в настройках блокчейна, у которого вызывается getter
dnsresolve
с 2 мя параметрами: доменом и типом записи (об этом чуть позже).Этот смарт контракт «откусывает» начальную часть домена (
\0ton
) и посылает наш запрос на смарт-контракт, отвечающий за доменную зону.ton
.Посылается запрос на смарт-контракт, отвечающий за доменную зону
.ton
, но ему передается уже откусанный домен\0alice\0first\0
.Этот смарт-контракт также «откусывает» свою часть домена —
\0alice
и посылает запрос на смарт-контракт, отвечающий за домен.alice
Процесс повторяется до тех пор, пока какой-нибудь конракт не выплюнет нам тоновский 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.
Практика
Для поднятия сайта, необходимо сделать несколько шагов:
Покупка домена (в тоне они реализованы в виде
NFT
— т.е. до тех пор, пока вы им владеете, домен ваш)Поднятие сайта на традиционном
http
сервереПоднятие тон-прокси, для проксирования запросов на ваш сайт из сети тон.
Создание записей в DNS TON
Создание записи для главного домена
Создание смарт-контракта для поддоменов, и создание записей там
0. Создание кошелька и покупка тонов
Для работы в сети тон необходимо иметь некадастриальный криптокошелек, поддерживающий tonconnect
. Для новичков советую скачать TonKeeper и пополнить его на 1.5
тон — этого должно хватить для запуска 1 го сайта
Покупка домена
Переходим на сайт dns.ton.org
Вводим интересующий нас домен (например,
thisismysite.ton
).Обратите внимание, чем больше символов в домене, тем меньше они стоят. За 4х сивольные домены придётся выложить 100 TON (по текущему курсу ~ 600$), за 5 — 50, 6 — 40, 7 — 30, 8 — 20, 9 — 10, 10 — 5, 11 и больше — 1 TON.
Нажимаем на кнопку «Place bid to start auction», и ждём 1 час, пока домен не купится.
В теории, кто-то может перебить вашу ставку своей, но на практике я ни разу с таким не сталкивался.
Пока домен покупается переходим к следующему шагу
Поднятие сайта локально
Тут вы не ограничены в средствах — можете использовать любой фреймворк, я люблю поднимать 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)
Куда кого и как
Переходим на сайт менеджера поддоменов (в случае тестнета добавляем testnet. перед доменом)
Нажимаем на аватарку сверху слева и привязываем кошелек, сканируя QR код.
Вводим свой домен и попадаем на страницу менеджмента поддомена
Интерфейс редактирования DNS для сайта howtorunsite.ton
В поле
TON Site
вставляем ADNL адрес, который мы получили вышеНажимаем на кнопку
Save
и подтверждаем транзакциюЖдём 1–2 минуты, пока транзакция пройдет в блокчейне
Пытаемся зайти на сайт по адресу
http://yourdomain.ton
через телеграм, или используем какое-нибудь прокси для обычного интернета (например, добавляя.run
или.sc
в конце)
А как же обещанные поддомены?
Нажимаем на кнопку «Create subdomains contract» (или Reset subdomains contract, если он уже задан), и подтверждаем транзакцию.
Ждём 1–2 минуты, пока транзакция пройдет в блокчейне (возможно, потребуется перезагрузка страницы)
Нажимаем на кнопку «Add subdomain» и вводим имя поддомена (без точек) и значение
TON SITE
(ADNL адрес, если захотим, можем поднять поддомен на другом адресе — всё как в обычном DNS). В случае отсутствия у поддомена хотя бы 1 записи (wallet, site, storage, next_dns_resolver), он автоматически «почистится», так что не забываем сразу вписать хотя бы одно значение.Нажимаем на кнопку «Save» и подтверждаем транзакцию
Для создания поддомена у поддомена (second.first.alice.ton) необходимо повторить аналогичные шаги 8–11 рекурсивно для созданного поддомена
Для примера конфигурации можете посмотреть на конфигурацию сайта howtorunsite.ton (удалить или изменить можете не пытаться — это сделать может только владелец домена).
Если что, все подробные инструкции есть снизу страницы.
Заключение
Сайты в сети .ton
только не давно были придуманы, и пока вообще не понятно, что ожидает их в будущем. Возможно, эта технология исчезнет, но также не исключено, что через 5–10 лет обычные сайты канут в лету (шутка).
Стоит ли сейчас полностью отказываться от обычных сайтов и переходить на .ton?
Если Ваш проект не зависит напрямую от TON, то ответ — нет. Сеть ещё не сталкивалась ни с ДДОС атаками, ни с нормальным наплывом пользователей (а если вспоминать самый производительный в мире блокчейн тон, который в моменты наплава пользователей ложился под нагрузкой, то перспективы не лучшие), ни с другими трудностями, так что лучше убедиться в её стабильности перед тем, как полностью туда мигрировать.
Стоит ли их вообще поднимать?
Да, как минимум концепция интересная. У .ton
много преимуществ — они не подвластны регуляторам ввиду децентрализованности сети (как минимум, так утверждается, хотя в теории, ваш смарт-контракт с доменом могут заморозить валидаторы, так что совсем незаконный контент я бы поднимать там не стал); у них децентрализованный DNS и интеграция с блокчейном TON.
В общем, жду вашего мнения в комментариях, а у меня всё.