Как создавать обновляемые Даппы (RUS)
Даппы пишутся на основе JS, HML, CSS и других веб технологиях. Они состоят из двух частей — Клиентской части, той части которая отвечает за интерфейс работы пользователя и Серверной части в виде смарт-контракта для запись и верификация данных в блокчейне. Для каждой части свой алгоритм создания обновляемого кода.
Обновление клиентской части даппа
В других даппах, таких как блокчейн Эфириум под клиентской частью понимают обычный сайт или обычное приложение (десктопное или мобильное), которое умеет взаимодействовать со смарт-контрактом. Поэтому проблема с обновлениями остро не стоит — обновляется обычным способом, например, если это сайт, то переписываются файлы страниц на веб-сервере. Т.е. фактически это обычное централизованное приложение со своими недостатками, например сайт можно заблокировать по решению государственных органов.
В Тера устойчива к цензуре, Тера хранит клиентскую часть кода в блокчейне. Но возникает актуальный вопрос о возможности обновления такого кода разработчиками, например в таких случаев как исправление багов или выпуск новых улучшенных версий. Ниже описан способ как это сделать.
Разработчикам нужно знать, что когда дапп загружается, то он загружается в отдельный безопасный фрейм (iframe)в режиме песочницы, что изолирует его от остальной части приложения. За загрузку отвечает файл dapp-frame.html, который в своем теле уже содержит номер даппа (подставляется сервером автоматически). При инициализации он запрашивает код даппа, определяет заполненность специальных полей состояния основного аккаунта смарт-контракта. Если такие есть то он загружает код не из базы даппов, а по адресу указанных в них. Эти поля имеют названия: HTMLBlock и HTMLTr — они указывают на номер блока и номер транзакции содержащий новый код клиентской части.
Для того чтобы клиентская часть даппа была обновляемая необходимо при создании смарт-контракта:
- Указать специальные поля в “State storage format”, пример: {HTMLBlock:uint,HTMLTr:uint16}
- Прописать процедуру их заполнения при отправке новых обновлений, например так:
function OnGet()
{
var lib=GetLib();
if(lib.OnGet())
return;
}
function GetLib()
{
return require(8);//List-lib
}
Комментарий к коду: библиотека заполнения с кодом 8 уже присутствует в основной и тестовой сети. Она работает следующим образом, когда на основной (Base)счет смарт-контракта отправляется транзакция (в том числе с нулевой суммой), то проверяется в описании платежа наличие JSON объекта с полями HTMLBlock и HTMLTr, например оно может быть такое: {“HTMLBlock”:12345,”HTMLTr”:0} При получении такого формата и при условии что оно было отправлено от создателя смарт-контракта, происходит обновление полей состояния.
Далее это значение состояние используется на системном уровне при загрузке клиентского кода. Вы можете более подробно изучить вопрос загрузки кода открыв файл dapp-frame.html
Инструменты
В Тера уже существует возможность создания вышеуказанных действий автоматически при создании дапп при использовании интегрированной среды разработки даппов, которая поставляется вместе с кодом полной ноды. Для этого нужно открыть страницу /dapp-edit.html
В ней создайте новый дапп (кнопка New)и выберите следующий шаблон — Dapp:User list, как показано на картинке ниже:
В итоге автоматически заполнятся нужные поля и будет создан нужный код в смарт-контракте.
Для того чтобы обновить клиентскую часть нужно на закладке Upload to blockchain сделать следующие действия:
- Выгрузить в блокчейн новую версию HMTL (кнопка SEND HTML FILE), дождаться подтверждения из блокчейна в логе в виде строки: /file/9183610/1
2. В списке даппов блокчейна выбрать нужный дапп (в левом нижнем окне)
3. Указать строку /file/9183610/1 в окошке перед кнопкой SEND VISIBLE FILE и отправить команду.
См. картинку ниже:
Благодарности
Выражаю благодарность Yang Longyang без которого данная статья еще долго была бы ненаписанной.