EOS源代码架构解析(二)

eos项目(v1.0.2)主要可以分为以下八个模块:

  1. 编译模块

  2. 主程序模块

  3. 依赖库模块

  4. 插件模块

  5. 智能合约模块

  6. 测试模块

  7. Docker工具模块

  8. 文档说明模块

                                                                                 4、插件模块

可以说eos项目中的节点程序依赖一个完整的插件体系:通过不同的插件组合来提供各种服务功能,如区块链查询,交易验证执行,打包区块,P2P网络通信等服务;应当补充的是,插件的全生命周期包括四个流程:注册、初始化、开启、停止,具体的执行算法将在后续文章展开介绍,本篇教程只介绍不同文件的所有功能。

eos项目的插件代码位于eos/plugins目录下,包括四个层次:

  • 模板层

  • 基类层

  • 派生类层

  • 封装层

4.1 插件模板

eos/plugins/template_plugin定义了eos项目中所有插件的模板:

4.2 基类插件

经总结,eos项目的插件体系中共有5个基类插件:

  • eos/plugins/chain_plugin

  • eos/plugins/http_plugin

  • eos/plugins/net_plugin

  • eos/plugins/wallet_plugin

  • eos/plugins/account_history_plugin

这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个基本功能:

  • 创建/读取钱包文件;

  • 设置unlock timeout时间;

  • 密钥导入钱包;

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个派生类插件,这些插件分别继承几个基类插件,实现指定功能。派生类插件包括:

  • 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/sql_db_plugin

  • eos/plugins/template_plugin

  • eos/plugins/txn_test_gen_plugin

4.3.1 bnet_plugin

eos/plugins/bnet_plugin目录定义了eos的P2P网络中不同节点之间同步各自本地链数据的算法,简单来讲,包括如下特征:

  • 查找本地链上的最后一个区块ID;

  • 如果本地产生新区块,则将该区块发送给其他节点;

  • 如果本地不产生新区块,则将接受到的未确认交易发送给其他节点;

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/plugins/account_history_api_plugin;

  • 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;

猜你喜欢

转载自blog.csdn.net/akai9898/article/details/82454499