Провайдер хранилища
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Провайдер хранилища — это сервис, который хранит файлы за комиссию.
Двоичные файлы
Вы можете загрузить двоичные файлы storage-daemon
и storage-daemon-cli
для Linux/Windows/macOS из TON Auto Builds.
Компилляция из исходного кода
Вы можете скомпилировать storage-daemon
и storage-damon-cli
из исходников, используя эту инструкцию.
Основные понятия
Он состоит из смарт-контракта, который принимает запросы на хранение и управляет платежами от клиентов, а также приложения, которое загружает и обслуживает файлы для клиентов. Вот как это работает:
- Владелец провайдера запускает
storage-daemon
, развертывает основной смарт-контракт и настраивает параметры. Адрес контракта передается потенциальным клиентам. - Использу я
storage-daemon
, клиент создает Bag из своих файлов и отправляет специальное внутреннее сообщение в смарт-контракт провайдера. - Смарт-контракт провайдера создает контракт хранения для обработки этого конкретного Bag.
- Провайдер, обнаружив запрос в блокчейне, загружает Bag и активирует контракт хранения.
- Затем клиент может перевести оплату за хранение на контракт хранения. Чтобы получить оплату, провайдер регулярно представляет контракт с доказательством того, что он все еще хранит Bag.
- Если средства на контракте хранения заканчиваются, контракт считается неактивным, и поставщику больше не требуется хранить Bag. Клиент может либо пополнить контракт, либо получить свои файлы.
Клиент также может получить свои файлы в любое время, предоставив доказательство права собственности на контракт хранения. Затем контракт передаст файлы клиенту и деактивируется.
Смарт-контракт
Использование провайдера клиентами
Чтобы использовать провайдера хранения, вам необходимо знать адрес его смарт-контракта. Клиент может получить параметры провайдера с помощью следующей команды в storage-daemon-cli
:
get-provider-params <address>
Параметры провайдера:
- Принимаются ли новые контракты на хранение.
- Минимальный и максимальный размер Bag (в байтах).
- Ставка — стоимость хранения. Указывается в nanoTON за мегабайт в день.
- Максимальный объем — как часто провайдер должен предоставлять доказательства хранения Bag.
Запрос на хранение
Вам необходимо создать Bag и сгенерировать сообщение с помощью следующей команды:
new-contract-message <BagID> <file> --query-id 0 --provider <address>
Информация:
Выполнение этой команды может занять некоторое время для больших Bag. Тело сообщения будет сохранено в <file>
(не все внутреннее сообщение). Идентификатор запроса может быть любым числом от 0 до 2^64-1
. Сообщение содержит параметры провайдера (скорость и максимальный диапазон). Эти параметры будут выведены после выполнения команды, поэтому их следует дважды проверить перед отправкой. Если владелец провайдера изменит параметры, сообщение будет отклонено, поэтому условия нового контракта на хранение будут в точности соответствовать ожиданиям клиента.
Затем клиент должен отправить сообщение с этим телом на адрес провайдера. В случае ошибки сообщение вернется к отправителю (возврат). В противном случае будет создан новый контракт на хранение, и клиент получит от него сообщение с op=0xbf7bd0c1
и тем же идентификатором запроса.
На этом этапе контракт еще не активен. Как только поставщик загрузит Bag, он активирует контракт на хранение, и клиент получит сообщение с op=0xd4caedcd
(также из контракта на хранение).
Контракт на хранение имеет клиентский баланс
— это средства, которые клиент перевел на контракт и которые еще не были выплачены поставщику. Средства постепенно списываются с этого баланса (по ставке, равной ставке за мегабайт в день). Первоначальный баланс — это то, что клиент перевел с запросом на создание контрак та хранения. Затем клиент может пополнить баланс, совершая простые переводы на контракт хранения (это можно сделать с любого адреса). Оставшийся баланс клиента возвращается get методом get_storage_contract_data
в качестве второго значения (balance
).
Контракт может быть закрыт в следующих случаях:
В случае закрытия контракта хранения клиент получает сообщение с остатком баланса и op=0xb6236d63
.
- Сразу после создания, перед активацией, если провайдер отказывается принять контракт (превышен лимит провайдера или другие ошибки).
- Баланс клиента достигает 0.
- Провайдер может добровольно закрыть контракт.
- Клиент может добровольно закрыть контракт, отправив сообщение с
op=0x79f937ea
со своего адреса и любого идентификатора запроса.
Запуск и настройка провайдера
Провайдер хранилища является частью storage-daemon
и управляется storage-daemon-cli
. storage-daemon
необходимо запустить с флагом -P
.
Создание основного смарт-контракта
Вы можете сделать это из storage-daemon-cli
:
deploy-provider
Для инициализации провайдера вам будет предложено отправить на указанный адрес сообщение с 1 TON, которое не подлежит возврату. Вы можете проверить, что контракт был создан, с помощью команды get-provider-info
.
По умолчанию контракт настроен на то, чтобы не принимать новые контракты на хранение. Перед его активацией вам необходимо настроить провайдера. Настройки провайдера состоят из конфигурации (хранящейся в storage-daemon
) и параметров контракта (хранящихся в блокчейне).
Конфигурация:
max contract
- максимальное количество контрактов на хранение, которые могут существовать одновременно.max total size
- максимальный общий размер Bag в контрактах на хранение. Вы можете просмотреть значения конфигурации с помощьюget-provider-info
и изменить их с помощью:
set-provider-config --max-contracts 100 --max-total-size 100000000000
Параметры контракта:
accept
- нужно ли принимать новые контракты на хранение.max file size
,min file size
- ограничения по размеру для одного Bag.rate
- стоимость хранения (указывается в nanoTON за мегабайт в день).max span
- как часто провайдер должен будет предоставлять доказательства хранения.
Просмотреть параметры можно с помощью get-provider-info
, а изменить их с помощью:
set-provider-params --accept 1 --rate 1000000000 --max-span 86400 --min-file-size 1024 --max-file-size 1000000000
На это стоит обратить внимание
Примечание: в команде set-provider-params
можно указать только часть параметров. Остальные будут взяты из текущих параметров. Поскольку данные в блокчейне не обновляются мгновенно, несколько последовательных команд set-provider-params
могут привести к неожиданным результатам.
Рекомендуется изначально положить на баланс провайдера более 1 TON, чтобы было достаточно средств для покрытия комиссий за работу с контрактами хранения. Однако не отправляйте слишком много TON с первым невозвратным сообщением.
После установки параметра accept
в 1
смарт-контракт начнет принимать запросы от клиентов и создавать контракты хранения, а демон хранения автоматически их обработает: загрузит и распределит Bag, сгенерирует доказательства хранения.
Дальнейшая работа с провайдером
Список существующих контрактов хранения
get-provider-info --contracts --balances
В каждом контракте хранения указаны балансы Client$
и Contract$
; разницу между ними можно вывести на основной контракт провайдера с помощью команды withdraw <address>
.
Команда withdraw-all
выведет средства со всех контрактов, у которых доступно не менее 1 TON
.
Любой контракт хранения можно закрыть с помощью команды close-contract <address>
. Это также переведет средства на основной контракт. То же самое произойдет автоматически, когда баланс клиента закончится. Файлы Bag в этом случае будут удалены (если нет других контрактов, использующих тот же Bag).
Перевод
Вы можете перевести средства с основного смарт-контракта на любой адрес (сумма указывается в nanoTON):
send-coins <address> <amount>
send-coins <address> <amount> --message "Some message"
Все Bag, хранящиеся у провайдера, доступны с помощью команды list
и могут использоваться как обычно. Чтобы не нарушать работу провайдера, не удаляйте их и не используйте этот демон храни лища для работы с другими Bag.