區塊鏈生產者由1到多

​ 在 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到多

在節點啓動並初始化的過程中,是先使用了創世塊文件的內容來初始化major和minor權限。

針對eosio.prods的權限的更新情況:

在controller.cpp中,我們可以看到start_block函數:
區塊鏈生產者由1到多

其中又調用了controller_impl的start_block函數:
區塊鏈生產者由1到多

可以看到,在函數的最後,調用了update_producers_authority()函數,這個函數就是來對eosio.prods進行權限更新的,其具體代碼示意如下:
區塊鏈生產者由1到多

上圖中生產者的名稱爲eosio.prods,其業務流程爲

  1. 先從當前pending對象的臨時塊中獲取到激活的生產者列表

  2. 定義了更新權限的函數

  3. 獲取當前激活生產者的數目

  4. 定義了計算權重閾值的函數

  5. 分別更新當前節點的生產者的相關權限的權重閾值:

    (1). 更新當前節點生產者的active權限的權重閾值爲 全部集合生產者的數目的三分之二加一

    (2). 更新當前節點生產者的major權限的權重閾值爲 全部集合生產者的數目的二分之一加一

    (3). 更新當前節點生產者的minor權限的權重閾值爲 全部集合生產者的數目的三分之一加一

區塊鏈生產者由1到多

【注意】:上面的業務流程是start_block函數中調用的,也就是說,每次出塊的時候都會進行生產者權限的相應更新,這個是爲了保證EOS投票結果導致的生產者變更能及時被應用。

鏈接
星河公鏈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章