Мы любим маленького кита. Это позволяет нам создавать продукты на единой платформе с использованием архитектуры микросервисов и развертывать их в самых разных средах. Это легкий, быстрый и освобождает разработчиков от рутинной работы по поддержке нескольких операционных систем.

EOS, потрясающее решение для блокчейна, к счастью, имеет здравый смысл поддерживать образ своего продукта в Docker Hub, что означает, что на платформах OSX, Linux или (глоток!) Windows нам не нужно устанавливать исходный код и инструменты, а также необходимость компилировать и запускать службы вручную - скорее, мы запускаем одну команду, и последняя и самая свежая версия запускается в нашей среде, готовая к работе

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

Docker Compose

Среда Docker поставляется с оркестратором, который позволяет нам абстрагироваться от множества деталей о том, как запускать контейнеры¹

EOS предоставляет docker-compose.yml в своем репозитории на github, что замечательно, но не предназначено специально для разработчиков, т. Е. Такие инструменты, как eosiocpp, не включены в образ. К счастью, у них есть изображение под названием eosio/eos-dev для разработчиков, и мы модифицируем текущий yml, чтобы использовать этот правильный образ - я предоставляю свою исправленную версию на github, которую я рекомендую вам поместить в каталог с именем eos (вы можете называть его как угодно нравиться):

OSX / Linux

mkdir eos; cd eos
curl -L http://bit.ly/2JEHAQk > docker-compose.yml

Windows (Powershell ≥ 3.0)

mkdir eos
cd eos
Invoke-WebRequest -OutFile docker-compose.yml http://bit.ly/2JEHAQk

В файле docker-compose используются именованные тома, и по какой-то причине они объявляются внешними. Это неприятно, поскольку требует от нас управления ими, т. Е. Создания их до запуска оркестратора, удаления их, когда они больше не нужны, время от времени проверять их чистоту между запусками. Я предпочитаю связанные каталоги, поэтому yml был изменен

Кроме того, чтобы иметь возможность компилировать наши контракты (находящиеся в локальной файловой системе), нам необходимо смонтировать каталог. Файл docker-compose также был изменен для использования каталога с именем contracts относительно нашего текущего каталога, поэтому создайте его следующим образом:

mkdir contracts

Теперь мы готовы запустить среду. Мы можем сделать это с помощью одной простой команды:

docker-compose up -d

Если это ваш первый раз, это может занять некоторое время, пока изображения будут загружены и загружены, а контейнеры построены. Результат, скорее всего, будет выглядеть примерно так, как показано ниже:

Creating volume "eos_nodeos-data-volume" with default driver
Creating volume "eos_keosd-data-volume" with default driver
Pulling nodeosd (eosio/eos-dev:)...
latest: Pulling from eosio/eos-dev
6b98dfc16071: Already exists
4001a1209541: Already exists
6319fc68c576: Already exists
b24603670dc3: Already exists
97f170c87c6f: Already exists
989c07c6edff: Already exists
3cb5f57fd105: Already exists
17e8c5aa3340: Already exists
865a94241630: Already exists
78c0dba4c581: Already exists
80dfca640586: Already exists
e56cf35e4a67: Already exists
36519f785e03: Already exists
07695dae958b: Already exists
d61d51134ed0: Already exists
0968c979e0d8: Already exists
cecf24f79303: Pull complete
03348f5b07b3: Pull complete
1fea77e318cf: Pull complete
e0a8fecc5f9f: Pull complete
Digest: sha256:8f1841f71332109d8281cbd4197751933f2bf4fb5e77db189908bb77782b19df
Status: Downloaded newer image for eosio/eos-dev:latest
Creating eos_nodeosd_1 ... done
Creating eos_keosd_1   ... done

Второй раз будет супер-быстрым и, вероятно, будет выглядеть так:

Creating network "eos_default" with the default driver
Creating eos_nodeosd_1 … done
Creating eos_keosd_1 … done

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

Для работы с контейнером вам понадобится полезный псевдоним. В среде OSX / Linux вы можете сохранить его в ~/.bashrc, в Windows Powershell отредактируйте $profile

OSX / Linux

alias cleos='docker-compose exec keosd /opt/eosio/bin/cleos -u http://nodeosd:8888 --wallet-url http://localhost:8900'

Windows (Powershell ≥ 3.0)

Function cleosfx {
   docker-compose exec keosd /opt/eosio/bin/cleos -u http://nodeosd:8888 --wallet-url http://localhost:8900 $args
}
set-alias cleos cleosfx

… Что позволяет нам создавать кошелек, ключи и учетную запись, отвечающую за владение контрактами. Сначала создаем кошелек. Обратите внимание, что мы могли назвать его, используя -n, но без имени он называется default. Команда выводит пароль для учетной записи, который мы сохраняем в локальном файле:

cleos wallet create --to-console > .Pass

Далее мы создаем ключ владельца и активный ключ и добавляем их в кошелек. Сгенерированные нами ключи сохраняются в локальных файлах.

OSX / Linux

cleos create key > .OwnerKeys
cleos create key > .ActiveKeys
cleos wallet import --private-key=$(cat .OwnerKeys |grep Private |cut -d" " -f3)
cleos wallet import --private-key=$(cat .ActiveKeys |grep Private |cut -d" " -f3)

Windows (Powershell ≥ 3.0)

cleos create key > .OwnerKeys
cleos create key > .ActiveKeys
$OwnerKey=(select-string -Path .OwnerKeys -Pattern "Private key: (.*)").Matches.Groups[1].Value
$ActiveKey=(select-string -Path .ActiveKeys -Pattern "Private key: (.*)").Matches.Groups[1].Value
cleos wallet import $OwnerKey
cleos wallet import $ActiveKey

и нам также нужно включить закрытый ключ eosio:

cleos wallet import --private-key=5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

Пришло время создать учетную запись. Вы можете называть свой аккаунт как хотите, я называю свой ekkis:

OSX / Linux

OwnerKey=$(cat .OwnerKeys |grep Public |cut -d" " -f3)
ActiveKey=$(cat .ActiveKeys |grep Public |cut -d" " -f3)
cleos create account eosio ekkis $OwnerKey $ActiveKey

Windows (Powershell ≥ 3.0)

$OwnerKey=(select-string -Path .OwnerKeys -Pattern "Public key: (.*)").Matches.Groups[1].Value
$ActiveKey=(select-string -Path .ActiveKeys -Pattern "Public key: (.*)").Matches.Groups[1].Value
cleos create account eosio ekkis $OwnerKey $ActiveKey

Теперь, чтобы составить контракт, он нам понадобится. Отличное руководство Infinite X Lab (которое я настоятельно рекомендую вам прочитать) предоставляет нам некоторый код. Возьмите это так:

mkdir contracts/Players
curl -L http://bit.ly/2JHAudM > contracts/Players/Players.hpp
curl -L http://bit.ly/2LzQvnK > contracts/Players/Players.cpp

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

OSX / Linux

eosiocpp() { d=/contracts/usr; docker exec eos_nodeosd_1 /opt/eosio/bin/eosiocpp $1 $d/$2 $d/$3; }
eosbuild() { d=/contracts/usr; eosiocpp -o $1.wast $1.cpp; eosiocpp -g $1.abi $1.cpp; cleos set contract ekkis $d/${1%/*} $d/$1.wast $d/$1.abi; }

Windows (Powershell ≥ 3.0)

function eosiocpp() { $d=/contracts/usr; docker exec eos_nodeosd_1 /opt/eosio/bin/eosiocpp $args[0] $d/$($args[1]) $d/$($args[2]) }
function eosbuild() { $d=/contracts/usr; eosiocpp -o $($args[0]).wast $($args[0]).cpp; eosiocpp -g $($args[0]).abi $($args[1]).cpp; cleos set contract ekkis $d/$($args[0].split("/")[0]) "$d/$($args[0]).wast" "$d/$($args[0]).abi" }

Теперь мы можем (наконец) построить и развернуть наш контракт следующим образом:

eosbuild Players/Players

Обратите внимание, что указанный путь не относительно локальной файловой системы, а относительно контейнера. Поэтому не имеет значения, где вы находитесь, чтобы он работал, и вы не можете исключить основу Players/, потому что внутри контейнера команда выполняется в каталоге /contracts/usr

Вы должны получить результат, аналогичный приведенному ниже:

Reading WAST/WASM from /contracts/usr/Players/Players.wast...
Assembling WASM...
Publishing contract...
executed transaction: f4cf55f3560fcd63407fc535e9df829d660825b9d6fb9a697a48897ac76ecf2c  2936 bytes  7956 us
#         eosio <= eosio::setcode               {"account":"ekkis","vmtype":0,"vmversion":0,"code":"0061736d01000000013e0c60047f7e7f7e0060027f7e0060...
#         eosio <= eosio::setabi                {"account":"ekkis","abi":"0e656f73696f3a3a6162692f312e30000406706c6179657200050c6163636f756e745f6e61...
2018-07-21T01:39:17.094 thread-0   main.cpp:391                  print_result   warning: transaction executed locally, but may not be confirmed by the network yet

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

Заключение

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

Самый простой способ - написать мне в Твиттере @ ekkis

Кроме того, включенный мной код Powershell не был протестирован, так как у меня больше нет среды Windows с запущенным Docker, поэтому, если он сломан, это не удивительно :)

Надеюсь, эта статья оказалась полезной. Если да, не стесняйтесь хлопать в ладоши!

сноски

[1], чтобы он работал, убедитесь, что у вас установлена ​​последняя требуемая версия Docker и docker-compose, как указано в документации: https://github.com/EOSIO/eos/ дерево / мастер / Докер