eos项目(v1.4.4)主要可以分为以下八个模块:
EOS主目录结构
eos项目的整体编译、依赖库下载、代码编译等功能,依托于一个完整的脚本体系,主要包括以下三部分:
eos/eosio_build.sh是eos项目的主编译脚本,通过运行这个脚本,就可以实现对eos项目的一键编译,脚本运行过程中主要测试了编译所需的硬件与软件环境是否满足要求以及显示编译结果。
eos/scripts目录中包含了项目编译所需的其他脚本文件,其中:
由于eos项目是基于CMake等工具编译的,所以eos/CMakeModules中主要包含CMake编译所需要使用的一些配置信息。
cotire.cmake是加快编译速度的cmake文件。
doxygen.cmake可以将代码中的一些注释生成相关文档。
FindGperftools.cmake包含了性能分析相关的配置。
FindGperftools.cmake检测当前机器是否可以生成wasm32。
installer.cmake提供安装的相关配置信息。
wasm.cmake文件提供wasm相关的配置信息。
eos项目的主程序源代码位于eos/program目录下,包含6个基本功能组件:
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-abigen是eos项目的智能合约编译器源代码(用于生成智能合约的.abi文件)
eos/program/eosio-launcher是eos项目的P2P网络组成启动器源代码,该部分简化了nodeos节点组网的流程。
eos/program/eosio-blocklog是eos项目的区块日志相关的源代码。
eos项目的运行依托于许多依赖库,这些依赖库的基本信息位于eos/libraries目录中,包括:
eos/libraries/abi_generator包含了智能合约编译器所需的依赖文件,可以说编译器的主要代码就是位于这个目录中
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/utilities主要包含了一些通用的标准函数
eos/libraries/wasm-jit中包含了一个WebAssembly的独立VM。 它可以加载标准的二进制格式,也可以加载WebAssembly参考解释器定义的文本格式。 对于文本格式,它可以加载标准堆栈机器语法和参考解释器使用的老式AST语法以及所有测试命令。
可以说eos项目中的节点程序依赖一个完整的插件体系:通过不同的插件组合来提供各种服务功能,如区块链查询,交易验证执行,打包区块,P2P网络通信等服务;应当补充的是,插件的全生命周期包括四个流程:注册、初始化、开启、停止,具体的执行算法将在后续文章展开介绍,本篇教程只介绍不同文件的所有功能。
eos项目的插件代码位于eos/plugins目录下,包括四个层次:
eos/plugins/template_plugin定义了eos项目中所有插件的模板:
经总结,eos项目的插件体系中共有5个基类插件:
这5个基类插件承载了eos插件体系中的基本功能:
4.2.1、chain_plugin
eos/plugins/chain_plugin目录定义了链处理插件,这个插件承载了nodeos节点程序与区块链交互的基本功能,包括:
4.2.2、net_plugin
eos/plugins/net_plugin目录定义了P2P网络插件,这个插件承载了eos系统的P2P网络中TCP/IP层相关功能,包括4个基本功能:
4.2.3、http_plugin
eos/plugins/http_plugin目录定义了网络http插件,这个插件承载了eos系统的P2P网络中http层相关功能,包括3个基本功能:
4.2.4、wallet_plugin
eos/plugins/wallet_plugin目录定义了钱包插件,这个插件承载了nodeos节点程序与钱包交互的相关功能,包括3个基本功能:
eos/plugins/wallet_plugin/wallet.cpp: 该文件实现了对钱包文件的基本功能,包括创建新钱包、导入密钥等;
eos/plugins/wallet_plugin/wallet_manager.cpp:该文件实现了对钱包的管理功能,包括设置unlock超时时间、lock指定钱包等;
eos/plugins/wallet_plugin/wallet_plugin.cpp:该文件对上述功能插件化,包括定义插件参数等,实现了nodeos节点程序通过调用插件处理钱包文件的功能;
4.2.5、acount_history_plugin
eos/plugins/acount_history_plugin目录定义了历史记录查询插件,该插件承载了节点程序对本地链发起查询的相关功能,包括3个基本功能:
4.3、派生类插件
经总结,eos项目的插件体系中共有8个派生类插件,这些插件分别继承几个基类插件,实现指定功能。派生类插件包括:
4.3.1、bnet_plugin
eos/plugins/bnet_plugin目录定义了eos的P2P网络中不同节点之间同步各自本地链数据的算法,简单来讲,包括如下特征:
4.3.2、faucet_testnet_plugin
eos/plugins/faucet_testnet_plugin目录定义了在测试网上快速建立测试帐号的插件,该插件为测试提供便利。
4.3.3、history_plugin
eos/plugins/history_plugin目录定义了查询指定账户中指定公钥的所有历史交易记录。
4.3.4、http_client_plugin
eos/plugins/http_client_plugin目录定义了eos网络http层响应请求,并做相应的安全验证的客户端插件。
4.3.5、mongo_db_plugin
eos/plugins/mongo_db_plugin目录定义了保存并管理本地不可逆转区块链数据的MongoDB数据库基本配置插件。
4.3.6、producer_plugin
eos/plugins/producer_plugin目录定义了区块生产节点的功能插件,其中功能包括:
4.3.7、sql_db_plugin
eos/plugins/sql_db_plugin目录定义了eos中保存了区块链所有数据的数据库管理插件,这部分数据包括所有区块数据、所有账户信息、所有交易数据等。
其中:
eos/plugins/block_storage定义了保存了所有区块数据(可逆或不可逆的)的数据库管理插件;
eos/plugins/consumer定义了保存了所有用户的所有数据的数据库管理插件;
eos/plugins/irreversible_block_storage定义了保存了所有不可逆转区块数据的数据库管理插件;
eos/plugins/sql_db_plugin是插件的主要定义文件;
4.3.8、txn_test_gen_plugin
eos/plugins/txn_test_gen_plugin定义了一个每秒自动产生指定数量的交易信息的插件,该插件主要用作对eos网络的吞吐量(TPS)测试。
4.4、封装类插件
该部分插件主要用于对上述几个特定插件进行封装,只暴露API,主要包括(不做详细介绍):
EOS项目的基本功能是通过系统合约提供的,用户可以调用已经部署上链的智能合约实现特定的功能,也可以通过C++语言自行编辑.cpp智能合约,并通过系统提供的eosiocpp编译器将.cpp、.hpp文件编译成.wasm和.abi文件部署上链,下面简单介绍一下eos项目中智能合约文件夹下的各个合约文件功能,文件结构如下图。
EOS项目的智能合约代码位于eos/contracts目录下,包括三个层次:
总结下来,EOS项目共有5个系统级智能合约:
5.1.1、eosio.bios
eos/contracts/eosio.bios合约用于启动EOS的P2P网络,该合约可以直接控制其他帐户的资源分配并访问其他特权API调用,具体启动流程如下:
5.1.2、eosio.msig
eos/contracts/eosio.msig目录定义了多签系统合约,实现了一个多签功能,由于EOS要求系统的每一次更新都需要出块节点完成一次多签,当签名数达到2/3+1时,更新才能生效。所以出块节点可以调用这个合约实现多签功能。
5.1.3、eosio.sudo
eos/contracts/eosio.sudo合约实现了创建EOS系统中root账户的功能,用于修改系统代码与更新合约。
5.1.4 eosio.system
eos/contracts/eosio.system目录可以算是EOS系统合约中最重要的部分,实现了EOS项目的所有基本功能:
5.1.5、eosio.token
eos/contracts/eosio.token目录实现了发行token的功能,可以说EOS本身代币或后续基于EOS的代币都是通过该合约发行的,主体函数包括:
上述5个系统合约的实现离不开一个庞大的依赖库,其中包括数据的定义(account、asset等)、还包括一些常用函数(权限管理、序列化等),我们将在后续的算法分析中结合特定示例详细展开。
EOS给出了一些有趣的示例合约和测试文件供用户理解原理与测试功能,主要包括:
EOS项目中的测试模块、Docker工具模块和文档说明模块属于辅助模块,所以放在一起总结。
EOS提供了一些测试文件,供用户测试节点是否运行正常,其中测试分两大类:
EOS允许通过Docker运行节点或钱包,eos/Docker文件夹下包含了一些通过Docker启动并运行程序的必要文件:
最后一章,我们罗列以下EOS给出的一些说明类文档: