摘要:從外因的角度來說,系統應該能夠容忍黑客攻擊受托人作弊的情況。這里的黑客攻擊不是說,造成的后果最多是部分服務器宕機,我們已經歸到內因里去了,這里的黑客攻擊主要是指通過入侵拿到部分受托人密鑰并獲取權限,然后利用這些權限獲利。
0 前言
我曾分析了DPOS算法的漏洞并且模擬了一個簡單的攻擊的方法,然后實現了一個簡化的PBFT算法模型試圖去修復該漏洞,并且對比了效果。
隨后在正式的產品中實現了完整版的算法,并且部署了10臺機器進行了測試。測試的結果在安全性方面完全符合預期,即經過頻繁的重啟、不按常規的廣播區塊、少數受托人聯合作弊的情況下,整個系統依然不會分叉;但是在性能方面,不太理想,在沒有任何交易的情況下,網路流量的峰值(廣播區塊的瞬間)達到了1.5Mbps。
其實這個流量也不算離譜,為了安全性,付出一些帶寬的代價也算合理,但我們認為還有很大的優化空間,而且asch作為一個開發平臺,平臺底層的效率和穩定性是很重要的,帶寬方面的優化是很有必要的,我們立刻著手去做了。截止到8月9號,系統已升級到0.9.5版本,在49個節點組成的testnet中,帶寬的峰值在600kbps左右。
帶寬統計
下面我們會對比下這幾個版本共識算法的差異和基本原理。為了方便起見,我們把最初實現的dpos with pbft算法稱為AC0.5(AC即asch consensus),優化后的版本稱為AC1.0。
1 AC0.5與DPOS
我們之前分析過,DPOS的主要問題在于受托人的權力過高,而其他節點對區塊的有效性驗證過于簡單,這就很容造成一個局面,即不同內容、但相同高度的區塊共存于網絡中的不同節點,也就是所謂的分叉,進而造成雙重支付。
PBFT算法的本質則是讓每一個節點都盡可能知道其他節點的決策,并以此來確定自己的決策。
因此,PBFT帶來額外的流量消耗就可以理解了,其根源也找到了。在AC0.5算法中,這個額外的流量或者說“其他節點的決策”指的就是每個節點對下一個區塊的投票信息,投票信息主要內容有4個部分,即區塊高度、區塊ID、簽名、公鑰,其中區塊高度和區塊ID的長度可以忽略不計,簽名的長度為64字節,公鑰的長度為32字節,一個區塊達成共識需要全部受托人總數的2/3的投票,在asch系統中受托人總數為101人,也就是說需要至少67個投票。一個區塊的大小大約是200字節,相當于2個投票的大小,因此AC0.5中流量消耗是原始DPOS的30多倍(在沒有交易的空block情況下,如果有交易則交易不會消耗額外的流量)。
2 AC1.0做了哪些改進
2.1 序列化方法
AC0.5中服務器之間的消息傳遞使用json格式,二進制字段則是轉化為hex編碼后再進行傳輸,投票中的二進制字段包括公鑰和簽名,之前我們算的是100字節,轉化為hex編碼后則翻1倍,變成200字節了。
另外json的字段信息和冗余的分隔符所占的字節數也不少。
AC1.0對這一點做了改進,使用了protobuf作為序列化方法,效果很不錯,帶寬降為原來的60%左右。
consensus proto
2.2 算法流程
AC0.5的流程為
廣播一個待確認區塊
收集選票(以廣播的形式)
收集確認信息(以廣播的形式)
確認區塊
AC1.0的流程為
propose (廣播一個區塊的元信息及當前generator的ip信息)
collect votes (其他節點采用一對一的方式直接將選票發送給當前generator)
commit and broadcast(廣播一個已經確認的區塊并攜帶投票信息)
通過對比可以發現,AC0.5需要三次廣播,AC1.0僅需要兩次廣播,并且在propose環節,只廣播了區塊的元信息,不包括交易信息,只廣播元信息有個好處,可以防止在區塊無法達成共識的情況下白白浪費流量,因為如果連元信息都無法通過,那就沒必要廣播交易信息了。
2.3 廣播協議
AC0.5使用的廣播協議為最樸素也最粗暴的gossip算法,即隨機選取一定數量的相鄰節點然后將消息廣播給它們, 這個一定數量固定為100. 任何一個節點在收到一條信息后,會計算這個消息的hash,如果發現沒有收到過,就會繼續廣播給它的相鄰節點。也就是說一輪廣播需要進行100 * N次通訊,在N小于100的情況下,相當于復雜度為O(N^2), 在這里N為整個網絡的節點個數。
AC1.0把這個固定數量改為sqrt(N), 也就是說假如有100個節點,每個節點只需要廣播給10個相鄰節點。
這個改動很小,但是參數的設置卻是非常需要經驗的,我們做過了大量的測試后,認為sqrt(N)可以達到比較理想的效果,一次廣播需要的通訊次數略高于N * sqrt(N)。
除此之外,我們還實現了一個基于一致性哈希的廣播算法,性能達到了極致,算法復雜度降低到了O(N), 但是這個算法需要更多的測試,其穩定性和可靠性也不如更簡單的隨機算法。
算法的demo版本在這里,有興趣的可以研究下。
gossip topology
3 容錯性
關于容錯性,我認為可以從內因和外因兩個方面來說。
從內因的角度來說,系統應該能容忍正常節點出錯,這些錯誤主要是指服務器宕機、硬件錯誤、網絡擁塞等。Asch系統能夠容忍最多1/3的受托人節點同時出錯,假如某個受托人的節點出錯了,那輪到該受托人生產區塊的時候,就會缺失一個,并順延到下一個10秒。假如超過1/3節點同時出錯,那么系統將暫停工作,等到足夠的節點恢復正常后,系統就可以立即恢復正常。
假如1/3以上的節點永遠無法恢復(這種情況是存在的,比如他們的密鑰丟了),那么系統必須要通過一次軟件升級來恢復,并且這個升級不強制所有節點執行,只要部分節點升級,區塊生產恢復正常后,通過受托人投票把那些不正常的節點撤銷掉,系統就恢復如常了。
從外因的角度來說,系統應該能夠容忍黑客攻擊、受托人作弊的情況。這里的黑客攻擊不是說DDOS,DDOS造成的后果最多是部分服務器宕機,我們已經歸到內因里去了,這里的黑客攻擊主要是指通過入侵拿到部分受托人密鑰并獲取權限,然后利用這些權限獲利。獲利的手段無非是廣播多個版本的區塊,在短時間內造成分叉,然后進行雙重支付。在asch系統中,黑客必須要同時獲得1/3以上節點的密鑰,才能夠發動連續攻擊,使網絡的分叉持續下去,否則系統將通過最長鏈同步算法迅速消除分叉,分叉之間的差距不會超過1個區塊高度,也就是說2次確認以上的交易基本上不可能被回滾了。
從現有的使用DPOS算法的系統來看,包括bitshares、crypti、lisk在內,這些系統出現的分叉都是內因造成的,甚至大多數是算法實現上的bug所導致的。黑客攻擊DPOS的案例還沒有聽說過,雖然存在理論上的漏洞,但要想真正的攻擊,需要高超的技術和昂貴的資源,成本和收益不對等,因此也不會有人去攻擊,當一個DPOS系統的市值慢慢增大,我們可以繼續提高受托人節點的數量,進一步提高攻擊的成本,因此外因的風險基本可以忽略。
最后,我想解釋一下分叉這個詞,分叉來源于英文的fork,fork根據上下文的不同,我認為可以翻譯成兩種意思,一個是分叉,另一個是分裂。
分叉指的是在社區成員團結一致的情況下系統因為bug或被攻擊造成的不一致性,而分裂是指社區成員因觀念分化造成軟件走向不同的方向。
分叉強調的是系統的bug和不一致性,強調了物的因素,分叉后系統可能還是一個系統,并且是很可能被復原的;而分裂則是強調了人為的因素,一旦社區分裂,則系統一分為二,變成兩個系統。
從這個角度來說,asch對于分叉可以做到事前的預防和事后的修復,但無法應對社區的分裂,任何一個區塊鏈系統也無法解決分裂的問題,包括比特幣和任何一個聲稱可以避免分叉的PBFT系統。
關于側鏈和區塊鏈開發的問題,歡迎加群:485979564,一起討論交流
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86539.html
摘要:事實上,已經成功了一半目前在區塊鏈領域融資金額排行第二,僅次于以太坊。以上這些,就是我們經過深思熟慮后,雖有以太坊等珠玉在前,但我們依然要做一個同類型的產品的原因。 0 前言 首先要聲明一點,我們和我們的一些朋友都是lisk的投資人和支持者,我們也相信lisk會成功。 事實上,lisk已經成功了一半,目前在區塊鏈領域融資金額排行第二,僅次于以太坊。 那為什么我們還要做一個類似的Asch...
摘要:事實上,已經成功了一半目前在區塊鏈領域融資金額排行第二,僅次于以太坊。以上這些,就是我們經過深思熟慮后,雖有以太坊等珠玉在前,但我們依然要做一個同類型的產品的原因。 0 前言 首先要聲明一點,我們和我們的一些朋友都是lisk的投資人和支持者,我們也相信lisk會成功。 事實上,lisk已經成功了一半,目前在區塊鏈領域融資金額排行第二,僅次于以太坊。 那為什么我們還要做一個類似的Asch...
閱讀 2088·2021-11-23 09:51
閱讀 3697·2021-10-20 13:49
閱讀 1706·2021-09-06 15:13
閱讀 1815·2021-09-06 15:02
閱讀 3154·2021-09-02 15:11
閱讀 889·2019-08-29 15:37
閱讀 1731·2019-08-29 13:24
閱讀 2273·2019-08-29 11:28