在上篇教程里我们已经对eos项目中前三个模块进行了简单描述,下面让我们开始EOS源码框架剖析系列第二篇:源码整体脉络梳理中篇。本篇教程将介绍eos项目中一个核心模块:插件模块。
eos项目(v1.0.2)主要可以分为以下八个模块:
编译模块
主程序模块
依赖库模块
插件模块
智能合约模块
测试模块
Docker工具模块
文档说明模块
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;
https://mp.weixin.qq.com/s?__biz=MzU1NDc2MzA2OA==&mid=2247483761&idx=1&sn=0cfd55dbc416c4df33f5c28c34ed7849&chksm=fbdfd722cca85e34d8f9fd93ff81ef531a15bb40895b5a895ef2ae2a3358c0fb0efd5a41dd42&scene=21#wechat_redirect