Глава 8. Развертывание децентрализованных приложений

Глава 8

Как вы узнаете, развертывание децентрализованных приложений – это путешествие на передовую новой компьютерной парадигмы.

Распределенное приложение, или dapp, разделяет те же самые идеалы, что и протокол EVM: обеспечение неизменяемости. Dapps состоят из смарт-контрактов, которые, как уже много раз упоминалось в этой книге, исполняются всеми узлами сети Ethereum в примерно одинаковое время.

На практике dapps – это общедоступные веб-сервисы, запущенные в EVM, но доступные для пользователей через обычный HTML/CSS/JavaScript фронтенд, к которому они могут получить доступ при помощи своих браузеров или приложений для смартфонов, либо при помощи браузера Ethereum, такого как Mist.

Примечание

В этой главе затрагиваются темы, предназначенные для разработчиков с уже имеющимся опытом. Если вы начинающий программист, прочитайте эту главу полностью вплоть до Главы 9. Далее, возьмите любую книгу по JavaScript для начинающих, чтобы улучшить ваши навыки в написании скриптов. Затем посетите страницу, на которой вы найдете другие руководства по языку Solidity.

Запуск клиентов приложений, основанных на блокчейне, гораздо легче, чем управление клиентами в парадигме облачного хостинга. Hub-and-spoke (топология “звезда”) веб-приложения масштабируются вертикально, в соответствии с отдельно взятыми серверами, на которых они работают. В отличие от них, Ethereum-приложение масштабируется горизонтально – это способ, подходящий для масштабирования облачного приложения.

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

Семь примеров использования смарт-контрактов

В основе любого dapp лежит набор смарт-контрактов. Смарт-контракты полезны в следующих сценариях, которые могут составить интересные проблемные области для прототипирования:

  • Поддержание работы системы учета для чего-либо из реального мира или для других контрактов
  • Создание контрактов-маршрутизаторов, например, сберегательный счет, который автоматически пересылает поступающие средства в отдельную корзину
  • Управление взаимоотношениями между несколькими сторонами, например, договор или расчеты с фрилансерами.
  • Смарт-контракт может выступать в роли программной библиотеки для других контрактов
  • Смарт-контракт может выступать в роли управляющего объекта для других систем или наборов контрактов
  • Смарт-контракт может служить в качестве логики приложения для веб-сервиса общего пользования
  • Смарт-контракт может служить в качестве утилиты, которую могут использовать разработчики на одноразовой основе, например, для генератора случайных чисел.

Разработка dapp приносит с собой новые проблемы для разработчиков приложений, такие как изучение Web3 JavaScript API и языка программирования Solidity. Будем надеяться, что вы почувствуете уверенность для работы с этими инструментами сразу же послу прочтения этой книги!

Чтобы лучше понять, какие виды dapps разрабатываются сегодня, зайдите на: http://dapps.ethercasts.com

Этот сайт управляется EtherCasts.

Модели данных контрактов в dapp

Первое, что вам необходимо знать для развертывания рабочего контракта, это какие данные вы можете хранить в EVM и где вы их храните.

Как мы уже обсуждали в предыдущих главах, каждый адрес контракта в сети Ethereum имеет хранилище для своих смарт-контрактов. Это пространство для хранения данных не имеет ограничений, если вы готовы за это заплатить. На момент написания этой книги пространство для хранения стоит $0.018 за килобайт.

Язык Solidity облегчает использование контрактов наподобие небольших реляционных баз данных. Чтобы упростить этот процесс, в языке Solidity есть два известных типа данных, которые мы еще не упоминали:

  • Маппинги / соответствия (“Mappings”)
  • Структуры (“Structs”)

Чтобы узнать больше об использовании этих типов в Solidity, обратитесь к странице.

Если говорить упрощенно, пространство для хранения данных конкретного контракта является хранилищем типа ключ/значение с 2256 возможными ключами и таким же количеством значений. Этого объема достаточно практически для любой структуры базы данных, которую вы хотите создать.

Примечание

Вспомним, что разработчики иногда называют атрибуты объектов ключами, например, во фразах “пара ключ/значение” или “хранилище типа ключ/значение”. В качестве понятного примера, пара ключ/значение: размер обуви = 40. Таблица, содержащая размеры обуви всех людей на выделенном сервере, является примером хранилища типа ключ/значение. Вы можете думать о EVM, как о гигантском хранилище типа ключ/значение, которое показывает балансы аккаунтов, поскольку это машина с отслеживанием состояния транзакций.

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

Как бэкенд в EVM общается с JS-фронтендом

Различие между сетью Ethereum и сетью, работающей по протоколу HTTP, известной как интернет, может быть преодолено. Допустим, клиент через традиционный браузер заказывает доставку еды на веб-сайте, работающем на базе dapp. Чтобы успешно передать данные по заказу (сколько молочных коктейлей?) между браузером и EVM, фронтенд dapp должен “отправить” данные в EVM в определенном формате.

Примечание

Dapps могут не нуждаться в собственном наборе контрактов; вместо этого, они могут иметь возможность вызывать определенные публичные функции из других контрактов, чтобы реализовать свой функционал. Для каждой функции, объявленной публичной в смарт-контракте, Solidity автоматически создает функцию доступа, так чтобы другие контракты могли вызвать ее.

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

Чтобы “трансляция” прошла корректно, программисты разрабатывают свои программы таким образом, чтобы те отправляли информацию в адрес других программ в определенных нотациях. Обычно нотация описывает формат для целого объекта (определенного в Главе 1 как набор атрибутов и значений).

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

JSONRPC

В современных веб-приложениях код JavaScript может передавать информацию по вебу, используя общепринятую объектную нотацию под названием JavaScript Object Notation (JSON). Объекты JSON могут содержать цифры, строки и упорядоченные последовательности значений для определенных атрибутов.

Есть два важных объекта данных в Web3.js, которые можно грубо сравнить с JSON в том плане, каким образом они передаются между фронтендом и бэкендом приложения на базе Ethereum. Они называются объектами JSON-RPC и поставляются с библиотекой Web3.js. Ниже описывается установка Web3.js. Эти два объекта используются следующим образом:

  • webeth используется специально для взаимодействия с блокчейном
  • webshh используется специально для взаимодействия с Whisper

Whisper – это протокол приватного обмена сообщениями, который является частью протокола Ethereum. Вы узнаете больше о Whisper и его роли в дорожной карте в Главе 11.

Пока что можете представлять себе, что объекты JSON-RPC непрерывно перемещаются туда и обратно между фронтендом (в HTTP-сети) и бэкендом (сеть Ethereum).

Web 3 уже здесь (почти)

JavaScript-библиотека под названием Web3.js является частью новой спецификации Web 3.

Страница на GitHub для проекта Web 3: https://github.com/ethereum/web3.js/

Web 3 – это общее понятие для децентрализованного веба, Web 2 – это веб-приложения и сервисы. Web 1 – это оригинальная “Всемирная паутина”, в которой хостились статические страницы. С того времени протокол передачи гипертекста HTTP дорабатывался для добавления большего количества методов и поддержки все более сложного контента и скриптов.

Web 3 – это настоящая концепция, которая фокусируется в частности на протоколе Ethereum. Принято считать, что она состоит из трех компонентов:

  • Одноранговой системы идентификации и обмена сообщениями
  • Совместно используемого состояния (блокчейн)
  • Децентрализованного хранилища файлов

Первые два пункта уже выполнены: сеть Ethereum и транзакции работают! Третья ножка стула, децентрализованное хранилище файлов, является частью проекта Swarm, о котором вы узнаете из Главы 11.

В парадигме Web 3 нет веб-серверов. Нет кэшей, обратных прокси-серверов, балансировщиков нагрузки, сетей доставки содержимого (CDN) и других пережитков устаревшего крупномасштабного развертывания веб-приложений. Даже децентрализованные серверы доменных имен (DNS) станут свободными. Когда хранилище Swarm будет запущено в сеть, оно будет дешевым, являясь составной частью Ethereum для веб-хостинга.

Для разработчиков и хакеров всех сортов Web 3 расширяет модель развертывания условно-бесплатных приложений, в которой увеличение количества пользователей и масштаба приводит ко все более высоким счетам за хостинг. В EVM вы можете управлять своими затратами путем написания эффективного кода, и вы можете рассчитывать на то, что любой житель планеты сможет получить доступ к вашему приложению с момента его запуска в сеть.

Давайте вернемся к специфике разработки dapp и посмотрим, как современный веб общается с EVM.

Эксперименты с JavaScript API

В Главе 6 вы узнали, насколько легко взаимодействовать с EVM, набирая команды в JavaScript-консоль в Geth. Когда вы делаете это, в действительности вы лишь вызываете частные методы JavaScript, которые поставляются с Ethereum JavaScript API. Эти методы JavaScript, которые вы набираете в консоли Geth, интерпретируются JIT-подобным интерпретатором JavaScript, разработанным специально для Geth. Это называется интерактивным использованием JSRE, или использованием его в интерактивном режиме.

Однако, методы Ethereum JavaScript API можно также передавать обычным веб-приложениям, позволяя им обмениваться данными с EVM.

Использование Geth для развертывания dapp

Несмотря на популярность других клиентов Ethereum, Geth (который написан на языке Go, разработанном в Google) со своим простейшим интерпретированием JavaScript является самым быстрым способом для соединения веб-приложения с пользовательским интерфейсом из традиционного HTTP-веба с контрактом на бэкенде в EVM.

Поскольку эти методы JavaScript интерпретируются при помощи Geth в код для EVM, имеется возможность связать их в скрипты, а это, конечно, естественное использование JavaScript в принципе. Это называется неинтерактивным использованием JavaScript.

Примечание

Неинтерактивное использование JavaScript API – это смысл того, что мы называем компьютерным программированием. Это, говоря обобщенно, цель программирования или написания программ: автоматизация того, что в противном случае было бы ручным набором команд в терминале, типа тех, что вы набирали в Geth. При выполнении сложных вычислений или построении аналитических моделей эти строки инструкций могут становиться длинными и утомительными.

Занося строки инструкций в простой текстовый файл программист может сделать программу краткой, быстрой, эффективной и повторяемой.

Другая цель программирования заключается в том, чтобы отделить задачи, которые вводит человек-оператор, и чтобы выполнять их в параллельном потоке, так чтобы вся работа занимала меньше времени. Как вы видели во время первого запуска Geth, вы не могли ничего сделать в этом окне для ввода команд, пока он синхронизировался, и конечно, этот поток не остановился бы, пока Geth запущен.

Надстроив консоль поверх Geth, разработчики Ethcore дали возможность вам, оператору консоли, давать команды в процессе синхронизации Geth в фоновом режиме, в другом потоке на вашей локальной машине.

Далее вы узнаете об идеальных фреймворках для веб-разработки, которые можно использовать для подключения к бэкенду на стороне EVM.

Использование Meteor с EVM

Если вы JavaScript-разработчик, то, возможно, слышали о Meteor.js, библиотеке, которая позволяет вам писать реактивные веб-приложения, которые запускают симметричный код на сервере и клиенте.

Этот полностековый фреймворк отлично подходит для разработки веб-приложений реального времени, но он полезен и для разработки фронтенда под Ethereum, поскольку он особенно пригоден для написания одностраничных приложений, или SPA.

Вот причины, по которым так много Ethereum-разработчиков любят Meteor:

  • Он полностью написан на JavaScript, как и инструменты
  • Вы получаете полноценную среду разработки “из коробки”
  • Развертывание супер-простое
  • Интерфейсы полностью реактивны (похоже на Angular.js)
  • Использует модель данных NoSQL под названием MiniMongo, которая может автоматически сохраняться в локальное хранилище смарт-контракта.

Чтобы узнать больше о разработке приложений под Ethereum с помощью Meteor.js, обратитесь к странице.

Этот URL также указан в списке на: http://tutorials.eth.guide

Далее вы узнаете об установке библиотеки Web3.js на машину для разработки, так чтобы вы смогли поиграться с контрактами локально.

Установка Web3.js для создания веб-приложения, совместимого с Ethereum

Библиотека Web3.js обменивается данными с локальным узлом посредством RPC. Библиотека работает с любым узлом Ethereum, если он предоставляет свой уровень RPC. Для запуска вашего фронтенд-приложения вам нужно будет установить эту библиотеку на вашу локальную машину для разработки и на ваш веб-сервер.

Даже если вы не запускаете собственную цепочку в Geth при помощи соответствующей команды, для приватных цепочек эта библиотека используется по умолчанию.

По сути, можете считать свой узел Ethereum слоем без операционной системы, открывающим доступ в EVM через его RPC-слой. Этот RPC-слой может отправлять и получать объекты web3.eth и web3.shh с помощью веб-сервера, на котором также работает Web3.js.

Чтобы установить Web3.js в вашей среде разработки, откройте Терминал и используйте наиболее удобный для вас способ установки:

  • npm: npm install web3
  • bower: bower install web3
  • meteor: meteor add ethereum:web3
  • vanilla: link the dist./web3.min.js

Далее вам нужно создать инстанс Web3 и установить ваш localhost в качестве провайдера. Чтобы продолжить изучение, как работать с Web3.js, перейдите к странице.

Далее вы узнаете, как запускать JavaScript-файлы из консоли Geth.

Запуск контрактов в консоли

Полное руководство по развертыванию dapps заняло бы много страниц и могло бы быть реализовано множеством способов. Вместо этого данный раздел фокусируется на быстром старте.

Вы можете загрузить файлы с вашим смарт-контрактом напрямую в Geth, отправляя их в транзакции в адрес EVM простым добавлением аргумента

–exec, и затем писать JavaScript-код, ссылающийся на локальный скрипт.

Например:

$ geth –exec loadScript(“/Desktop/test.js”)

По факту, вы можете даже запустить код JavaScript, находящийся на другой машине, если на ней запущен Geth:

$  geth –exec loadScript(“/Desktop/test.js”)   attach https://100.100.100.100:8000

В следующем разделе описывается архитектура приложений, совместимых с Ethereum, а также их отличия от традиционной веб-архитектуры.

Как контракты объявляют интерфейс

При использовании JavaScript dapp API, вызов контракта посредством уровня абстракции, такого как функция eth.contract(), вернет обратно объект со всеми функциями, с которыми контракт, вызванный на JavaScript, может работать.

Чтобы стандартизировать этот интроспективный функционал, протокол Ethereum поставляется с двоичным интерфейсом приложения, также известном, как Ethereum Contract ABI. ABI исполняет роль API, создавая стандартный синтаксис для контрактов, чтобы их могли вызывать приложения.

ABI предписывает контракту возвращать массив, который описывает заданную сигнатуру вызова и доступные функции контракта.

Некоторые разработчики могут удивиться, особенно те из них, кто пришли из среды разработки Apple, что нет фреймворков, “поставляемых с” Ethereum для упрощения написания компонентов типовых приложений.

Несмотря на то, что протокол Ethereum может в целом не иметь возможностей для этого, по-прежнему сохраняется необходимость в создании контрактов, взаимодействие с которыми в типовых сценариях использования будет происходить предсказуемым образом. Эти сценарии включают в себя: валютные единицы, регистрацию названий и трейдинг на биржах. ABI используется для подобных сценариев.

ABI содержит двоичный код, потому что в EVM ниже прикладного уровня находится уровень, на котором работает байткод EVM.

Вы можете найти эту спецификацию по адресу.

Или здесь: http://abi.eth.guide

Стандарты для смарт-контрактов обычно состоят из наборов сигнатур функций для некоторых типовых методов, таких как: отправка, получение, регистрация, удаление и так далее.

Рекомендации для прототипирования

Первое, что необходимо знать о прототипировании контрактов на  Solidity, это то, что вам необязательно иметь узел Ethereum для тестирования ваших контрактов. Вы можете использовать симулятор контрактов виртуальной машины Ethereum (Ethereum VM Contract Simulator): https://github.com/EtherCasts/evm-sim/

Этот симулятор позволяет разработчикам тестировать контракты изолированно, когда отсутствует доступ к тестовой сети, например, при работе с нетбука.

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

  • Не используйте слишком много эфира на контракт, и где это возможно, программируйте верхние пределы того, сколько контракты будут хранить. Это хорошая защита на случай сбоев, при которых в результате бага блокируются ваши средства. Просто не используйте слишком много при тестировании с применением реального эфира.
  • Сохраняйте свои контракты модульными и легкими для понимания. Когда это возможно, абстрагируйте функционал в библиотеки, которые можно протестировать в индивидуальном порядке. Ограничивайте количество переменных и длину функций. Документируйте все.
  • Используйте паттерн “Проверки-Эффекты-Взаимодействия” (“Checks-Effects-Interactions”). Это означает, что вам не следует писать программы, которые ожидают возвращаемых данных от другого контракта для того, чтобы продолжить свою работу; это приведет к тайм-аутам. В целом говоря, вы можете избежать этого при помощи проверок данных, которые вы получаете обратно, перед изменением состояния.
  • Пишите свои собственные посредники. Поскольку EVM – это платформа, не прощающая ошибок, она обязывает вас создавать такие механизмы для ваших программ, которые будут работать безотказно.
  • Как упоминалось в Главе 5, в руководстве по контракту токена, разработчики стремятся использовать стандарты для определенных типов контрактов. Вы можете зарегистрировать свои контракты при помощи стороннего сервиса, такого как Etherchain, чтобы другие люди могли использовать их. Вы можете увидеть публично доступные контракты по адресу: https://etherchain.org/contracts
  • Тестируйте, тестируйте и еще раз тестируйте! Ресурсы для тестирования представлены по адресу: http://test.eth.guide

Вы познакомились с несколькими контрактами, которые были написаны для демонстрационных целей. Какие простые смарт-контракты вы можете создать в сервисе реальных децентрализованных приложений? Какой есть лучший способ для их развертывания? Это предмет последнего раздела в данной главе.

Сторонние библиотеки для развертывания

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

Инструменты для разработки – это важнейшая область, которая активно прорабатывается в сообществе Ethereum. Ведущие группы разработчиков создали инструменты, чтобы облегчить создание контрактов и развертывание dapps. Вот некоторые проекты, о которых вам следует знать:

  • Руководства и контракты на Solidity от Monax (https://monax.io/docs/)
  • Смарт-контракты от OpenZeppelin
  • Среда для развертывания, тестирования и создания активов Truffle
  • Dapple, среда разработки для сложных систем контрактов
  • Populus, фреймворк для разработки контрактов, написанный на Python
  • Embark, фреймворк для разработки dapps, написанный на JavaScript
  • Ether Pudding, сборщик пакетов
  • Solium, инструмент статического анализа кода на Solidity

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

Вдобавок, по этой ссылке вы можете найти подборку каналов в Gitter, где можно получить помощь в разработке и развертывании: http://help.eth.guide.

Итоги Главы 8

В этой главе вы узнали о видах контрактов, для написания которых может пригодиться Ethereum, а также об их развертывании. Также были раскрыты способы, при помощи которых смарт-контракты могут обмениваться данными с фронтендом приложения.

Разработка dapps для Ethereum – непростой процесс, но он становится все более и более доступным с каждым днем. Подпишитесь на каналы Gitter или присоединитесь к своим местным сообществам разработчиков. На момент написания книги в 450 митапах, посвященных Ethereum, приняло участие 81424 участников и 2257 заинтересованных людей по всему миру – в 218 городах и 57 странах. Чтобы найти митапы, проводимые рядом с вами, поищите на Meetup (www.meetup.com).

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

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: