​ 在 EOS 区块链上有些系统帐户可以控制各种相应的功能。 这些账户都有个 “eosio.” 的前缀。

什么是 eosio 系统账户? EOSIO 区块链的起源中只有一个帐户:eosio。 eosio 帐户包含 eosio.system合约,该合约提供区块链的基本交易功能。 而系统帐户就是由 eosio 创建的帐户, 每个系统账户会控制 eosio.system 和其它系统级合约中的每个特定操作。

​ 本文中我们重点介绍下eosio.prods账户。

​ 在EOS区块链上对 eosio 帐户进行查阅时,会发现它们的所有者和活跃权限都被委派给了另一个帐户的活跃权限:eosio.prods@active。这里的 eosio.prods 通常被称为“prods” --- 是一个涵盖当前的前21个BP节点的名单,并与选举的改变同步。前21名BP节点的特权就来自这里,这个权限只需要21个节点中的15个的同意就可以执行。

  什么是特权账户? 特权帐户是可以跳过标准授权检查执行交易的。 为确保这不会引出安全漏洞,所以才把这些特权账户的权限授权给了 eosio.prods。

如何从单个生产者过渡到多个生产者?
​ 要有2/3 +1的生产者同意,单个生产者产生的区块才被认可。生产者是被选举出来的。生产者列表可以更改。管理规则是和一个叫做eosio.prods的内建账户有关的。eosio.prods 账户使用的是 用eosio.msig合约定义的使用许可。一旦完成安装eosio.system合约,我们要把eosio.msig变成一个特权账户以便它能代表eosio账户的权限。
一旦完成,eosio将会放弃权限并且eosio.prods将会接管权限。

​ eosio.prods账户的权限在EOS代码中共有两处涉及:

​ a. 节点启动并初始化的时候,在 initialize_database()函数中创建该账户并设置了相应权限

​ b. 节点定时出块时,在start_block 函数处理中 更新该账户相应权限

​ 下面我们分别来看下具体的代码实现:

针对eosio.prods的账户创建及权限创建的情况:

在controller.cpp的 initialize_database()函数中,有如下代码:
区块链生产者由1到多_第1张图片

在节点启动并初始化的过程中,是先使用了创世块文件的内容来初始化major和minor权限。

针对eosio.prods的权限的更新情况:

在controller.cpp中,我们可以看到start_block函数:
区块链生产者由1到多

其中又调用了controller_impl的start_block函数:
区块链生产者由1到多_第2张图片

可以看到,在函数的最后,调用了update_producers_authority()函数,这个函数就是来对eosio.prods进行权限更新的,其具体代码示意如下:
区块链生产者由1到多_第3张图片

上图中生产者的名称为eosio.prods,其业务流程为

  1. 先从当前pending对象的临时块中获取到激活的生产者列表

  2. 定义了更新权限的函数

  3. 获取当前激活生产者的数目

  4. 定义了计算权重阈值的函数

  5. 分别更新当前节点的生产者的相关权限的权重阈值:

    (1). 更新当前节点生产者的active权限的权重阈值为 全部集合生产者的数目的三分之二加一

    (2). 更新当前节点生产者的major权限的权重阈值为 全部集合生产者的数目的二分之一加一

    (3). 更新当前节点生产者的minor权限的权重阈值为 全部集合生产者的数目的三分之一加一

区块链生产者由1到多_第4张图片

【注意】:上面的业务流程是start_block函数中调用的,也就是说,每次出块的时候都会进行生产者权限的相应更新,这个是为了保证EOS投票结果导致的生产者变更能及时被应用。

链接
星河公链