Если вы разработчик 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 можно найти здесь. Тем не менее для вашего удобства мы представляем следующую упрощённую процедуру:
Откройте 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.
Откройте командную строку Windows и введите:
lxrun /uninstall /full для удаления
lxrun /install для повторной установки
Наберите bash для запуска новой оболочки в Ubuntu и выполните обновление в ней:
sudo apt update
sudo apt full-upgrade
Загрузите и установите 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/EOSexport EOSIO_INSTALL_DIR=${WORKSPACE_DIR}/eosexport EOS_PROGRAMS=${EOSIO_INSTALL_DIR}/build/programsexport 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
Переведено @rusteemitblog
Оригинал поста: ЗДЕСЬ