精通EOS:EOS 插件系统

当前位置:首页 > 币圈百科 > 精通EOS:EOS 插件系统

精通EOS:EOS 插件系统

2022-12-09币圈百科338
eos中的节点程序Nodeos,从架构上看本质上是一个插件系统。系统提供的主要功能依赖于其插件系统,通过不同的插件组合提供各种服务功能,如区块链查询、交易验证执行、分块打包、P2P网络通信等服务。

插件的继承

系统的插件系统位于eos/plugins目录下。插件系统包含三个层次:

顶层,是位于libraries/app base/include/app base/plugin . HPP文件中的抽象类abstract_plugin。这个抽象类提供了插件的基本接口,包括:初始化来初始化插件。启动运行插件。Shutdown关闭插件。Set_program_options设置插件可以接收的选项。Get_state返回插件的状态。目前插件有四种状态,分别是:注册、初始化、运行、停止。其中registered表示插件对象已经实例化,但是什么都没有做;Initialized表示插件的参数已经初始化,可以随时运行;正在运行的插件已经在运行;Stopped表示插件已停止运行。Name表示插件的名称,由运行时类识别技术RITT和boost:core:demangle获得。得到的名字包含了命名空间,比如:eosio:chain_api_plugin。中间层是libraries/app base/include/app base/application . HPP文件中的模板类,实现抽象插件中定义的方法,并定义一个虚函数来定义插件的依赖关系。插件构造函数。该方法通过C的蓑衣网小编2022RTTI运行时类型识别技术获得具体实例化插件的名称,并存储在_name属性中。名字包括命名空间,比如:eosio:chain_api_plugin。Get_state返回当前状态object _state。Name返回当前实例化的类的名称,如构造函数中所解释的。Register_dependencies通过static_cast方法将当前插件转换为具体的实例化插件,然后调用插件的plugin_requires模板方法来加载插件所依赖的其他插件。初始化如果当前插件未注册,将不执行任何任务处理。对于处于注册状态的插件,进行如下处理:首先,将插件状态设置为初始化;其次,调用plugin_requires插件的模板方法,加载插件依赖的其他插件,通过Lambda表达式执行其他插件的initialize方法;然后,调用插件的plugin_initialize方法进行初始化;最后,调用应用程序的plugin_initialized方法,将插件添加到初始化的集合initialized_plugins中。

通过以上步骤,插件及其依赖项被初始化。启动如果当前插件未初始化,将不执行任何任务处理。对于处于初始化状态的插件,进行如下处理:首先,将插件状态设置为started其次,调用plugin _需要插件的模板方法,加载插件依赖的其他插件,通过Lambda表达式执行其他插件的启动方法;然后,调用插件的plugin_startup方法启动;最后调用应用的plugin_started方法,将插件添加到运行集running_plugins中。

通过以上步骤,插件及其依赖项正在运行。关闭如果当前插件未初始化,将不进行任何任务处理。对于处于初始化状态的插件,进行如下处理:首先,将插件状态设置为stopped其次,调用插件的plugin_shutdown方法停止。

注意:插件的initial和startup方法在main函数中分别通过调用application对象的application:iinitialize_impl和application:startup来调用。底层是承担各种特定功能的插件。这些插件位于eos/plugins中,它们都定义了以下方法:plugin_requires模板方法,加载插件的依赖,以及通过表达式依赖插件的对应方法。 Set_program_options虚函数plugin 蓑衣网小编2022 _ initialize instantiation plugin _ startup plugin _ shut down plugin

EOS提供的插件中,chain_plugin、net_plugin、http_plugin、producer_plugin这四个插件不需要用户手动注册,节点会自动注册。系统提供的

插件及其功能如下:

chain_plugin该插件承载了nodeos节点程序与区块链交互的基本功能,包括:读取本地不可逆区块链的基本信息;设置本地链检查点;设置本地链参数;设置可逆块数据库的参数;设置账户黑/白名单;设置智能合约的黑/白名单;重载的区块链初始状态文件;删除、重写和替换本地区块链数据(包括启动和停止等操作);Net_plugin,定义P2P网络插件的插件,承载了EOS系统P2P网络中TCP/IP层的相关功能,包括四个基本功能:

建立节点间的握手和互联;监控/发送/接收新的交易请求;监控/发送/接收新的块请求;验证接收数据的合法性;Http_plugin该插件定义了网络Http插件,承载了EOS系统P2 P网http层的相关功能,包括三个基本功能:监控/发送/接收新的事务请求;监控/发送/接收新的块请求;验证接收数据的合法性;Producer_plugin定义了块生产节点的函数插件,包括:生产/打包新的块数据;签署新区块;验证收到的块,包括块头、签名和交易的合法性;Wallet_plugin这个插件定义了Wallet插件,它承载了nodeos节点程序与wallet交互的相关功蓑衣网小编2022能,包括三个基本功能:创建/读取wallet文件;设置解锁超时;密钥导入钱包;Account_history_plugin这个插件定义了历史查询插件,它承载了节点程序查询本地链的相关功能,包括三个基本功能:指定块查询;指定帐户状态查询;指定交易记录查询;EOS的插件Bnet_plugin定义了P2P网络中不同节点间同步本地链数据的算法。简而言之,它包括以下特性:查找本地链上的最后一个块ID;如果本地生成了新的块,则将该块发送到其他节点;如果本地没有生成新的块,则将接收到的未确认事务发送到其他节点;fau _ testnet _ plugin的插件定义了一个在测试网络上快速建立测试账号的插件,为测试提供了便利。History_plugin这个插件定义了指定账户中指定公钥的所有历史交易记录。Http_client_plugin这个插件定义了eos网络Http层响应请求并进行相应安全验证的客户端插件。Mongo_db_plugin这个插件定义了MongoDB数据库的基本配置插件,用来保存和管理本地不可逆的区块链数据。Txn_test_gen_plugin这个插件定义了一个每秒自动生成指定数量交易信息的插件。该插件主要用于测试eos网络的吞吐量(TPS)。这个插件定义了一些区块链相关的api,用户可以调用。主要是:/v1/chain/ABI _ bin _ to _ JSON/v1/chain/ABI _ JSON _ to _ bin/v1/chain/Get _ ABI/v1/chain/Get _ account/v1/chain/Get _ block/v1/chain/Get _区块链/Get _ code/v1/chain/Get _ code _ hash/v1/chain/Get _ currency _ balance/v1/chain/Get _ currency _ stats/v1/chain/Get _ info/v1/chain/Get _ producer _ schedule/v1/chain/Get _ producers/v1/chain/Get _ producers/v1/chain/Get 主要是:/v1/history/get _ actio sget _ transaction get _ key _ accounts get _ controlled _ accounts net _ API _ plugin这个插件定义了一些网络数据相关的API,用户可以调用。有:/v1/net/connect/v1/net/disconnect/v1/net/status/v1/net/connections productor _ API _ plugin。这个插件定义了一些与生产模块相关的API,用户可以调用。主要是:/v1/producer/pause/v1/producer/resume/v1/producer/paused/v1/producer/get _ runtime _ options/v1/producer/update _ runtime _ options/v1/producer/add _ greylist _ accounts/v1/producer/get _ greylist _ accounts/v1/producer/get _白名单_黑名单/v1/producer/Set _白名单_黑名单/v1/producer/get _ integrity _ hash/v1/producer/create _ snapshot wallet _ API _ plugin这个插件定义了一些与钱包相关的API主要是:/v1/wallet/set _ time out/v1/wallet/sign _ transaction/v1/wallet/sign _ digest/v1/wallet/create/v1/wallet/lock _ all/v1/wallet/lock/v1/wallet/lock/v1/wallet/unlock/v1/wallet/remove _ key/v1/wallet/create _ key/v1/wallet/list _ wallets/v1/wallet/get _ list _ keys/v1/wallet/get _ public _ keys

插件生命周期每

1。插件注册

在执行C的主函数之前,系统会提前初始化静态变量,包括与初始化插件相关的变量,这些变量是通过调用app()来注册的。register_plugin()方法。我们简单看一下这个方法:

调用模板函数find_plugin,查找插件是否存在,如果存在,直接返回;否则,进入下一步;实例化模板插件的具体实例,并将其放入插件集合中;最后,调用插件的register_dependencies的方法来注册插件的依赖项。

系统中有部分插件采用静态注册:[X]bnet _ Plugin chain _ API _ Plugin db _ size _ API _ Plugin faucet _ testnet _ Plugin history _ API _ Plugin history _ Plugin http _ Plugin login _ Plugin mongo _ db _ Plugin net _ API _ Plugin Producer _ Plugin Template _ Plugin Test _ Control _ Plugin TXN _ Test _ Gen _ Plugin Wallet _ API _ Plugin Wallet _ Plugin[X]The

如果我们开发一个新的插件,因为这个插件不依赖于任何已有的插件,所以我们必须采用静态注册的方法。我们必须在系统启动之前注册它,然后我们可以在配置文件或者参数中指定它,这样插件就会被初始化并启动。

2。插件初始化

无论是自动启动的插件,还是用户通过- plugin参数或配置文件指定的插件,这两个插件都是通过在主函数中调用application对象的application:iinitialize_impl方法来初始化的。

3。插件启动

插件初始化后,通过调用application对象的application:startup方法,在主函数中启动已经初始化的插件。

后记

精通EOS:EOS 插件系统

由于本人水平有限,文中出现错误在所难免。欢迎大家踊跃指出自己的错误,我很感激。我的微信联系方式:joepeak。

原创不容易,尤其是在寒冷的冬天。欢迎赞助我一杯咖啡。我的比特币地址如下:3c 1 gyc 2 TSVVVNQCzFWHVIDQEPET 95

版权声明:免费转载-非商业-非衍生-保留签名(知识共享4.0许可)

精通EOS:EOS 插件系统 | 分享给朋友: