网上已经有很多关于btc的源码分析了,由于eos主网上线还需时日,且网上关于eos的源码解析较少,斗胆尝试着做一个系列的文,学习eos的源码,也提升一下自己的阅读代码的能力和对新知识的了解能力。要阅读赏析源码首先运行起来,看看大概是个什么样子,这样心里有个底,也就踏实多了。本文为系列文的第一篇,Ubuntu下eos代码的编译,是依据官网文档的指导完成的。
官方文档链接:https://github.com/EOSIO/eos
根据官方文档提示,eos代码仅支持Ubuntu16.04版本或更高版本上进行编译(推荐使用Ubuntu16.10),本文在Ubuntu16.04上实现。在编译eos代码之前,我们首先要获取eos代码编译、运行所需要依赖的工具和库,具体获取方式可在终端中输入以下指令来实现:
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
其中 LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),而Clang正是我们完成eos代码编译的编译器。Eos代码大量的依赖于boost库,因此我们需要获取boost库并进行编译、安装,同时将boost库的相关信息添加至环境变量,以上步骤可以通过以下指令来实现:
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
如果觉得下载慢的话,也可以自己去boost官网下载对应的版本(linux64位)然后按照上面的步骤进行解压、添加环境变量、编译、安装。
接下来我们需要获取并安装secp256k1-zkp,具体我们可以把它看做是一个加解密的库,具体获取、编译、安装可以通过以下方式实现:
cd ~
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install
同时,我们还需要WASM编译器,由于llvm和clang中并未对WASM进行配置,因此需要我们进行手动编译
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
以上获取了eos代码编译所需要使用的工具以及依赖库,在保证以上步骤完成的基础上,我们就可以编译并运行一个eos节点了。在编译之前,我们首先要从git上下载eos的源码,由于eos代码分支较多,我们可以加上—recursive来获取完整的代码,如下指令:
git clone https://github.com/eosio/eos --recursive
获取到代码之后,我们就可以对eos进行编译了
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 )
编译完成之后我们可以在路径~/eos/build/programs看到以下文件夹:
eosiod里面是服务端的区块链组件相关文件。
eosioc里面是区块链的命令行接口相关文件
eosio-launcher里面是网络节点的应用相关文件。
eosiowd里面是eos钱包相关文件。
现在我们cd到eosiod路径下,可以执行eosiod,在执行的过程中可能会产生报错,如果没产生报错的话,可以用ctrl+c停止eosiod的运行,此时我们可以在eosiod文件夹下看到一个名为data-dir的文件夹,其中包含有eosiod的相关配置信息。打开config.ini把以下内容添加进去:
# 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
再次运行./eosiod,然鹅,又一次出现了错误
原来提示我们genesis.json文件路径不对,那么我们可以用Locate genesis来查找我们本机中的genesis.json所在的路径,并将该路径添加至,eos的编译配置文件中去,如下图:
再次运行eosiod,又出现了下图的报错:
原来是提示我们配置文件中enable-stale-production使用了两次或者两次以上,我们再重新打开config.ini将其中一个enable-stale-production注释掉即可。
现在我们再运行一次./eosiod,终于,见证奇迹的时刻到了:
当你看到上图,说明你的第一个eos节点已经运行起来了,还真的是一波三折。
至此我们根据官方文档的指示,在ubuntu16.04环境下完成了eos编译环境的搭建、eos编译工具获取安装、eos代码依赖库获取安装、eos代码的编译及运行,其中以eosiod为例简单的描述了运行中产生的问题及解决方案,当然我们也可以打开config.ini查看eosiod相关的配置信息。
So Welcome to EOSIO!
下一篇将围绕eos的代码结构进行相关分析。