源代码解读 [EOS 源码分析] 27 - EOS 系统的控制器头文件 (controller.hpp) 解析 (2)

Admin · 2019年12月21日 · 24 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

上一篇文章介绍了EOS系统的控制器的头文件controller.hpp中声明的部分依赖类,这篇文章继续介绍controller类的主体声明内容。

controller.hpp

继续看controller.hpp(eos/libraries/chain/include/eosio/chain/controller.hpp)中class controller的声明:

img

struct config

class controller的内容比较多,首先是一个配置结构体(struct config),这些配置有些被定义了(设置了初始值),有些只是声明。

比如声明了一系列黑名单和白名单的集合:

flat_set<account_name>   actor_whitelist;
flat_set<account_name>   actor_blacklist;
flat_set<account_name>   contract_whitelist;
flat_set<account_name>   contract_blacklist;
flat_set< pair<account_name, action_name> > action_blacklist;
flat_set<public_key_type> key_blacklist;

这些黑白名单的含义从字面意思上就能理解,flat_set是一个集合,Set容器不会包含重复的值。

另外一些设置了默认值的配置项如下:

  • blocks_dir:存储区块数据的目录,默认值"blocks",完整路径是.local/share/eosio/nodeos/data/blocks;

  • state_dir:存储状态数据的目录,默认值"state",完整路径是.local/share/eosio/nodeos/data/state;

  • state_size:状态数据大小,默认值1*1024*1024*1024ll字节,即1GB;

  • state_guard_size:状态数据守护大小,默认值128*1024*1024ll字节,即128MB;

  • reversible_cache_size:可逆区块数据缓存大小,默认值340*1024*1024ll字节,即340MB;

  • reversible_guard_size:可逆区块数据守护大小,默认值2*1024*1024ll字节,即2MB;

  • sig_cpu_bill_pct:签名可计费百分比,默认值50%;

  • thread_pool_size:线程池大小,默认值2;

  • read_only:是否只读,默认false;

  • force_all_checks:是否强制执行所有检查,默认false;

  • disable_replay_opts:是否禁止replay选项,默认false;

  • contracts_console:是否允许合约信息输出到控制台(终端),默认false,在EOS智能合约开发中为了方便调试,可通过config.ini把改值设置为true;

  • allow_ram_billing_in_notify:是否允许内存账单通知,默认false;

  • wasm_runtime:运行时的WASM虚拟机类型,默认是WABT虚拟机(eosio::chain::wasm_interface::vm_type::wabt);

  • read_mode:数据库读取模式,默认值db_read_mode::SPECULATIVE(推测模式),读取内容包括头部区块和还未上链交易;

  • block_validation_mode:区块数据验证模式,默认值validation_mode::FULL(全模式),验证全部区块数据。

这些配置项中有一部分通过FC_REFLECT宏被序列化公开:

img

enum class block_status

在配置类config之后,class controller中定义了枚举类block_status

img

block_status表示区块的状态,有以下几种:

  • irreversible:不可逆;

  • validated:已被验证,但还未成为不可逆状态;

  • complete:已由有效区块生产者签名,但还未被验证;

  • incomplete:还未被生产和签名。

一般情况下,EOS区块状态的变化过程是incomplete->complete->validated->irreversible。

controller的成员函数和私有成员变量

接下来controller.hpp中声明了构造函数、析构函数和大量成员函数,这些函数处理着EOS系统的大量业务逻辑,主要用于控制出块流程,贯穿EOS链生命周期的大部分行为,如start_block、abort_block、push_block、push_transaction、validate_tapos等。

controller声明了如下私有成员变量:

  • apply_context:应用区块的上下文环境,包括缓存、索引/二级索引管理等功能;

  • transaction_context:交易的上下文环境,包括交易的生命周期和相关函数;

  • mutable_db():返回一个chainbase::database,用来操作状态数据库;

  • my:controller_impl(controller实现类)实例的指针,是controller的环境对象。

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 17:49
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册