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

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

Установка и обновление операционной системы

Для изучения Ethereum можно арендовать виртуальный или облачный сервер у одного из провайдеров. Еще вариант — установить Ubuntu на свой настольный компьютер или на виртуальную машину VMware Workstation, либо аналогичную.

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

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

  • От 4 ядер процессора (CPU) с тактовой частотой от 2 ГГц;

  • Оперативная память от 2 Гбайт;

  • Диск SSD объемом от 20 Гбайт.

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

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

$ sudo apt update
$ sudo apt upgrade

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

*** System restart required ***

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

$ sudo shutdown -r now

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

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

Установка программы Geth

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

Для работы с узлом Geth можно использовать интерфейс командной строки, а также программный интерфейс (API, Application Programming Interface) JSON-RPC, доступный через протоколы HTTP и WebSocket, а также через механизм коммуникации процессов Unix  (IPC, Inter-Process Communication).

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

Клиент Geth может работать на платформах, где имеется Go. Это, например, Linux, Mac OSX, Windows, Raspberry Pi, Android OS, iOS. На странице загрузки доступны реализации для Linux, macOS и Windows, а также исходные коды Geth.

Итак, перейдем к установке программы Geth.

Чтобы установить эту программу, добавьте персональный пакет архивов PPA (Personal Package Archives) и установите стабильную версию пакета go-ethereum:

$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum

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

$ geth version
Geth
Version: 1.10.13-stable
Git Commit: 7a0c19f813e285516f4b525305fd73b625d2dec8
Architecture: amd64
Go Version: go1.17.2
Operating System: linux
GOPATH=
GOROOT=go

Как видите, установлен Geth стабильной версии 1.10.13, который работает в Go версии 1.17.2.

Скопируйте файлы из репозитория GitHub

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

Для этого сначала установите git:

$ sudo apt install git

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

$ git clone https://github.com/AlexandreFrolov/sol01.git

 Для обновления файлов из репозитория воспользуйтесь командой git pull:

$ git pull origin main

В вашем домашнем каталоге будет создано дерево каталогов sol01, в котором вы найдете каталоги к урокам. Например, файлы третьего урока находятся в каталоге sol01/les03.

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

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

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

Откройте свой домашний каталог и проверьте, что в каталоге ~/sol01/les03 находится файл genesis.json, загруженный из только что упомянутого репозитория GitHub (листинг 3.1.).

Листинг 3.1. Файл ~/sol01/les03/genesis.json
{
  "config": {
     "chainId": 98760,
     "homesteadBlock": 0,
     "eip150Block": 0,
     "eip155Block": 0,
     "eip158Block": 0,
     "byzantiumBlock": 0,
     "constantinopleBlock": 0,
     "istanbulBlock": 0,
     "petersburgBlock": 0
  },
  "difficulty": "10",
  "gasLimit": "5100000",
  "alloc": {}
}

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

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

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

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

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

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

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

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

Аналогично, установим равными нулю значения параметров byzantiumBlock, constantinopleBlock,  istanbulBlock и petersburgBlock. В основной сети такие параметры задают номера блоков, при достижении которых был изменен протокол.

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

С помощью параметра gasLimit мы задаем в рамках блокчейна предел расхода так называемого газа (Gas).

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

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

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

Теперь создайте в своем домашнем каталоге подкаталог node1:

$ cd
$ mkdir node1

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

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

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

$ geth --datadir ~/node1 account new

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

$ geth --datadir ~/node1 account new

INFO [12-08|06:18:33.646] Maximum peer count                       ETH=50 LES=0 total=50

INFO [12-08|06:18:33.647] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"

Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
Your new key was generated
 Public address of the key:   0x2cF942e02baAC0BB883147873943666e397CAe03

Path of the secret key file: /home/developer/node1/keystore/UTC--2021-12-08T14-18-43.611281385Z--2cf942e02baac0bb883147873943666e397cae03
 - You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

Команда account new выведет на консоль параметр Public address of the key — так называемый адрес узла. В нашем случае это адрес 0x2cF942e02baAC0BB883147873943666e397CAe03. Мы будем указывать его в различных командах.

Также обратите внимание на путь к файлу с секретным ключом Path of the secret key file. Этот файл необходим для выполнения транзакций. Его можно скопировать и хранить в безопасном месте.

Параметр datadir команды geth указывает путь к рабочему каталогу. Мы используем каталог node1, расположенный в вашем домашнем каталоге.

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

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

$ geth --datadir ~/node1 init ~/sol01/les03/genesis.json

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

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

INFO [12-08|06:19:56.127] Maximum peer count                       ETH=50 LES=0 total=50

INFO [12-08|06:19:56.127] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"

INFO [12-08|06:19:56.128] Set global gas cap                       cap=50,000,000

INFO [12-08|06:19:56.128] Allocated cache and file handles         database=/home/developer/node1/geth/chaindata cache=16.00MiB handles=16

INFO [12-08|06:19:56.146] Writing custom genesis block

INFO [12-08|06:19:56.146] Persisted trie from memory database      nodes=0 size=0.00B time="14.424µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [12-08|06:19:56.147] Successfully wrote genesis state         database=chaindata                            hash=a5e5bc..3f490e

INFO [12-08|06:19:56.147] Allocated cache and file handles         database=/home/developer/node1/geth/lightchaindata cache=16.00MiB handles=16

INFO [12-08|06:19:56.151] Writing custom genesis block

INFO [12-08|06:19:56.152] Persisted trie from memory database      nodes=0 size=0.00B time="5.185µs"  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [12-08|06:19:56.153] Successfully wrote genesis state         database=lightchaindata                       hash=a5e5bc..3f490e

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

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

$ geth --datadir ~/node1 --ipcpath "~/node1/geth.ipc" --nodiscover --mine --miner.threads 1 --maxpeers 0 --verbosity 3 --networkid 98760 console

Здесь предполагается, что вы подключились к консоли пользователем developer.

На экране появится множество сообщений о ходе инициализации. В ходе этого процесса будет запущена генерация так называемого файла DAG. Он содержит направленный ациклический граф (Directed Acyclic Graph,  DAG).

Файл DAG используется для добавления блоков в Ethereum с помощью алгоритма с названием Ethash. Его размер может составлять несколько Гбайт. Размер этого файла увеличивается по мере роста сети Ethereum.

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

Welcome to the Geth JavaScript console!

 instance: Geth/v1.10.13-stable-7a0c19f8/linux-amd64/go1.17.2

coinbase: 0x2cf942e02baac0bb883147873943666e397cae03

at block: 0 (Wed Dec 31 1969 16:00:00 GMT-0800 (PST))

 datadir: /home/developer/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

 To exit, press ctrl-d or type exit

> INFO [12-08|06:22:31.712] Generating DAG in progress               epoch=0 percentage=0 elapsed=1.076s

INFO [12-08|06:22:32.749] Generating DAG in progress               epoch=0 percentage=1 elapsed=2.114s

INFO [12-08|06:22:33.123] Mapped network port                      proto=tcp extport=30303 intport=30303 interface="UPNP IGDv1-IP1"

INFO [12-08|06:22:33.793] Generating DAG in progress               epoch=0 percentage=2 elapsed=3.158s

INFO [12-08|06:22:34.848] Generating DAG in progress               epoch=0 percentage=3 elapsed=4.213s

INFO [12-08|06:29:35.171] Commit new mining work                   number=69 sealhash=5549e6..4d0eba uncles=0 txs=0 gas=0 fees=0 elapsed="150.228µs"

INFO [12-08|06:29:43.723] Successfully sealed new block            number=69 sealhash=5549e6..4d0eba hash=de53cc..05e38c elapsed=8.551s

INFO [12-08|06:29:43.723] ???? block reached canonical chain          number=62 hash=dd9c17..4f1a18

INFO [12-08|06:29:43.723] ???? mined potential block                  number=69 hash=de53cc..05e38c

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

Текущий размер блока и прогнозы по его росту можно узнать, например, на сайте https://minerstat.com/dag-size-calculator?lang=ru. На момент создания этого урока файл DAG для основной сети Ethereum был размером 4.5 Гбайт.

Чем больше файл DAG, тем труднее выполнить майнинг.

Для ускорения майнинга используются видеокарты. При этом данные DAG должны полностью поместиться в память видеокарты.

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

Листинг 3.2. Файл ~/sol01/les03/start_node.sh
geth --datadir ~/node1 --ipcpath "~/node1/geth.ipc" --nodiscover --mine --miner.threads 1 --maxpeers 0 --verbosity 3 --networkid 98760 console

Запускайте его следующей командой:

$ bash ~/sol01/les03/start_node.sh

Чтобы завершить работу узла, нажмите в окне консоли комбинацию клавиш Ctrl+D.

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

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

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

$ geth -h

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

Для явного указания пути к файлу IPC мы использовали параметр ipcpath.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$ geth --datadir ~/node1 --networkid 98760 attach

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

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

Welcome to the Geth JavaScript console!

 instance: Geth/v1.10.12-stable-6c4dc6c3/linux-amd64/go1.17.2

coinbase: 0xf82e93ef1de726ac0bbbb64f8efa3ffa0d5a393b

at block: 271 (Mon Nov 29 2021 01:01:06 GMT-0800 (PST))

 datadir: /home/developer/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

To exit, press ctrl-d or type exit

Команду подключения вы найдете в файле репозитория ~/sol01/les03/attach_node.sh (листинг 3.3.).

Листинг 3.3. Файл ~/sol01/les03/attach_node.sh
geth --datadir ~/node1 --networkid 98760 attach

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

$ bash ~/sol01/les03/attach_node.sh

Welcome to the Geth JavaScript console!

 instance: Geth/v1.10.12-stable-6c4dc6c3/linux-amd64/go1.17.2

coinbase: 0x9eb9b6147be101260597a0e011156355ebff9a81

at block: 2787 (Tue Nov 30 2021 05:03:19 GMT-0800 (PST))

 datadir: /home/frolov/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

 To exit, press ctrl-d or type exit

>

Чтобы выйти из консоли, можно ввести команду exit или нажать комбинацию клавиш Ctrl+D.

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

> web3.eth.accounts

["0xe04b76f2c0bf657ca08b78095050d15aa29fc735", "0xe68afc8c9c3f59066a2a5d999c68000e8748c045"]

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

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

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

> web3.version
{
  api: "0.20.1",
  ethereum: undefined,
  network: "98760",
  node: "Geth/v1.10.15-stable-8be800ff/linux-amd64/go1.17.5",
  whisper: undefined,
  getEthereum: function(callback),
  getNetwork: function(callback),
  getNode: function(callback),
  getWhisper: function(callback)
}

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

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

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

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

> 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

Установка Node.js

Вы скорее всего будете работать с узлами Ethereum с помощью скриптов JavaScript, работающих под управлением Node.js. При этом используется фреймворк Web3, а также узлы Ganache CLI и Geth.

Устанавливать Node.js в ОС Ubuntu нужно с помощью скрипта менеджера управления версиями NVM (Node Version Manager).

 Эта процедура описана здесь:  https://github.com/nodesource/distributions/blob/master/README.md.

Прежде всего установите программу curl и скопируйте скрипт NVM из репозитория Github:

sudo apt install curl
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

После установки проверьте версии Node.js и npm:

$ node -v
v16.13.1
$ npm -v
8.1.2

Установка Truffle

В нашем курсе мы будем изучать интегрированную среду разработки (Integrated Development Environment, IDE) Truffle, очень популярную среди программистов Solidity. Она проста в установке и удобна на практике.

Вначале установите необходимые пакеты:

$ sudo apt install build-essential

 Для установки Truffle введите команду:

$ sudo npm install -g truffle

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

$ truffle version
Truffle v5.4.32 (core: 5.4.32)
Solidity v0.5.16 (solc-js)
Node v16.13.2
Web3.js v1.5.3

На консоли появится версия Truffle, а также версия компилятора Solidity solc-js, версия Node.js и пакета Web3.js.

Подробная информация об установке и использовании Truffle есть на сайте http://truffleframework.com/.

Установка и запуск Ganache-cli

В нашем курсе мы будем использовать не только Geth, но и программу Ganache CLI, очень удобную для создания тестового узла Ethereum.

С помощью Ganache CLI  можно очень легко создать персональный блокчейн, удобный для отладки смарт-контрактов, в том числе с помощью такого инструмента, как Truffle.

Установить Ganache CLI очень просто:

$ sudo npm install -g ganache-cli

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

$ ganache-cli

Программа создаст при запуске 10 аккаунтов, причем у каждого аккаунта на счету уже будет 100 Ether. Информацию об аккаунтах и вашей приватной сети она выведет на консоль:

Ganache CLI v6.12.2 (ganache-core: 2.13.2)

Available Accounts

==================

(0) 0x7068e1737ACb237361c27CdD2fc07D360c6E7fb1 (100 ETH)

(1) 0x8208f2E5Ac0C05925Ba0f78B01ED17f0ee766d3D (100 ETH)

(2) 0x915b48A6DfA293c75D925F6d2A2F2F78c8B392EB (100 ETH)

(3) 0x7FEFFD1959c47ed2d1b28Cbbabe1a6450029afa8 (100 ETH)

(4) 0xeD11B63a6E06a8deA81E844FA490eB3af4858506 (100 ETH)

(5) 0xC04cEf12b37138C6DBfA22B57D15FF91543507A4 (100 ETH)

(6) 0x0b56E6D8d72300066B4349dcF1b687eBa1B1Ceb5 (100 ETH)

(7) 0x17EF124e61b2cc14B1c5df9385Cd3c38B66EBA3b (100 ETH)

(8) 0xCacFcbBC9db0eDB04f2DA4a525D23d7373593a49 (100 ETH)

(9) 0xF101d652AE265dF03a7fb276da021eCBC22D3408 (100 ETH)

 Private Keys

==================

(0) 0x5712b6f3f2cc9a0a65aa4aee6312c03b44d0f79287a285a56e7133ee81afcb75

(1) 0x31ba88967f3c568e2f800916a1691dd5026eb137f2671ed095de4a6f2d4f5b58

(2) 0x2b822789e8670fc9302eb4f734c4e1b9ff75039fa14a3cefefa38bc39609084f

(3) 0x7fca0a698c7a39af2d06a35f7a230403c550f76f352d976a28e8e9f74a1b6c3d

(4) 0x490f3556f258b1fb2ab86ee249ce31c8cd1108e497b6f192866d78d30d08ca9b

(5) 0x4cf5a21253198710362a80bf0f43a058075b5a9ec443531023d9531b7f4b1869

(6) 0x8f5579e651697162856dd08618d7efd152cd5e51715445d558d3e78c9a85afad

(7) 0x26a9bdea6620c42b405903301624f6ba5eed9878ee7f443cb500ce02b57b0e86

(8) 0x94ace2c51779e337ddb5411a4b3b6ebbc88d2fd137be419c723f18c9efdc4297

(9) 0x57212b11f4a3b80206f11f3f4939166765626dafee541b5554b733a09317d327

 HD Wallet

==================

Mnemonic:      enough like enjoy where such they sword matrix birth water orange amateur

Base HD Path:  m/44'/60'/0'/0/{account_index}

 Gas Price

==================

20000000000

Gas Limit

==================

6721975

 Call Gas Limit

==================

9007199254740991

Listening on 127.0.0.1:8545

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

Для подключения к узлу Ganache CLI запустите в отдельном консольном окне команду:
$ geth attach http://127.0.0.1:8545

После этого посмотрите список аккаунтов:

> web3.eth.accounts

["0x634cdd00a95cb83d594e9401bfbe66d3fc02e930", "0x3b9067d86ee5bd2a8ea814ea337fe8c68589b819", "0x77453108040c2aeac8d48ba01b59c12a7070b4b7", "0x093cca41ff8a49483204dc5e925ffffa7463de63", "0x2baee1b78787ae63024ef0aefa3c2c67d541b003", "0x29796fb84ff016e926190caa26a5ee263890292f", "0x6de6013c3554c3ef9f3be1095c38accdab89aebe", "0xe8318637a3a459f6af01f27b833ccd13405452ec", "0x2cb59fab5d614355090f56a6d36e1e8d7e5385c0", "0x80370337b1a46888003677655d9bbbfbf5d0470c"]

>

Как видите, уже есть 10 аккаунтов, готовых для работы. Вы можете убедиться, что на этих аккаунтах уже есть средства в размене 100 Ether:

> web3.fromWei( eth.getBalance("0x3b9067d86ee5bd2a8ea814ea337fe8c68589b819") )
100

Установка Web3

Запустите в первом консольном окне узел Geth:
$ bash ~/sol01/les03/start_node.sh

Далее для установки пакета web3.js, представляющего собой API Ethereum для JavaScript, используйте команду:

npm install web3

Для проверки результатов установки запустите консоль Node.js командой node:

$ node
>

Убедитесь, что у вас запущен узел вашей локальной сети Ethereum на базе Ether или Ganache CLI. Далее в консольном приглашении Node.js введите следующие команды:

> var Web3 = require('web3')
undefined
 > Web3.version
'1.7.0'

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

Узел на базе Geth доступен с применением протокола IPC. Здесь нам потребуется провайдер Web3.providers.IpcProvider.

Введите в приглашении node следующие команды:

> const net = require('net');
undefined
> const Web3 = require('web3');
undefined
> const web3 = new Web3(new Web3.providers.IpcProvider("/home/developer/node1/geth.ipc", net));
undefined

> await web3.eth.getAccounts();
[
  '0x9EB9b6147BE101260597a0E011156355ebfF9A81',
  '0x651895A7f98F34bFe3FC544C001e0373EadfF136'
]
>

В результате на консоли появится список аккаунтов, созданных при помощи Geth.

Для получения списка аккаунтов, созданных при запуске Ganache CLI, потребуется провайдер Web3.providers.HttpProvider (с использованием протокола HTTP).

Введите в приглашении node такие команды:

>  var Web3 = require('web3')

undefined

> var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

undefined

> await web3.eth.getAccounts();

[

  '0xC45cb6355FE0AcdA9d0b6b6750e689b082f3743f',

  '0xd56B6c181Dad6ea9a455813065bf56EaFb12D582',

  '0x9D6351707Ef4910214605d331b2ecA9764f82542',

  '0xF8DAC793B4aFF4F7c82F81Ea4E3EF51b6422CB50',

  '0xC5A7aeD0b0Dcc460F2267F4248C055aB70c0035b',

  '0xFf7bfa85784820E574b77dbE401056784b92D4fb',

  '0x20D365eA672c9BFfE4baaA800D3c6C56B23C063F',

  '0xE0840AD4d6733D986083c3b64dDDBe5A30E5db8E',

  '0x2132417287567e5D7D5DC2194f96bb6Aca808a9D',

  '0x9E994E8616c2765524f6bb859C860c0D53Fe12d7'

]

Если в консоли Node.js появился список аккаунтов, значит, все было установлено правильно.

С помощью следующей команды можно посмотреть баланс заданного аккаунта в единицах wei и Ether:

> await web3.eth.getBalance("0xEa0C5394d72be6623d0ee8bAFfBdd332C70955ac").then(function (balance) { console.log('balance: ', balance, 'wei, ', web3.utils.fromWei(balance, 'ether'), 'ether'); })

balance:  100000000000000000000 wei,  100 ether

Установка пакетного компилятора solc

Для того чтобы компилировать контракты Solidity в командной строке или из ваших скриптов, можно использовать пакетный компилятор solc.

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

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc

Затем проверьте версию установленного компилятора solc:

$ solc --version
solc, the solidity compiler commandline interface
Version: 0.8.10+commit.fc410830.Linux.g++

Документация по компилятору solc находится здесь.

Полезные ссылки

Страница загрузки программы Geth и ее исходных кодов

Предложения по улучшению Ethereum

Текущий размер файла DAG

Описание процедуры установки Node.js

Работа с Truffle

Репозиторий Ganache

Документация по компилятору solc

Репозиторий моих исходников на Github

Итоги

Вы подготовили рабочую среду, необходимую для дальнейшего изучения Ethereum и смарт-контрактов Solidity. Вы создали сервер с ОС Ubuntu, установили программы Geth, Node.js, Truffle, Ganache-cli, пакет Web3, а также компилятор solc.

Вы также загрузили из репозитория GitHub исходные файлы, необходимые для работы с нашим курсом.

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

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

Комментарии (2)


  1. jesaiah4
    10.03.2022 19:54

    так что получается Geth  это обычная урезанная нода с api ?


  1. AlexandreFrolov Автор
    11.03.2022 08:59

    Добрый день! Geth - это Go Ethereum, на ее базе можно сделать полноценную или урезанную ноду Ethereum, и у нее есть API. Также это может быть узел тестовой сети, Rinkeby, например. На базе Geth очень просто сделать свой приватный (корпоративный) блокчейн.

    https://geth.ethereum.org/

    Go Ethereum is one of the three original implementations (along with C++ and Python) of the Ethereum protocol. It is written in Go, fully open source and licensed under the GNU LGPL v3.