В этой статье мы рассмотрим, что такое узлы 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
. Когда вы это сделаете, вы должны получить вывод, похожий на этот:
➜ ~ geth INFO [06-03|11:03:13] Maximum peer count ETH=25 LES=0 total=25 INFO [06-03|11:03:13] Starting peer-to-peer node instance=Geth/v1.8.10-stable/darwin-amd64/go1.10.2 INFO [06-03|11:03:13] Allocated cache and file handles database=/Users/mjvr/Library/Ethereum/geth/chaindata cache=768 handles=128 INFO [06-03|11:03:13] Writing default main-net genesis block INFO [06-03|11:03:14] Persisted trie from memory database nodes=12356 size=2.34mB time=48.31016ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [06-03|11:03:14] Initialised chain configuration config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Byzantium: 4370000 Constantinople: <nil> Engine: ethash}" INFO [06-03|11:03:14] Disk storage enabled for ethash caches dir=/Users/mjvr/Library/Ethereum/geth/ethash count=3 INFO [06-03|11:03:14] Disk storage enabled for ethash DAGs dir=/Users/mjvr/.ethash count=2 INFO [06-03|11:03:14] Initialising Ethereum protocol versions="[63 62]" network=1 INFO [06-03|11:03:14] Loaded most recent local header number=0 hash=d4e567…cb8fa3 td=17179869184 INFO [06-03|11:03:14] Loaded most recent local full block number=0 hash=d4e567…cb8fa3 td=17179869184 INFO [06-03|11:03:14] Loaded most recent local fast block number=0 hash=d4e567…cb8fa3 td=17179869184 INFO [06-03|11:03:14] Regenerated local transaction journal transactions=0 accounts=0 INFO [06-03|11:03:14] Starting P2P networking INFO [06-03|11:03:16] UDP listener up self=enode://a4cb08519bc2bceecb8ad421871c624d5212888653bbaee309fda960f3c87ca7aa9855ee14684d521836ae88ad1986b8ca944348e976760d2bd1247ed3ca7628@[::]:30303 INFO [06-03|11:03:16] RLPx listener up self=enode://a4cb08519bc2bceecb8ad421871c624d5212888653bbaee309fda960f3c87ca7aa9855ee14684d521836ae88ad1986b8ca944348e976760d2bd1247ed3ca7628@[::]:30303 INFO [06-03|11:03:16] IPC endpoint opened url=/Users/mjvr/Library/Ethereum/geth.ipc
После этого вы должны периодически появляться новые строки, где Geth говорит «Импорт нового состояния» или «Импорт новых заголовков блоков» или «Импорт новых поступлений». Состояние, заголовки блоков и транзакции являются частью попыток дерева Ethereum : они должны быть загружены для синхронизации вашего узла с блокчейном Ethereum.
Это процесс, который может занять очень много времени, поэтому один из вариантов, который у вас есть, — запустить такой легкий узел;
geth --light
Теперь нужно, чтобы Geth извлек только самые последние заголовки блоков и полагался на другие полные узлы для проверки транзакций с помощью подтверждений Merkle .
Доступ к консоли Geth
Теперь, когда вы создали узел, вы можете получить к нему доступ, открыв новую вкладку в своем терминале и выполнив следующее:
geth attach
Это подключит консоль Geth — среду Javascript для связи с блокчейном — к вашему работающему узлу. Это можно сделать как в полном режиме клиента, так и в легком режиме.
После того, как вы открыли консоль, введите:
web3.eth.blockNumber
Вы должны получить вывод в виде числа (например, 5631487), которое представляет текущий номер блока сети Ethereum.
Создание новой учетной записи
Чтобы использовать блокчейн, вам необходимо иметь учетную запись. С Geth вы можете сделать это, запустив в своем терминале следующее:
geth account new
После того, как вы это сделаете, он попросит вас ввести пароль, который вам понадобится для защиты вашей учетной записи. Убедитесь, что вы используете безопасный пароль и храните его в безопасности.
То, что делает Geth при запуске geth account new
— это обновление файла в каталоге данных Geth (каталоге, в котором Geth хранит все необходимые данные, включая блоки и заголовки). Места (на платформу):
- macOS:
~/Library/Ethereum
- Linux:
~/.ethereum
- Windows:
%APPDATA%\Ethereum
Доступ к Geth от других клиентов
Когда вы запускаете Geth, клиент автоматически запускает RPC-сервер на порту 8545
. Вы можете получить доступ к серверу RPC и его методам на этом порту, подключившись к localhost:8545
с помощью библиотеки, такой как web3js
или web3j
или web3j
ее вручную с помощью curl
или wget
.
Чтобы узнать о подключении внешних инструментов, таких как те, к работающему экземпляру Geth (частному при запуске вашей собственной цепочки блоков или общедоступным, как в инструкциях выше), смотрите этот пост .
Вывод
В этом кратком введении мы рассмотрели Geth, типы узлов Ethereum и их назначение. Теперь вы можете запустить собственный узел Geth и улучшить его с помощью сторонних инструментов. В следующих статьях мы рассмотрим работу частных сетей (собственный блокчейн Ethereum с Geth) и многое другое.