`

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函数为执行完毕的事务,如果再次被其他区块应用则会从这个列表中移除,生产者在调度新事务打包到区块中时可以查询这个列表
分享到:
评论

相关推荐

    EOS开发资料-EOS系统概述.

    01 EOS系统概述. 的

    EOS系统概述,介绍EOS6的相关文档,欢迎下载!

    EOS系统概述,介绍EOS6的相关文档,欢迎下载!

    09 EOS Report管理员手册.chm

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    05 EOS基础构件库参考手册.chm

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    06 EOS管理员手册.chm

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    17 EOS6_报表教程.rar

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    15 EOS6.0三个例子包含SQL.rar

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    08 EOS Report参考手册.chm

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    20 EOS故障处理指南.rar

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    18 EOS6程序员教程.rar

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    13 EOS6.0 DtreeDemo.zip

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    19 EOS6中级开发实战.rar

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    10《项目开发规范》参考模板.rar

    01 EOS系统概述.chm :01 EOS系统概述.chm 02 EOS示例与教程.chm :02 EOS示例与教程.chm 03 EOS基础开发指南.chm :03 EOS基础开发指南.chm 04 EOS基础参考手册.chm :04 EOS基础参考手册.chm 05 EOS基础构件库...

    EOS.rar_EOS_普元_普元EOS_普元EOS教程

    **EOS - 普元企业服务总线** EOS(Enterprise Service Bus),由普元公司研发,是一款高效、灵活的企业服务总线系统。它在SOA(Service-Oriented Architecture,面向服务架构)环境中扮演着核心角色,为企业提供了...

    EOS产品介绍

    EOS产品概述 EOS开发过程 EOS使用参考

    普元EOS7.5基础教程(官网版)

    ### 一、EOS7.5平台概述 1. **系统架构**:EOS7.5基于微服务理念,构建了一种松耦合、可扩展的系统架构,支持分布式部署和服务治理。 2. **服务总线**:EOS7.5作为ESB,负责企业内部服务的发现、路由、转换和监控,...

    EOS5.1程序员培训教程pdf

    #### 一、EOS产品概述 - **EOS**:上海普元信息技术有限责任公司自主研发的一款面向构件的中间件,基于J2EE标准之上,适用于构建互联网应用系统。 - **EOS特点**:提供对构件在定义、组装、发布、运行、管理、访问等...

Global site tag (gtag.js) - Google Analytics