爲了適應BOE技術的要求,同時儘量的提高安全TPS, HPB共識算法採用了高效的雙層選舉機制,即外層選舉和內層選舉。git
外層選舉:由具備BOE板卡的全部用戶中選取出。選取週期爲3個月。選取方式爲經過HPB錢包進行投票選舉。github
內層選舉:採用節點貢獻值評價指標,從衆多候選節點中選出高貢獻值節點成員。基於Hash隊列記名投票機制,在每次區塊生成時,計算高貢獻值節點生成區塊的優先級,優先級高的高貢獻值節點享有優先生成區塊的權利。算法
在整個共識算法設計中, HPB共識算法的輕量級消息交換機制使其在共識效率上遠高於其餘共識算法, 同時在安全性,隱私性等方面也作了較大幅度的提高。segmentfault
因爲在申請BOE板卡時已經考慮了除用戶持幣量的其餘因素,因此外層選舉在錢包投票節點主要考慮持幣量的因素,以及用戶的承認度,用戶承認度高,則用戶會對他進行投票,反之則投票數量少。安全
注1:若是具備BOE的用戶較多,會存在必定數量的用戶在外層選舉中落選。落選的用戶仍然能夠入網,可是不會做爲候選節點或者高性能節點,而且也不會收到獎勵。網絡
本文重點關注內層選舉。將會詳細描述內層選舉的實現方式和關鍵因素。dom
選舉包括2部分,首先是投票節點,而後是唱票階段。性能
內層選舉階段發生在網絡運行中的特定階段,每間隔必定數量的區塊進行一次選舉,而且根據關鍵因素進行排名,選擇優秀的節點進行投票。測試
節點帶寬:在節點運行期間,節點會按期測試與其餘節點間的帶寬數據,並保存在節點中,提供給共識使用,節點的帶寬數據會記錄在區塊中。網站
用戶持幣量:用戶在投票時的持幣數量。
投票數量:外層選舉過程當中用戶節點得到的投票數量。
節點根據外層選舉得出的節點數據爲集合,根據關鍵因素的排名加權選擇最優節點,進行投票。爲了保證選舉結果數量,在投票過程當中進行了隨機化操做,並非在全部的外層選舉集合內進行最有選擇,而是隨機選擇出特定數量的集合,而後選擇最優節點投票。這個目的是保證選舉結果的數量達到穩定值,保證網絡的穩定性,而且排除節點排名較靠後的節點。
已經有了投票的基礎數據後,在特定階段環節進行唱票工做,全部節點在唱票階段經過讀取區塊進行唱票,將區塊中全部的投票數據提取出來進行統計。在投票階段會將投票的數據寫入voteIndex。
將得到投票的全部節點做爲一個集合,從中選出特定數量的節點,做爲下一輪的高性能節點。所以須要對該結合中的節點進行排名操做,排名的依據是voteIndex的均值。
在注2中能夠看到幾個與次文關係較密切的字段,分別是candAddress,miner以及voteIndex。
miner:產生區塊的節點。
candAddress:是由miner根據內層選舉的3個關鍵因素肯定的。
voteIndex:是candAddress所對應的因素加權結果值。
從投票到唱票的全部環節,全部節點均存在校驗機制,確保節點沒法進行虛假投票和唱票,若是投票僞造,則該區塊會被其餘節點拒收;若是唱票僞造,則會被其餘節點踢出網絡。
注2:區塊部份內容。
{ **candAddress: 「0x4a8111ecec1f9150d366ae319d0585303085748f」**, comdAddress: 「0x4a8111ecec1f9150d366ae319d0585303085748f」, difficulty: 2, extraData: 「0x00000000000…」, gasLimit: 100000000, gasUsed: 0, hardwareRandom: 「0x2bce19ff44fbf1b05edfb93fcb7c7d3ab04c50fd7dc947e2fce65d66493d0dff」, hash: 「0x1fceb9c0d5a822fdddaa72bb9378f5ce24cd168b0281082a83d8f3a00c62d79a」, logsBloom: 「0x00000000000…」, **miner: 「0x4a8111ecec1f9150d366ae319d0585303085748f」**, mixHash: 「0x0000000000000000000000000000000000000000000000000000000000000000」, nonce: 「0x0000000000000000」, number: 100, parentHash: 「0xab7299002317fecbfdd835b28bacb470e24a7933b41102f75cb76491957baa98」, receiptsRoot: 「0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421」, sha3Uncles: 「0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347」, size: 683, stateRoot: 「0xc46fc99654813b2f92e9be58f7e69957499fa2c9b1c0ac31d1da86679f3b9a62」, timestamp: 1541416798, totalDifficulty: 201, transactions: [], transactionsRoot: 「0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421」, uncles: [], **voteIndex: "0x0"** }
具體投票機制可能根據最新的需求會調整,請及時參考最新的代碼。
咱們創立了HPB的技術討論專欄,若有任何技術問題,請訪問更多技術諮詢。
做者:感謝HPB技術團隊整理。
更多技術諮詢
1.若是你想了解更多關於HPB-Wallet的技術文章,請訪問:
HPB-Wallet
2.若是你想了解更多關於HPB的技術信息,請訪問咱們的GitHub WiKi:
HPB WiKi of GitHub
3.若是你想得到更多HPB信息,請關注咱們的官方網站:
HPB Website