Статьи

Настройка приватного блокчейна с Ethereum (часть 1)

Я не думаю, что он нуждается в представлении о текущей ажиотаже, которая происходит с Blockchain , биткойнами , Ethereum и другими инициативами. Чтобы лучше понять, что это такое и как это работает, я решил попробовать Ethereum, поскольку он обещает стать разрушительным решением для множества различных вариантов использования . Не вдаваясь в теоретические основы Blockchain или Ethereum (об этом уже написано много документов), этот пост будет посвящен тому, как я настраивал частную сеть Ethereum на своем MacBook. Я буду использовать Docker-контейнеры в качестве узлов Ethereum и использовать браузер Mist на моем Mac для «подключения» к частной сети.

Обратите внимание, что это просто возможная настройка, которая работает для меня. Могут быть лучшие / более легкие альтернативы для других вариантов использования.

Я выполняю следующие шаги для создания частной сети Ethereum:

    • Настроить инфраструктуру
      • создайте каталог для хранения ваших источников Dockerfile и данных Ethereum

Я создал каталог под названием «Myether». В этом каталоге я создал две подкаталоги: «datadir1» и «datadir2».

      • создать файл «mygenesis.json»

Для настройки новой сети Ethereum я использую файл «mygenesis.json», чтобы инициировать новую цепочку блоков. Этот файл будет использоваться для ввода первого блока в цепочке. Чтобы узнать больше об этом см. Здесь .
Вот содержимое моего файла, который я создал в моем новом каталоге, созданном на предыдущем шаге:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
{
  "alloc": {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00",
  "config":{
    "chainId": 13
  }
}
      • создать Dockerfile

Также в новом каталоге я создал ‘Dockerfile’, который запустит образ Ubuntu и начнет установку Ethereum и необходимых зависимостей от него.
Файл содержит следующий контент:

1
2
3
4
5
6
7
8
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y software-properties-common net-tools
RUN add-apt-repository -y ppa:ethereum/ethereum && apt-get update
RUN apt-get -y install ethereum
ADD ./mygenesis.json /root/mygenesis.json
EXPOSE 8545 8546 30303 30303/udp
RUN mkdir -p /root/datadir
ENTRYPOINT "bash"

Полная структура папок на моем MacBook теперь выглядит следующим образом:

      • создать образ Docker

Имея Dockerfile и файл genesis, я могу создать образ Docker, выполнив:
docker build -t pascalalma/my-ether-node .
Вывод выглядит так:

      • начать первый узел

С созданным изображением я могу начать свой первый узел. Мне нужно открыть некоторые порты и использовать собственный каталог данных для моего узла (чтобы хранить данные между запусками контейнера Docker). Команда для запуска первого узла:
docker run -it -p 8545:8545 -p 30303:30303 -v /Users/pascalalma/develop/myether/datadir1:/root/datadir pascalalma/my-ether-node /bin/bash

      • начать второй узел

В другом терминале я запускаю следующую команду:
docker run -it -p 8546:8545 -p 30304:30303 -v /Users/pascalalma/develop/myether/datadir2:/root/datadir pascalalma/my-ether-node /bin/bash

      • запишите IP-адрес первого узла

Я записал IP-адрес контейнера Docker узла 1, чтобы позже использовать его для соединения узла 2 с узлом 1. Я запустил команду ‘ifconfig eth0’ следующим образом:

Таким образом, в этом примере IP-адрес должен быть «172.17.0.2».

    • инициировать частную сеть

Теперь у меня есть два узла Linux, работающие на моем MacBook. Затем я запускаю новый блокчейн с помощью geth . На обоих узлах я запускаю следующую команду:
geth --datadir=/root/datadir/ init /root/mygenesis.json
Вывод выглядит так:

Начальный блок создан (цепочка блоков настроена), и я готов к следующему шагу.

    • начать частную сеть

Создав начальный блок, я могу запустить цепочку блоков, запустив geth на обоих узлах и указав узел 2 на адрес узла 1.

      • запустить geth на node1

Я запускаю следующую команду, чтобы запустить geth на node1:
geth --datadir /root/datadir/ --networkid 1234 --port 30303 --rpcport 8545 --rpc --rpcapi eth,web3,personal,net --rpcaddr 0.0.0.0 console

      • запустить geth на node2

Я запускаю ту же команду для запуска geth на node2:
geth --datadir /root/datadir/ --networkid 1234 --port 30303 --rpcport 8545 -rpc --rpcapi eth,web3,personal,net --rpcaddr 0.0.0.0 console

      • подключить узел 2 к частной сети узла 1

Чтобы получить адрес узла 1, выполните следующую команду на узле 1 в консоли geth:
'admin.nodeInfo.enode' как это:

1
2
> admin.nodeInfo.enode
"enode://8fd1e8b6941cd96030580082cabd0758cf274ac7a74493c942120191b4447e49489e3961eb55ce666db172e2fe177ef9bf03f1685d4d81afb364ab9b5ed4aec9@[::]:30303"

Выходом является адрес узла 1 в формате enode-url .
Теперь я запускаю следующую команду на узле 2:

1
admin.addPeer("enode://8fd1e8b6941cd96030580082cabd0758cf274ac7a74493c942120191b4f77e49489e3961eb55ce666db172e2fe177ef9bf03f1685d4d81afb364ab9b5ed4aec9@172.17.0.2:30303")

Где строка ‘enode’ — это строка, возвращенная в предыдущей команде, а IP-адрес — это IP-адрес, отмеченный ранее для узла 1.
Результат команды должен быть ‘true’.
Чтобы проверить соединение между узлом 1 и узлом 2, я запускаю:
net.peerCount
который должен возвращать ‘1’
или я могу запустить admin.peers который должен вернуть что-то вроде:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
>> admin.peers
[{
    caps: ["eth/63"],
    id: "8fd1e8b6941cd96030580082cabd0758cf274ac7a74493c942120191b4447e49489e3961eb55ce666db172e2fe177ef9bf03f1685d4d81afb364ab9b5ed4aec9",
    name: "Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9",
    network: {
      localAddress: "172.17.0.3:37666",
      remoteAddress: "172.17.0.2:30303"
    },
    protocols: {
      eth: {
        difficulty: 131072,
        head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
        version: 63
      }
    }
}]

Резюме

Так что теперь у меня есть частная сеть Ethereum, состоящая из двух узлов. В следующем посте я покажу вам, как использовать консоль ‘geth’ на одном из узлов для создания учетных записей и выполнять некоторые операции по майнингу для создания эфира для учетной записи. Я также покажу, как подключить ваш браузер Mist к этой частной сети. Будьте на связи!

Опубликовано на Java Code Geeks с разрешения Паскаля Альмы, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Настройка приватного блокчейна с Ethereum (часть 1)

Мнения, высказанные участниками Java Code Geeks, являются их собственными.