eos项目的整体编译、依赖库下载、代码编译等功能,依托于一个完整的脚本体系,主要包括以下三部分:
eos/scripts
eos/scripts/eosio_build.sh
eos/CMakeModules
eos/scripts/eosio_build.sh是eos项目的主编译脚本,通过运行这个脚本,就可以实现对eos项目的一键编译,脚本运行过程中主要测试了编译所需的硬件与软件环境是否满足要求以及显示编译结果。
由于eos项目是基于CMake等工具编译的,所以eos/CMakeModules中主要包含CMake编译所需要使用的一些配置信息。
eos项目的主程序源代码位于eos/program目录下,包含6个基本功能组件:
eos/program/nodeos
eos/program/cleos
eos/program/keosd
eos/program/eosio-blocklog
eos/program/eosio-launcher
eos/program/nodeos是eos项目的核心程序源代码,可以配置不同插件来运行不同类型节点。该进程主要负责提供区块生产,封装API接口和本地开发的功能;
eos/program/cleos是eos项目中与nodeos之间交互信息的命令行工
具cleos的源代码,编译后与nodeos公开的REST API进行信息交互。
eos/program/keosd是eos项目中的内置钱包程序,配合钱包相关插件通过HTTP接口或RPC API与cleos进行通信,完成账户创建,转账等基本钱包功能。
eos/program/eosio-launcher是eos项目的P2P网络组成启动器源代码,该部分简化了nodeos节点组网的流程。
eos项目的运行依托于许多依赖库,这些依赖库的基本信息位于eos/libraries目录中,包括:
eos/libraries/appbase
eos/libraries/builtins
eos/libraries/chain
eos/libraries/fc
eos/libraries/chainbase
eos/libraries/wasm-jit
eos/libraries/appbase提供了一个用于从一组插件构建应用程序的基本框架。该模块负责管理插件的生命周期,并确保所有插件按正确的顺序配置,初始化,启动和关闭。
该依赖库包含5个主要特征:
eos/libraries/builtins中包含了eos项目编译过程中所需要的compiler-RT编译器(libgcc的替换库)的源代码,包括编译器本身以及相关功能函数的代码描述。
可以说eos/libraries/chain包含有eos项目的核心内容,包括区块,区块链,merkle树等数据结构以及初始区块,控制器等关键算法,这一部分将在后续的教程中展开介绍。
eos/libraries/appbase/chainbase中定义了保存eos区块链数据的数据库结构,可以说该数据库旨在满足区块链应用程序的苛刻要求,但适用于任何需要强大的事务数据库的应用程序。
eos/libraries/fc是eos项目的细胞级模块,定义了eos项目中的基本变量数据结构,包括String,Time,Base系列编码等,在后需的具体代码分析中,我们将会遇到很多fc::前缀的引用,届时具体回顾。
在eos/libraries/fc/src目录中我们可以看到具体的代码实现
eos/libraries/softfloat包含了一个Berkeley SoftFloat,即符合IEEE浮点运算标准二进制浮点的软件实现。
eos/libraries/testing包含了几个测试实例,包括对区块链数据库的链接测试,P2P网络的链接测试等。
eos/libraries/wasm-jit中包含了一个WebAssembly的独立VM。 它可以加载标准的二进制格式,也可以加载WebAssembly参考解释器定义的文本格式。 对于文本格式,它可以加载标准堆栈机器语法和参考解释器使用的老式AST语法以及所有测试命令。
可以说eos项目中的节点程序依赖一个完整的插件体系:通过不同的插件组合来提供各种服务功能,如区块链查询,交易验证执行,打包区块,P2P网络通信等服务;应当补充的是,插件的全生命周期包括四个流程:注册、初始化、开启、停止,具体的执行算法将在后续文章展开介绍,本篇教程只介绍不同文件的所有功能。
eos项目的插件代码位于eos/plugins目录下,包括四个层次:
eos/plugins/template_plugin定义了eos项目中所有插件的模板:
经总结,eos项目的插件体系中共有5个基类插件:
eos/plugins/chain_plugin
eos/plugins/http_plugin
eos/plugins/net_plugin
eos/plugins/wallet_plugin
eos/plugins/state_history_plugin
这5个基类插件承载了eos插件体系中的基本功能:
eos/plugins/chain_plugin目录定义了链处理插件,这个插件承载了nodeos节点程序与区块链交互的基本功能,包括:
eos/plugins/net_plugin目录定义了P2P网络插件,这个插件承载了eos系统的P2P网络中TCP/IP层相关功能,包括4个基本功能:
eos/plugins/http_plugin目录定义了网络http插件,这个插件承载了eos系统的P2P网络中http层相关功能,包括3个基本功能:
eos/plugins/wallet_plugin目录定义了钱包插件,这个插件承载了nodeos节点程序与钱包交互的相关功能,包括3个基本功能:
eos/plugins/state_history_plugin目录定义了历史记录查询插件,该插件承载了节点程序对本地链发起查询的相关功能,包括3个基本功能:
经总结,eos项目的插件体系中共有8个派生类插件,这些插件分别继承几个基类插件,实现指定功能。派生类插件包括:
eos/plugins/bnet_plugin
eos/plugins/faucet_testnet_plugin
eos/plugins/history_plugin
eos/plugins/http_client_plugin
eos/plugins/mongo_db_plugin
eos/plugins/producer_plugin
eos/plugins/template_plugin
eos/plugins/txn_test_gen_plugin
eos/plugins/bnet_plugin目录定义了eos的P2P网络中不同节点之间同步各自本地链数据的算法,简单来讲,包括如下特征:
eos/plugins/faucet_testnet_plugin目录定义了在测试网上快速建立测试帐号的插件,该插件为测试提供便利。
eos/plugins/history_plugin目录定义了查询指定账户中指定公钥的所有历史交易记录。
eos/plugins/http_client_plugin目录定义了eos网络http层响应请求,并做相应的安全验证的客户端插件。
eos/plugins/mongo_db_plugin目录定义了保存并管理本地不可逆转区块链数据的MongoDB数据库基本配置插件。
eos/plugins/producer_plugin目录定义了区块生产节点的功能插件,其中功能包括:
生产/打包新区块数据;
对新区块签名;
对接收的区块进行验证,包括区块头合法性、签名合法性和交易合法性;
eos/plugins/txn_test_gen_plugin定义了一个每秒自动产生指定数量的交易信息的插件,该插件主要用作对eos网络的吞吐量(TPS)测试。
该部分插件主要用于对上述几个特定插件进行封装,只暴露API,主要包括(不做详细介绍):
eos/plugins/chain_api_plugin;
eos/plugins/db_size_api_plugin;
eos/plugins/history_api_plugin;
eos/plugins/net_api_plugin;
eos/plugins/producer_api_plugin;
eos/plugins/wallet_api_plugin;
EOS项目的基本功能是通过系统合约提供的,用户可以调用已经部署上链的智能合约实现特定的功能,也可以通过C++语言自行编辑.cpp智能合约,并通过系统提供的eosiocpp编译器将.cpp、.hpp文件编译成.wasm和.abi文件部署上链,下面简单介绍一下eos项目中智能合约文件夹下的各个合约文件功能,文件结构如下图。
EOS项目的智能合约代码位于eos/contracts目录下,包括三个层次:
总结下来,EOS项目共有5个系统级智能合约:
eosio.contracts/contracts/eosio.bios
eosio.contracts/contracts/eosio.msig
eosio.contracts/contracts/eosio.system
eosio.contracts/contracts/eosio.token
eosio.contracts/contracts/eosio.wrap
eosio.contracts/contracts/eosio.bios合约用于启动EOS的P2P网络,该合约可以直接控制其他帐户的资源分配并访问其他特权API调用,具体启动流程如下:
eosio.contracts/contracts/eosio.msig目录定义了多签系统合约,实现了一个多签功能,由于EOS要求系统的每一次更新都需要出块节点完成一次多签,当签名数达到2/3+1时,更新才能生效。所以出块节点可以调用这个合约实现多签功能。
eosio.contracts/contracts/eosio.sudo合约实现了创建EOS系统中root账户的功能,用于修改系统代码与更新合约。
eosio.contracts/contracts/eosio.system目录可以算是EOS系统合约中最重要的部分,实现了EOS项目的所有基本功能:
eos/contracts/eosio.token目录实现了发行token的功能,可以说EOS本身代币或后续基于EOS的代币都是通过该合约发行的,主体函数包括:
上述5个系统合约的实现离不开一个庞大的依赖库,其中包括数据的定义(account、asset等)、还包括一些常用函数(权限管理、序列化等),我们将在后续的算法分析中结合特定示例详细展开。
eos/unittests
EOS提供了一些测试文件,供用户测试节点是否运行正常,其中测试分两大类:
对链功能的测试:包括与区块链之间的数据交互,transaction分发等;
对网络层的测试:包括P2P网络传输功能、cleos与nodeos之间的通信等;
eos/Docker
EOS允许通过Docker运行节点或钱包,eos/Docker文件夹下包含了一些通过Docker启动并运行程序的必要文件:
eos/tutorials
最后一章,我们罗列一下EOS给出的一些说明类文档: