`

eos controller概述

    博客分类:
  • EOS
 
阅读更多
EOS中的模型层是blocks.log和基于chainbase的StateDB
controller是控制器层,声明于controller.hpp

eos::chain的依赖
 class permission_object;//同样继承自chainbase::object.增加了属于权限范畴的属性,包括id主键,parent父权限id,权限使用id,账户名,权限名,最后更新时间,权限认证.另外,提供了检查传入权限是否等效或大于其他权限.权限是按层次结构组织的,因此父权限比子权限及孙权限更大

 const fork_database& fork_db()const;//分叉数据库

 const account_object&                 get_account( account_name n )const;//同样继承自chainbase::object.增加了属于账户范畴的属性,包括id主键, 账户名,是否拥有超级权限能力,最后code更新时间,code版本,创建时间,code,abi.另外,提供了ABI设置函数set_abi()和ABI查询函数get_abi()
 const global_property_object&         get_global_properties()const;//维护全局状态信息,同样继承自chainbase::object.它的值由委员会成员设置,以调优区块链参数.与上面的区别是,一个是动态计算,一个是静态指定
 const dynamic_global_property_object& get_dynamic_global_properties()const;
 const resource_limits_manager&        get_resource_limits_manager()const;//完全的命名空间为eosio::chain::resource_limits,为controller提供资源限制管理的功能.此处的资源指的是基于chainbase数据库的存储资源.例如,增加索引,数据库初始化,快照增加和读取,账户初始化,设置区块参数,更新账户使用等
 resource_limits_manager&              get_mutable_resource_limits_manager();
 const authorization_manager&          get_authorization_manager()const;//提供权限管理的功能,权限内容有认证信息,依赖密钥,关联权限,许可,管理操作包括增,删,改,查
 authorization_manager&                get_mutable_authorization_manager();


   enum class db_read_mode {
      SPECULATIVE,//推测模式.其内容为两个主体的数据,即已完成的头区块及还未上链的事务
      HEAD,//头块模式.其内容为当前头区块数据
      READ_ONLY,//只读模式.其内容为同步进来的区块数据,不包括推测状态的事务处理数据
      IRREVERSIBLE//不可逆模式.其内容为当前不可逆区块的数据
   };

   enum class validation_mode {
      FULL,//完全模式.所有同步进来的区块都将被完整地校验
      LIGHT//轻量模式.所有同步进来的区块头都将被完整校验,通过校验的区块头所在区块的全部事务被认为可信

//被序列化的内容
FC_REFLECT( eosio::chain::controller::config,
            (actor_whitelist)//账户集合,作为actor白名单
            (actor_blacklist)//账户集合,作为actor黑名单
            (contract_whitelist)//账户集合,作为合约白名单
            (contract_blacklist)//账户集合,作为合约黑名单
            (blocks_dir)//存储区块数据的目录名字,默认值为"blocks"
            (state_dir)//存储状态数据的目录名字,默认值为"state"
            (state_size)//状态数据的大小,默认值为1GB
            (reversible_cache_size)//可逆区块数据的缓存大小,默认值为340MB
            (read_only)//是否只读,默认为false
            (force_all_checks)//是否强制执行所有检查,默认为false
            (disable_replay_opts)//是否禁止重播参数,默认为false
            (contracts_console)//是否允许合约输出到控制台,一般为了调试合约使用,默认为false
            (genesis)//eosio::chain::genesis_state结构体的实例,包含了创世块的初始化配置内容
            (wasm_runtime)//运行时webassembly虚拟机的类型,默认值为eosio::chain::wasm_interface::vm_type::wabt
            (resource_greylist)//账户集合,是资源灰名单
            (trusted_producers)//账户集合,是可信生产者
          )
   };

       //未被序列化的内容
       flat_set< pair<account_name, action_name> > action_blacklist; //账户和action组成一个二元组作为元素的集合,储存了action的黑名单
       flat_set<public_key_type> key_blacklist; //公钥集合,公钥黑名单
       uint64_t state_guard_size =  chain::config::default_state_guard_size;//状态守卫大小,默认为128MB
       uint64_t reversible_guard_size  =  chain::config::default_reversible_guard_size;//可逆区块守卫大小,默认为2MB
       bool allow_ram_billing_in_notify = false; //是否允许内存账单通知,默认为false
       db_read_mode read_mode = db_read_mode::SPECULATIVE; //db只读模式,默认为SPECULATIVE
       validation_mode block_validation_mode  = validation_mode::FULL; //区块校验模式,默认为FULL


flat_set:是config配置项中大量使用的一个容器.这是一个使用键存储对象,且经过排序的容器,同时它是一个去重容器.类似set

         //区块状态
         enum class block_status {
            irreversible = 0, //该区块已经被当前节点应用,并且被认为是不可逆的
            validated   = 1, //这是由一个有效生产者签名的完整区块,并且之前已经被当前节点应用,因此该区块已被验证但未成为不可逆
            complete   = 2, //这是一个由有效生产者签名的完整区块,但是还没有成为不可逆,也没有被当前节点应用
            incomplete  = 3, //这是一个未完成的区块,未被生产者签名,也未被某个节点生产
         };


      //私有成员
      private:
         friend class apply_context;//处理节点应用区块的上下文环境,其中包含迭代器缓存,二级索引管理,通用索引管理,构造器等内容
         friend class transaction_context;//事务上下文环境,包括构造器,转型,事务的生命周期(包括初始化,执行,完成,写入磁盘,撤销操作),事务资源管理,分发action,定时事务,资源账单等内容
         chainbase::database& mutable_db()const;//返回一个可变db,类型与正常db相同,都是chainbase::database,但这个函数返回的是一个常量引用

         std::unique_ptr<controller_impl> my;//这是整个controller的环境对象,comtroller_impl结体包含众多controller功能的实现.通过my都可以缓存在同一个环境下使用


信号
public:
 signal<void(const signed_block_ptr&)>         pre_accepted_block; //预承认区块(承认其他节点广播过来的区块是正确的)
 signal<void(const block_state_ptr&)>          accepted_block_header; //承认区块头(对区块头做过校验)
 signal<void(const block_state_ptr&)>          accepted_block; //承认区块
 signal<void(const block_state_ptr&)>          irreversible_block; //不可逆区块
 signal<void(const transaction_metadata_ptr&)> accepted_transaction; //应用事务(承认其他节点数据要先校验,通过以后可以应用在本地节点)
 signal<void(std::tuple<const transaction_trace_ptr&, const signed_transaction&>)> applied_transaction; //承认确认
 signal<void(const int&)>                      bad_alloc; //内存分配错误信号


1.pre_accept_block
发射时机:push_block 函数,会对已签区块校验,包括不能有pending块,不能push空块,区块状态不能是incomplete.通过校验后会发射该信号,并携带该区块.
插件捕捉处理:chain_plugin连接该信号,由信号槽转播到channel,pre_accepted_block_channed发布该区块,但是该channel没有订阅者.

2.accepted_block_header
发射时机1.commit_block函数,如果函数的参数add_to_fork_db为true,则需要添加至fork_db.首先,将pending状态区块的状态置为已校验,在fork_db中添加pending状态区块;其次,发射该信号并携带pending状态区块
发射时机2:push_block函数,pre_accepted_block发射完以后,获取区块的可信状态并添加至fork_db,然后发射该信号,携带fork_db添加成功后返回的状态区块
插件捕捉处理1:net_plugin连接该信号,绑定处理函数,函数体实现了日志打印
插件捕捉处理2:chain_plugin连接该信号,由信号槽转播到channel,accepted_block_header_channel发布该区块,bnet_plugin订阅该channel,绑定bnet_plugin_impl的on_accepted_block_header函数,该函数涉及线程池等概念,将会在bnet_plugin插件部分详细分析.遍历线程池,转到session会话下的on_accepted_block_header函数执行.如果传入区块与本地时间相差6s以内则接收;反之,则不处理.接收处理时先从本地多索引库表block_status中查找是否已存在,若不存在,则插入block_status结构对象.如果不是远程不可逆请求以及不存在该区块,该区块不是来自其他节点的情况,则需要在区块头通知集合中插入该区块id

3.accpet_block
发射时机:commit_block函数,fork_db重播处理结束后,发射承认区块的信号,携带pending状态区块数据
插件捕捉处理1:net_plugin连接该信号,绑定处理函数,打印日志的同时调用dispatch_manager::bcast_block,传入区块数据,send_all向所有连接发送广播

插件捕捉处理2:chain_plugin连接该信号,由信号槽转播到channel,accepted_block_channel发布该区块.bnet_plugin订阅该channel,依然有线程池的处理,会话遍历,执行单个会话的on_accepted_block函数,删除缓存中的所有事务,遍历接收的区块的事务receipt,获得事务的打包对象,事务id,在多索引表_transaction_status中查找该id,如果找到了则删除.如果在空闲状态下,尝试发送下一条pingpong心跳连接信息

插件捕捉处理3:mongo_db_plugin连接该信号,绑定其mongo_db_plugin_impl::accepted_block函数,传入区块内容.该函数首先校验是否达到了Mongo配置中的开始处理的区块号,这项配置是通过参数start_block_num设置的.如果传入区块号大于该参数设置的值(默认是0),则将标志位start_block_reached置true.然后根据另一个配置项mongodb-store-blocks(是否储存区块数据)及mongodb-store-block-states(是否储存状态区块数据)判断是否要存储区块数据.储存区块的方式是调用队列block_state_queue,传入区块数据等待被消费.

插件捕捉处理4:
a.producer_plugin连接该信号,执行其on_block函数,传入区块数据.函数首先做了校验.包括时间是否大于最后签名区块的时间及当前时间,以及区块号是否大于最后签名区块号.
b.校验通过以后,活跃生产者账户集合active_producers开辟新空间,插入计划出块生产者.然后利用set_intersection取本地生产者与集合active_producers的交集(如果结果为空,则说明本地生产者没有出块权利,不属于活跃生产者).将结果存入一个迭代器,迭代执行内部函数,如果交集生产者不等于接收区块的生产者,则说明是校验别人生产的区块,如果相等则不必做特殊处理.
c.校验别人生产的区块,首先要在活跃生产者的key中找到匹配的key(本地生产者账户公钥),否则说明该区块不是合法生产者签名,抛弃不处理.
获取本地生产者私钥,组装生产确认数据字段,包括区块id,区块摘要,生产者,签名.更新producer插件本地标志位_last_signed_block_time和_last_signed_block_num.最后发射信号confirmed_block,携带以上组装好的数据.但经过搜索,项目目前没有对该信号设置槽connection.
d.在区块创建之前要为该区块的生产者设置水印用于标示该区块的生产者是谁

4.irreversible_block
发射时机1:push_block函数,当推送的区块状态为irreversible不可逆时,发射该信号,携带状态区块数据.
发射时间2:on_irreversible函数,更改区块状态为irreversible的函数,操作成功后发射该信号
插件捕捉处理1.net_plugin连接该信号,绑定函数irreversible_block,打印日志.

插件捕捉处理2:chain_plugin连接该信号,由信号槽转播到channel,irreversible_block_channel发布该区块.bnet_plugin订阅该channel,依然有线程池的处理,遍历会话,执行on_new_lib函数,当本地库领先时可以清除历史直到满足当前库,或者直到最后一个被远端节点所知道的区块.最后,如果空闲,则尝试发送下一条pingpong心跳连接信息

插件捕捉处理3:mongo_db_plugin连接该信号,执行applied_irreversible_block函数,仍旧参照Mongo配置项的值决定是否储存区块,状态区块及事务数据,然后将区块数据塞入队列等待消费

插件捕捉处理4:producer_plugin连接该信号,绑定执行函数on_irreversible_block,设置producer成员_irreversible_block_time的值为区块的时间

5.accepted_transaction
发射时机1:push_scheduled_transaction函数,推送计划事务时,将事务体经过一系列转型及校验,最后发射信号并承认此事务.其中涉及的校验情况包括事务超时时间小于,大于或等于正常等待区块时间的情况
发射时机2:push_transaction函数,新事务到大状态区块,要经过身份认证以及决定是现在执行还是延期执行,最后要插入pending区块的receipt接收事务中.当检查事务末被承认时,发射一次该信号.全部函数处理完毕之后,再次发射该信号
插件捕捉处理1:net_plugin连接该信号,绑定函数accepted_transaction,打印日志
插件捕捉处理2:chain_plugin连接该信号,由信号槽转播到channel,accepted_transaction_channel发布该事务.bnet_plugin订阅channel,线程池遍历会话,执行函数on_accepted_transaction.在可能是多个的投机块中一个事务被承认,当一个区块包含该承认事务或者切换分叉时,该事务状态变为"receive now",被添加至数据库表中,作为发送给其他节点的证据.当该事务被发送至其他节点时,根据这个状态可以保证之后不会重复发送.每一次事务被"accepted",都会延时5s.每次一个区块被应用,所有超过5s未被应用的但被承认的事务都将被清除
插件捕捉处理3:mongo_db_plugin连接该信号,执行函数accepted_transaction,校验加入队列待消费

6.applied_transaction
发射时机1:push_scheduled_transaction函数,事务过期时间小于pending区块时间处理后发射该信号;反之,大于或等于处理后发射该信号.当事务的sender发送者不为空且没有主观失败的处理后发射该信号.基于生产和校验的主观修改,主观处理后发射该信号,非主观处理直接发射该信号
发射时机2:push_transaction函数,发射两次该信号,逻辑较多
插件捕捉处理1:net_plugin连接该信号,绑定函数applied_transaction,打印日志
插件捕捉处理2:chain_plugin连接该信号,由信号槽转播到channel
插件捕捉处理3:mongo_db_plugin捕捉处理

7.accepted_confirmation
发射时机:push_confirmation函数,推送确认信息,在此阶段不允许有pending区块存在,接着fork_db添加确认信息,发射该信号
插件捕捉处理1:net_plugin连接该信号,绑定函数accepted_confirmation,打印日志.
插件捕捉处理2:chain_plugin连接该信号,由信号槽转播到channel

8.bad_alloc
发射时机:与前面七种不同,该信号没有发射,属于boost::interprocess::bad_alloc,用于捕捉内存分配错误的异常
插件捕捉处理:无connect

controller_impl:是controller的具体实现
1.self:controller实例的引用
2.db:chainbase::database的一个实例,用于存储区块全数据,是区块进入不可修改的block_log之前的缓冲地带,包括本地的,同步过来的,未承认的,已承认的
3.reversible_blocks:也是chainbase::database的一个实例,但它是用于存储那些已经成功被应用但仍旧是可逆的special区块
5.pending:处于pending状态的一个区块的包装
6.head:block_state_ptr结构体是所有区块的统一数据结构,head代表区块对象
7.fork_db:fork_database类实例,分叉库
8.wasmif:wasm_interface类实例,是webassembly虚拟机接口的实例
9.resource_limits:resource_limits_manager资源限制管理器实例
10.authorization:authorization_manager认证权限管理器实例
11.conf:controller::配置config的实例
12.chain_id:chain_id_type类型,代表区块链当前id
13.replaying:是否允许重播,默认初始化为false
14.replay_head_time:重播的头区块时间
15.read_mode:数据库读取模式,默认初始化为SPECULATIVE
16.in_trx_requiring_checks:事务中是否需要检查,默认为false.如果为true,通常会被跳过的检查不会被跳过,如身份验证
17.subjective_cpu_leeway:剩余的CPU资源,以微秒计算
18.trusted_producer_light_validation:可信的生产者执行轻量级校验,默认为false
19.snapshot_head_block:快照的头区块号
20.handler_key:处理者的键,元素为scope和action组成的二元组
21.apply_handlers:应用操作的处理者,元素为以handler_key为键,std::function<void(apply_context&)>为值的map作为值,账户名作为键的复杂map
22.unapplied_transactions:未应用的事务map,以sha256加密串作为键,transaction_metadata_ptr为值.pop_block函数或者abort_block函数为执行完毕的事务,如果再次被其他区块应用则会从这个列表中移除,生产者在调度新事务打包到区块中时可以查询这个列表
分享到:
评论

相关推荐

    Java系统源码+科研工作量管理系统

    Java系统源码+科研工作量管理系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    毕业设计-智能优化之粒子群模型Python代码.rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测(含完整的程序,GUI设计和代码详解)

    内容概要:本文介绍了如何在MATLAB中实现结合黏菌优化算法(SMA)和核极限学习机(KELM)的分类预测模型。SMA优化KELM的超参数,提高模型的训练效率和预测精度,特别适用于处理复杂、高维数据集。文档详细阐述了项目背景、目标、挑战、模型架构、代码实现、结果展示、GUI设计、部署与应用等多个方面。 适合人群:具备一定MATLAB编程基础,对机器学习特别是优化算法和核方法感兴趣的科研人员和工程师。 使用场景及目标:①金融预测:股票价格、外汇市场等时间序列预测;②医疗诊断:疾病预测与辅助诊断;③工业故障检测:设备故障预警;④气象预测:天气变化预测;⑤市场营销:客户行为分析与预测。通过结合SMA和KELM,提升模型在高维数据上的分类和预测性能。 其他说明:文档不仅提供了详细的理论和方法介绍,还包含了完整的程序代码和GUI设计,有助于读者快速上手并应用到实际问题中。此外,文档还讨论了模型的部署、安全性和未来改进方向。

    Java jdbc for sqlserver2000 驱动包: msbase.jar;mssqlserver.jar;msutil.jar

    解压到项目下的LIB目录,在IDEA上右键,选添加为库即可。 连接代码如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQL { public static void main(String[] args) { String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; String connectionUrl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名"; String username = "sa"; String password = "口令"; try { Class.forNam……

    毕业设计-神经网络图像分类代码(可直接运行).rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    水母检测4-YOLO(v5至v9)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar

    水母检测4-YOLO(v5至v9)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar水族馆-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括638张图像。 水族馆以可可格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    电缆损坏检测8-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    电缆损坏检测8-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar电缆损坏-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括1318张图像。 电缆破坏以可可格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    基于java的讯友网络相册.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    2024税务稽查典型案例分析(PPT格式,可编辑)

    2024年以来,税务稽查主要针对虚开骗税、骗取税收优惠、隐匿收入、虚增成本等行为,开展重点行业重点领域重点行为税收监管。本课程从案例出发,梳理稽查重点关注的问题行为,分析常见涉税疑点,供财务人员实务参考。

    content_1734090857469.docx

    content_1734090857469.docx

    阵列信号处理-MUSIC算法-幅相误差校正-协方差矩阵校正法-信噪比变化

    阵列信号处理,MUSIC算法中,使用基于协方差矩阵的幅相误差校正法实现幅相误差校正

    linux的概要介绍与分析

    以下是一个关于Linux系统管理与自动化脚本项目的资源描述及源码概要: 资源描述 本项目专注于Linux系统管理与自动化脚本开发,旨在通过一系列脚本提升系统运维效率。在资源准备阶段,我们深入研究了Linux系统架构、Shell脚本编程、以及常用系统管理命令。参考了《Linux命令行与Shell脚本编程大全》等经典书籍,以及Linux官方文档和在线社区,如Stack Overflow和Linux Academy,这些资源为我们提供了丰富的知识和实战案例。 项目实施过程中,我们利用Bash Shell作为主要脚本语言,结合sed、awk、grep等文本处理工具,以及cron作业调度器,实现了系统监控、日志分析、自动备份、用户管理等一系列自动化任务。同时,通过SSH和rsync等工具,实现了远程服务器管理和文件同步,极大地提高了运维的灵活性和效率。 项目源码概要 项目源码包含多个Shell脚本文件,每个脚本负责不同的自动化任务: system_monitor.sh:监控系统资源使用情况,如CPU、内存、磁盘空间等,并生成报告。 log_analyzer.sh:分析系统日志文件,提取关

    黑鲨4S完好机备份基带qcn 黑鲨4S基带qcn

    资源说明; 完好机备份的基带qcn文件 下载后解压 可以解决常规更新降级刷第三方导致的基带丢失。 会使用有需要的友友下载,不会使用的请不要下载 需要开端口才可以写入,不会开端口的请不要下载 希望我的资源可以为你带来帮助 谢谢 参考: https://blog.csdn.net/u011283906/article/details/124720894?spm=1001.2014.3001.5502

    javaweb学生信息管理系统-lw.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    情侣恋爱主题源码LikeGirl v5.2.0最终版

    情侣恋爱主题源码LikeGirlv5.2.0最终版,经过多次更新和优化,情侣小站现已正式定版为v5.2.0。从今日起,此版本将成为项目的最终版本。 维护终止:自2024年11月7日起,情侣小站将不再接受新的功能更新或bug 修复。 用户责任:如在使用过程中遇到任何问题,请自行修复或选择放弃使用。

    基于java进销存管理系统.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    园区监控方案【范本模板】.pdf

    园区监控方案【范本模板】.pdf

    基于ssm的房源管理系统源代码(java+vue+mysql+说明文档+LW).zip

    基于ssm的房源管理系统源代码(java+vue+mysql+说明文档+LW).zip

    商务大楼能源计量系统施工方法.docx

    商务大楼能源计量系统施工方法.docx

Global site tag (gtag.js) - Google Analytics