Как создавать обновляемые Даппы (RUS)

Yuriy Ivanov
3 min readMay 18, 2021

--

Даппы пишутся на основе JS, HML, CSS и других веб технологиях. Они состоят из двух частей — Клиентской части, той части которая отвечает за интерфейс работы пользователя и Серверной части в виде смарт-контракта для запись и верификация данных в блокчейне. Для каждой части свой алгоритм создания обновляемого кода.

Обновление клиентской части даппа

В других даппах, таких как блокчейн Эфириум под клиентской частью понимают обычный сайт или обычное приложение (десктопное или мобильное), которое умеет взаимодействовать со смарт-контрактом. Поэтому проблема с обновлениями остро не стоит — обновляется обычным способом, например, если это сайт, то переписываются файлы страниц на веб-сервере. Т.е. фактически это обычное централизованное приложение со своими недостатками, например сайт можно заблокировать по решению государственных органов.

В Тера устойчива к цензуре, Тера хранит клиентскую часть кода в блокчейне. Но возникает актуальный вопрос о возможности обновления такого кода разработчиками, например в таких случаев как исправление багов или выпуск новых улучшенных версий. Ниже описан способ как это сделать.

Разработчикам нужно знать, что когда дапп загружается, то он загружается в отдельный безопасный фрейм (iframe)в режиме песочницы, что изолирует его от остальной части приложения. За загрузку отвечает файл dapp-frame.html, который в своем теле уже содержит номер даппа (подставляется сервером автоматически). При инициализации он запрашивает код даппа, определяет заполненность специальных полей состояния основного аккаунта смарт-контракта. Если такие есть то он загружает код не из базы даппов, а по адресу указанных в них. Эти поля имеют названия: HTMLBlock и HTMLTr — они указывают на номер блока и номер транзакции содержащий новый код клиентской части.

Для того чтобы клиентская часть даппа была обновляемая необходимо при создании смарт-контракта:

  1. Указать специальные поля в “State storage format”, пример: {HTMLBlock:uint,HTMLTr:uint16}
  2. Прописать процедуру их заполнения при отправке новых обновлений, например так:
    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

TERA DApp IDE

В ней создайте новый дапп (кнопка New)и выберите следующий шаблон — Dapp:User list, как показано на картинке ниже:

В итоге автоматически заполнятся нужные поля и будет создан нужный код в смарт-контракте.

Для того чтобы обновить клиентскую часть нужно на закладке Upload to blockchain сделать следующие действия:

  1. Выгрузить в блокчейн новую версию HMTL (кнопка SEND HTML FILE), дождаться подтверждения из блокчейна в логе в виде строки: /file/9183610/1

2. В списке даппов блокчейна выбрать нужный дапп (в левом нижнем окне)

3. Указать строку /file/9183610/1 в окошке перед кнопкой SEND VISIBLE FILE и отправить команду.

См. картинку ниже:

Благодарности

Выражаю благодарность Yang Longyang без которого данная статья еще долго была бы ненаписанной.

--

--

Yuriy Ivanov
Yuriy Ivanov

No responses yet