Цель урока: создать узел собственного приватного блокчейна 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, специально предназначенным для этого случая. Разумеется, такой способ можно применять и на обычных серверах, физических и виртуальных.
Для первоначальной установки ОС Rasberian вам нужно подключить к микрокомпьютеру блок питания, монитор (лучше всего через интерфейс HDMI), клавиатуру (через интерфейс USB). Также нужно подключить микрокомпьютер кабелем Ethernet к вашему роутеру.
Установите в микрокомпьютер карту памяти MicroSD объемом не меньше 8 Гбайт.
После того как установка и настройка Rasberian будут завершены, монитор и клавиатуру можно будет отключить.
Хорошую инструкцию по начальной подготовке Raspberry Pi 3 к работе можно найти здесь: http://dmitrysnotes.ru/raspberry-pi-3-obzor-i-nachalo-raboty.
Прежде всего нужно отформатировать карту памяти 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, нужно включить такую возможность. Для этого в консоли введите следующую команду:
sudo raspi-config
Выберите в списке строку 5. Interfacing options, найдите в списке SSH и включите.
Для удаленной работы через 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 версии 1.9.6. Установка для Rasbian очень похожа на установку для Debian, однако вам потребуется дистрибутив, рассчитанный на архитектуру процессора ARM.
Как мы уже говорили, дистрибутивы 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
Прежде чем перейти собственно к установке Geth и Swarm, нужно проверить версию go. Теперь должно быть указано, что установлена версия 1.9.6 для процессоров ARM:
$ go version
go version go1.9.6 linux/arm
Установка 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 для создания тестового узла. На таком узле майнинг запускать не нужно, т.к. там уже предусмотрен аккаунт с очень большим балансом.