Kitabı oku: «Создание смарт-контрактов Solidity для блокчейна Ethereum. Практическое руководство», sayfa 3

Yazı tipi:

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

Расскажем о параметрах 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 и теперь готовы для первых экспериментов с вашим приватным блокчейном.

Урок 3. Подготовка рабочей среды на Raspberry Pi 3

Цель урока: создать узел собственного приватного блокчейна Ethereum для дальнейшей работы в рамках этого курса на микрокомпьютере Raspberry Pi 3 с операционной системой Rasberian. Изучить способ запуска узла приватной сети Ethereum при помощи параметра –dev утилиты Geth.

Практические задания: установка операционной системы Rasberian на Raspberry Pi 3, установка ПО Geth, обеспечивающего работу узла нашего блокчейна, а также демона децентрализованного хранилища данных Swarm. Запуск узла приватного блокчейна Ethereum с помощью параметра –dev утилиты geth.

На предыдущем уроке вы научились создавать свой приватный блокчейн Ethereum на сервере с ОС Ubuntu и Debian. Возможно, для первых опытов и отладки смарт-контрактов вам больше подойдет очень недорогой микрокомпьютер Raspberry Pi 3 (или его более новая модель Raspberry Pi 3 model B), который создавался как раз для обучения.

К сожалению, ресурсы микрокомпьютера Raspberry Pi довольно ограничены, в частности, объем оперативной памяти составляет всего 1 Гбайт (уже есть в продаже Raspberry Pi 4 с 4 Гбайт памяти на борту). Поэтому на Raspberry Pi не получится запустить майнинг в Geth аналогично тому, как мы это делали на предыдущем уроке в ОС Ubuntu и Debian.

Тем не менее, выход есть.

Если раньше вы создавали файл первичного блока, инициализировали блокчейн и запускали майнинг, то на этом уроке мы будем использовать другой, возможно, более удобный способ создания тестовой сети. Мы создадим ее, запустив Geth с параметром –dev, специально предназначенным для этого случая. Разумеется, такой способ можно применять и на обычных серверах, физических и виртуальных.

Подготовка Raspberry Pi 3 к работе

Для первоначальной установки ОС Rasberian вам нужно подключить к микрокомпьютеру блок питания, монитор (лучше всего через интерфейс HDMI), клавиатуру (через интерфейс USB). Также нужно подключить микрокомпьютер кабелем Ethernet к вашему роутеру.

Установите в микрокомпьютер карту памяти MicroSD объемом не меньше 8 Гбайт.

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

Хорошую инструкцию по начальной подготовке Raspberry Pi 3 к работе можно найти здесь: http://dmitrysnotes.ru/raspberry-pi-3-obzor-i-nachalo-raboty.

Установка Rasberian

Прежде всего нужно отформатировать карту памяти MicroSD. В ОС Microsoft Windows воспользуйтесь для этого бесплатной утилитой SD Memory Card Formatter, загрузив ее с сайта https://www.sdcard.org/downloads/formatter_4/. Стандартные средства форматирования ОС Microsoft Windows не подойдут.

Далее нужно скачать дистрибутив Raspbian с сайта https://www.raspberrypi.org/downloads/raspbian/. Для наших целей подойдет версия Raspbian Stretch Lite. Загрузите архив Zip и распакуйте его. В итоге вы получите файл с расширением имени img, например, 2018-04-18-raspbian-stretch-lite.img.

Запишите этот файл на предварительно отформатированную карту памяти MicroSD. Это можно сделать с помощью бесплатной утилиты Rufus. Загрузите ее с сайта https://rufus.akeo.ie/.

Далее установите подготовленную таким способом карту в Raspberry Pi и включите питание. Проследите процесс начальной загрузки Rasberian на мониторе.

В первый раз для подключения через консоль используйте имя пользователя pi и пароль raspberry. После подключения сразу смените пароль с помощью утилиты passwd.

Установка обновлений

Сразу после установки микрокомпьютер получит динамический адрес IP от сервера DHCP вашего роутера, и вы сможете продолжить установку.

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

sudo apt-get update

sudo apt-get upgrade

Включение доступа SSH

Чтобы с микрокомпьютером можно было работать удаленно через SSH, нужно включить такую возможность. Для этого в консоли введите следующую команду:

sudo raspi-config

Выберите в списке строку 5. Interfacing options, найдите в списке SSH и включите.

Установка статического адреса IP

Для удаленной работы через SSH будет удобно, если микрокомпьютеру будет выделен статический адрес IP. Чтобы это сделать, отредактируйте файл /etc/dhcpcd.conf:

sudo nano /etc/dhcpcd.conf

Уберите символы комментария # со следующих строк:

interface eth0

static ip_address=192.168.0.38/24

static ip6_address=fd51:42f8:caae:d92e::ff/64

static routers=192.168.0.1

static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

Также в строке static ip_address укажите нужный адрес IP. Заметим, что этот адрес нужно исключить из DHCP соответствующей настройкой вашего роутера.

После изменения файла перезагрузите микрокомпьютер:

sudo shutdown -r now

Теперь вы можете подключиться к нему удаленно с помощью любого клиента SSH по статическому адресу. Если удаленный доступ работает, вы можете отключить клавиатуру и монитор от Raspberry Pi и продолжить работу через SSH.

Дальнейшие действия очень похожи на то, что мы делали в предыдущем уроке. Однако есть и отличия.

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

Как и на прошлом уроке, мы рекомендуем вам установить редактор vim, утилиты sudo и git:

# apt-get install vim

# apt-get install sudo

# apt-get install git

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

Установка Go

Мы будем работать с Go версии 1.9.6. Установка для Rasbian очень похожа на установку для Debian, однако вам потребуется дистрибутив, рассчитанный на архитектуру процессора ARM.

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

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

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

$ curl -O https://dl.google.com/go/go1.9.6.linux-armv6l.tar.gz

Как и на предыдущем уроке, вам нужно добавить возможность работать пользователю book с командой sudo, для чего нужно воспользоваться командой visudo.

Добавьте в конец файла /etc/sudoers строку:

book ALL=(ALL) ALL

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

$ sudo tar -C /usr/local -xzf go1.9.6.linux-armv6l.tar.gz

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

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

Создайте в домашнем каталоге пользователя 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. Теперь должно быть указано, что установлена версия 1.9.6 для процессоров ARM:

$ go version

go version go1.9.6 linux/arm

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

Установка 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.8.9-unstable

Architecture: arm

Protocol Versions: [63 62]

Network Id: 1

Go Version: go1.9.6

Operating System: linux

GOPATH=/home/book/go

GOROOT=/usr/local/go

$ swarm version

Swarm

Version: 1.8.9-unstable

Network Id: 0

Go Version: go1.9.6

OS: linux

GOPATH=/home/book/go

GOROOT=/usr/local/go

Обратите внимание, что команда geth version сообщает о том, что она работает на процессоре с архитектурой ARM.

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

На предыдущем уроке мы создавали приватный блокчейн, подготовив для него первичный блок в файле genesis.json. Затем мы создали в домашнем каталоге пользователя book рабочий каталог node1, создали аккаунт, запустили инициализацию узла и, наконец, запустили узел нашего блокчейна. При этом был создан файл DAG с направленным ациклическим графом и запущен майнинг. В другой консоли мы подключились к нашему узлу и выдали там несколько команд Web3.

На этот раз мы сделаем все намного проще. Создадим рабочий каталог node1 для размещения данных блокчейна:

$ mkdir node1

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

$ geth –datadir node1 –networkid 98760 –dev –rpc –rpcapi="db,eth,net,web3,personal,web3" console

В окне консоли появятся сообщения о запуске узле сети.

Сохраните команду запуска узла в пакетном файле с именем start_node.sh (листинг 3.1.).

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

geth –datadir node1 –networkid 98760 –dev –rpc –rpcapi="db,eth,net,web3,personal,web3" console

Обратите внимание, что мы указали здесь те же значения параметров datadir, networked, rpc и rpcapi, что и на предыдущем уроке.

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

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

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

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

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

Проверка учетной записи и баланса

Запустите файл attach_node.sh и в приглашении консоли Geth введите команду accounts:

> web3.eth.accounts

["0xd902f8405a6108e8bd9343d1bfccf21a081d2897"]

Оказывается, в нашем тестовом узле уже определен пользователь, хотя мы не создавали его явным образом и не задавали пароль, как на прошлом уроке. У этого пользователя пустой пароль.

Попробуйте также ввести команду web3.version:

> web3.version

{

 api: "0.20.1",

 ethereum: "0x3f",

 network: "98760",

 node: "Geth/v1.8.9-unstable/linux-arm/go1.9.6",

 whisper: "6.0",

 getEthereum: function(callback),

 getNetwork: function(callback),

 getNode: function(callback),

 getWhisper: function(callback)

}

Здесь будут показаны те же самые данные приватной сети, что и на предыдущем уроке.

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

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

1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+59

Как видите, на нашем аккаунте есть уже довольно много монет Ether, хотя мы и не запускали майнинг явным образом. Это все благодаря тестовому режиму geth, выбранному с помощью параметра –dev.

Итоги урока

На третьем уроке вы научились устанавливать узел приватного блокчейна Ethereum на микрокомпьютер Raspberry Pi 3, обладающего оперативной памятью размеров всего 1 Гбайт.

Хотя на этом компьютере не удается запустить майнинг утилитой Geth, вы использовали параметр –dev для создания тестового узла. На таком узле майнинг запускать не нужно, т.к. там уже предусмотрен аккаунт с очень большим балансом.

Урок 4. Учетные записи и перевод средств между аккаунтами

Цель урока: научиться просматривать список аккаунтов, создавать новые аккаунты, познакомиться с криптовалютными единицами в сети Ethereum, а также научиться переводить средства с одного аккаунта на другой с помощью транзакции из консоли Geth.

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

К четвертому уроку мы подготовили серверы Ubuntu и Debian и установили на них Go Ethereum (программу Geth), создали узел приватной сети. Мы проделали аналогичную операцию с микрокомпьютером Raspberry Pi 3, установив на него ОС Rasberian и Geth для запуска сети в тестовом режиме с параметром –dev.

Мы научились подключаться к узлу сети в отдельном окне консоли, получив приглашение Geth в виде символа “>” (далее мы будем назвать это приглашение консолью Geth). Напомним, что для выхода из консоли Geth и возврата к системному приглашению ОС нужно ввести команду exit.

Детальное описание программного интерфейса фреймворка Web3 JavaScript API версии 0.2x.x, вы найдете здесь: https://github.com/ethereum/wiki/wiki/JavaScript-API.

На момент подготовки книги версия 1.0 еще не реализована, но вы можете изучить документацию на нее по адресу http://web3js.readthedocs.io/en/1.0/. В нашем руководстве мы будем приводить примеры использования и стабильной версии 0.2x.x, и бета-версий 1.0-beta.xx.

Yaş sınırı:
12+
Litres'teki yayın tarihi:
08 ekim 2019
Yazıldığı tarih:
2019
Hacim:
234 s. 25 illüstrasyon
Telif hakkı:
Автор
İndirme biçimi:

Bu kitabı okuyanlar şunları da okudu