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

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

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

img

上一篇文章介绍了wasm_interface、EOS持久化数据目录结构和EOS软件设计架构的分层,wasm_interface.cpp中很多函数是通过controller具体实现的,这篇文章介绍EOS系统分层中的控制器(controller)。

controller.hpp

控制器层代码实现封装在eos/libraries/chain目录下的controller类中,包括头文件eos/libraries/chain/include/eosio/chain/controller.hpp和源文件eos/libraries/chain/controller.cpp。

可以从controller.hpp头文件看到controller的整体结构,首先声明了两个命名空间:

img

  • chainbase::database:EOS系统的状态数据库(StateDB),用来保存可逆区块数据Multi-index表数据;

  • boost::asio::thread_pool:Boost库的线程池,用于并发访问。

然后是主要代码的声明,放在eosio::chain命名空间中:

img

eosio::chain中声明了一些controller需要使用的依赖。

authorization_manager

权限管理器,主要功能包括权限创建(create_permission)、修改(modify_permission)、删除(remove_permission)、查询(find_permission、get_permission)、权限验证(check_authorization)、获取权限关联的密钥(get_required_keys)等。

resource_limits::resource_limits_manager

资源限制管理器,主要功能包括账户初始化(initialize_account)、设置区块参数(set_block_parameters)、设置账户资源使用限制(set_account_limits,包括ram_bytes/net_weight/cpu_weight),还声明了一系列accessors函数,用于获取各种设置的参数。

controller_impl

controller的实现类。

dynamic_global_property_object

动态维护的全局状态信息,用来存储区块链运行时的全局属性,dynamic_global_property_object定义如下:

img

继承自chainbase::object,后者是一个类模板:

img

每一个继承自chainbase::object都需要指定一个typeId,types.hpp中声明了object_type枚举类型来保存这些typeId:

img

global_property_object

全局状态信息,和dynamic_global_property_object作比较,一个动态计算的全局参数,一个是静态指定的全局参数。

global_property_object也继承自chainbase::object类,这种xxx_object类型一般都继承自chainbase::object类,下面的permission_object、account_object相同。

permission_object

EOS系统中的权限对象,定义如下(成员变量部分):

img

account_object

EOS系统中的账户对象,定义如下:

img

fork_database

分叉数据库,管理轻量级的状态数据,包含未确认的潜在分叉区块。

本地节点新接收的区块会被默认添加到fork_database,它跟踪最长链和最新不可逆区块号,如果存储的区块已变为不可逆状态则将其删除。

db_read_mode

数据库读取模式,是一个枚举类:

enum class db_read_mode {
  SPECULATIVE,
  HEAD,
  READ_ONLY,
  IRREVERSIBLE
};

有4种读取模式:

  • SPECULATIVE:推测模式,读取内容包括头部区块和还未上链交易;

  • HEAD:头部模式,读取内容是头部区块;

  • READ_ONLY:只读模式,读取内容是不包括推测数据的区块;

  • IRREVERSIBLE:不可逆模式,读取内容是不可逆区块。

validation_mode

区块数据验证模式,也是一个枚举类:

enum class validation_mode {
  FULL,
  LIGHT
};

有两种数据验证模式:

  • FULL:全模式,验证全部区块数据;

  • LIGHT:轻模式,只验证区块头的数据。

controller.hpp源码中接下来声明的是class controller,放到下一篇文章中介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

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