网上已经有很多关于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的代码结构进行相关分析。