开发工具 eos源码赏析(一):Ubuntu下eos代码编译

OldCat · March 13, 2018 · Last by strahe replied at March 15, 2018 · 5253 hits

网上已经有很多关于btc的源码分析了,由于eos主网上线还需时日,且网上关于eos的源码解析较少,斗胆尝试着做一个系列的文,学习eos的源码,也提升一下自己的阅读代码的能力和对新知识的了解能力。要阅读赏析源码首先运行起来,看看大概是个什么样子,这样心里有个底,也就踏实多了。本文为系列文的第一篇,Ubuntu下eos代码的编译,是依据官网文档的指导完成的。 官方文档链接:文档 根据官方文档提示,eos代码仅支持Ubuntu16.04版本或更高版本上进行编译(推荐使用Ubuntu16.10),本文在Ubuntu16.04上实现。在编译eos代码之前,我们首先要获取eos代码编译、运行所需要依赖的工具和库,具体获取方式可在终端中输入以下指令来实现:

[quote] sudo apt-get update wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key sudo apt-get install clang-4.0 lldb-4.0 libclang-4.0-dev cmake make libbz2-dev libssl-dev libgmp3-dev autotools-dev build-essential libbz2-dev libicu-dev python-dev autoconf libtool git [/quote] 其中 LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),而Clang正是我们完成eos代码编译的编译器。Eos代码大量的依赖于boost库,因此我们需要获取boost库并进行编译、安装,同时将boost库的相关信息添加至环境变量,以上步骤可以通过以下指令来实现:

[quote] cd ~ wget -c 'https://sourceforge.net/projects/boost/files/boost/1.66.0/boost_1_66_0.tar.bz2/download' -O boost_1.66.0.tar.bz2 tar xjf boost_1.66.0.tar.bz2 cd boost_1_66_0/ echo "export BOOST_ROOT=$HOME/boost_1_66_0" >> ~/.bash_profile source ~/.bash_profile ./bootstrap.sh "--prefix=$BOOST_ROOT" ./b2 install source ~/.bash_profile [/quote]

如果觉得下载慢的话,也可以自己去boost官网下载对应的版本(linux64位)然后按照上面的步骤进行解压、添加环境变量、编译、安装。 接下来我们需要获取并安装secp256k1-zkp,具体我们可以把它看做是一个加解密的库,具体获取、编译、安装可以通过以下方式实现:

[quote] cd ~ git clone https://github.com/cryptonomex/secp256k1-zkp.git cd secp256k1-zkp ./autogen.sh ./configure make sudo make install [/quote]

同时,我们还需要WASM编译器,由于llvm和clang中并未对WASM进行配置,因此需要我们进行手动编译

[quote] mkdir ~/wasm-compiler cd ~/wasm-compiler git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git cd llvm/tools git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git cd .. mkdir build cd build cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../ make -j4 install [/quote]

以上获取了eos代码编译所需要使用的工具以及依赖库,在保证以上步骤完成的基础上,我们就可以编译并运行一个eos节点了。在编译之前,我们首先要从git上下载eos的源码,由于eos代码分支较多,我们可以加上—recursive来获取完整的代码,如下指令:

[quote] git clone https://github.com/eosio/eos --recursive [/quote]

获取到代码之后,我们就可以对eos进行编译了

[quote] cd ~ git clone https://github.com/eosio/eos --recursive mkdir -p ~/eos/build && cd ~/eos/build cmake -DBINARYEN_BIN=~/binaryen/bin -DWASM_ROOT=~/wasm-compiler/llvm -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib .. make -j$( nproc ) [/quote]

编译完成之后我们可以在路径~/eos/build/programs看到以下文件夹: 1 eosiod里面是服务端的区块链组件相关文件。 eosioc里面是区块链的命令行接口相关文件 eosio-launcher里面是网络节点的应用相关文件。 eosiowd里面是eos钱包相关文件。

现在我们cd到eosiod路径下,可以执行eosiod,在执行的过程中可能会产生报错,如果没产生报错的话,可以用ctrl+c停止eosiod的运行,此时我们可以在eosiod文件夹下看到一个名为data-dir的文件夹,其中包含有eosiod的相关配置信息。打开config.ini把以下内容添加进去:

[quote]

Load the testnet genesis state, which creates some initial block producers with the default key

genesis-json = /path/to/eos/source/genesis.json # Enable production on a stale chain, since a single-node test chain is pretty much always stale enable-stale-production = true

Enable block production with the testnet producers

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 = inito producer-name = initp producer-name = initq producer-name = initr producer-name = inits producer-name = initt producer-name = initu

Load the block producer plugin, so you can produce blocks

plugin = eosio::producer_plugin

Wallet plugin

plugin = eosio::wallet_api_plugin

As well as API and HTTP plugins

plugin = eosio::chain_api_plugin plugin = eosio::http_plugin [/quote]

再次运行./eosiod,然鹅,又一次出现了错误 !(https://mmbiz.qpic.cn/mmbiz_jpg/X997N1LWNAUV1SbHkfqFfvDcvmUdOX0UibkMlFk5FNshxEvq41COxTgpVNicgaCibrscryOnN2fjg2bU19caXUGwg/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1) 原来提示我们genesis.json文件路径不对,那么我们可以用Locate genesis来查找我们本机中的genesis.json所在的路径,并将该路径添加至,eos的编译配置文件中去,如下图: !(https://mmbiz.qpic.cn/mmbiz_jpg/X997N1LWNAUV1SbHkfqFfvDcvmUdOX0UJnQTR5lcfHicmFB0vDMKo84jPOekJDHZxGrj1oywhRc7SeSBtYLUj3w/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1) 再次运行eosiod,又出现了下图的报错: !(https://mmbiz.qpic.cn/mmbiz_jpg/X997N1LWNAUV1SbHkfqFfvDcvmUdOX0U8uXdxUWLNNGPXIic9ZFElzSoXUJxYrp3yhqwZXFjdAL6YrO0d5SVsiag/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1) 原来是提示我们配置文件中enable-stale-production使用了两次或者两次以上,我们再重新打开config.ini将其中一个enable-stale-production注释掉即可。 现在我们再运行一次./eosiod,终于,见证奇迹的时刻到了: !(https://mmbiz.qpic.cn/mmbiz_jpg/X997N1LWNAUV1SbHkfqFfvDcvmUdOX0UTFHbgPQiaUvib03iakslnfKYdMJbfBiarXVs9dib2bsMPJ5eyK8q2DLGeqw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1) 当你看到上图,说明你的第一个eos节点已经运行起来了,还真的是一波三折。

至此我们根据官方文档的指示,在ubuntu16.04环境下完成了eos编译环境的搭建、eos编译工具获取安装、eos代码依赖库获取安装、eos代码的编译及运行,其中以eosiod为例简单的描述了运行中产生的问题及解决方案,当然我们也可以打开config.ini查看eosiod相关的配置信息。

So Welcome to EOSIO!

下一篇将围绕eos的代码结构进行相关分析。

共收到 3 条回复

你好, 图片引用问题能fix下吗?

我们网站也是支持上传图片的.

[quote="@strahe"] 你好, 图片引用问题能fix下吗?

我们网站也是支持上传图片的. [/quote] 我没有找到,只能从我自己公众号复制过来,话说这个论坛发帖回帖的功能都不太友好,像五年前的论坛。

[quote="@OldCat"] [quote="@strahe"] 你好, 图片引用问题能fix下吗?

我们网站也是支持上传图片的. [/quote] 我没有找到,只能从我自己公众号复制过来,话说这个论坛发帖回帖的功能都不太友好,像五年前的论坛。 [/quote]

哦? 实际上这算是比较现代化的社区吧 , 可能使用习惯有点不符合大众习惯, 抱歉.

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up