在windows上安装运行EOS

原文地址:https://steemit.com/eos/@tokenika/installing-and-running-eos-on-windows

如果你是一名windows c++开发者,你最喜欢的ide是ms visual studio,那么你可能就想知道能不能直接在windows上编译eos代码。

我们在windows c++编译器上做了几次试验,结果不行。虽然eos的代码有win32的标签,但主要的问题在于,它前后不一致。而且,windows的clang编译器和unix的clang编译器有些不同,它的限制更多。比如,像std::move(u8″env”)这样的表达式在windows下是无效的。

不过,我们找到了一个替代的解决办法: Windows Subsystem for Linux,它捆绑了 Visual Studio Code   ide。待会你会看到,用这个方法比直接在windows下编译代码更好。

准备工具

你需要 Windows 10, 版本1703, 也就是 Creators Update。想验证你的windows版本,你可以打开设置面板,然后进入系统>关于 进行查看。

如果你用的是更早的版本,而且不想升级到1703版,你仍然可以试一试,不过你要把你的Windows Subsystem for Linux从ubuntu 14 升级到ubuntu 16.

Windows Subsystem for Linux只能安装到系统盘。如果你的系统盘空间不够(Windows Subsystem for Linux需要3-4G的空间),那你可以使用这里的工具拓展你的系统分区。

动手

首先,我们要启动Windows Subsystem for Linux,然后在visual studio里使用bash 命令行界面。

Windows Subsystem for Linux

官方的Windows Subsystem for Linux安装指南在这里可以找到。不过,我们提供了下面的简化版本:

1 ,在管理员模式下(右击然后选择以管理员运行/Run as Administrator)打开PowerShell,然后执行以下命令:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

2 ,按照提示重启计算机。

3 打开开发者模式:

–打开设置面板,进入升级&安全>开发者 页面

—选择开发者模式Developer Mode单选按钮

—如果有提示,则重启计算机。

4 打开windows 命令提示器,输入bash。接受证书协议,然后会下载一张用户模式图片,并提取到%localappdata%\lxss\。然后会提示你设置linux用户名和密码。当这步骤结束的时候,快捷名称Bash on Ubuntu on Windows会被加入到你的开始菜单。

5 使用下面任一方式启动一个新的ubuntu shell:

—在命令提示器内输入bash,或者

—在开始菜单里使用Bash on Ubuntu on Windows

6  一旦你进入了linux shell,要确保你运行了ubuntu 16:

lsb_release -a

7 最后,升级 ubuntu:

sudo apt update

sudo apt full-upgrade

重装ubuntu

下面的步骤是可选的,不一定非做不可。只有在你需要从头开始,重装ubuntu的时候才需要做。

1 打开windows 命令行提示器,运行:

lxrun /uninstall /full  进行卸载

lxrun /install 进行重装

2 运行bash,启动新的ubuntu shell,然后在这个新的ubuntu shell里进行更新和升级:

sudo apt update

sudo apt full-upgrade

Visual Studio Code

从官网下载并安装visual studio code https://code.visualstudio.com/Download,要想在visual studio code 内启用ubuntu bash 控制台,你需要修改用户设置:

—进入 File > Preferences > User Settings   ,用户>偏好设置>用户设置。

—在右边面板里添加如下内容,覆盖掉默认设置:”terminal.integrated.shell.windows”:                  “C:\Windows\sysnative\bash.exe”.

—保存修改,你就可以使用Ctrl + ‘ 或者 View > Integrated Terminal切换到ubuntu 控制台。

你还可以添加c++拓展到visual studio code,这对c++开发有帮助。使用Ctrl + Shift + X打开拓展面板,然后添加以下拓展:

— C/C++

— C++ Intelisense

— CMakeTools

— CMake Tools Helper

— Code Runner

编译源码

在windows文件系统上为EOS创建一个workspace 文件夹。在这篇文章中,我们使用X:\Workspaces\EOS,不过你可以自己决定你想在哪建这个workspace文件夹。

在linux 文件系统中,上面的地址会被映射为/mnt/x/Workspaces/EOS。它会相应地映射你设置的地址。

注意:使用分区名称的小写字母形式,比如我们使用的是/mnt/x/。

到了这一步,你就可以开始使用visual studio code的ubuntu shell了(View > Integrated Terminal)。它的主要优势是它能方便地复制黏贴。

下面的所有命令都是在ubuntu shell上运行的。

1定义以下系统变量:

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 替换成你设置的workspace地址。

2 把上面设置的系统变量保存到~/.bashrc文件:

echo “export WORKSPACE_DIR=${WORKSPACE_DIR}” >> ~/.bashrc

echo “export EOSIO_INSTALL_DIR=${EOSIO_INSTALL_DIR}” >> ~/.bashrc

echo “export EOS_PROGRAMS=${EOS_PROGRAMS}” >> ~/.bashrc

3 安装 cmake 和git:

sudo apt install cmake

sudo apt install git

4 从EOS代码仓库clone 源代码:

cd ${WORKSPACE_DIR}

git clone https://github.com/eosio/eos –recursive

5 现在,你就可以编译源码了。这一步可能需要几个小时时间,取决于你计算机的配置,而且,这期间会要求你确认某些动作,以及输入sudo密码。

cd ${EOSIO_INSTALL_DIR}

./build.sh ubuntu full

注意:由于这一步需要从多个地方下载文件,它有可能会失败。如果失败的话,就重新开始这一步。

运行

如果以上的步骤没有什么错,你就编译好了EOS代码,它生成了多个文件和可执行文件。可执行文件放在$EOS_PROGRAMS文件夹:

  • eosd- 一个服务器端区块链节点组件,
  • eosc- 与区块链进行交互的命令行界面,
  • eos-walletd- 一个EOS钱包,
  • launcher- 一个组建和部署网络的应用,更多信息,可以查看这里:https://github.com/EOSIO/eos/blob/master/testnet.md

 

到了这一步,你就可以运行eos/README.md里的测试了。

我们试试EOS 能不能启动:

cd ${EOS_PROGRAMS}/eosd && ./eosd

这一步,它可能会报错,说没有定义genesis.json文件,然后退出。如果没有报这个错退出,你可以使用ctrl + C来关闭它。

生产区块

找到genesis.json文件的路径。我们的是/mnt/x/Workspaces/EOS/eos/build/genesis.json,你的路径可能不一样,取决于你把workspace文件夹建在哪了。

使用WordPad(或者其他的编辑器)编辑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

如果一切ok的话,你会在你的控制台看到下面的内容:

 

 

 

 

 

 

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/boost164_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