Что такое TON Storage?
TON Storage - это часть экосистемы TON, изначально спроектированной командой Telegram, во главе с Павлом Дуровым. Она предоставляет возможность хранить, скачивать и делиться файлами децентрализованным способом.
Напомню, что работа TON (Telegram Open Network) на несколько лет была запрещена американским судом, а проект был передан сообществу и переименован в The Open Network.
TON Storage необходим в блокчейн-экосистеме как дешевый способ хранения больших файлов. Хранение файлов непосредственно в блокчейне будет очень дорогим, а потребность в обмене большими файлами между пользователями блокчейна существует. Например, NFT создаются не только на основе изображений, но и музыки и видео. И все эти данные нужно где-то хранить.
На какой машине будет работать TON Storage?
Для того, чтобы нода могла работать понадобится как минимум 1GHz и 2 ядра CPU, 2GB RAM, 2 GB SSD без учета размера скачиваемых/раздаваемых файлов и сеть 10 Mb/s со статическим IP адресом.
Множество устройств сможет вытянуть эту конфигурацию. Нода работает даже на Raspberry Pi. Но все портит последний критерий - статический IP адрес. Т.е. большинство домашних интернет-соединений не подойдет для того, чтобы вкусить официальный клиент прямо дома. Но есть обходной путь – использовать неофициальный клиент или VPS. Об неофициальных клиентах чуть позже.
Официальные релизы всех компонентов TON для разных ОС можно найти тут. Тем не менее, вы не сможете найти там билд для Apple M чипа. Поэтому в таком случае можно воспользоваться официальной инструкцией по сборке билда. Я опробовал ее несколько раз, в том числе на Apple M1 и Raspeberry Pi – на удивление, все работает с первого раза. Довольно часто процесс билда таких больших проектов ломается на разных этапах, но не в этом случае.
Из чего состоит TON Storage?
На данный момент TON Storage не сильно связан с блокчейном TON. Чтобы начать использование Storage не нужно покупать криптовалюту и проводить какие-то транзакции. Несмотря на это, все компоненты экосистемы построены на одних и тех же технологиях. Например, для передачи данных используется собственная разработка – ADNL. А для поиска нод и информации о файлах – TON DHT.
BagID - ключ к данным
BagID - это строка, которая может принимать два вида: hex строка длиной 64 символа или же base64 представление данных из hex. Это детерминистическое значение рассчитанное на основе данных + описания этих данных.
После того, как вы начали раздавать какие-то данные, ваш Storage Daemon возвращает определенный BagID. Вам достаточно поделиться им с другим человеком, чтобы он мог скачать ваши файлы и встать на раздачу.
TON Storage Daemon
Именно через Daemon происходит раздача и скачивание файлов. Чтобы запустить его нужно выполнить команду:
storage-daemon -v 3 -C global.config.json -I <ip>:3333 -p 5555 -D storage-db
Все данные, с которыми работает Daemon, хранятся в директории storage-db в виде обычных файлов. У каждого набора файлов есть уникальный идентификатор BagID. Если вы скачали BagID EF155134D49CD4515691226A7EEB31965A34EA245F1906901EAC8E45D539AE9A
, то все файлы из него будут в ~/storage-db/torrent/torrent-files/EF155134D49CD4515691226A7EEB31965A34EA245F1906901EAC8E45D539AE9A/
.
Это довольно удобная структура для доступа к файлам, если вы хотите разрабатывать какие-то проекты поверх TON Storage.
TON CLI
Для управление Storage Daemon вам необходим контрольный пункт, в качестве которого выступает ton-cli. Для ее запуска используйте команду:
storage-daemon-cli -I 127.0.0.1:5555 -k storage-db/cli-keys/client -p storage-db/cli-keys/server.pub
Ключи -k
и -p
отвечают за клиентский приватный ключ и за публичный ключ ноды. Эти ключи генерируются при первом запуске Daemon. Если вы запускает cli на машине отличной от той, где находится Daemon, то обращайте внимания на корректность ключей и открытые порты на машине с Daemon.
Вот список доступных команды в ton-cli для управления Daemon.
Hidden text
create [-d description] [--no-upload] [--copy] [--json] <file/dir> - создает BagID из директории ли файла с описанием того, что находится внутри. Метаданные описания так же распространяются в сети
add-by-hash <bag-id> [-d root_dir] [--paused] [--no-upload] [--json] [--partial file1 file2 ...] - добавляет BagID в hex виде в очередь на загрузку. Именно с помощью этой команды вы можете скачивать файлы
add-by-meta <meta> [-d root_dir] [--paused] [--no-upload] [--json] [--partial file1 file2 ...] - добавляет файлы на загрузку используя файл метаданных
get-meta <bag> <file> - сохраняет метаданные BagID в файл
get-peers <bag> [--json] - выводит список пиров
get-pieces-info <bag> [--files] [--offset l] [--max-pieces m] [--json] - выводит информацию о загруженных частях BagID
download-pause <bag> - ставит загрузку конкретного BagID на паузу
download-resume <bag> - продолжает загрузку BagID
upload-pause <bag> - ставит на паузу раздачу BagID
upload-resume <bag> - продолжает раздачу BagID
priority-all <bag> <p> - выставляет приоритет на все файлы BagID. 0 - не скачивать, 255 - самый высокий приоритет
priority-idx <bag> <idx> <p> - выставляет приоритет на конкретный файл BagID. 0 - не скачивать, 255 - самый высокий приоритет
remove <bag> - удаляет BagID со всеми файлами из очереди
load-from <bag> [--meta meta] [--files path] - предоставьте метаданные и данные для существующей полностью незагруженного BagID
get-speed-limits [--json] - показывает глобальные ограничения по скачиванию и отдаче данных
set-speed-limits [--download x] [--upload x] - устанавливает глобальные ограничения по скачиванию и отдаче данных в байтах или “unlimited” для снятия ограничений
new-contract-message <bag> <file> [--query-id id] --provider <provider> - создает новое сообщение контракта для поставщика хранилища. Сохраняет тело сообщения в файл
new-contract-message <bag> <file> [--query-id id] --rate <rate> - создает новое сообщение контракта для поставщика хранилища. Сохраняет тело сообщения в файл, но параметры не получаются автоматически
Протокол ADNL: Передача Данных
Начнем с того, что ADNL (Abstract Datagram Network Layer) — это фундамент всей сети TON, работающий на основе UDP в IPv4 (а в будущем и IPv6). Если UDP не под рукой — не беда, можно использовать и TCP.
Каждый участник сети обладает 256-битным ADNL адресом. С помощью протокола ADNL вы можете отправлять и получать данные, используя только ADNL адреса, забыв о IP-адресах и портах. Но что же это за магия? Адрес ADNL, в сущности, равен 256-битному ECC публичному ключу. Создавайте сколько угодно разных сетевых идентичностей, главное — помнить соответствующий закрытый ключ, чтобы получать (и расшифровывать) ваши сообщения.
ADNL адрес — это не сам публичный ключ, а 256-битный SHA256 хеш от сериализованного объекта данных.
Все отправленные данные подписываются отправителем и шифруется так, чтобы только получатель мог расшифровать сообщение и проверить его на целостность.
TON ADNL узел обычно имеет "таблицу соседей", содержащую информацию о других известных узлах. Со временем он будет расширять эту таблицу, используя информацию, полученную от этих узлов. Новые записи могут появляться в виде ответов на специальные запросы или, наоборот, устаревшие записи могут удаляться.
TON DHT: Распределённая хэш-таблица
TON DHT основан на Kademlia и это важная составляющая TON, служащая маяком для поиска других узлов в сети. В качестве ключа выступает SHA256 хеш, а в качестве значения выступает IP-адрес и порт ноды. Таким образом, хранение и скачивание файлов не является анонимными. По крайнем мере, в стандартной конфигурации.
С помощью DHT так же происходит регистрация BagID в сети. Остальные ноды, которые запрашивают этот BagID могут получить список раздающих нод и скачивать данные сразу со всех нод.
Гейтвей для разработки dApps на основе Storage
Разработка даппов на основе децентрализованных хранилищ практически всегда требует использование гейтвеев — порталов для доступа к данным без установки сложного софта для клиентов. Гейтвеи порой могут быть с довольно сложной логикой, требующей регулярного тестирования.
Если вы разрабатываете open-source проект и храните его на Github, то для тестов отлично подойдет Github Actions. Тем не менее, чтобы запустить готовый билд на Github Actions, нужно немного заморочиться. Доступные билды несовместимы с серверами, которые предоставляет Github. Поэтому можно пойти двумя путями:
Каждый раз билдить ноду для тестов
Установить эмулятор, чтобы запускать готовый билд
Давайте пойдем по второму пути, чтобы запускать именно тот билд, который будет использоваться на наших реальных серверах.
Запуск тестов с помощью Github Actions
Файл .github/workflows/tests.yaml
Hidden text
name: Test
on:
push:
branches:
- master
pull_request:
branches:
- '**'
jobs:
test:
name: Run tests
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Build Docker image
uses: docker/build-push-action@v2
with:
context: .
platforms: linux/arm64
push: false
load: true
tags: your-docker-image-name:latest
- name: Run tests
run: docker run your-docker-image-name:latest
С помощью него устанавливается QEMU и запускается Docker.
Содержимое Dockerfile
. В нем также происходит установка mysql, но если для вашего проекта это не нужно, то можно удалить строки отвечающие за mysql.
Hidden text
# Start from the latest LTS Node version built for arm64 on Alpine
FROM node:alpine
# Add the TON Storage daemon and CLI to the path
ENV PATH="/app/ton:${PATH}"
WORKDIR /app
# Install necessary packages
# netcat equivalent in Alpine is netcat-openbsd
# curl, mysql, and mysql-client are added since they might not be present in Alpine by default
RUN apk add --no-cache curl netcat-openbsd mysql mysql-client
# Initialize MySQL Database
RUN mysql_install_db --user=mysql --ldata=/var/lib/mysql
# Create the directory for the MySQL Unix socket and change its ownership
RUN mkdir -p /run/mysqld/ && chown -R mysql:mysql /run/mysqld/
# Download TON Storage daemon and CLI binaries
RUN curl -LJO https://github.com/ton-blockchain/ton/releases/download/v2023.06/storage-daemon-linux-arm64
RUN curl -LJO https://github.com/ton-blockchain/ton/releases/download/v2023.06/storage-daemon-cli-linux-arm64
RUN curl -LJO https://ton-blockchain.github.io/global.config.json
# Make them executable
RUN chmod +x storage-daemon-linux-arm64 storage-daemon-cli-linux-arm64
# Move them to the right place
RUN mkdir ton && mv storage-daemon-linux-arm64 storage-daemon-cli-linux-arm64 global.config.json ton/
# Add the current directory content to the Docker image
ADD . /app
# Install project dependencies
RUN npm ci
# Run scripts
RUN npm run check:types
RUN npm run lint:check
# Copy the startup script and make it executable
COPY ./startup.sh /app/startup.sh
RUN chmod +x /app/startup.sh
CMD ["/app/startup.sh"]
Содержимое startup.sh
для запуска TON Storage Daemon.
Hidden text
#!/bin/sh
/app/ton/storage-daemon-linux-arm64 -v 5 -C /app/ton/global.config.json -I localhost:3333 -p 5555 -D /app/ton/storage-db >/dev/null 2>&1 &
/usr/bin/mysqld --user=mysql --socket=/run/mysqld/mysqld2.sock &
sleep 5 && npm run test
Вы можете ознакомиться с реальным примером проекта, использующего TON Storage и Github Actions тут.
Можно ли заработать на TON Storage?
И да и нет. Официально, существует инструкция о том, как может работать рынок хранения данных. С помощью нее, люди могут платить провайдерам данных в Toncoin, а провайдеры зарабатывать Toncoin за хранение. Тем не менее, развитого для этого рынка нет. Если вы захотите воспользоваться инструкцией, то едва ли сможете найти провайдера или клиентов. По крайне мере сейчас, пока TON сосредоточен на самом блокчейне, а не на Storage.
Инструкция
Идея состоит в том, что можно взять смарт контракт из официального репозитория и развернуть его в TON. Контракт принимает запросы на хранение и управляет платежами. Провайдер данных скачивает и раздает файлы клиентам. Вот как это работает:
Провайдер запускает storage-daemon, развертывает смарт контракт и настраивает параметры. Адрес контракта распространяется среди потенциальных клиентов.
С помощью storage-daemon клиент создает Bag из своих файлов и отправляет специальное внутреннее сообщение в смарт контракт провайдера.
Смарт контракт провайдера создает обязательство хранения для обработки этого Bag.
Провайдер, обнаружив запрос в блокчейне, загружает Bag и активирует обязательство хранения.
Клиент может затем отправить платеж за хранение. Чтобы получить платеж, провайдер регулярно представляет контракту доказательство того, что он все еще хранит Bag.
Если средства на контракте закончатся, обязательство считается неактивным, и от провайдера больше не требуется хранить Bag. Клиент может либо пополнить контракт, если хочет продолжить хранение у провайдера, либо может оставить все как и есть. Тогда файлы будут "забыты" в сети.
TON Storage вместо торрентов
Из-за сходства принципов работы TON Storage с торрентами, идея использования его в качестве альтернативы заслуживает внимания. И уже существует проект под названием TON Torrent, доступный на GitHub. Разработанный на Go, он неплохо работает на основных ОС. В его основе лежит версия Storage на Go tonutils-storage.
TON Torrent позволяет скачивать файлы даже с домашнего интернет-соединения, но файлы должны быть размещены на нодах со статическими IP. Однако стоит отметить, что раздача файлов с серого IP через этот клиент не будет возможной.
TON Torrent может стать шагом на пути к использованию TON Storage в повседневной практике, но без маркетинга и инноваций в самом протоколе едва ли это возможно.
Удалось ли сделать прорыв? Выводы
TON Storage во многом представляет собой адаптированный торрент-протокол, который несовместим с другими протоколами. Работая на базе протоколов TON и типов данных TL, он становится интересным элементом в экосистеме. Кроме этого, особых нововведений в протоколе нет. TON Storage имеет потенциал стать ключевым инструментом для хранения всех объемных данных пользователей TON, и возможно, даже Telegram, но это видится перспективой отдаленного будущего.
На текущий момент, применение TON Storage выглядит рациональным лишь в случае глубокой интеграции ваших проектов с экосистемой TON и при условии вашей готовности ждать неопределенное время до того момента, как TON Foundation активизирует свои усилия в данном направлении. Если же вам требуется надежное хранилище с активным сообществом и стабильной работой программного обеспечения уже сейчас, то рассмотрите возможность использования альтернативных решений.
Helltraitor
И зачем необходимо это требование?