- Введение в Geth и запуск узлов Ethereum
- Типы узлов
- Установка Гета
- Бегущий Гет
- Создаем приватную сеть Ethereum Geth в контейнерах Docker
- Устанавливаем Docker
- Создаем пользователя, каталоги и файлы
- Создаем сеть и контейнеры
- Создание узлов приватной сети Ethereum и аккаунтов
- Запуск узлов Geth
- Объединение узлов в сеть
- Работа с узлами сети с помощью Node.js
- Что дальше
- Читают сейчас
- Редакторский дайджест
- Похожие публикации
- Nemesida WAF: Docker-контейнер
- Краткая история о том, как развернуть веб-сервер Flask в docker контейнере
- Установка docker-контейнеров c Zabbix на Raspberry Pi
- Курсы
- Минуточку внимания
- Комментарии 4
Введение в Geth и запуск узлов Ethereum
В этой статье мы рассмотрим, что такое узлы Ethereum, и рассмотрим один из самых популярных, называемый Geth.
Для связи с блокчейном мы должны использовать клиент блокчейна. Клиент — это часть программного обеспечения, способная устанавливать канал связи p2p с другими клиентами, подписывать и транслировать транзакции, осуществлять майнинг, развертывать и взаимодействовать с интеллектуальными контрактами и т. Д. Клиент часто называют узлом .
Формальное определение функциональности, которой должен следовать узел Ethereum, определено в желтой статье ethereum . Желтая бумага определяет требуемые функции узлов в сети, алгоритм майнинга, параметры ECDSA с закрытым / открытым ключом. Он определяет все функции, которые делают узлы полностью совместимыми с клиентами Ethereum.
Основываясь на желтой бумаге, каждый может создать собственную реализацию узла Ethereum на любом языке, который он считает нужным.
Полный список клиентов можно увидеть здесь .
На сегодняшний день самыми популярными клиентами являются Geth и Parity . Реализации различаются в основном по выбору языка программирования — где Geth использует Golang, а Parity использует Rust.
Поскольку Geth является самой популярной клиентской реализацией, доступной на данный момент, мы сосредоточимся на ней сейчас.
Типы узлов
Когда вы присоединяетесь к сети Ethereum, у вас есть возможность запустить
различные типы узлов. Варианты в настоящее время:
- Легкий узел
- Полный узел
- Архивный узел
Архивный узел — это особый случай полного узла, поэтому мы не будем вдаваться в подробности. Одно из лучших резюме по типам узлов, которые я нашел, находится на Stack Exchange :
В общем, мы можем разделить программное обеспечение узлов на два типа: полные узлы и легкие (весовые) узлы. Полные узлы проверяют блок, который транслируется в сеть. Таким образом, они гарантируют, что транзакции, содержащиеся в блоках (и самих блоках), следуют правилам, определенным в спецификациях Ethereum. Они поддерживают текущее состояние сети (как определено в соответствии со спецификациями Ethereum).
Транзакции и блоки, которые не соответствуют правилам, не используются для определения текущего состояния сети Ethereum. Например, если A пытается отправить 100 эфиров в B, но A имеет 0 эфиров, и блок включает эту транзакцию, полные узлы поймут, что это не соответствует правилам Ethereum, и отклонят этот блок как недействительный. В частности, выполнение смарт-контрактов является примером транзакции. Всякий раз, когда в транзакции используется умный контракт (например, отправка токенов ERC-20), все полные узлы должны будут выполнить все инструкции, чтобы убедиться, что они достигли правильного, согласованного следующего состояния блокчейна.
Есть несколько способов достичь одного и того же состояния. Например, если бы А имел 101 эфир и отдал сто из них Б за одну транзакцию, заплатив 1 эфир за газ, конечный результат был бы таким же, как если бы А отправил 100 транзакций по 1 эфиру каждая, заплатив 0,01 эфира за транзакцию ( игнорируя, кто получил комиссию за транзакцию). Чтобы узнать, разрешено ли теперь B посылать 100 эфира, достаточно знать, каков текущий баланс B. Полные узлы, которые сохраняют всю историю транзакций, называются полными узлами архивации. Они должны существовать в сети, чтобы быть здоровыми.
Узлы также могут отказаться от старых данных; если B хочет отправить 100 эфира в C, не имеет значения, как был получен эфир, только учетная запись B содержит 100 эфира. Легкие узлы, напротив, не проверяют каждый блок или транзакцию и могут не иметь копии текущего состояния блокчейна. Они полагаются на полные узлы, чтобы предоставить им недостающие детали (или просто не хватает определенной функциональности). Преимущество легких узлов заключается в том, что они могут гораздо быстрее запускаться и работать, могут работать на устройствах с большим количеством вычислительных ресурсов / памяти и не поглощают почти столько же памяти. С другой стороны, существует элемент доверия в других узлах (он варьируется в зависимости от клиента, и вероятностные методы / эвристика могут использоваться для снижения риска). Некоторые полные клиенты включают функции для более быстрой синхронизации (например, синхронизация деформации Parity).
Установка Гета
Инструкции по установке Geth на различных платформах (Windows, macOS, Linux) можно найти здесь . Список довольно полный и актуализированный, поэтому я не буду его обсуждать в этой статье.
Бегущий Гет
Чтобы раскрутить узел Geth, единственное, что вам нужно сделать, это зайти в окно терминала и запустить geth . Когда вы это сделаете, вы должны получить вывод, похожий на этот:
Источник
Создаем приватную сеть Ethereum Geth в контейнерах Docker
Если вам нужно развернуть приватную сеть Ethereum на базе Geth, то это можно сделать, например, создавая узлы сети на физических серверах или виртуальных машинах. Однако намного легче использовать готовые образы (Images) контейнеров Geth из репозитория Docker hub. В этом случае можно установить целую сеть узлов даже на одной виртуальной машине или на одном физическом сервере.
В этой статье мы расскажем как установить Docker на сервере с ОС Debian 9 (виртуальном или физическом), как создать несколько контейнеров с работающим Geth и объединить их в приватную сеть. Мы приведем пример скрипта для Node.js, который обращается к узлам Geth, работающим в контейнерах.
Устанавливаем Docker
Установка Docker описана на официальном сайте. Для Debian 9 и 10 вы найдете подробные инструкции на сайте https://docs.docker.com/install/linux/docker-ce/debian/.
Прежде всего, обновите пакеты:
Далее установите необходимые пакеты следующей командой:
Добавьте официальный ключ GPG:
Убедитесь, что вы получили ключ с отпечатком 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88:
Добавьте стабильный репозиторий Docker:
Обновите пакеты и установите Docker:
Теперь остается только проверить, что все сделано правильно. Для этого запустите образ (Image) hello-world:
Эта команда загрузит нужный образ, и запустит на выполнение. Как и следовало ожидать, вы увидите на консоли сообщение «Hello from Docker!».
Как видите, ничего сложного! Теперь можно приступить к созданию приватной сети Geth с узлами, работающими в контейнерах.
Создаем пользователя, каталоги и файлы
Создайте на сервере пользователя book, а в его домашнем каталоге — следующие подкаталоги:
Далее в каталоге /home/book/dock-test создайте файл Dockerfile:
Этот файл будет использован при создании контейнеров Docker.
Еще вам нужно будет создать файл /home/book/dock-test/distr/genesis.json, необходимый для инициализации узлов сети Ethereum:
Здесь мы задаем идентификатор нашей приватной сети 98760. Для облегчения майнинга мы указали в параметре difficulty значение 10. Это позволит работать на виртуальных машинах с относительно небольшим объемом памяти (например, 4 Гбайта).
Создаем сеть и контейнеры
Для того чтобы наши узлы могли обмениваться данными между собой, создадим сеть между контейнерами:
Далее нужно сделать текущим каталог /home/book/dock-test, в котором расположен файл Dockerfile. Затем создайте нужное количество контейнеров, например, три:
Создание первого контейнера идет относительно долго, т.к. нужно загрузить необходимые образы (images). Зато следующие контейнеры создаются практически моментально — сравните со скоростью создания виртуальных машин, даже через клонирование.
Теперь откройте четыре консольных окна. В трех из них мы будем работать с контейнерами, а в четвертом — получать необходимые нам данных о контейнерах и сети.
В первом консольном окне выдайте такую команду:
Вы увидите приглашение вида:
Во втором и третьем консольном окне введите, соответственно, следующие команды:
Создание узлов приватной сети Ethereum и аккаунтов
На данный момент у нас работают три контейнера с Geth. Давайте создадим в каждом из них узел нашей приватной сети Ethereum и аккаунт.
Введите в первых трех консольных окнах команду:
Нужно будет ввести пароль. Для простоты при тестах используйте один и тот же пароль на каждом узле, но запишите его где-нибудь. Если вы забудете пароль, то его никак не получится восстановить.
После создания аккаунтов на консоли появятся публичные адреса ключей, похожие на эти:
Сохраните адреса (у вас будут другие), т.к. они нам понадобятся для запуска узлов.
Теперь нужно запустить инициализацию узлов. Это делается при помощи команды:
Введите эту команду во всех консольных окнах наших контейнеров. Параметр —nousb отключает все коммуникации с USB-устройствами.
Запуск узлов Geth
Теперь откройте по очереди каждое из консольных окон и запустите там Geth с помощью приведенных ниже команд.
В каждом из открытых окон появятся сообщения о генерации DAG:
Дождитесь, пока генерация будет завершена. После этого eth.hashrate и eth.blockNumber будут отличны от 0:
Проверить текущий баланс аккаунта можно так:
Чтобы вам не мешали сообщения о создании новых блоков и другие сообщения в консольных окнах, завершите работу Geth командой exit и перезапустите заново, указав значение параметра verbosity, равным 1.
Объединение узлов в сеть
Для начала мы посмотрим список запущенных контейнеров. Выдайте из четвертого консольного окна следующую команду:
Здесь для каждого контейнера показывается его идентификатор, название образа, имя контейнера и другая информация.
Для объединения контейнеров в сеть вам потребуются адреса IP контейнеров в нашей приватной сети PRIVATENET. Вы можете получить эти адреса по идентификатору контейнера, например, следующим образом:
Также можно воспользоваться командой docker network inspect PRIVATENET:
Сопоставляя данные, полученные этими командами, составим список IP-адресов для наших контейнеров:
Разумеется, у вас будет другой список, и при перезапуске контейнеров эти адреса могут меняться.
Получив список адресов, перезапустите geth во всех контейнерах, указав в параметре —rpcaddr адрес своего контейнера. Можно, конечно, задать адрес 0.0.0.0, но это плохо с точки зрения безопасности — к узлу сможет подключиться кто или что угодно. Например, это могут быть боты, которые попытаются «увести» все средства из этих узлов, дождавшись, когда узел будет разблокирован.
Для объединения узлов вам нужно будет воспользоваться командой admin.addPeer. В качестве параметра этой команде нужно передать URL в формате enode. Получите этот URL для каждого контейнера с помощью команды admin.nodeInfo.enode:
Полученные адреса сохраните.
Для того чтобы подключить один узел к другому, откройте консольное окно первого узла и введите там команду следующего вида:
Здесь мы передали адрес URL, указав в нем адрес IP подключаемого узла. Проделайте аналогичную процедуру и на других узлах сети.
Для того чтобы проверить, что соединение установлено, воспользуйтесь командой admin.peers. Если соединений нет, команда вернет пустой результат:
В нашем случае команда показывает, что первый узел с адресом 172.21.0.2 подключен к узлам с адресами 172.21.0.3 и 172.21.0.4:
Обратите внимание, что после успешного объединения узлов и их синхронизации команда eth.blockNumber будет возвращать одно и то же значение при запуске в любом из наших трех контейнеров.
Команда web3.fromWei( eth.getBalance(eth.coinbase) ) напротив, будет показывать разный баланс на разных узлах, т.к. у каждого узла свой собственный аккаунт.
Работа с узлами сети с помощью Node.js
В листинге 3 мы привели простой скрипт, работающий под управлением Node.js, который показывает на консоли список аккаунтов указанного узла и баланс каждого из них:
Этот скрипт вы можете запустить в отдельном, например, в четвертом консольном окне:
Что дальше
Тема разработки ПО для криптовалют вообще и для Ethereum в частности довольно увлекательна. Если после прочтения этой статьи у вас появились вопросы и захотелось узнать больше, читайте мою книгу «Создание смарт-контрактов Solidity для блокчейна Ethereum. Практическое руководство», которая вышла в издательстве Литрес.
Также возможно, вам пригодится хорошая шпаргалка по командам Docker.
Буду благодарен за любые замечания и дополнения по статье и книге!
Читают сейчас
Редакторский дайджест
Присылаем лучшие статьи раз в месяц
Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.
Похожие публикации
Nemesida WAF: Docker-контейнер
Краткая история о том, как развернуть веб-сервер Flask в docker контейнере
Установка docker-контейнеров c Zabbix на Raspberry Pi
Курсы
AdBlock похитил этот баннер, но баннеры не зубы — отрастут
Минуточку внимания
Комментарии 4
Это может пригодится в том случае, если вам нужно быстро развернуть приватную сеть узлов Ethereum для тестирования или в учебных целях, а не ограничиваться только одним узлом. Docker сокращает затраты времени и ресурсов на создание такой сети. Или если вам просто нужно быстро развернуть приватную сеть на большом количестве узлов.
В этой статье не рассматривается методика полностью автоматического развертывания, в каждый узел приходится заходить отдельно, создавать аккаунт и выполнять инициализацию. Возможно, позже я рассмотрю полностью автоматическое развертывание тестовой приватной сети.
нужно быстро развернуть приватную сеть узлов Ethereum для тестирования или в учебных целях
В этой статье я не рассматривал назначение приватных блокчейнов. Вы можете использовать приватные сети для обучения, разработки, для хранения личных данных или данных организации.
Приватная сеть полностью изолирована от основной сети Ethereum и может использоваться бесплатно на ресурсах, принадлежащих частному лицу или организации. Вы можете сами задавать для своей сети сложность майнинга и у вас будут бесплатные тразакции. Это все очень ценно и для обучения, и для частных проектов.
Что же касается вопроса, чем лучше сеть узлов по сравнению с одним узлом, то, во-первых, вы сможете отлаживать свои приложения в среде, максимально похожей на рабочую, а во-вторых, в частной сети, состоящей из многих узлов, может работать необходимое количество участников с использованием POW для защиты системы от злоупотреблений.
Разумеется, можно отлаживать смарт-контракты в тестовых сетях, например, в Rinkeby, однако намного легче это делать именно в приватной сети. Что же касается сетей для нужд организаций или частных лиц, то по понятным причинам едва ли их стоит реализовывать на бесплатных тестовых сетях.
Один узел — это вырожденный случай, пригодный лишь для тестирования.
Что же касается использования Docker, то он позволяет создать такую сеть всего лишь на одной виртуальной машине или сервере. Конечно, подобная конфигурация пригодна только для изучения или разработки, но ничто не мешает вам потом развернуть эту сеть и на разных физических серверах тем же простым способом.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Источник