Настройка частной тестовой сети Ethereum

Я хочу поиграть с несколькими смарт-контрактами Ethereum, не тратя реальных денег до того, как будут готовы окончательные версии. К счастью, Ethereum был разработан таким образом, что позволяет легко создавать новые сети, особенно частные, которые не связаны с основной сетью. Здесь я попытаюсь объяснить первые шаги как для себя, так и для всех, кто ищет простой и безопасный способ играть со смарт-контрактами Ethereum.

Примечание. Есть несколько проектов, которые позволяют настроить частную сеть Ethereum одним щелчком мыши, например Ganache. Я не буду обсуждать это, потому что я хотел бы немного углубиться под капот.

Что нам нужно?

ГЕТ

Geth означает Go Ethereum и представляет собой реализацию протокола Ethereum с полным узлом, написанную на Go. Это одна из трех оригинальных реализаций (наряду с C++ и Python). Geth позволит нам настроить тестовую сеть из так называемого файла генезиса. Перво-наперво, давайте установим его. Для пользователей macOS вроде меня есть удобная установка через Homebrew:

После установки Geth нам нужно настроить наш файл генезиса.

Файл Бытия

Файл генезиса — это файл конфигурации JSON, который Geth использует для создания блока генезиса. Цель этого блока — определить правила игры, и выглядит он примерно так (спасибо, pyethapp):

{
  "nonce": "0x0000000000000042",
  "difficulty": "0x200",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
  "gasLimit": "0x1388",
  "alloc": {
    "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {
      "balance": "1337000000000000000000"
    },
    "17961d633bcf20a7b029a7d94b7df4da2ec5427f": {
      "balance": "229427000000000000000"
    }
  }
}

Он устанавливает некоторые довольно важные базовые значения, такие как начальные difficulty и gas limit. Сложность, в смысле PoW, диктует энтропию каждого следующего хэша, или, проще говоря, сколько вычислительной мощности необходимо для решения следующего блока и угадывания комбинации mixhash и nonce. Мы хотим, чтобы в нашей тестовой сети он был достаточно низким, чтобы мы могли «майнить», используя только ноутбук, не дожидаясь и не переплавляя его.

С другой стороны, мы хотим, чтобы gas limit было достаточно высоким, чтобы мы могли допускать операции произвольной сложности без необходимости повторной инициализации нуля нашей чистой формы. Тем не менее, прежде чем запускать смарт-контракт, всегда следите за количеством газа, которое тратится на операции, потому что в основной сети это означает реальные реальные деньги.

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

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

Туман

Mist — это браузер Ethereum Dapp с графическим интерфейсом, содержащий собственный интегрированный узел Geth, а также встроенный менеджер кошелька ETH. Если вы до сих пор использовали только кошелек ETH, концепция браузера Dapp поначалу может показаться сложной. Помимо управления кошельками, Mist также функционирует как де-факто магазин децентрализованных приложений, позволяя пользователю находить и использовать уже разработанные децентрализованные приложения, такие как CryptoKitties, Augur, Bancor и т. д. Лучше всего, что Mist позволяет создавать, развертывать и выполнять функции на смарт-контрактах. Это в первую очередь то, для чего мы будем его использовать.

Инициализация сети

Перво-наперво, давайте инициализируем нашу сеть. Нам понадобится исходная структура папок, которая может выглядеть так:

mytestnet/ - chaindata/ - genesis.json

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

geth --datadir=.chaindata init genesis.json

Geth запустит блокчейн и закроется. Как только цепочка инициализирована, вы можете запустить один экземпляр Geth и поддерживать его работу:

geth --datadir=.chaindata

Geth подключится и будет поддерживать работу сервера. Единственное, на что вы хотите обратить внимание, — это последняя строка процесса подключения, которая должна выглядеть примерно так:

INFO [07-29|09:53:20.327] IPC endpoint opened url=/path/to/my/testnet/.chaindata/geth.ipc

Файл .ipc — это то, что мы будем использовать для подключения Mist на следующем шаге.

Стартовый туман

Следует отметить момент, касающийся Mist. Он поставляется с собственной версией Geth, которая, если на вашем компьютере не запущена другая версия, запустится автоматически. Это может привести к тому, что Mist попытается подключиться к основной сети и начать загрузку копии реального блокчейна Ethereum. Мы хотим предотвратить это. Вместо этого мы запустим Mist из командной строки и укажем на файл .ipc, который открыл наш экземпляр Geth:

/Applications/Mist.app/Contents/MacOS/Mist --rpc /path/to/my/testnet/.chaindata/geth.ipc

После небольшой настройки Mist запустится. Независимо от того, выделили ли вы ранее ETH для некоторых адресов в генезис-файле, вы не сможете получить к ним доступ. Вам нужно будет создать новый кошелек и добыть немного ETH.

После того, как вы настроите свой первый кошелек, почему бы вам не добыть немного ETH? Предполагая, что вы оставили значение difficulty достаточно низким, это должен быть довольно быстрый и простой процесс. Откройте новую вкладку и запустите второй экземпляр Geth следующим образом:

geth attach /path/to/my/testnet/.chaindata/geth.ipc

Он запустит консоль, в которой вы напишите следующий набор команд:

miner.setEtherbase("the_address_of_your_wallet"); miner.start(1); // # of parallel threads. // To stop the miner, type miner.stop()

Через некоторое время Mist начнет показывать постоянно увеличивающееся количество ETH в вашем кошельке.

В качестве упражнения попробуйте отправить немного ETH на другой кошелек, который вы создали через Mist. Чтобы подтвердить транзакцию, вы должны быстро запустить майнер и поддерживать его работу до тех пор, пока не будут выполнены все подтверждения. Обычно Mist должен быть достаточно отзывчивым, чтобы показывать это в режиме реального времени. Однако иногда Mist может перестать отвечать или терять соединение с сокетом. Если это произойдет, просто перезапустите его, и он снова должен работать.

Это все на данный момент. В следующем посте я расскажу о создании и развертывании простого смарт-контракта в нашей новой частной тестовой сети. Быть в курсе.

Первоначально опубликовано на preslav.me 20 июля 2018 г.