Создание смарт-контрактов Solidity для блокчейна Ethereum. Практическое руководство

Александр Вячеславович Фролов, 2019

Эта книга поможет быстро приступить к созданию смарт-контактов Solidity и распределенных приложений DApp для блокчейна Ethereum. Она состоит из 12 уроков с практическими заданиями. Выполнив их, читатель сможет создавать собственные локальные узлы Ethereum, публиковать смарт-контракты и вызывать их методы, обмениваться данными между реальным миром и смарт-контрактами с помощью оракулов, работать с сетью Rinkeby. Книга адресована всем, кто интересуется передовыми технологиями в области блокчейнов и хочет быстро получить знания, позволяющие заниматься интересной и перспективной работой.

Оглавление

* * *

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

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

Урок 2. Подготовка рабочей среды в ОС Ubuntu и Debian

Цель урока: создать узел собственного приватного блокчейна Ethereum для дальнейшей работы в рамках этого курса на сервере Ubuntu и Debian.

Практические задания: установка операционной системы Ubuntu и Debian, установка ПО geth, обеспечивающего работу узла нашего блокчейна, а также демона децентрализованного хранилища данных swarm. Вам будет нужно создать собственный приватный блокчейн Ethereum, выполнить его инициализацию. Подключившись к узлу блокчейна, вы научитесь выдавать простейшие команды в приглашении geth.

Прежде чем мы займемся изучением смарт-контрактов Ethereum, нам необходимо подготовить рабочую среду — установить операционную систему (ОС) и необходимое программное обеспечение (ПО).

Мы могли бы приступить к работе сразу в какой-либо интегрированной среде разработки (IDE, Integrated Development Environment), например, Remix или Truffle. Возможно, это был бы самый быстрый путь к изучению смарт-контрактов Solidity. Однако для того, чтобы глубже разобраться в том, как работает Ethereum, мы начнем с базовых инструментов.

Выбор операционной системы

Свой первый узел сети Ethereum мы будем делать на базе клиента Go Ethereum (https://geth.ethereum.org/). Это ПО представляет собой реализацию протокола Ethereum и реализовано на языке программирования Go и доступно в виде программы Geth. На базе Geth можно создать полнофункциональный узел сети Ethereum.

Для работы с узлом Geth можно использовать интерфейс командной строки, а также программный интерфейс (API, Application Programming Interface) JSON RPC. Используя этот интерфейс и различные фреймворки, вы сможете создавать ПО, работающее с узлами Ethereum, практически на всех современных языках программирования.

Клиент Geth может работать на платформах, где имеется Go (это, например, Linux, Mac OSX, Windows, Raspberry Pi, Android OS, iOS). На странице загрузки https://geth.ethereum.org/downloads/ доступны реализации для Linux, macOS и Windows. Также вы можете загрузить исходные коды Geth.

При работе над книгой мы использовали OC Ubuntu Live Server 18.04.2, Ubuntu 18.10 cosmic, Debian версий 9 и 10 Alfa 5, хотя Geth можно установить и на другие сборки Linux. На следующем уроке мы выполним установку Geth на OC Rasberian для микрокомпьютера Raspberry Pi 3.

Для изучения Ethereum можно арендовать виртуальный или облачный сервер у одного из провайдеров. Также вы можете установить эти ОС на свой настольный компьютер, непосредственно на его диск или на виртуальную машину, например, VMware Workstation, или воспользоваться другой системой виртуализации.

Описание процесса установки Ubuntu и Debian выходит за рамки нашей книги, но в интернете есть немало достаточно подробных руководств, посвященных этому вопросу. Кроме того, при аренде виртуального или облачного сервера провайдер обязательно поможет установить на него ОС. Учтите, что вам нужна 64-разрядная версия ОС Ubuntu и Debian.

Для работы над книгой мы использовали облачный виртуальный сервер в следующей конфигурации:

• 4 ядра CPU с тактовой частотой 2 GHz;

• 2 GB RAM;

• 20 GB Disk SSD.

Мы также установили OC Ubuntu 18.10 cosmic в виртуальную машину VMware Workstation с такой конфигурацией:

• 8 ядер CPU с тактовой частотой 2 GHz;

• 8 GB RAM;

• 100 GB Disk SATA.

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

Для микрокомпьютеров Raspberri Pi, где памяти меньше, есть решение, о котором мы расскажем на следующем уроке.

Сразу после установки ОС Ubuntu или Debian обновите пакеты при помощи команды apt-get:

$ sudo apt-get update

$ sudo apt-get upgrade

Если в Ubuntu Server обновилось ядро, может потребоваться перезагрузка ОС. Сообщение об этом вы увидите при подключении к консоли:

*** System restart required ***

В этом случае перед продолжением работы выполните перезагрузку:

$ sudo shutdown — r now

Пакеты Ubuntu можно также обновлять также через менеджер обновлений в графическом интерфейсе.

Обновление пакетов нужно делать с правами пользователя root.

Установка необходимых утилит

В ОС Ubuntu установите сервис ssh, если вы планируете подключаться к консоли удаленно (по умолчанию в десктопной версии сервис ssh не устанавливается, при установке Ubuntu Live Server нужно отметить соответствующий флажок).

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

Вы также можете создать пользователя book уже после установки Ubuntu. В этом случае при помощи команды visudo добавьте этому пользователю возможность работать с командой sudo. Для этого запустите с правами пользователя root такую команду:

# visudo

Откроется редактор файла /etc/sudoers. Вам нужно добавить в конец этого файла следующую строку:

book ALL=(ALL) ALL

Для установки сервиса ssh введите следующую команду:

$ sudo apt-get install ssh

Далее в Ubuntu и Debian установите редактор vim (если вам удобно в нем работать), утилиты sudo (если она не установлена), git, curl, gcc и mc (mc устанавливать не обязательно, пригодится, если только вы привыкли работать с Midnight Commander):

$ sudo apt-get install vim sudo git curl gcc mc

Для того чтобы обезопасить ваш сервер от атак типа брутфорса (перебор паролей) на порт SSH, установите fail2ban:

$ sudo apt-get install fail2ban

Мы настоятельно рекомендуем использовать эту утилиту в рабочем окружении вместе с брандмауэром.

Установка Geth и Swarm в Ubuntu

Далее мы перейдем к установке Geth, а также ПО узла распределенного хранилища данных Swarm (потребуется позже, на 10 уроке).

Проще всего установить Geth в ОС Ubuntu. Процедура описана здесь: https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu.

Для установки выполните следующие команды:

$ sudo apt-get install software-properties-common

$ apt-get install build-essential

$ sudo add-apt-repository — y ppa:ethereum/ethereum

$ sudo apt-get update

$ sudo apt-get install ethereum

Вы также можете установить девелоперскую (нестабильную версию Geth), для чего выполните такую команду:

$ sudo apt-get install ethereum-unstable

После установки проверьте версию Geth:

$ geth version

Geth

Version: 1.8.23-stable

Git Commit: c942700427557e3ff6de3aaf6b916e2f056c1ec2

Architecture: amd64

Protocol Versions: [63 62]

Network Id: 1

Go Version: go1.10.4

Operating System: linux

GOPATH=

GOROOT=/usr/lib/go-1.10

Как видите, здесь мы установили Geth стабильной версии 1.8.23 и Go версии 1.10.4.

Для установки распределенного хранилища данных Swarm на локальный тестовый узел используйте следующую команду:

$ sudo apt-get install ethereum-swarm

После установки проверьте версию Swarm:

$ swarm version

Swarm

Version: 0.3.11-stable

Git Commit: c942700427557e3ff6de3aaf6b916e2f056c1ec2

Go Version: go1.10.4

OS: linux

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

В том случае, когда при установке произошли ошибки, попробуйте найти решение в поисковой системе Google. Заметим, что ошибки часто связаны с обновлением версий устанавливаемого ПО.

Установка Geth и Swarm в Debian

Установку Geth и Swarm в ОС Debian нужно выполнять из исходных текстов. При этом вначале нужно будет установить Go, а затем уже собственно Geth и Swarm.

На момент создания нашей книги была доступна версия Go 1.12.1. Заметим, что Geth и Swarm находятся в состоянии постоянного совершенствования. Не исключено, что к моменту, когда вы начнете работу над этой книгой, для них придется устанавливать новую версию Go.

Предварительная подготовка

Прежде всего обновите пакеты и установите необходимые утилиты:

$ sudo apt-get update

$ sudo apt-get upgrade

$ apt-get install vim sudo git curl gcc mc

Если вы при установке ОС не добавили пользователю book возможность работы с командой sudo, сделайте это аналогично тому, как это было описано ранее для Ubuntu.

После этого можно переходить к установке Go и Geth.

Загрузка дистрибутива Go

Дистрибутивы Go различных версий и для различных платформ можно найти здесь: https://golang.org/dl/.

Прежде всего подключимся к нашему серверу (физическому или виртуальному) пользователем book и загрузим архив Go нужной версии:

$ curl — O https://dl.google.com/go/go1.12.1.linux-amd64.tar.gz

Теперь, находясь в консоли с правами пользователя book, распаковываем загруженный архив в каталог /usr/local:

$ sudo tar — C /usr/local — xzf go1.12.1.linux-amd64.tar.gz

У вас будет запрошен пароль пользователя book. Команда sudo необходима, так как обычному пользователю запрещена запись файлов в каталог /usr/local.

Установка переменных окружения

Далее мы создаем в домашнем каталоге пользователя book каталог go и устанавливаем переменные окружения:

$ mkdir — p ~/go; echo"export GOPATH=$HOME/go">> ~/.bashrc

$ echo"export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin">> ~/.bashrc

$ source ~/.bashrc

Проверяем, что переменные окружения установлены:

$ printenv grep go

GOPATH=/root/go

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/go/bin:/usr/local/go/bin

Проверка версии Go

Прежде чем перейти собственно к установке Geth и Swarm, нужно проверить версию go:

$ go version

go version go1.12.1 linux/amd64

Если у вас версия 1.12.1, то все нормально. Но если ранее по каким-то причинам на вашем сервере была установлена старая версия go из репозитория, удаляем ее так:

sudo apt-get remove golang-go

sudo apt-get remove — auto-remove golang-go

Установка Geth и Swarm

Первым шагом загрузите исходный код Geth из репозитория на GitHub:

$ mkdir — p $GOPATH/src/github.com/ethereum

$ cd $GOPATH/src/github.com/ethereum

$ git clone https://github.com/ethereum/go-ethereum

$ cd go-ethereum

$ git checkout master

$ go get github.com/ethereum/go-ethereum

Далее запустите компиляцию клиента Geth и Swarm:

go install — v./cmd/geth

go install — v./cmd/swarm

Если при компиляции появились ошибки, попробуйте установить Go другой версии. Перед этим удалите все каталоги, созданные в процессе предыдущей установки.

Если же все хорошо, то осталось только проверить версию установленной Geth и Swarm:

$ geth version

Geth

Version: 1.9.0-unstable

Architecture: amd64

Protocol Versions: [63 62]

Network Id: 1

Go Version: go1.12.1

Operating System: linux

GOPATH=/home/book/go

GOROOT=/usr/local/go

$ swarm version

Swarm

Version: 0.3.12-unstable

Go Version: go1.12.1

OS: linux

Как видите, были установлены нестабильные версии Geth и Swarm. С помощью whereis вы можете определить, в какой каталог была выполнена установка:

$ whereis geth

geth: /home/book/go/bin/geth

Чтобы установить стабильную версию, загрузите ее бинарный код с сайта https://geth.ethereum.org/downloads/. Затем извлеките из архива программу geth и скопируйте в отдельный каталог.

Актуальную инструкцию по установке Geth и Swarm можно найти по адресу https://media.readthedocs.org/pdf/swarm-guide/latest/swarm-guide.pdf.

Создаем приватный блокчейн

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

Готовим файл genesis.json

Прежде всего создайте в домашнем каталоге пользователя book файл genesis.json (листинг 2.1.).

Листинг 2.1. Файл genesis.json

{

"config": {

"chainId": 1999,

"homesteadBlock": 0,

"eip155Block": 0,

"eip158Block": 0

},

"difficulty":"10",

"gasLimit":"5100000",

"alloc": {}

}

Этот файл описывает первичный блок (genesis block) цепочки блоков — самый первый блок блокчейна. Так как мы создаем наш приватный блокчейн, то и о первом блоке мы должны позаботиться сами.

Хорошее описание первичного блока сети Ethereum можно найти, например, здесь: https://arvanaghi.com/blog/explaining-the-genesis-block-in-ethereum/.

Блок config файла genesis.json содержит переменные конфигурации сети Ethereum.

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

Если речь идет о главной сети Ethereum, то ее идентификатор равен 1. Идентификатор тестовой сети Rinkeby равен 4. При создании нашей приватной сети мы можем указать любое значение, отличное от известных. Мы выбрали значение 1999.

Значение 0 в поле homesteadBlock указывает на то, что мы будем использовать релиз сети Ethereum под названием Homestead. Homestead представляет собой второй релиз сети Ethereum (первый релиз назывался Frontier). Нулевое значение этого параметра используется и в основной сети Ethereum.

Немного о параметрах с префиксом EIP. При реализации Homestead был обновлен протокол, причем без обратной совместимости с предыдущим релизом Ethereum. Соответствующие изменения отражены в документах «Предложения по улучшению Ethereum» (Ethereum Improvement Proposals, EIPs), опубликованных на сайте https://eips.ethereum.org/.

Реализация изменений может потребовать выполнения так называемой процедуры хардфорка (hard-forking), или обновления ПО узлов. В результате этой процедуры может меняться структура блока, появляется возможность использовать ранее недоступные блоки и вносить различные изменения в протокол.

Так как мы не будем делать хардфорк, то установим значения соответствующих параметров eip155Block и eip158Block равными нулю.

Параметр difficulty важен для нас в практическом смысле. Этот параметр имеет прямое влияние на время генерации новых блоков блокчейна. Для нашего «учебного» блокчейна мы установим очень маленькое значение этого параметра, равное 10, чтобы скорость добавления новых блоков была приемлемой даже на виртуальных серверах небольшой производительности.

С помощью параметра gasLimit мы задаем в рамках блокчейна предел расхода так называемого газа (Gas). Газ Ethereum представляет собой расходный ресурс, который тратится на выполнение таких операций, как отправка транзакций, публикация и выполнение контрактов и т.п. Далее мы расскажем об этом подробнее. В нашей приватной тестовой сети мы устанавливаем достаточно большое значение, чтобы не возникали ограничения при запуске тестовых программ.

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

Создаем каталог для работы

Создайте в домашнем каталоге подкаталог node1:

$ mkdir node1

В этом каталоге будут располагаться данные блокчейна.

Создаем аккаунт

Теперь перейдем к созданию нашего приватного блокчейна. Прежде всего войдите в домашний каталог пользователя book и создайте новый аккаунт:

$ geth — datadir node1 account new

При создании аккаунта будет запрошен пароль, который нужно сохранить в безопасном месте:

INFO [02-13 08:42:28.798] Maximum peer count ETH=25 LES=0 total=25

Your new account is locked with a password. Please give a password. Do not forget this password.

Passphrase:

Repeat passphrase:

Address: { 4f744742ac711fd111c7a983176db1d48d29f413 }

Команда account new выведет на консоль в фигурных скобках так называемый адрес узла. В нашем случае это адрес 4f744742ac711fd111c7a983176db1d48d29f413. Мы будем указывать его в различных командах.

Параметр datadir команды geth указывает путь к рабочему каталогу. Мы используем каталог /home/book/node1.

Запускаем инициализацию узла

После создания аккаунта нам нужно выполнить инициализацию узла, выполняем ее из домашнего каталога пользователя book:

$ geth — datadir node1 init genesis.json

Здесь мы с помощью параметра datadir должны указать путь к рабочему каталогу, а в параметре init — путь к файлу первичного блока genesis.json.

Команда выполнит инициализацию и выведет на консоль результаты своей работы:

INFO [02-13 08:43:53.934] Maximum peer count ETH=25 LES=0 total=25

INFO [02-13 08:43:53.936] Allocated cache and file handles database=/home/book/node1/geth/chaindata cache=16 handles=16

INFO [02-13 08:43:53.950] Writing custom genesis block

INFO [02-13 08:43:53.950] Persisted trie from memory database nodes=0 size=0.00B time=28.058µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [02-13 08:43:53.951] Successfully wrote genesis state database=chaindata hash=a5e5bc…3f490e

INFO [02-13 08:43:53.951] Allocated cache and file handles database=/home/book/node1/geth/lightchaindata cache=16 handles=16

INFO [02-13 08:43:53.955] Writing custom genesis block

INFO [02-13 08:43:53.955] Persisted trie from memory database nodes=0 size=0.00B time=1.778µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [02-13 08:43:53.956] Successfully wrote genesis state database=lightchaindata hash=a5e5bc…3f490e

Для работы с узлом вам нужно будет открыть две консоли, подключившись в каждой консоли пользователем book.

Чтобы запустить узел, выполните в первой консоли следующую команду:

$ geth — etherbase"0x4f744742ac711fd111c7a983176db1d48d29f413"–datadir node1 — nodiscover — mine — minerthreads 1 — maxpeers 0 — verbosity 3 — networkid 98760 — rpc — rpcapi="db,eth,net,web3,personal,web3"console

В качестве параметра — etherbase нужно ввести адрес узла, полученный при первоначальном создании аккаунта.

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

INFO [02-13 08:51:16.647] Maximum peer count ETH=0 LES=0 total=0

INFO [02-13 08:51:16.649] Starting peer-to-peer node instance=Geth/v1.8.22-stable-7fa3509e/linux-amd64/go1.10.4

INFO [02-13 08:51:16.649] Allocated cache and file handles database=/home/book/node1/geth/chaindata cache=512 handles=524288

INFO [02-13 08:51:16.662] Initialised chain configuration config="{ChainID: 1999 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Constantinople: <nil> ConstantinopleFix: <nil> Engine: unknown}"

INFO [02-13 08:51:16.663] Disk storage enabled for ethash caches dir=/home/book/node1/geth/ethash count=3

INFO [02-13 08:51:16.663] Disk storage enabled for ethash DAGs dir=/home/book/.ethash count=2

INFO [02-13 08:51:16.663] Initialising Ethereum protocol versions="[63 62]"network=98760

INFO [02-13 08:51:16.724] Loaded most recent local header number=0 hash=a5e5bc…3f490e td=10 age=49y10mo16h

INFO [02-13 08:51:16.724] Loaded most recent local full block number=0 hash=a5e5bc…3f490e td=10 age=49y10mo16h

INFO [02-13 08:51:16.724] Loaded most recent local fast block number=0 hash=a5e5bc…3f490e td=10 age=49y10mo16h

INFO [02-13 08:51:16.724] Loaded local transaction journal transactions=0 dropped=0

INFO [02-13 08:51:16.725] Regenerated local transaction journal transactions=0 accounts=0

INFO [02-13 08:51:16.732] New local node record seq=3 id=eae4aa1f2059eed4 ip=127.0.0.1 udp=0 tcp=30303

INFO [02-13 08:51:16.732] Started P2P networking self="enode://5ac26687728e3e3f4575e5e8feab33748bbc467951e1841b2063cc201dcb6ed4e9b9e26ca322fc935cc5b6b042ebbb6126f5bd7d6cf6903c1e19600cf7f6c8b5@127.0.0.1:30303?discport=0"

INFO [02-13 08:51:16.732] IPC endpoint opened url=/home/book/node1/geth.ipc

INFO [02-13 08:51:16.733] HTTP endpoint opened url=http://127.0.0.1:8545 cors= vhosts=localhost

INFO [02-13 08:51:16.733] Transaction pool price threshold updated price=1000000000

INFO [02-13 08:51:16.733] Updated mining threads threads=1

INFO [02-13 08:51:16.733] Transaction pool price threshold updated price=1000000000

INFO [02-13 08:51:16.734] Commit new mining work number=1 sealhash=5c4116…c8c1bf uncles=0 txs=0 gas=0 fees=0 elapsed=562.141µs

INFO [02-13 08:51:16.779] Mapped network port proto=tcp extport=30303 intport=30303 interface=NAT-PMP(192.168.0.1)

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.22-stable-7fa3509e/linux-amd64/go1.10.4

coinbase: 0x4f744742ac711fd111c7a983176db1d48d29f413

at block: 0 (Wed, 31 Dec 1969 16:00:00 PST)

datadir: /home/book/node1

modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> INFO [02-13 08:51:18.459] Generating DAG in progress epoch=0 percentage=0 elapsed=983.779ms

INFO [02-13 08:51:19.420] Generating DAG in progress epoch=0 percentage=1 elapsed=1.944s

INFO [02-13 08:51:20.395] Generating DAG in progress epoch=0 percentage=2 elapsed=2.919s

INFO [02-13 08:51:21.440] Generating DAG in progress epoch=0 percentage=3 elapsed=3.963s

INFO [02-13 08:55:56.193] Successfully sealed new block number=46 sealhash=fccbc1…5cc27f hash=776967…3700c9 elapsed=7.306s

INFO [02-13 08:55:56.193] block reached canonical chain number=39 hash=9c6ba7…c95452

INFO [02-13 08:55:56.193] mined potential block number=46 hash=776967…3700c9

INFO [02-13 08:55:56.193] Commit new mining work number=47 sealhash=41558f…3ef931 uncles=0 txs=0 gas=0 fees=0 elapsed=97.707µs

> [1;5FINFO [02-13 08:56:01.030] Successfully sealed new block number=47 sealhash=41558f…3ef931 hash=f67a9b…773bfd elapsed=4.837s

INFO [02-13 08:56:01.030] block reached canonical chain number=40 hash=3a6600…bde7e0

INFO [02-13 08:56:01.030] mined potential block number=47 hash=f67a9b…773bfd

INFO [02-13 08:56:01.030] Commit new mining work number=48 sealhash=d4ab02…7151c7 uncles=0 txs=0 gas=0 fees=0 elapsed=97.374µs

В зависимости от производительности вашего виртуального или физического сервера генерация файла DAG может занять несколько минут или дольше.

Файл DAG содержит направленный ациклический граф (Directed Acyclic Graph). Он используется для добавления блоков в Ethereum с помощью алгоритма с названием Ethash. Его размер может составлять более 1 Гбайта. Размер этого блока увеличивается по мере роста сети Ethereum. Текущий размер блока можно узнать, например, на сайте https://investoon.com/tools/dag_size. На момент создания этого учебного курса файл DAG для основной сети Ethereum был размером 2.95 Гбайт.

Чем больше файл DAG, тем труднее выполнить майнинг. Если для майнинга используются видеокарты, то данные DAG должны полностью поместиться в память видеокарты, иначе применение видеокарты для майнинга будет бесполезным.

Так как запуск узла вы будете выполнять часто, рекомендуем подготовить пакетный файл для запуска с именем, например, start_node.sh (листинг 2.2.).

Листинг 2.2. Файл start_node.sh

geth — etherbase"0x4f744742ac711fd111c7a983176db1d48d29f413"–datadir node1 — nodiscover — mine — minerthreads 1 — maxpeers 0 — verbosity 3 — networkid 98760 — rpc — rpcapi="db,eth,net,web3,personal,web3"console

Параметры запуска узла

Расскажем о параметрах geth, которые мы использовали при запуске узла. Эти параметры были выбраны исходя из назначения нашего узла — мы создаем узел для учебной приватной сети Ethereum. Когда вы будете создавать узел для работы с тестовой сетью Rinkeby или с основной сетью Ethereum, нужно будет указывать другие параметры.

Чтобы получить краткую справку по всем командам и параметрам geth, запустите ее следующим образом:

$ geth — h

С параметром datadir, который указывает путь к каталогу блокчейна, вы уже знакомы. При запуске узла укажите тот же каталог, что мы использовали при инициализации приватного блокчейна.

Параметр etherbase задает публичный адрес, на который будет отправлено вознаграждение за майнинг.

Параметр nodiscover отключает поиск других узлов сети. Мы указали его, так как пока будем работать только с одним узлом блокчейна.

Мы также указали значение параметра maxpeers, равное нулю. Таким способом мы фактически отключили обмен по сети между узлами нашего блокчейна.

С помощью параметра mine мы запускаем так называемый майнинг — процесс создания новых блоков в нашем блокчейне. Это необходимо, так как без появления новых блоков выполнение транзакций и публикация смарт-контрактов будут невозможны.

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

Очень важный параметр — networkid. Это идентификатор сети. Здесь мы должны указать уникальный идентификатор 98760 нашего приватного блокчейна.

Параметр verbosity задает детализацию журнала:

• 0 — не записывать данные в журнал;

• 1 — записывать сообщения об ошибках;

• 2 — записывать предупреждающие сообщения;

• 3 — записывать информационные сообщения;

• 4 — записывать отладочную информацию;

• 5 — записывать детальную информацию.

По умолчанию используется значение 3.

Так как мы будем работать с узлом с помощью протокола JSON RPC, нам необходимо включить такую возможность, указав параметр rpc. Дополнительно с помощью параметра rpcapi мы перечисляем, какие программные интерфейсы должен предоставить нам узел. Здесь мы указали такой набор: db, eth, net, web3, personal, web3. Подробнее об этом мы расскажем позже.

При запуске geth мы указываем команду console. Эта команда запускает интерактивную консоль JavaScript, где мы сможем выдавать команды.

Подключаемся к нашему узлу

Теперь откройте вторую консоль и введите в ней следующую команду:

$ geth — datadir node1 — networkid 98760 attach ipc://home/book/node1/geth.ipc

Эта команда откроет консоль geth и подключится к вашему приватному узлу.

Здесь необходимо указать те же значения параметров datadir и networked, что и при запуске узла. Команда attach подключается к узлу, адрес которого задан после нее, и запускает интерактивную консоль JavaScript. В адресе нам нужно указать полный путь к рабочему каталогу нашего приватного блокчейна.

Запишите команду подключения в файл attach_node.sh для удобства (листинг 2.3.).

Листинг 2.3. Файл attach_node.sh

geth — datadir node1 — networkid 98760 attach ipc://home/book/node1/geth.ipc

Теперь запустите этот файл, и вы увидите приглашение консоли geth:

$ sh attach_node.sh

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.22-stable-7fa3509e/linux-amd64/go1.10.4

coinbase: 0x3cd46aab0631305437842cf639218e41ce946baa

at block: 379 (Wed, 13 Feb 2019 09:12:48 PST)

datadir: /home/book/node1

modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

Введите в этом приглашении команду web3.eth.accounts:

> web3.eth.accounts

["0x4f744742ac711fd111c7a983176db1d48d29f413"]

Вы увидите идентификатор (адрес) аккаунта, который мы создали ранее, указав для него пароль. У вас этот идентификатор будет другой.

Попробуйте также ввести команду web3.version. Эта команда позволяет посмотреть версию фреймворка Web3, с помощью которого мы будем работать с контрактами, версию geth, а также номер сети. Мы задали номер нашей приветной сети, равный 98760.

Для стабильного релиза Geth версии 1.8.22 на консоль будет выведено сообщение:

> web3.version

{

api:"0.20.1",

ethereum:"0x3f",

network:"98760",

node:"Geth/v1.8.22-stable-7fa3509e/linux-amd64/go1.10.4",

whisper: undefined,

getEthereum: function(callback),

getNetwork: function(callback),

getNode: function(callback),

getWhisper: function(callback)

}

Использование нестабильной версии Geth будет отмечено в поле node:

> web3.version

{

api:"0.20.1",

ethereum:"0x3f",

network:"98760",

node:"Geth/v1.8.11-unstable/linux-amd64/go1.9.6",

whisper: undefined,

getEthereum: function(callback),

getNetwork: function(callback),

getNode: function(callback),

getWhisper: function(callback)

}

Управление майнингом и проверка баланса

При запуске узла мы автоматически запускаем майнинг. Текущий баланс вы можете проверить при помощи следующей команды:

> web3.fromWei( eth.getBalance(eth.coinbase) )

0

Позже мы опишем экономику Ethereum и эти команды детальнее.

Сразу после инициализации сети баланс нашего аккаунта равен нулю. Однако по мере того, как будут «добыты» новые блоки, баланс будет расти:

> web3.fromWei( eth.getBalance(eth.coinbase) )

15

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

INFO [02-13 09:37:10.577] block reached canonical chain number=45 hash=924ce1…d8b5a2

INFO [02-13 09:37:10.577] mined potential block number=52 hash=a80a36…153593

INFO [02-13 09:37:10.577] Commit new mining work number=53 sealhash=3acb6c…0ecd19 uncles=0 txs=0 gas=0 fees=0 elapsed=130.557µs

INFO [02-13 09:37:11.223] Successfully sealed new block number=53 sealhash=3acb6c…0ecd19 hash=14e0fa…575494 elapsed=645.999ms

INFO [02-13 09:37:11.223] block reached canonical chain number=46 hash=c5ff7a…da8069

INFO [02-13 09:37:11.224] mined potential block number=53 hash=14e0fa…575494

INFO [02-13 09:37:11.224] Commit new mining work number=54 sealhash=96235b…f3fc50 uncles=0 txs=0 gas=0 fees=0 elapsed=124.053µs

INFO [02-13 09:37:11.723] Successfully sealed new block number=54 sealhash=96235b…f3fc50 hash=e5438e…2f6f2e elapsed=498.975ms

С помощью команд miner.start и miner.stop можно запускать и останавливать майнинг.

При ручном запуске майнинга нужно указать количество потоков для поиска новых блоков:

> miner.start(4)

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

Заметим, что при отладке смарт-контрактов процесс майнинга останавливать не нужно, иначе ваш узел не сможет обрабатывать транзакции, публиковать контракты и вызывать методы контрактов. Тем не менее, вы всегда сможете остановить майнинг с помощью такой команды:

> miner.stop()

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

Завершение работы консоли Geth

Для завершения работы Geth введите в приглашении команду exit:

> exit

Итоги урока

На втором уроке вы подготовили рабочую среду, необходимую для дальнейшего изучения Ethereum и смарт-контрактов Solidity. Вы создали сервер с ОС Ubuntu или Debian, установили Go, Geth и программу распределенного хранилища данных Swarm.

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

Оглавление

* * *

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

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

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

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