Если вы разработчик C++ для Windows, а MS Visual Studio — ваш любимый IDE, то вы наверняка задавались вопросом — возможно ли скомпилировать код EOS напрямую в Windows?
Мы несколько раз брались за C++ компиляторы в Windows, но безрезультатно. Основная проблема заключается в том, что, хотя код EOS и вписывается в WIN32
, но, к сожалению, не полностью. Кроме того, компилятор Windows Clang ведёт себя иначе, чем его аналог Unix — он оказался более строгим. Например, такие выражения, как std::move(u8"env")
, Windows не допускает.
Тем не менее, мы придумали альтернативное решение — это подсистема Windows для Linux в сочетании с интегрированной средой разработки Visual Studio Code. Как вы увидите, такой подход работает намного лучше, чем код, скомпилированный непосредственно в Windows.
Предусловия
Вам необходимо работать на Windows 10, версии 1703, также известной как Creators Update. Для подтверждения вашей версии Windows откройте Панель управления и перейдите к Система > Информация о системе
.
Если у вас более ранняя версия Windows 10 и по каким-либо причинам вы не хотите обновляться до версии 1703, вы всё равно можете попробовать, если вам удастся обновить подсистему Windows для Linux с Ubuntu 14 до Ubuntu 16.
Подсистема Windows для Linux может быть установлена только на системный диск. Если объём вашего дискового пространства невелик (потребуется дополнительно 3-4 ГБ), возможно, вам потребуется расширить свой системный раздел с помощью средств, доступных для скачивания здесь.
Оснащение
Сначала мы включаем подсистему Windows для Linux, а затем получаем доступ к интерфейсу командной строки Bash из Visual Studio.
Подсистема Windows для Linux
Официальное руководство по установке подсистемы Windows для Linux можно найти здесь. Тем не менее для вашего удобства мы представляем следующую упрощённую процедуру:
Откройте PowerShell в режиме администратора (кликните правой кнопкой мыши, выберите Запуск от имени администратора) и выполните команду:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Перезагрузите компьютер при необходимости.
Включите Режим разработчика:
-- Откройте Панель управления и перейдите в Обновление и безопасность > Для разработчиков.
-- Выберите Режим разработчика.
-- При необходимости снова перезагрузите компьютер.Откройте командную строку Windows и введите
bash
. После принятия лицензионного соглашения образ пользовательского режима Ubuntu будет загружен и извлечен в%localappdata%\lxss\
. Вам будет предложено создать имя пользователя для Linux и пароль. После завершения процесса ярлык под названием Bash on Ubuntu on Windows будет добавлен в ваше меню "Пуск".Запустите новую оболочку в Ubuntu, либо:
-- Наберитеbash
в командной строке, или
-- Используйте ярлык Bash on Ubuntu on Windows, доступный в меню "Пуск".После того, как вы окажетесь внутри оболочки Linux, убедитесь, что вы используете Ubuntu 16:
lsb_release -a
И, наконец, обновите Ubuntu:
sudo apt update
sudo apt full-upgrade
Повторная установка Ubuntu
Следующий шаг не является обязательным. Используйте его только в том случае, если вам по каким-либо причинам необходимо повторить установку Ubuntu.
Откройте командную строку Windows и введите:
lxrun /uninstall /full
для удаления
lxrun /install
для повторной установкиНаберите
bash
для запуска новой оболочки в Ubuntu и выполните обновление в ней:
sudo apt update
sudo apt full-upgrade
Visual Studio Code
Загрузите и установите Visual Studio Code с официального сайта. Для включения bash-консоли Ubuntu в Visual Studio Code необходимо изменить Параметры пользователя:
-- Перейдите к Файл > Настройки > Параметры пользователя.
-- Добавьте следующую запись в правую панель, чтобы изменить настройки по умолчанию: "terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\bash.exe"
.
-- После сохранения изменений вы должны суметь переключить консоль Ubuntu с помощью Ctrl + ' или Вид > Интегрированный терминал.
В качестве дополнения можно добавить расширения C++ в Visual Studio Code, поскольку они могут быть полезны для разработки на C++. Набрав Ctrl + Shift + X
, чтобы открыть панель расширений, вы сможете добавить следующие расширения:
-- C/C++
-- C++ Intelisense
-- CMakeTools
-- CMake Tools Helper
-- Code Runner
Компилирование исходного кода
Создайте рабочую локацию для EOS в файловой системе Windows. В этом руководстве мы будем использовать X:\Workspaces\EOS
, но, очевидно, вы выберете своё собственное местоположение.
В файловой системе Linux вышеуказанное расположение будет отображено как /mnt/x/Workspaces/EOS
. Выбранное вами местоположение будет отображено соответствующим образом.
Примечание: используйте нижний регистр для имени диска, как /mnt/x/
в нашем случае.
На этом этапе вы можете начать использовать оболочку Ubuntu в Visual Studio Code (Вид > Интегрированный терминал). Её главным преимуществом является поддержка простого способа копирования и вставки команд.
Все следующие команды должны выполняться в оболочке Ubuntu.
- Определите все следующие изменяемые параметры системы:
export WORKSPACE_DIR=/mnt/x/Workspaces/EOS
export EOSIO_INSTALL_DIR=${WORKSPACE_DIR}/eos
export EOS_PROGRAMS=${EOSIO_INSTALL_DIR}/build/programs
export TEMP_DIR=/tmp
Примечание: не забудьте заменить x/Workspaces/EOS
на соответствующий путь к местоположению рабочей локации на вашем компьютере.
Сохраните указанные выше системные переменные в файл
~/.bashrc
echo "export WORKSPACE_DIR=${WORKSPACE_DIR}" >> ~/.bashrc
echo "export EOSIO_INSTALL_DIR=${EOSIO_INSTALL_DIR}" >> ~/.bashrc
echo "export EOS_PROGRAMS=${EOS_PROGRAMS}" >> ~/.bashrc
Установите
cmake
иgit
:
sudo apt install cmake
sudo apt install git
Клонируйте исходный код из репозитория EOS:
cd ${WORKSPACE_DIR}
git clone https://github.com/eosio/eos --recursive
Теперь вы готовы приступить к фактической компиляции исходного кода. Этот шаг может занять несколько часов, что зависит от мощности компьютера, и потребует от вас периодического подтверждения некоторых действий. Также будет необходимо ввести пароль
sudo
.
cd ${EOSIO_INSTALL_DIR}
./build.sh ubuntu full
Примечание: поскольку этот процесс требует загрузки большого количества файлов из различных источников, он может завершиться неудачей. В таком случае просто попробуйте выполнить этот шаг еще раз.
Запуск исполняемых файлов
Если ошибки не произошло, вы получаете скомпилированный в вашей системе Windows код EOS с несколькими библиотеками и исполняемыми файлами в качестве результата. Исполняемые файлы помещаются в папку $EOS_PROGRAMS
:
eosd
– компонент ноды блокчейна на стороне сервера,eosc
– интерфейс командной строки для взаимодействия с блокчейном,eos-walletd
– кошелёк EOS,launcher
– приложение для создания и развертывания сети; более подробная информация доступна здесь.
На этом этапе вы должны иметь возможность запускать тесты, описанные в eos/README.md
.
Для полноты картины давайте попробуем запустить EOS:
cd ${EOS_PROGRAMS}/eosd && ./eosd
На этом этапе должен произойти выход с ошибкой, указывающей на то, что файл genesis.json
не определён. В том случае, если EOS не выходит с этой ошибкой, вы всегда можете закрыть его с помощью комбинации клавиш ctrl + C
.
Производство блоков
Найдите путь к вашему файлу genesis.json
. В нашем случае это каталог /mnt/x/Workspaces/EOS/eos/build/genesis.json
, но, скорее всего, ваш путь будет другой, что зависит от выбранной рабочей локации.
Отредактируйте файл config.ini
(в нашем случае он находится здесь: X:\Workspaces\EOS\eos\build\programs\eosd\data-dir\config.ini
) Используя Блокнот (или другой текстовый редактор на ваш выбор), найдите запись enable-stale-production
и измените её на enable-stale-production = true
.
Затем добавьте в config.ini
следующее содержимое:
genesis-json = /mnt/x/Workspaces/EOS/eos/build/genesis.json
producer-name = inita
producer-name = initb
producer-name = initc
producer-name = initd
producer-name = inite
producer-name = initf
producer-name = initg
producer-name = inith
producer-name = initi
producer-name = initj
producer-name = initk
producer-name = initl
producer-name = initm
producer-name = initn
producer-name = initq
producer-name = initr
producer-name = inits
producer-name = initt
producer-name = initu
plugin = eos::producer_plugin
plugin = eos::chain_api_plugin
plugin = eos::wallet_api_plugin
plugin = eos::account_history_api_plugin
plugin = eos::http_plugin
Примечание: убедитесь, что для genesis.json
задан верный путь – скорее всего, ваш путь будет отличаться от приведённого выше.
На этом этапе при повторном запуске eosd
он должен начать производство блоков:
cd ${EOS_PROGRAMS}/eosd && ./eosd
Если всё работает нормально, вы должны увидеть в консоли следующее:
232901ms thread-0 chain_plugin.cpp:80 plugin_initialize ] initializing chain plugin
232902ms thread-0 producer_plugin.cpp:159 plugin_initialize ] Public Key: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
232903ms thread-0 http_plugin.cpp:132 plugin_initialize ] host: 127.0.0.1 port: 8888
232905ms thread-0 http_plugin.cpp:135 plugin_initialize ] configured http to listen on 127.0.0.1:8888
...
232998ms thread-0 producer_plugin.cpp:170 plugin_startup ] producer plugin: plugin_startup() begin
232999ms thread-0 producer_plugin.cpp:175 plugin_startup ] Launching block production for 19 producers.
*******************************
* *
* ------ NEW CHAIN ------ *
* - Welcome to EOS! - *
* ----------------------- *
* *
*******************************
Your genesis seems to have an old timestamp
Please consider using the --genesis-timestamp option to give your genesis a recent timestamp
233012ms thread-0 producer_plugin.cpp:185 plugin_startup ] producer plugin: plugin_startup() end
233012ms thread-0 http_plugin.cpp:147 plugin_startup ] start processing http thread
...
233059ms thread-0 http_plugin.cpp:224 add_handler ] add api url: /v1/account_history/get_transaction
233060ms thread-0 http_plugin.cpp:224 add_handler ] add api url: /v1/account_history/get_transactions
237003ms thread-0 chain_controller.cpp:235 _push_block ] initq #1 @2017-09-29T16:03:57 | 0 trx, 0 pending, exectime_ms=0
237005ms thread-0 producer_plugin.cpp:233 block_production_loo ] initq generated block #1 @ 2017-09-29T16:03:57 with 0 trxs 0 pending
240003ms thread-0 chain_controller.cpp:235 _push_block ] initc #2 @2017-09-29T16:04:00 | 0 trx, 0 pending, exectime_ms=0
240004ms thread-0 producer_plugin.cpp:233 block_production_loo ] initc generated block #2 @ 2017-09-29T16:04:00 with 0 trxs 0 pending
243003ms thread-0 chain_controller.cpp:235 _push_block ] initd #3 @2017-09-29T16:04:03 | 0 trx, 0 pending, exectime_ms=0
Примечание: Случается, что eosd
зависает и не производит блоков с первой попытки. В таком случае просто выйдите из процесса нажатием комбинации клавиш ctrl + C
, затем немного подождите и повторите попытку.
Обновление исходного кода
Для обновления исходного кода из официального репозитория и последующей его рекомпиляции выполните следующие команды:
cd ${EOSIO_INSTALL_DIR}
git pull
rm -r build && mkdir build && cd build
export BOOST_ROOT=${HOME}/opt/boost_1_64_0
cmake -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_C_COMPILER=clang-4.0 \
-DCMAKE_CXX_COMPILER=clang++-4.0 \
-DWASM_LLVM_CONFIG=${HOME}/opt/wasm/bin/llvm-config \
-DBINARYEN_BIN=${HOME}/opt/binaryen/bin \
-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl \
-DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib \
../ && make
Если вам нужны руководства по запуску EOS на других операционных системах, пожалуйста, обратитесь к этому списку.
Свежие новости в Телеграм: t.me/EOS_RU
Оригинал поста: ЗДЕСЬ
Please transilite this in english.
i think you will find a link just above " Оригинал поста: ЗДЕСЬ " you will get the english version there,
good day to u @ovronil )
You can find eng. version here