1. ?概要
具體DPOS的算法請(qǐng)參考:
https://www.leiphone.com/news/201706/JfsBmaf6Y0ZtV11R.html
白皮書DPOS部分:https://blog.csdn.net/lsttoy/article/details/80041033?
本文不描述DPOS的理論,網(wǎng)絡(luò)已經(jīng)很多了
? ? ? ? 引用BM的話,任何共識(shí)算法都應(yīng)該考慮以下幾個(gè)問題:
1. ?區(qū)塊應(yīng)該由誰來生成:選舉產(chǎn)生,基于stake的大小產(chǎn)生
2. ?區(qū)塊何時(shí)生成:區(qū)塊生成的時(shí)間和間隔
3. ?區(qū)塊應(yīng)該包含哪些交易:智能合約、交易、消息交互等
4. ?競(jìng)爭(zhēng)的交易歷史應(yīng)該如何解決:分叉如何解決,涉及到活性和一致性的權(quán)衡,一般使用最長(zhǎng)鏈原則。
? ? ? ? 在這些的基礎(chǔ)上增加一條區(qū)塊的確定性:確定性在POW中是永遠(yuǎn)都不會(huì)實(shí)現(xiàn)的,因?yàn)镻OW的記賬者原則上是所有全節(jié)點(diǎn)都可能是,所以只會(huì)無限接近,一般認(rèn)為6個(gè)塊后確定。對(duì)于DPOS,認(rèn)為選舉出的一輪記賬者中,2/3的記賬者認(rèn)同即可確定,區(qū)塊會(huì)認(rèn)為是不可逆的區(qū)塊(最終會(huì)寫到chain下得last_irreversible_block_num中并寫入數(shù)據(jù)庫)。DPOS現(xiàn)在的版本都是等待2/3的記賬者出塊之后確定,后面的Realtime -BFT,即在出塊之后,通知其他記賬者,超過2/3的記賬者認(rèn)同簽名后,記錄該塊為不可逆塊還沒有實(shí)現(xiàn)。
下面描述記賬者的選舉過程:
1. ?抵押獲取投票權(quán)限
在EOS系統(tǒng)中,抵押token以獲取對(duì)應(yīng)比例的band、ram等資源和投票的權(quán)力,需要將token轉(zhuǎn)到合約賬戶'eosio.stake'下,釋放資源后,失去投票權(quán)利,token贖回。
命令行:
delegate_bandwidth_subcommand
undelegate_bandwidth_subcommand
delegatebw && undelegatebw
輸入:賬戶、數(shù)額
流程:

2. 記賬者候選人
流程分為注冊(cè)和注銷。
producer注冊(cè):
命令行實(shí)現(xiàn):register_producer_subcommand
? ? ? ? ? ? ? ? ? ? ? ? ?regproducer
輸入:賬戶名、key、url(producer網(wǎng)站)、location(每個(gè)國(guó)家一個(gè)數(shù)字編碼,參考https://eosportal.io/chain/12/producers ,也可以參考移動(dòng)編碼的MCC,例如中國(guó)86)
流程:

producer 的注銷:
命令行:unregister_producer_subcommand
? ? ? ? ? ? ? ? ?unregprod
輸入:賬戶名
流程:查找用戶,并刪除
輸出:void
3. 委托
注冊(cè)和注銷為proxy,可以全權(quán)代理被代理者的投票權(quán),被代理人的投票權(quán)利被收回。
命令行:regproxy_subcommand
? ? ? ? ? ? ? ? ?regproxy
輸入:賬戶名、動(dòng)作:注冊(cè)還是注銷
流程:

4. 投票選舉
命令行實(shí)現(xiàn):
? ? ? ? ? ? vote_producer_proxy_subcommand
? ? ? ? ? ? vote_producers_subcommand
? ? ? ? ? ? approve_producer_subcommand
? ? ? ? ? ? unapprove_producer_subcommand
Voteproducer
輸入:本人賬戶名、proxy的賬戶名、候選人列表(最多30人)
流程: 不考慮proxy的情況

輸出:void
?? ? ? ? ? 其中,每個(gè)候選人都獲取相同數(shù)量的投票,最多投30人。
EOSIODawn 4.0 里面一個(gè)重要的改進(jìn)是投票權(quán)的衰減機(jī)制,每位voter每周必須重新投票,否則會(huì)權(quán)重會(huì)衰減,衰減頻率是一周,半衰期是一年,所謂的衰減是指,現(xiàn)在重新計(jì)算的權(quán)重比之前要大,之前的權(quán)重并沒有改變。?
5.?定時(shí)更新生產(chǎn)者信息
EOS 的出塊時(shí)間是500ms一個(gè),所以利用這個(gè)時(shí)間特性實(shí)現(xiàn)了定時(shí)器的功能,收到120個(gè)出塊消息,即一分鐘觸發(fā)一次計(jì)票統(tǒng)計(jì)(因?yàn)?1個(gè)生產(chǎn)者,每人3s,如果是15個(gè)生產(chǎn)者,就應(yīng)該是42s),調(diào)用set_proposed_producers接口將在線的生產(chǎn)者列表和要寫入的區(qū)塊號(hào)保留下來,在出塊的時(shí)候調(diào)用set_new_producers接口寫到header中。
update_elected_producers
輸入:block_time
流程:

6. 編排出塊者順序
在注冊(cè)producer的時(shí)候,用戶需要寫入location,在定時(shí)更新生產(chǎn)者信息的時(shí)候,會(huì)按照location排序,達(dá)到編排的目的。
7.?惡意記賬者的懲罰:
在Casper中需要在投票選擇分叉的時(shí)候需要將token抵押,防止Byzantine user 作惡,對(duì)于EOS而言,所有的懲罰措施都體現(xiàn)在投票上,即下一輪會(huì)被選舉出局,投票抵押的token沒有罰沒機(jī)制,只是會(huì)延遲3天后返還。