Мы любим маленького кита. Это позволяет нам создавать продукты на единой платформе с использованием архитектуры микросервисов и развертывать их в самых разных средах. Это легкий, быстрый и освобождает разработчиков от рутинной работы по поддержке нескольких операционных систем.
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/ дерево / мастер / Докер