Ethereum: работа с сетью, смарт-контракты и распределенные приложения

Алексей Бурков, 2020

В представленном учебнике рассматривается создание смарт-контрактов для блокчейн-сети Ethereum на языке программирования Solidity в операционной системе Windows. Мы также опишем развертывание окружения для создания и тестирования смарт-контрактов и децентрализованных приложений (DApps). Более того, в завершение курса мы создадим свою собственную блокчейн-сеть. Данный учебный курс создан на базе ООО «Лаборатория цифровой трансформации» при поддержке ООО «Цифровые технологии».

Оглавление

* * *

Приведённый ознакомительный фрагмент книги Ethereum: работа с сетью, смарт-контракты и распределенные приложения предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Неделя № 2. Создание и тестирование простейших смарт-контрактов

Введение

В этой неделе мы рассмотрим состав проекта языка программирования смарт-контрактов Solidity [8], [9], создание и управление проектом, ознакомимся с основами синтаксиса языка Solidity и структурой смарт-контракта, а также разберем создание и запуск простейших смарт-контрактов.

Урок 1. Структура проекта Solidity в VS Code

Аннотация. В данном уроке мы рассмотрим файловую структуру проекта языка программирования смарт-контрактов Solidity. Будут рассмотрены все папки и файлы, входящие в проект, и описано их назначение.

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

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

Перед тем как создавать смарт-контракты, нам необходимо создать проект в Truffle. Проект — это набор файлов и папок, необходимый для создания, публикации и выполнения смарт-контрактов. Давайте рассмотрим структуру проекта MetaCoin, который мы создали в предыдущих уроках.

Запустите VS Code и откройте проект MetaCoin. Для этого в окне VS Code на панели Explorer нажмите кнопку Open Folder (рис. 2.1.1).

Рис. 2.1.1

Появится окно выбора папки с проектом (рис. 2.1.2).

Рис. 2.1.2

Выберите папку «MetaCoin» и нажмите кнопку «Выбор папки».

Замечание. По умолчанию VS Code создает проекты в папке «Документы / VS Code».

После открытия проекта MetaCoin окно VS Code примет вид как на рис. 2.1.3.

Рис. 2.1.3

На панели EXPLORER мы видим файловую структуру проекта MetaCoin. Давайте рассмотрим структуру подробнее. Проект содержит четыре папки: build, contracts, migrations и test. Рассмотрим назначение этих папок.

Для начала рассмотрим папку contracts. Это самая главная папка проекта, в ней находятся файлы с кодом наших смарт-контрактов. Это файлы с расширением sol. В нашем случае в проекте MetaCoin в данной папке мы видим три файла: ConvertLib.sol, MetaCoin.sol и Migrations.sol. Хотелось бы отметить файл Migrations.sol (рис. 2.1.4).

Рис. 2.1.4

Этот файл предназначен для публикации других смарт-контрактов проекта в сети Ethereum. Изменять файл Migrations.sol не рекомендуется. Остальные два файла реализуют логику проекта.

Теперь перейдем к папке build. В папке build располагаются файлы с расширением json — это откомпилированные в формат json смарт-контракты. Их компиляция была рассмотрена в предыдущих уроках. Они содержат бинарный код смарт-контракта, который понимает сеть Ethereum, а также входные и выходные параметры, необходимые для запуска смарт-контракта (рис. 2.1.5).

Рис. 2.1.5

Папка migrations содержит js-файлы (файлы в формате JavaScript). Они предназначены для публикации смарт-контрактов проекта в сеть Ethereum. Все файлы в папке migrations должны начинаться с цифры. Первым файлом должен быть файл 1_initial_migrations.js (рис. 2.1.6).

Рис. 2.1.6

Этот файл публикует в сети файл Migration.json, который инициирует публикацию других смарт-контрактов проекта. Второй js-файл предназначен для публикации остальных двух смарт-контрактов (рис. 2.1.7).

Рис. 2.1.7.

Замечание. В представленном на рис. 2.1.6 файле осуществляется публикация сразу двух смарт-контрактов. Однако для упрощения понимания проекта рекомендуется создавать отдельный публикационный js-файл для каждого смарт-контракта. Поэтому так мы будем поступать в наших проектах позже.

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

Рис. 2.1.8

Файл с расширением js — это файл, который содержит код на языке JavaScript. Он предназначен для выполнения тестового смарт-контракта фреймворком Truffle (рис. 2.1.9).

Рис. 2.1.9

В заключение урока кроме четырех рассмотренных выше папок в проекте можно заметить еще два файла — truffle-config.js и LICENSE. Файл truffle-config.js мы рассматривали в предыдущих уроках. Он предназначен для подключения проекта к серверу сети Ethereum или к эмулятору сети, например Ganache. Файл LICENSE — это обычный текстовый файл с лицензионным соглашением фреймворка Truffle (рис. 2.1.10).

Рис. 2.1.10

Замечание. В проекте также можно заметить файлы с именем.placeholder. Это служебные файлы для системы управления версиями Git. Эти файлы можно удалить.

На этом мы заканчиваем рассмотрение файловой структуры проекта Solidity и переходим к созданию нашего проекта для создания простых смарт-контрактов. Проект MetaCoin можно закрыть, выбрав в оконном меню VS Code пункт File / Close Folder.

Урок 2. Создание нового проекта Solidity

Аннотация. В уроке рассматривается создание нового проекта на языке программирования Solidity с помощью фреймворка Truffle.

Создадим новый проект на языке программирования Solidity с помощью фреймворка Truffle. Для начала нам необходимо создать папку, где будет располагаться наш проект. Советуем создать папку проекта в папке «Документы / VS Code». Давайте назовем наш проект SimpleContracts, поскольку он будет содержать простейшие смарт-контракты. Поэтому создайте одноименную папку (рис. 2.2.1).

Рис. 2.2.1

Откройте созданную папку SimpleContracts, как открывали папку MetaCoin в предыдущем уроке. Мы видим, что папка пуста (рис. 2.2.2).

Рис. 2.2.2

Теперь, используя фреймворк Truffle, создадим в этой папке файловую структуру нового проекта Solidity. Откройте терминал, выбрав в оконном меню пункт Terminal / New Terminal. Для создания нового проекта в терминале наберите команду «truffle init» и нажмите клавишу Enter (рис. 2.2.3).

Рис. 2.2.3

Терминал примет вид как на рис. 2.2.4.

Рис. 2.2.4

На панели EXPLORER появилась рассмотренная в предыдущем уроке файловая структура проекта (рис. 2.2.5).

Рис. 2.2.5

Обратите внимание на то, что новый проект состоит только из трех файлов: Migrations.sol, 1_initial_migration.js и truffle-config.js. Файлы Migrations.sol, 1_initial_migration.js полностью самодостаточны, нам их изменять не нужно. Файл truffle-config.js будет необходим при запуске нашего смарт-контракта. Поэтому его настройку мы рассмотрим позднее, в уроке, посвященному запуску смарт-контрактов.

Папка test пуста. На данном этапе нам пока рано заниматься глубокой отладкой наших простых смарт-контрактов. Поэтому пока оставим эту папку пустой.

Мы видим, что в нашем проекте отсутствует папка с откомпилированными контрактами build. Давайте создадим эту папку. Для этого нам необходимо просто откомпилировать все смарт-контракты проекта. В нашем случае это смарт-контракт Migrations.sol. Для компиляции всех смарт-контрактов проекта необходимо в терминале выполнить команду «truffle compile» (рис. 2.2.6).

Рис. 2.2.6

Терминал примет вид как на рис. 2.2.7.

Рис. 2.2.7

После выполнения в терминале команды «truffle compile» на панели EXPLORER появится папка build с откомпилированным файлом Migrations.json (рис. 2.2.8).

Рис. 2.2.8

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

Урок 3. Создаем наш первый смарт-контракт Hello World

Аннотация. Теперь давайте создадим наш первый смарт-контракт. По традиции пусть это будет «Hello World!!!», т. е. смарт-контракт будет выводить сообщение «Hello World!!!» [11].

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

Для создания нового смарт-контракта HelloWorld в терминале наберите команду «truffle create contract “HelloWorld”» и нажмите клавишу Enter (рис. 2.3.1).

Рис. 2.3.1

После выполнения команды в нашем проекте появится новый файл смарт-контракта HelloWorld.sol. Давайте рассмотрим его содержимое. Откройте смарт-контракт, щелкнув по нему на панели EXPLORER. Окно VS Code примет вид как на рис. 2.3.2.

Рис. 2.3.2

Здесь мы видим шаблон нового пустого смарт-контракта. Рассмотрим данный шаблон подробнее.

Замечание. Синтаксис языка Solidity очень похож на синтаксис таких языков программирования, как JavaScript и Java. Поэтому если вы знаете эти языки программирования, то вы без труда поймете код смарт-контрактов.

Из каких же частей состоит новый смарт-контракт? Первая строка «pragma solidity ^0.5.0;» задает версию языка программирования Solidity, которую мы используем. В нашем случае это версия 0.5.0. Так как язык программирования Solidity постоянно развивается, то со временем эта версия будет обновляться в сторону увеличения.

Далее мы видим строку «contract HelloWorld {» — это начало нашего смарт-контракта HelloWorld (рис. 2.3.3).

Замечание. Символ «{» показывает начало блока кода, а символ «}» в строке номер 7 показывает окончание блока кода, то есть начало и конец смарт-контракта HelloWorld. В языке Solidity блок кода группирует команды, и они рассматриваются как одна команда. В строках номер 4 и 6 данные символы обозначают начало и конец функции.

Рис. 2.3.3

Наш смарт-контракт содержит функцию sayHello. Она определяется командой «function sayHello() public pure returns (string memory)».

Команда function определяет функцию и имеет следующее строение:

• sayHello() — имя функции, наша функция не имеет входных параметров, поэтому область определения параметров пуста (). Позже мы рассмотрим функции с параметрами;

• public — это область видимости функции, означает, что мы можем использовать эту функцию в любом месте кода смарт-контракта;

• pure — определяет, что для выполнения нашего смарт-контракта не требуется эфир;

• returns (string memory) — показывает, что наша функция возвращает строку (HelloWorld — это string). Запись результата происходит в память, а не в блок, поэтому указываем параметр «memory».

Ну и наконец, рассмотрим содержимое нашей функции sayHello. Она состоит только из одной команды «return “Hello World!!!”;». Команда return выводит результат работы функции. В нашем случае это строка “Hello World!!!”. Строка заключается в кавычки. В языке Solidity любая команда заканчивается знаком «;» (рис. 2.3.3).

Замечание. Как мы можем видеть, язык программирования смарт-контрактов Solidity по синтаксису очень похож на языки программирования JavaScript и Java.

Теперь давайте откомпилируем наш смарт-контракт. Мы видим, что в коде нашего контракта отсутствуют подчеркнутые команды (рис. 2.3.3). Это говорит о том, что в коде отсутствуют ошибки и его можно компилировать. Для компиляции всего проекта в терминале выполните команду «truffle compile» (рис. 2.3.4).

Рис. 2.3.4

После компиляции проекта мы видим, что на панели EXPLORER в папке build появился откомпилированный смарт-контракт HelloWorld.json (рис. 2.3.5).

Рис. 2.3.5

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

Урок 4. Публикация смарт-контракта HelloWorld в эмуляторе блокчейн-сети Ganache

Аннотация. В данном уроке мы рассмотрим публикацию простейшего смарт-контракта в эмуляторе блокчейн-сети Ganache.

В предыдущей неделе мы рассматривали публикацию смарт-контракта MetaCoin в эмуляторе блокчейн-сети Ganache. Однако смарт-контракт MetaCoin был тестовым контрактом, он был развернут по заданному в truffle шаблону и не требовал создания js-файлов для публикации (они уже были созданы).

В нашем новом проекте SimpleContracts смарт-контракта HelloWorld был сгенерирован по шаблону нового пустого контракта и при этом не создавались js-файлы для его публикации. По умолчанию в новом проекте присутствует js-файл 1_initial_migration.js, который публикует смарт-контракт Migrations.sol, развертывающий все остальные контракты проекта. Рассмотрим файл 1_initial_migration.js более подробно (рис. 2.4.1).

Рис. 2.4.1

Выбрав файл 1_initial_migration.js на панели EXPLORER, мы увидим его содержимое (рис. 2.4.1). В первой строке командой const Migrations = artifacts.require(“Migrations”); создается константа, привязанная к публикуемому смарт-контракту. Такие константы называются артефактами. В нашем случае мы создали артефакт Migrations (код голубого цвета), привязанный к смарт-контракту Migrations, указанный без расширения sol (код коричневого цвета). Далее создается функция, публикующая наш артефакт, команда module.exports = function(deployer) {. Как вы поняли из предыдущих уроков, функция закрывается символом }; в строке 5. Внутри функции расположена команда deployer.deploy(Migrations);. Данная команда публикует наш артефакт Migrations и привязанный к нему смарт-контракт Migrations.sol.

Создадим js-файл для публикации нашего смарт-контракта. Чтобы не набирать код js-файла, просто скопируем файл 1_initial_migration.js. Для этого щелкните по файлу 1_initial_migration.js правой кнопкой мыши и в появившемся меню выберите Copy (рис. 2.4.2).

Рис. 2.4.2

Затем щелкните по папке migrations правой кнопкой мыши и в появившемся меню выберите Paste (рис. 2.4.3).

Рис. 2.4.3

В папке migrations появится файл 1_initial_migration copy.js (рис. 2.4.4).

Рис. 2.4.4

Переименуем новый файл в js-файл с именем 2_HelloWorld_migration.js. Напоминаем, что js-файлы для публикации смарт-контрактов должны начинаться с цифры. Для переименования файла щелкните правой кнопкой мыши и в появившемся меню выберите Rename (рис. 2.4.5).

Рис. 2.4.5

Введите имя файла 2_HelloWorld_migration и нажмите клавишу Enter. Папка migrations примет вид как на рис. 2.4.6.

Рис. 2.4.6

Откройте js-файл, щелкнув по нему. Внутри файл будет аналогом скопированного js-файла 1_initial_migration.js. Замените все Migrations на HelloWorld (код голубого и коричневого цвета). Содержимое файла 2_HelloWorld_migration.js станет как на рис. 2.4.7.

Рис. 2.4.7

Сохраните файл 2_HelloWorld_migration.js и запустите эмулятор блокчейн-сети Ganache. При запуске Ganache выберите вариант QUICKSTART.

Конец ознакомительного фрагмента.

Оглавление

* * *

Приведённый ознакомительный фрагмент книги Ethereum: работа с сетью, смарт-контракты и распределенные приложения предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Смотрите также

а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ э ю я