» » Создаём собственный блокчейн на Ethereum

 

Создаём собственный блокчейн на Ethereum

Автор: admin от 1-11-2017, 21:10, посмотрело: 1085

Создаём собственный блокчейн на Ethereum

Как создать приватный блокчейн Ethereum с нуля?



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



Инструкция включает в себя следующее:




  • Создание приватного блокчейна Ethereum с помощью [i][b]geth[/b][/i].

  • Создание кошелька MetaMask для работы с приватным блокчейном.

  • Перевод средств между несколькими аккаунтами.

  • Создание, развёртывание и вызов смарт-контракта в приватном блокчейне с помощью [b][i]remix[/i][/b].

  • Создание обозревателя блоков Ethereum поверх приватного блокчейна.

geth[/b][/i]) это одна из трёх изначальных реализаций протокола Ethereum (наряду с C++ и Python). Она написана на Go, полностью открыта и лицензирована под GNU LGPL v3. Go Ethereum можно скачать или как отдельный клиент, работающий практически в любой ОС, или как баблиотеку для встраивания в проекты Go, Android или iOS.



Для установки [i][b]geth[/b][/i] под Mac OS X мы использовали [i][b]homebrew[/b][/i]. Homebrew устанавливает всё необходимое, о чём не позаботилась Apple. Эта статья предполагает, что [i][b]homebrew[/b][/i] у вас уже установлен. Если нет, следуйте этой инструкции. После установки [i][b]homebrew[/b][/i] следующие команды установят [i][b]geth[/b][/i].



brew tap ethereum/ethereum

brew install ethereum



Установить [i][b]geth[/b][/i] на Ubuntu довольно просто, достаточно запустить следующие команды [i][b]apt-get[/b][/i].



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 соответствующий инсталлятор лежит здесь. В случае каких-либо сложностей обращайтесь к инструкции.



Создание аккаунта майнера



Сначала нужно создать аккаунт для майнинга Ethereum. Так мы сгенерируем пару приватного и публичного ключей с паролем для защиты. Не потеряйте свой пароль, иначе никогда не сможете восстановить ключи. По умолчанию, ключи хранятся внутри: [i][b]/keystore[/b][/i]. Всё, что сохраняет [i][b]geth[/b][/i], хранится внутри [i][b]datadir [/b][/i] (кроме PoW Ethash DAG). Расположение директории по умолчанию зависит от ОС. Всегда лучше изменить стандартные настройки и задать свой собственный путь для приватного блокчейна.




  • Mac: ~/Library/Ethereum

  • Linux: ~/.ethereum

  • Windows: %APPDATA%Ethereum



Ethash DAG хранится в ~/.ethash (Mac/Linux) или %APPDATA%Ethash (Windows), так что его могут использовать все клиенты.



Следующая команда показывает, как создать аккаунт с произвольным путём для директории данных. Эта команда выдаст ваш адрес Ethereum.



geth account new --datadir



Пример:



geth account new --datadir /path/to/data/dir



Создание первичного блока (genesis block)



Блокчейны Ethereum отличаются друг от друга первичными блоками. Каждый блокчейн начинается с такого блока, а всё остальное строится поверх него, где каждый следующий блок ссылается на предыдущий. В публичном блокчейне Ethereum первичный блок был создан 20 июля 2015 года. Для нашей собственной цепочки нужно создать собственный первичный блок. Инициализация приватного блокчейна с заданным первичным блоком осуществляется следующей командой:



geth -datadir init



Пример:



geth -datadir /path/to/data/dir init /path/to/genesis.json




  • [i][b]datadir[/b][/i]: директория для баз данных и хранилища ключей.

  • [i][b]init[/b][/i]: начальная загрузка и инициализация нового первичного блока  — с соответствующим файлом json.



Ниже показан наш первичный блок, который используется в приватном блокчейне — нужно сохранить его под именем [i][b]genesis.json[/b][/i] и указать в приведённой выше команде.



{
    "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "0x400",
    "gasLimit": "0x2100000",
    "alloc": {
        "7a69b359e86893efa3d9732e4c65ced51567edd0": 
         { "balance": "0x1337000000000000000000" }     
    }
}



  • [i][b]chainid[/b][/i]: обеспечивает способ совершения транзакций в Ethereum без использования ETC (Ethereum Classic) или тестовой сети Morden. EIP 155 предусматривает следующие значения chainid для разных сетей: основная сеть Ethereum (1), основная сеть Morden / Expanse (2), Ropsten (3), Rinkeby (4), основная сеть Rootstock(30), тестовая сеть Rootstock (31), Kovan (42), основная сеть Ethereum Classic (61), тестовая сеть Ethereum Classic (62), приватные цепочки geth (1337 по умолчанию). В нашем примере мы указали идентификатор 15, который не используется ни одной из существующих цепей.

  • [i][b]homesteadBlock[/b][/i]: значение 0 указывает на использование релиза Ethereum Homestead. Это второй из основных релизов Ethereum — а недавно, 16 октября 2017 года, Ethereum форкнулся на релиз [i][b]Byzantium[/b][/i].

  • [i][b]eip155Block[/b][/i]: значение 0 указывает, что этот блок поддерживает EIP (Ethereum improvement proposal, предложение об улучшении Ethereum) номер 155. Предложения EIP описывают стандарты для платформы Ethereum, в том числе ключевые спецификации протокола, клиентские API и стандарты контрактов.

  • [i][b]eip158Block[/b][/i]: значение 0 указывает, что этот блок поддерживает EIP 158.

  • [i][b]difficulty[/b][/i]: значение соответствует уровню сложности, которое применяется для поиска случайного значения nonce к этому блоку. В этой статье подробно объясняется, как рассчитывается уровень сложности в Ethereum.

  • [i][b]gasLimit[/b][/i]: газ — это внутренняя единица оплаты для проведения транзакции или контракта в Ethereum. Каждая инструкция, которая отправляется в виртуальную машину Ethereum Virtual Machine (EVM) для обработки транзакции или смарт-контракта стоит определённое количество газа. Если транзакция не получает нужного количества газа, то она не пройдёт. При совершении каждой транзакции в Ethereum вы указываете лимит газа — максимальное количество, которое могут использовать все сопутствующие операции для этой транзакции. Параметр [i][b]gasLimit[/b][/i] в блоке определяет общий лимит всех транзакций в блоке.

  • [i][b]alloc[/b][/i]: параметр для предварительного распределения Эфира из первичного блока на один или несколько аккаунтов. В вышеприведённом примере первичного блока весь Эфир поступает на аккаунт, созданный с самого начала.



Начинаем майнинг



Всё готово! Теперь можно начать майнинг через [i][b]geth[/b][/i] с помощью следующей команды. Здесь параметр [i][b]networkid[/b][/i] выделяет эту сеть Ethereum среди других. Все майнеры, желающие подключиться к этой сети, должны использовать тот же идентификатор [i][b]networkid[/b][/i] с тем же первичным блоком.



geth --mine --rpc --networkid --datadir



Пример:



geth --mine --rpc --networkid 1999 --datadir /path/to/data/dir




  • [i][b]networkid[/b][/i]: сетевой идентификатор этой сети Ethereum. Выбираете любое значение. Например, Olympic (0), Frontier (1), Morden (2), Ropsten (3).

  • [i][b]mine[/b][/i]: включает майнинг.

  • [i][b]rpc[/b][/i]: включает сервер HTTP-RPC. Приложения кошельков могут подключаться по http к этому узлу майнинга.

  • [i][b]rpcaddr[/b][/i]: указывает интерфейс для прослушивания на сервере HTTP-RPC (по умолчанию: “localhost”)

  • [i][b]rpcport[/b][/i]: указывает порт для прослушивания на сервере HTTP-RPC (по умолчанию: 8545)

  • [i][b]rpcapi[/b][/i]: указывает API, доступные по интерфейсу HTTP-RPC (по умолчанию: “eth,net,web3”)

  • [i][b]rpccorsdomain[/b][/i]: активирует CORS, указывая разделённый запятыми список сторонних доменов, с которых можно принимать запросы (cross-origin). Полезная опция при использовании для размещения смарт-контрактов браузерных редакторов Solidity (Remix) или браузерных кошельков. Например, такой параметр позволит принимать CORS с любого домена.



    --rpccorsdomain "*"

  • [i][b]nodiscover[/b][/i]: отключает механизм поиска пиров. Ваш узел не смогут найти никакие другие узлы в сети. Если намерены использовать блокчейн в локальной сети совместно с другими, не применяйте этот параметр.

  • [i][b]console[/b][/i]: этой командой мы можем запустить узел майнинга с интерактивным окружением javascript. В следующем разделе подробнее рассмотрим эту тему.



    geth --mine --rpc --networkid 1999 --datadir /path/to/data/dir console



Подключаем консоль Geth



Можно или начать майнинг как [i][b]console [/b][/i], или запустить [i][b]console [/b][/i] отдельно — и подключить её к узлу майнинга командой [i][b]attach[/b][/i]. Сейчас покажу, как это делается, и проверьте, что вы указали параметры в том же порядке.



geth --datadir attach ipc:/geth.ipc



Пример:



geth --datadir /path/to/data/dir attach ipc:/path/to/data/dir /geth.ipc



Консоль подключается к узлу майнинга по [i][b]IPC[/b][/i]. [i][b]IPC[/b][/i] (межпрорцессное взаимодействие) работает на локальном компьютере. В этом случае [i][b]geth[/b][/i] создаёт конвейер [i][b]Geth[/b][/i] (который представлен файлом [i][b]/geth.ipc[/b][/i]) в файловой системе локального компьютера — а консоль подключается к этому узлу по IPC.



Просмотр всех аккаунтов



Как только вы подключились к консоли [i][b]geth[/b][/i], можно попробовать запустить следующую команду для отображения всех доступных аккаунтов.


["0x7a69b359e86893efa3d9732e4c65ced51567edd0"]



Просмотр баланса аккаунта



Следующая команда позволяет просмотреть баланс заданного аккаунта из консоли [i][b]geth[/b][/i].




1.295e+21



Подключение кошелька MetaMask Ethereum



MetaMask — это кошелёк Ethereum, работающий как расширение Chrome. Он внедряет Ethereum Web3 API в каждый контекст javascript на сайте, так что все эти приложения способны получать информацию из блокчейна. MetaMask также позволяет создавать собственные идентификаторы (identities) и управлять ими, так что когда приложение хочет совершить транзакцию и записать данные в блокчейн, у пользователя есть безопасный интерфейс для просмотра транзакции, прежде чем одобрить или отклонить её.



Для подключения MetaMask к приватному блокчейну Ethereum нужно выбрать правильные имя хоста и порт. Web3 API — это программные интерфейсы javascript для Ethereum, реализованные в [i][b]web3.js[/b][/i]. Чтобы javascript-приложение обменивалось данными с узлом Ethereum, MetaMask использует библиотеку [i][b]web3.js[/b][/i] с удобным интерфейсом для методов [b]rpc[/b]. Она обменивается с локальным узлом вызовами [b]rpc[/b]. Библиотека [i][b]web3.js[/b][/i] работает с любым узлом Ethereum, у которого есть слой [b]rpc[/b]. Вы могли заметить выше, что при запуске узла майнинга можно передать параметр [i][b]rpcapi [/b][/i] и указать, какие интерфейсы мы хотим использовать на этом узле. По умолчанию, если ничего не указать, будут использоваться интерфейсы [i][b]eth,net,web3 [/b][/i].



Создаём собственный блокчейн на Ethereum


Передача Эфира



MetaMask создаст аккаунт Ethereum — секретный ключ и адрес Ethereum. Дальше разберёмся, как передавать Эфир с первого аккаунта, созданного в самом начале, на аккаунт MetaMask из консоли [i][b]geth[/b][/i]. Для передачи средств аккаунта нужно использовать для подписи секретный ключ этого аккаунта. Чтобы его использовать, нужно его сначала разблокировать, как показано ниже.







[i][b]personal[/b][/i] — это управляющие программные интерфейсы в [i][b]geth[/b][/i]. Кроме [i][b]personal[/b][/i], [i][b]geth[/b][/i] также предоставляет следующие управляющие API: [i][b]admin[/b][/i], [i][b]debug[/b][/i], [i][b]miner[/b][/i] и [i][b]txpool[/b][/i]. Как только мы разблокировали аккаунт, мы можем определить в консоли три переменные: для [i][b]sender[/b][/i], [i][b]receiver[/b][/i] и [i][b]amount[/b][/i], то есть получателя, отправителя и количества передаваемых средств. Значение [i][b]sender[/b][/i] — это адрес Ethereum, который мы создали в начале этой статьи, а значение [i][b]receiver[/b][/i] — адрес Ethereum, созданный в MetaMask.



var receiver = "0xA9f28458eE1170F285440990c196c1592D3a73f5"

> var amount = web3.toWei(1, "ether")



Следующая команда осуществит передачу средств — она ссылается на переменные, которые мы определили выше.







Просмотр баланса аккаунта в MetaMask



Когда мы завершили передачу средств, следуя вышеуказанным шагам, можно просмотреть баланс аккаунта двумя способами. Первый способ — напрямую из плагина MetaMask, как показано ниже.



Создаём собственный блокчейн на Ethereum


Другой способ — через консоль [i][b]geth[/b][/i], с помощью следующей команды.



< eth.getBalance("0xA9f28458eE1170F285440990c196c1592D3a73f5")

1000000000000000000




Редактор Remix для Solidity



Solidity — самый популярный язык программирования для написания смарт-контрактов Ethereum. Remix — это IDE для Solidity со встроенным отладчиком и средой тестирования. Онлайновый редактор remix можно найти здесь. Remix подключается к любой сети Ethereum. Для подключения к нашему локальному блокчейну убедитесь, что вы запустили узел майнинга следующей командой, как показано ниже. О параметре --rpccorsdomain "*" мы уже говорили. Вместо звёздочки (максимальная открытость) в качестве значения этого параметра можно указать [i][b]“https://remix.ethereum.org”[/b][/i].



geth --mine --rpc --rpccorsdomain "*" --networkid --datadir



Для подключения [i][b]remix[/b][/i] к нашей закрытой сети нужно изменить [i][b]Environment[/b][/i] на [i][b]Web3 Provider[/b][/i], это делается на вкладке [i][b]Run[/b][/i]. При этом изменении [i][b]remix[/b][/i] попросит указать [i][b]Web3 Provider Endpoint [/b][/i] — установите значение http://localhost:8545. Пока вы явно не изменили порт, по умолчанию узел для майнинга стартует на порту 8545.



Создаём собственный блокчейн на Ethereum


Создание смарт-контракта



Теперь всё готово для написания самого первого смарт-контракта, который мы запустим в сети Ethereum. Скопируйте следующий код и вставьте его в онлайновый редактор [i][b]remix[/b][/i]. Это очень простой смарт-контракт — я даже не хочу объяснять его построчно. В следующей статье подробно рассмотрим язык программирования 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;
     }
 }


Если вы не меняли настройки по умолчанию в [i][b]remix[/b][/i], то они установлены на автоматическую компиляцию. Если нет, то надо скомпилировать код.



Создаём собственный блокчейн на Ethereum


После компиляции при нажатии кнопки [i][b]Details[/b][/i] вы увидите расчётное количество газа, необходимое для создания этого смарт-контракта.



Внедрение смарт-контракта



Теперь можем внедрить смарт-контракт в наш приватный блокчейн. На вкладке [i][b]Run[/b][/i] убедитесь, что у вас выбран правильный аккаунт Ethereum и правильный лимит газа. Значения [i][b]gas price[/b][/i] и [i][b]value[/b][/i] можно указать нулевыми.



Создаём собственный блокчейн на Ethereum


Здесь транзакция Ethereum, подписанная с выбранного выше аккаунта для создания смарт-контракта в блокчейне. Для подписи сначала нужно разблокировать аккаунт через консоль [i][b]geth[/b][/i].



> personal.unlockAccount( "0x7a69b359e86893efa3d9732e4c65ced51567edd0","password")



Теперь можете нажать кнопку [i][b]Create[/b][/i], чтобы создать смарт-контракт. У нас в нём конструктор, принимающий строковый параметр, вот почему [i][b]remix[/b][/i] показывает поле ввода вместе с кнопкой [i][b]Create[/b][/i]. Сюда можно ввести какое-нибудь значение (в кавычках, например, “Hi”)  — или просто оставить пустым. В консоли [i][b]geth[/b][/i] при создании смарт-контракта появится следующее сообщение. Также обратите внимание, что если не установлен корректный [i][b]gas limit[/b][/i], то такая команда приведёт к ошибке.



INFO [10-19|07:31:08] Submitted contract creation fullhash=0xf5511bb9d088672ac0d3896b8590b9a3e25484300f02deecdd739c3a549ed33a contract=0x42b7E903Fb42e191a7D623cbb4b7b4330D329d78



Вызов смарт-контракта



После создания смарт-контракта интерфейс [i][b]remix[/b][/i] немного изменится — как показано ниже, на вкладке [i][b]Run[/b][/i].



Создаём собственный блокчейн на Ethereum


Здесь можно установить некое значение для метода [i][b]setGreeting[/b][/i] — и нажать на него для вызова смарт-контракта. Опять же следует убедиться, что аккаунт разблокирован, потому что при вызове смарт-контракта мы использует транзакции Ethereum и требуется подпись инициатора. Проделав операцию с [i][b]setGreeting[/b][/i], можно вызвать и другие методы.



Создаём собственный блокчейн на Ethereum


Ethereum Block Explorer



Возможно, вы знакомы с сервисом [i][b]etherscan[/b][/i] для сканирования публичного блокчейна Ethereum. Но его нельзя направить на наш локальный блокчейн. Хотя Ethereum Block Explorer даже близко не сравнится по функциональности с [i][b]etherscan[/b][/i], он вполне подходит для изучения того, что происходит в нашем локальном блокчейне.



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



git clone https://github.com/carsenk/explorer



Затем запустим команду установки из директории Ethereum Block Explorer.



npm install



По окончании установки запустите [i][b]Ethereum Block Explorer[/b][/i] следующей командой — и получите доступ к веб-консоли через http://localhost:8000.



npm start



Создаём собственный блокчейн на Ethereum


Перед подключением [i][b]Ethereum Block Explorer[/b][/i] к локальному блокчейну убедитесь, что запустили узел майнинга следующей командой с параметром --rpccorsdomain "*" — его значение мы обсуждали ранее.



geth --mine --rpc --rpccorsdomain "*" --networkid --datadir



[b]Обновление[/b]: Обсуждение этой статьи на Hacker News см. здесь. Не стесняйтесь присоединяться.



Резюме



В этой статье мы обсудили, как создать приватный блокчейн Ethereum с помощью [i][b]geth[/b][/i]. Затем настроили кошелёк MetaMask для работы с этим блокчейном и и перевели средства на аккаунт Ethereum, созданный в MetaMask. Для создания, внедрения и вызова смарт-контракта использовалась онлайновая IDE [i][b]remix[/b][/i]. Наконец, мы установили [i][b]Ethereum Block Explorer[/b][/i] для изучения приватного блокчейна.

Источник: Хабрахабр

Категория: Программирование

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *