談談EOS的出塊時間,不可逆時間,BFT

2021-09-01 00:06:34 字數 2250 閱讀 7412

我們知道,新生產節點必須基於上乙個區塊生產新區塊,因此新生產節點必須在指定的時候內接收到上乙個區塊的內容,否則只能跳過(只能基於上上乙個區塊生產)。如果出塊時間太短,新節點很大可能接收不到上乙個區塊的內容,進而頻繁出現跳塊。只要有跳塊,系統就會出現臨時分叉,儘管eos的dpos的定時出塊和最長鏈共識讓系統很大可能最終達成共識,但是也會造成更多缺塊,進而降低了有效單位出塊數量,得不償失。

因而乙個合適的出塊時間就顯的很重要了,比如steam, btxs的出塊時間就設定為3s。那憑啥eos能將出塊時間設定為0.5s呢?因為eos做了如下改進:

1)1個生產節點連續出12個塊

1個生產節點內的12個塊不存在接收等待問題,是0等待,肯定也不存在跳塊問題。比如生產區塊2時,肯定能拿到區塊1的資料

2)21個生產節點的出塊順序是固定的,且直連

當a個節點完成12個區塊時,系統會切換生產者,新的生產者b就需要通過網路接收上乙個生產者的區塊。由於a的區塊是生產乙個就廣播乙個,12區塊傳播到生產者b的可用時間最短, 由於網路時延和擁堵問題,b不一定能接收a的12區塊。因此為了減少跳塊,必須降低a->b的時延。由於steem,btsx中,生產節點是隨機排序的,a->b的時延是不確定的,可能a在美國,b在中國,美國和中國的來回傳播就可能需要600ms, 同時a和b可能沒有直連還需要中間節點跳轉才能傳播,時延就更久了,因而需要設定乙個比較大的出塊時間,最後測試除錯下來,steem和btxs就設定了乙個比較合理的3s經驗值。eos為了減少相鄰兩個節點的時延,按照節點之間的時延安排出塊順序,即時延小的安排在鄰近,比如a安排為香港,b為中國就比a是美國,b為中國好太多。同時,由於這21個節點的資訊是透明的,這21個節點可以直連,進一步降低傳播時延。有了這兩個改進後,0.5s變為可能了。當然這種固定出塊順序的確定性也帶來了不安全因素,比如攻擊者可以準確預估每個出塊節點,就可以更容易發起攻擊行為。

然後我們來看下節點地域和實際出塊順序:

中國的節點沒有將伺服器部署在中國大陸的,要麼在香港要麼在日本,新加坡,甚至美國。

還有,仔細的網友可能可以看出,目前的實際出塊順序其實滿足按字母排序,但是同時時延排序也接近滿足。這和bm最初提的完全根據時延安排出塊順序有一些差異,這可能因為節點直連,同時沒有中國大陸節點,時延已經可以滿足了,同時幾乎固定的節點,其他優化的方式會很多。(多謝網友angelia提供資訊)        

eos中,21個生產節點輪流出塊。乙個區塊是通過後續節點基於該區塊的生產行為來間接確認的,為了實現bft級別的不可逆,自然需要得到2/3+1的節點確認。由於每個節點生產12個區塊,所以需要12*(2/3*21+1)=12*15=180個區塊確認。因而大家第一感覺是1個區塊只需要後續180個區塊即可變成不可逆狀態。然而,如果大家在eos區塊鏈上查詢區塊的實時資訊,就會發現乙個區塊都是在300多區塊的時候才會被標識為不可逆狀態。這是因為區塊的確認分為兩個階段,第乙個階段是pre-commit階段,該階段需要接受2/3+1個節點的確認表明,超過2/3節點認可該區塊。但是此時並不意味著超過2/3的節點已經了解到這個2/3確認資訊。因而再次需要2/3的commit簽名確認過程。兩階段簽名確認流程類似下圖:

常規的bft都是生產乙個區塊,等待共識,然後再生產乙個區塊,比如tendermint和cosmos裡的pbft的實現。由於pbft共識需要比較長的時間(至少1s以上),因而採用傳統的pbft是沒法滿足0.5s出塊需求的。因而eos 的bft採取了不同的實現方式,出塊和共識是流水並行工作的,區塊生產完成後,不等待pbft共識,繼續生產同時參與並處理上乙個區塊的pbft共識,當pbft共識完成後即修改為不可逆狀態。

其實很多人都在問我這個問題,我只能說,根據我目前了解點到的資訊是還沒實行。其實從目前不可逆時間也可推測出bft沒有啟用,如果bft已經啟用,1個區塊在乙個bft共識完成後(該共識一般只需1s多)即可被確認,而不是目前的3分鐘。

談談個人站長的時間管理

近段時間,很多站長談得比較多的就是執行力的問題。有些站長總是抱怨說,自己的執行力還可以,但就是常常覺得時間不夠用,導致無法完成所定的計畫。本文所有講的,就是談談個人站長的時間管理的問題。談到管理,很多人第一時間想到的往往的對人力和物力這方面的管理,但往往忽視了時間的管理。其實,時間才是最重要的資源,...

談談JS的時間物件(一) Date物件的定義

js中用於處理時間的是date物件,建立date物件的語法為 var d new date 上面的date 不傳任何引數,這時預設返回當前時間的date物件。除此之外,還有傳入具體某一時間date物件的語法 new date format newdate yyyy,mth,dd,hh,mm,ss n...

談談RTP傳輸中的負載型別和時間戳

最近被rtp的負載型別和時間戳搞鬱悶了,乙個問題除錯了近一周,終於圓滿解決,回頭看看,發現其實主要原因還是自己沒有真正地搞清楚rtp協議中負載型別和時間戳的含義。雖然做rtp傳輸,有著 jrtplib和 ortp這兩個強大的庫支援,乙個是c 介面,乙個是c語言介面,各有各的特點,各有各的應用環境,但...