1. 程式人生 > >eos原始碼賞析(七):EOS智慧合約入門之共識機制初探

eos原始碼賞析(七):EOS智慧合約入門之共識機制初探

        從丐幫幫主及丐幫長老的選舉說起。

        金庸小說中塑造了眾多丐幫幫主的形象,如汪劍通、蕭峰、洪七公、黃蓉、魯有腳、耶律齊、史火龍等。這些幫主在未當選幫主之前大都是丐幫中普普通通的一員,後來經過投票選舉---也就是吐唾沫的方式當上了幫主。這和現在eos的各大BP的競選類似,eos的持有者可以通過投票的方式或者代理投票的方式選擇自己意向中的BP,今天我們就從選舉和投票的角度來談談丐幫幫主選舉,來談談eos的投票機制以及對共識的理解。


        關於共識的理解準備分兩篇來解讀,本篇只針對在eos中使用到的共識機制做簡單的分析,在接下來的文章中會結合eos原始碼來解讀BFT-DPoS共識機制。說道BFT-DPoS我們就要從Pos機制和DPos機制說起,文章文字較多,程式碼較少,請謹慎閱讀:

        那麼什麼是PoS呢?

        PoS:Proof  of  Stake,也稱股權證明,類似於財產儲存在銀行,這種模式會根據你持有數字貨幣的量和時間,分配給你相應的利息。通俗的講,有個丐幫弟子名為白世鏡,曾是丐幫八袋弟子,他持有這八個袋子已經五年了,要知道這些在丐幫都是資歷的證明。有一天,白世鏡給丐幫立功了,再加上他在丐幫的資歷,幫主就提拔他做了九袋弟子並擢升為執法長老。這就是Pos機制,一個丐幫弟子持有的袋子越多,持有的時間越長就越有可能上升到丐幫的長老位。


        那麼什麼又是DPoS呢?

        DPoS:Deligated Proof of Stake,也稱委託股權證明,eos使用了DPoS的機制,在eos的白皮書中對eos為何使用DPoS

進行了詳盡的解釋,簡單摘錄如下:

EOS.IO軟體架構中採用目前為止唯一能夠複合上述效能要求的區塊鏈共識算(DPoS)。根據這種演算法,全網持有代幣的人可以通過投票系統來選擇區塊生產者,一旦當選任何人都可以參與區塊的生產。

EOS.IO裡預計每3秒生產一個區塊。任何時刻,只有一個生產者被授權產生區塊。如果在某個時間內沒有成功出塊,則跳過該塊。

EOS.IO架構中區塊產生是以21個區塊為一個週期。在每個出塊週期開始時,21個區塊生產者會被投票選出。前20名出塊者首選自動選出,第21個出塊者按所得投票數目對應概率選出。所選擇的生產者會根據從塊時間匯出的偽隨機數進行混合。以便保證出塊者之間的連線儘量平衡。

如果出塊者錯過了一個塊,並且在最近24小時內沒有產生任何塊,則這個出塊者將被刪除。這確保了網路的順利執行。

在正常情況下,DPOS塊鏈不會經歷任何叉,因為塊生產者合作生產區塊而不是競爭。如果有區塊分叉,共識將自動切換到最長的鏈條。具有更多生產者的區塊鏈長度將比具有較少生產者的區塊鏈增長速度更快。此外,沒有塊生產者應該同時在兩個區塊鏈分叉上生產塊。如果一個塊生產者發現這麼做了,就可能被投票出局。

        仍舊以白世鏡為例,白世鏡和其他二十位長老共二十一位長老被吐唾沫選舉出來來維持整個丐幫的發展,這就是DPoS的投票機制,通過持有的布袋投票出自己意向中的丐幫長老。有一天丐幫需要修改幫規的第三十二條:若要當選丐幫幫主必須接受幫內弟子的唾沫洗禮。如何才能修改成功呢,需要這二十一位長老中的2/3以上的人同意修改才可以,也就是十五位或者十五位以上的長老簽了字,下一任幫主任職的時候才能免去唾沫的洗禮,這就是DPoS的可以根據協議修改共識引數的功能。

        那麼如果在修改幫規的那一天這二十一位中的其中一位因為不在場這個幫規還能修改成功麼?當然可以,這就是我們所說的委託股權證明,比如護幫長老被西夏一品堂的人糾纏而不能親臨幫規修改現場,那麼他可以把自己的權利委託給傳功長老,讓他替自己行使權利,從而完成幫規的修改,這就是DPoS的股權委託證明機制。

        當然,當上了長老就一勞永逸了麼?並不是,拿白世鏡來說由於他和康敏之間不得不說的關係被丐幫弟子發現之後,群丐不再支援他做丐幫長老,因此他就會被從丐幫長老的位置上除名,這就是DPoS的不作為淘汰機制。

        前些天如火如荼的超級節點競選亦是如此,持有的eos大都凍結在交易所裡,而各大交易所紛紛宣告自己要參與超級節點競選的投票,其實他們這些交易所拿的都是eos持有者的權益去投票的。因為幣凍結了,相當於eos的持有者將投票權委託給交易所進行了投票。這

些超級節點如果沒能正確履行自己的權利和義務,eos的持有者將不再投票支援他們,他們也將從超級節點除名,從而產生下一個新的超級節點。

        那麼什麼又是BFT-DPoS

        BFT-DPoS: Byzantine Fault Tolerance- Deligated Proof of Stake,又稱具有拜占庭容錯機制的DPoS。

        仍舊以丐幫眾位長老為例,幫主選舉之前需要以眾位長老的的意見統一才可實現。於是執法長老白世鏡選出自己意向中的幫主--蕭峰並寫在紙條上傳給傳功長老,傳功長老如果同意執法長老的意見則確認之後傳遞給護幫長老,如果不同意執法長老的意見,則寫出自己意向中的長老,就這樣依次傳遞下去直到二十一位長老全部傳遞完,如果有超出2/3以上的長老同意蕭峰當幫主,則蕭峰就可以上任丐幫幫主了。假設兩位長老之間傳遞紙條的時間為3s一次,那麼要完成2/3以上的長老確認就至少需要15*3=45s的時間。

        有沒有什麼更好的辦法呢來縮短這個幫主選舉確認的時間呢?在eos的最新版本中採用了BFT-DPoS的機制,即在其中一個節點產生區塊的時候就通知其他節點來確認這個區塊的產生,也就是說當白世鏡在紙條上寫下蕭峰的名字的同時就大吼一聲,讓其他的長老再他寫下名字的同時就來確認丐幫幫主的人選。接下去傳功長老也寫下一個名字並喊其他長老來確認,這樣一來,只需要3s便可確認一個區塊的產生,也就是幫主人選的確認。

        這種產生區塊就廣播出去並讓其他節點完成簽名確認的過程便稱之為BFT-DPoS。但是問題也隨之而來,我們有過部署nodeos節點經驗的小夥伴們都知道,在eos中產生塊的速度為500ms,那麼這個會不會因為時間太短導致別的節點還沒有簽名確認結束就輪到下一個區塊生產者產生區塊呢?就比如白世鏡長老寫了一個名字在紙條上吼了一聲之後等其他長老來確認,但是其中一個長老年邁,走不快了,還沒來得及確認,就輪到傳功長老寫紙條了。這樣就導致了紙條傳遞的延時,在eos鏈上就體現為網路延時同時產生分叉,如何解決網路延時及分叉這個問題呢?BM團隊放棄了原來按隨機順序出塊的設計,改用記賬人相互協商後確定的順序。這樣就能保證網路延遲較低的記賬人之間能以相鄰的順序出塊。

        具體eos出塊的規則及BFT-DPoS共識機制在原始碼中的體現,會在下一篇文章中結合著原始碼進行解讀。

長按以下二維碼,關注本公眾號,一起學習eos開發.


    微信公眾號

         有任何疑問或者指教請新增本人個人公眾號,當然有對eos開發感興趣或者金庸粉的也可以新增,備註eos開發或金庸,拉你進群一起交流


           個人微信帳號