Подготовка рабочей среды для создания смарт-контрактов Solidity

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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

</cut>

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

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

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

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

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

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

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

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

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

<code>
$ sudo apt update
$ sudo apt upgrade
</code>

 

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

<code>
*** System restart required ***
</code>

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

<code>
$ sudo shutdown -r now
</code>

Пакеты 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. На странице загрузки https://geth.ethereum.org/downloads доступны реализации для Linux, macOS и Windows, а также исходные коды Geth.

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

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

<source lang="bash">
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
</source>

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

<source lang="bash">
$ geth version
Geth
Version: 1.10.13-stable
Git Commit: 7a0c19f813e285516f4b525305fd73b625d2dec8
Architecture: amd64
Go Version: go1.17.2
Operating System: linux
GOPATH=
GOROOT=go
</source>

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

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

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

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

<source>
$ sudo apt install git
</source>

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

<source>
$ git clone https://github.com/AlexandreFrolov/sol01.git
</source>

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

<source>
$ git pull origin main
</source>

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

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

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

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

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

<source>
Листинг 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": {}

}
</source>

Этот файл описывает первичный блок (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:

<source>

$ cd

$ mkdir node1

 </source>

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

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

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

<source>
$ geth --datadir ~/node1 account new
</source>

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

<source>

$ 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!

</source>

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

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

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

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

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

<source>

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

 </source>

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

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

<source>

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

</source>

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

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

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

</source>

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

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

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

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

<source>
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]

Источник: https://habr.com/ru/post/654835/


Интересные статьи

Интересные статьи

В рамках своих проектов я часто сталкиваюсь с потребностью в разработке интерфейса и, так как я работаю с python, в моём арсенале присутствует большое количество разных библиотек, позволяющих генериро...
Корпорация Microsoft готовится к массовому переводу пользователей ноутбуков и десктопов на Windows 11, которая пришла на смену «десятке». Время бежит быстро, так что не стоит удивляться, что последн...
Благодарю за отклики Получив разноплановые отклики в виде комментариев и «кармы» на свою первую статью на Хабре «Фреймворк на PHP: CodeIgniter 4. «Лёгкий пример» использования Database Migrations...
История компании Apple невероятна: от гаража до одной из самых крупных компаний в мире. Сейчас Apple задает тренды и определяет, что будет модно завтра. Красивая упаковка, «челочка» у...
ReactJS по умолчанию обладает высокой производительностью. Но время от времени у вас появляется шанс сделать его еще лучше. И замечательное сообщество React придумало для...