Controller是EOS区块链的核心控制器,其功能丰富、责任重大。
关键字:EOS,区块链,controller,chainbase,db,namespace,using,信号槽,fork_database,snapshot
命名空间namespace命名空间namespace定义了一个范围,这个范围本身可作为额外的信息,类似于地址,或者位置。如果有两个名字相同的变量或者函数,例如foshan::linshuhao和nba::linshuhao,命名空间可以提供:
区分性或者归类性。不同命名空间下的内容互相孤立,即使内部函数名称相同,也不会产生混淆。
可读性,本例中foshan和nba提供了一层语义。
C++程序架构中,不同的文件可以通过引入相同的命名空间使用或者扩展功能。进一步理解,不同的文件名可以提供一层语义,这些文件可以共同维护一个跨文件的命名空间。
using语法C++程序设计中,经常会遇到带有using关键字的语句。using正如字面含义,代表了本作用域后续会使用到的内容,这个内容可以是:
其他命名空间,用using声明以后,该命名空间下的公有属性都可被使用。
直接指定其他命名空间下的某个函数,相当于导入功能,可以使用该函数,不过使用时仍旧要带上包含函数命名空间的完整路径。
为某个复杂名字变量起的别名以便于使用。例如using apply_handler = std::function<void(apply_context&)>;
controller依赖功能通过controller的声明文件,可以看到其整个结构。它声明了两个命名空间:
chainbase,这项声明为controller提供了基于chainbase的状态数据库能力。该命名空间是chainbase组件定义的,声明了database类,在chainbase源码中可以找到database类,这个类在前文chainbase的章节已经介绍过。
eosio::chain,该命名函数是EOSIO项目中内容最丰富的,在很多其他组件都有定义与使用。Controller引用了其他组件在相同命名空间下定义的功能,包括:
authorization_manager,提供权限管理的功能,权限内容有认证信息、依赖密钥、关联权限、许可。管理操作包括增删改查。
resource_limits::resource_limits_manager,完全的命名空间为eosio::chain::resource_limits,为controller提供了资源限制管理的功能。此处的资源指的是基于chainbase的数据库的存储资源。例如,增加索引、数据库初始化、快照增加和读取、账户初始化、设置区块参数、更新账户使用等。
dynamic_global_property_object,动态维护全局状态信息,继承自chainbase::object。它的值是在正常的链操作期间计算的,以及反映全局区块链属性的当前值。
global_property_object,维护全局状态信息,同样继承自chainbase::object。它的的值由委员会成员设置,以调优区块链参数。与上面的区别是一个是动态计算,一个是静态指定。
permission_object,同样继承自chainbase::object。增加了属于权限范畴的属性,包括id主键、parent父权限id、权限使用id,账户名、权限名、最后更新时间、权限认证。另外提供了检查传入权限是否等效或大于其他权限。权限是按层次结构组织的,因此父权限严格地比子权限以及孙子权限更强大。
account_object,同样继承自chainbase::object。增加了属于账户范畴的属性,包括id主键、账户名、是否拥有超级权限能力、最后code更新时间、code版本、创建时间、code、abi。另外提供了abi设置函数set_abi()和abi查询函数get_abi()。
fork_database,分叉数据库。下面会详细介绍。
controller扩展在controller.hpp中,最重要的部分就是类controller的内容,它是对命名空间eosio::chain内容的扩展。在展开介绍controller类之前,先要说明在eosio::chain命名空间下,有两个枚举类的定义,这也是对命名空间功能的扩展,因为下面介绍controller类的时候会使用:
db_read_mode,db读取模式是一个枚举类,包括:
SPECULATIVE,推测模式。内容为两个主体的数据:已完成的头区块,以及还未上链的事务。
HEAD,头块模式。内容为当前头区块数据。
READ_ONLY,只读模式。内容为同步进来的区块数据,不包括推测状态的事务处理数据。
IRREVERSIBLE,不可逆模式。内容为当前不可逆区块的数据。
validation_mode,校验模式也同样是一个枚举类,包括:
FULL,完全模式。所有同步进来的区块都将被完整地校验。
LIGHT,轻量模式。所有同步进来的区块头都将被完整的校验,通过校验的区块头所在区块的全部事务被认为可信。
下面进入controller类,内容很多,首先包含了一个公有的成员config,它是一个结构体,包含了大量链配置项,可在配置文件或者链启动命令中配置。controller中的config结构体是动态运行时的参数配置,而EOSIO提供了另外一个eosio::chain::config命名空间,这里定义了系统初始化默认的一些配置项的值,controller中的config结构体的某些配置项的初始化会使用到这些默认值。