- PVSM.RU - https://www.pvsm.ru -
Ethereum — децентрализованная платформа, на которой работают смарт-контракты: приложения, исполняемые строго запрограммированным образом, без возможности даунтайма, цензуры, фрода или вмешательства третьих лиц. В этой статье я проведу вас через все шаги, необходимые для создания полностью функционального приватного блокчейна Ethereum внутри вашей локальной сети.
Инструкция включает в себя следующее:
Go Ethereum (или geth [1]) это одна из трёх изначальных реализаций протокола Ethereum (наряду с C++ и Python). Она написана на Go, полностью открыта и лицензирована под GNU LGPL v3. Go Ethereum можно скачать или как отдельный клиент, работающий практически в любой ОС, или как баблиотеку для встраивания в проекты Go, Android или iOS.
Для установки geth под Mac OS X мы использовали homebrew [2]. Homebrew устанавливает всё необходимое, о чём не позаботилась Apple. Эта статья предполагает, что homebrew у вас уже установлен. Если нет, следуйте этой инструкции [3]. После установки homebrew следующие команды установят geth.
brew tap ethereum/ethereum
brew install ethereum
Установить geth на Ubuntu довольно просто, достаточно запустить следующие команды apt-get.
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:thereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
Для Windows соответствующий инсталлятор лежит здесь [4]. В случае каких-либо сложностей обращайтесь к инструкции [5].
Сначала нужно создать аккаунт для майнинга Ethereum. Так мы сгенерируем пару приватного и публичного ключей с паролем для защиты. Не потеряйте свой пароль, иначе никогда не сможете восстановить ключи. По умолчанию, ключи хранятся внутри: <datadir>/keystore. Всё, что сохраняет geth, хранится внутри datadir (кроме PoW Ethash DAG). Расположение директории по умолчанию зависит от ОС. Всегда лучше изменить стандартные настройки и задать свой собственный путь для приватного блокчейна.
Ethash DAG хранится в ~/.ethash (Mac/Linux) или %APPDATA%Ethash (Windows), так что его могут использовать все клиенты.
Следующая команда показывает, как создать аккаунт с произвольным путём для директории данных. Эта команда выдаст ваш адрес Ethereum.
geth account new --datadir <path-to-data-directory>
Пример:
geth account new --datadir /path/to/data/dir
Блокчейны Ethereum отличаются друг от друга первичными блоками. Каждый блокчейн начинается с такого блока, а всё остальное строится поверх него, где каждый следующий блок ссылается на предыдущий. В публичном блокчейне Ethereum первичный блок был создан 20 июля 2015 года. Для нашей собственной цепочки нужно создать собственный первичный блок. Инициализация приватного блокчейна с заданным первичным блоком осуществляется следующей командой:
geth -datadir <path-to-data-directory> init <path-to-genesis-block>
Пример:
geth -datadir /path/to/data/dir init /path/to/genesis.json
Ниже показан наш первичный блок, который используется в приватном блокчейне — нужно сохранить его под именем genesis.json и указать в приведённой выше команде.
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x400",
"gasLimit": "0x2100000",
"alloc": {
"7a69b359e86893efa3d9732e4c65ced51567edd0":
{ "balance": "0x1337000000000000000000" }
}
}
Всё готово! Теперь можно начать майнинг через geth с помощью следующей команды. Здесь параметр networkid выделяет эту сеть Ethereum среди других. Все майнеры, желающие подключиться к этой сети, должны использовать тот же идентификатор networkid с тем же первичным блоком.
geth --mine --rpc --networkid <networkd-id> --datadir <path-to-data-directory>
Пример:
geth --mine --rpc --networkid 1999 --datadir /path/to/data/dir
--rpccorsdomain "*"
geth --mine --rpc --networkid 1999 --datadir /path/to/data/dir console
Можно или начать майнинг как console , или запустить console отдельно — и подключить её к узлу майнинга командой attach. Сейчас покажу, как это делается, и проверьте, что вы указали параметры в том же порядке.
geth --datadir <path-to-data-directory> attach ipc:<path-to-data-directory>/geth.ipc
Пример:
geth --datadir /path/to/data/dir attach ipc:/path/to/data/dir /geth.ipc
Консоль подключается к узлу майнинга по IPC. IPC (межпрорцессное взаимодействие) работает на локальном компьютере. В этом случае geth создаёт конвейер Geth (который представлен файлом <path-to-data-directory>/geth.ipc) в файловой системе локального компьютера — а консоль подключается к этому узлу по IPC.
Как только вы подключились к консоли geth, можно попробовать запустить следующую команду для отображения всех доступных аккаунтов.
> eth.accounts
["0x7a69b359e86893efa3d9732e4c65ced51567edd0"]
Следующая команда позволяет просмотреть баланс заданного аккаунта из консоли geth.
> eth.getBalance("0x7a69b359e86893efa3d9732e4c65ced51567edd0")
1.295e+21
MetaMask [8] — это кошелёк Ethereum, работающий как расширение Chrome. Он внедряет Ethereum Web3 API в каждый контекст JavaScript на сайте, так что все эти приложения способны получать информацию из блокчейна. MetaMask также позволяет создавать собственные идентификаторы (identities) и управлять ими, так что когда приложение хочет совершить транзакцию и записать данные в блокчейн, у пользователя есть безопасный интерфейс для просмотра транзакции, прежде чем одобрить или отклонить её.
Для подключения MetaMask к приватному блокчейну Ethereum нужно выбрать правильные имя хоста и порт. Web3 API — это программные интерфейсы JavaScript для Ethereum, реализованные в web3.js. Чтобы JavaScript-приложение обменивалось данными с узлом Ethereum, MetaMask использует библиотеку web3.js [9] с удобным интерфейсом для методов rpc. Она обменивается с локальным узлом вызовами rpc. Библиотека web3.js работает с любым узлом Ethereum, у которого есть слой rpc. Вы могли заметить выше, что при запуске узла майнинга можно передать параметр rpcapi и указать, какие интерфейсы мы хотим использовать на этом узле. По умолчанию, если ничего не указать, будут использоваться интерфейсы eth,net,web3 .
MetaMask создаст аккаунт Ethereum — секретный ключ и адрес Ethereum. Дальше разберёмся, как передавать Эфир с первого аккаунта, созданного в самом начале, на аккаунт MetaMask из консоли geth. Для передачи средств аккаунта нужно использовать для подписи секретный ключ этого аккаунта. Чтобы его использовать, нужно его сначала разблокировать, как показано ниже.
> personal.unlockAccount( "0x7a69b359e86893efa3d9732e4c65ced51567edd0","password")
personal [10] — это управляющие программные интерфейсы в geth. Кроме personal, geth также предоставляет следующие управляющие API: admin [11], debug [12], miner [13] и txpool [14]. Как только мы разблокировали аккаунт, мы можем определить в консоли три переменные: для sender, receiver и amount, то есть получателя, отправителя и количества передаваемых средств. Значение sender — это адрес Ethereum, который мы создали в начале этой статьи, а значение receiver — адрес Ethereum, созданный в MetaMask.
> var sender = "0x7a69b359e86893efa3d9732e4c65ced51567edd0";
> var receiver = "0xA9f28458eE1170F285440990c196c1592D3a73f5"
> var amount = web3.toWei(1, "ether")
Следующая команда осуществит передачу средств — она ссылается на переменные, которые мы определили выше.
> eth.sendTransaction({from:sender, to:receiver, value: amount})
Когда мы завершили передачу средств, следуя вышеуказанным шагам, можно просмотреть баланс аккаунта двумя способами. Первый способ — напрямую из плагина MetaMask, как показано ниже.
Другой способ — через консоль geth, с помощью следующей команды.
< eth.getBalance("0xA9f28458eE1170F285440990c196c1592D3a73f5")
1000000000000000000
Solidity — самый популярный язык программирования для написания смарт-контрактов Ethereum. Remix — это IDE для Solidity со встроенным отладчиком и средой тестирования. Онлайновый редактор remix можно найти здесь [15]. Remix подключается к любой сети Ethereum. Для подключения к нашему локальному блокчейну убедитесь, что вы запустили узел майнинга следующей командой, как показано ниже. О параметре --rpccorsdomain "*"
мы уже говорили. Вместо звёздочки (максимальная открытость) в качестве значения этого параметра можно указать “https://remix.ethereum.org”.
geth --mine --rpc --rpccorsdomain "*" --networkid <networkd-id> --datadir <path-to-data-directory>
Для подключения remix к нашей закрытой сети нужно изменить Environment на Web3 Provider, это делается на вкладке Run. При этом изменении remix попросит указать Web3 Provider Endpoint — установите значение http://localhost:8545
. Пока вы явно не изменили порт, по умолчанию узел для майнинга стартует на порту 8545.
Теперь всё готово для написания самого первого смарт-контракта, который мы запустим в сети Ethereum. Скопируйте следующий код и вставьте его в онлайновый редактор remix. Это очень простой смарт-контракт — я даже не хочу объяснять его построчно. В следующей статье подробно рассмотрим язык программирования Solidity.
pragma solidity ^0.4.11;
contract Hello {
// a string variable
string public greeting;
// the function with the same name as the class is a constructor
function Hello(string _greeting) {
greeting = _greeting;
}
// change the greeting message
function setGreeting(string _greeting) {
greeting = _greeting;
}
// get the greeting message
function greet() constant returns (string _greeting) {
_greeting = greeting;
}
}
Если вы не меняли настройки по умолчанию в remix, то они установлены на автоматическую компиляцию. Если нет, то надо скомпилировать код.
После компиляции при нажатии кнопки Details вы увидите расчётное количество газа, необходимое для создания этого смарт-контракта.
Теперь можем внедрить смарт-контракт в наш приватный блокчейн. На вкладке Run убедитесь, что у вас выбран правильный аккаунт Ethereum и правильный лимит газа. Значения gas price и value можно указать нулевыми.
Здесь транзакция Ethereum, подписанная с выбранного выше аккаунта для создания смарт-контракта в блокчейне. Для подписи сначала нужно разблокировать аккаунт через консоль geth.
> personal.unlockAccount( "0x7a69b359e86893efa3d9732e4c65ced51567edd0","password")
Теперь можете нажать кнопку Create, чтобы создать смарт-контракт. У нас в нём конструктор, принимающий строковый параметр, вот почему remix показывает поле ввода вместе с кнопкой Create. Сюда можно ввести какое-нибудь значение (в кавычках, например, “Hi”) — или просто оставить пустым. В консоли geth при создании смарт-контракта появится следующее сообщение. Также обратите внимание, что если не установлен корректный gas limit, то такая команда приведёт к ошибке.
INFO [10-19|07:31:08] Submitted contract creation fullhash=0xf5511bb9d088672ac0d3896b8590b9a3e25484300f02deecdd739c3a549ed33a contract=0x42b7E903Fb42e191a7D623cbb4b7b4330D329d78
После создания смарт-контракта интерфейс remix немного изменится — как показано ниже, на вкладке Run.
Здесь можно установить некое значение для метода setGreeting — и нажать на него для вызова смарт-контракта. Опять же следует убедиться, что аккаунт разблокирован, потому что при вызове смарт-контракта мы использует транзакции Ethereum и требуется подпись инициатора. Проделав операцию с setGreeting, можно вызвать и другие методы.
Возможно, вы знакомы с сервисом etherscan [16] для сканирования публичного блокчейна Ethereum. Но его нельзя направить на наш локальный блокчейн. Хотя Ethereum Block Explorer [17] даже близко не сравнится по функциональности с etherscan, он вполне подходит для изучения того, что происходит в нашем локальном блокчейне.
Для установки программы сначала возьмём исходники со следующего репозитория.
git clone https://github.com/carsenk/explorer
Затем запустим команду установки из директории Ethereum Block Explorer.
npm install
По окончании установки запустите Ethereum Block Explorer следующей командой — и получите доступ к веб-консоли через http://localhost:8000
.
npm start
Перед подключением Ethereum Block Explorer к локальному блокчейну убедитесь, что запустили узел майнинга следующей командой с параметром --rpccorsdomain "*"
— его значение мы обсуждали ранее.
geth --mine --rpc --rpccorsdomain "*" --networkid <networkd-id> --datadir <path-to-data-directory>
Обновление: Обсуждение этой статьи на Hacker News см. здесь [18]. Не стесняйтесь присоединяться.
В этой статье мы обсудили, как создать приватный блокчейн Ethereum с помощью geth. Затем настроили кошелёк MetaMask для работы с этим блокчейном и и перевели средства на аккаунт Ethereum, созданный в MetaMask. Для создания, внедрения и вызова смарт-контракта использовалась онлайновая IDE remix. Наконец, мы установили Ethereum Block Explorer для изучения приватного блокчейна.
Автор: m1rko
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/kriptografiya/267243
Ссылки в тексте:
[1] geth: https://geth.ethereum.org/downloads/
[2] homebrew: https://brew.sh/
[3] этой инструкции: https://docs.brew.sh/Installation.html
[4] здесь: https://ethereum.github.io/go-ethereum/downloads/
[5] инструкции: https://ethereum.github.io/go-ethereum/install/
[6] EIP 155: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md
[7] этой: https://medium.facilelogin.com/the-mystery-behind-block-time-63351e35603a
[8] MetaMask: https://metamask.io/
[9] web3.js: https://github.com/ethereum/web3.js
[10] personal: https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal
[11] admin: https://github.com/ethereum/go-ethereum/wiki/Management-APIs#admin
[12] debug: https://github.com/ethereum/go-ethereum/wiki/Management-APIs#debug
[13] miner: https://github.com/ethereum/go-ethereum/wiki/Management-APIs#miner
[14] txpool: https://github.com/ethereum/go-ethereum/wiki/Management-APIs#txpool
[15] здесь: https://remix.ethereum.org/
[16] etherscan: https://etherscan.io/
[17] Ethereum Block Explorer: https://github.com/carsenk/explorer
[18] здесь: https://news.ycombinator.com/item?id=15509147
[19] Источник: https://habrahabr.ru/post/341466/
Нажмите здесь для печати.