PoW算法最基本的技術原理是使用哈希算法。假設找到哈希值Hash(r),如果原始數據是r(raw),則運算結果是R(Result)。
R =哈希(r)
hash函數Hash()的特點是,對於任意輸入值R,都可以得到結果R,並且不能從R反推,當輸入原始數據R變化1位時,結果R值完全改變。在比特幣的PoW算法中,引入算法難度d和隨機值n,得到如下公式:
Rd =哈希(r+n)
公式要求在填入隨機值n時,計算結果Rd的前d個字節必須為0。因為哈希函數的結果是未知的,所以每個礦工都要做大量的計算,才能得到正確的結果。計算結果廣播到全網後,其他節點只需要做壹個哈希運算就可以檢查了。PoW算法使用這種方法使得計算消耗資源,驗證只需要壹次。
?
PoS算法要求節點驗證者質押壹定的資金才有資格進行挖掘和打包,區域鏈系統在選擇打包節點時采用隨機的方法。壹個節點認捐的資金越多,它被選為打包塊的概率就越大。
在POS模式下,每枚硬幣每天產生1幣齡。比如妳持有100枚硬幣30天,那麽妳的幣齡就是3000。此時,如果您驗證了壹個POS塊,您的幣齡將被清零,您將從該塊中獲得相應的數字貨幣利息。
壹個節點通過PoS算法進行阻塞的過程如下:壹個普通節點要成為阻塞節點,首先要質押自己的資產。輪到它分塊時,它會把分塊打包廣播到全網,其他驗證節點會驗證分塊的合法性。
?
DPoS算法類似於PoS算法,股份和權利也是質押的。
但不同的是,DPoS算法采用的是委托質押的方式,類似於普選選出N個超級節點的方式。
選民為壹個節點投票。如果壹個節點被選為記賬節點,那麽這個記賬節點在得到壹個獎勵後,往往可以用任何方式回報它的投票者。
這N個記賬節點會輪流封鎖,節點之間互相監督。如果他們作惡,抵押將被扣除。
通過信任少量誠實節點,可以去除分組簽名過程中不必要的步驟,提高交易速度。
?
拜占庭問題:
拜占庭是古代東羅馬帝國的首都。為了保衛每個封地,駐紮了壹支由單壹將軍率領的軍隊,將軍們只能通過信使傳遞消息。在壹場戰爭中,所有的將軍都必須達成對* * *的理解,決定是否與* * *作戰。
但軍隊中可能會有漢奸,這些人會影響將領的認識。拜占庭將軍問題是指在已知其中壹人是叛徒的情況下,剩下的將軍如何達成壹致決定的問題。
BFT:
BFT是拜占庭容錯,拜占庭容錯技術是分布式計算領域的壹種容錯技術。拜占庭假設是現實世界的模型。由於硬件錯誤、網絡擁塞或中斷以及惡意攻擊,計算機和網絡可能會出現不可預測的行為。拜占庭容錯技術就是為了處理這些異常行為,滿足待解決問題的規範要求而設計的。
拜占庭容錯系統;
故障節點稱為拜占庭節點,正常節點為非拜占庭節點。
假設分布式系統有n個節點,整個系統的拜占庭節點不超過m (n ≥ 3m+1),拜占庭容錯系統需要滿足以下兩個條件:
此外,拜占庭容錯系統需要達到以下兩個指標:
PBFT是壹種實用的拜占庭容錯算法,解決了原有拜占庭容錯算法效率低的問題。該算法的時間復雜度為O (n 2),使得解決實際系統應用中的拜占庭容錯問題成為可能。
?
PBFT是壹個狀態機復制算法。所有副本都是在視圖旋轉過程中操作的。主節點由視圖號和節點數決定,即主節點p = v mod |R|。v:視圖數,|R|節點數,p:主節點數。
PBFT算法的* * *識別過程如下:客戶端發起消息請求並廣播給各個副本節點,其中壹個主節點發起建議消息pre-prepare並廣播。其他節點獲得原始消息,並在驗證完成後發送準備消息。每個節點接收2f+1準備消息,這意味著它準備好並發送提交消息。當節點收到2f+1條提交消息,客戶端收到f+1條相同的回復消息時,說明客戶端發起的請求已經到達全網。
具體流程如下:
客戶端c發送
收到客戶端的請求後,主節點需要提交以下內容:
A.客戶端請求消息的簽名是否正確。
非法的丟棄請求。正確的請求被分配壹個編號n,該編號主要用於對客戶端的請求進行排序。然後廣播壹個
副本節點I從主節點接收預準備消息,並需要提交以下內容:
A.主節點的預準備消息簽名是否正確。
B.當前副本節點是否已經接收到具有相同V號和不同簽名的預準備消息。
c.d .和m的摘要是否壹致。
d. n是否在區間[h,H]內。
非法的丟棄請求。正確的請求,副本節點I發送消息
當主節點和副本節點收到準備消息時,它們需要提交以下內容:
A.復制節點準備消息的簽名是否正確。
b當前副本節點是否在同壹個視圖v中接收到n。
c. n是否在區間[h,H]內。
d. d是否與當前收到的預備文件中的d相同?
非法的丟棄請求。如果復制節點I接收到2f+1個已驗證的準備消息,它發送消息< COMMIT,v,n,d,i & gt消息,v,n,d,I與上述準備消息相同。& ltCOMMIT,v,n,d,i & gt制作副本節點的簽名I .在日誌中記錄提交消息,用於恢復視圖更改過程中未完成的請求操作。在日誌中記錄其他副本節點發送的準備消息。
當主節點和副本節點收到提交消息時,它們需要提交以下內容:
A.副本節點的提交消息的簽名是否正確。
b當前副本節點是否在同壹個視圖v中接收到n。
c.d .和m的摘要是否壹致。
d. n是否在區間[h,H]內。
非法的丟棄請求。如果副本節點I收到2f+1個驗證提交消息,則表示當前網絡中的大多數節點已經達到* * *識,運行客戶端請求的操作o,並返回
?
如果主節點是惡的,它可能給不同的請求分配相同的序列號,或者不分配序列號,或者使相鄰的序列號不連續。備份節點應該有責任主動檢查這些序列號的合法性。
如果主節點斷開連接或作惡,不廣播客戶端的請求,則客戶端設置超時機制,如果超時,則向所有副本節點廣播請求消息。副本節點檢測到主節點是邪惡的或離線的,並啟動視圖改變協議。
查看更改協議:
副本節點廣播
當主節點p = v+1 mod |R|接收到2f個有效的視圖改變消息時,它進行廣播
副本節點從主節點接收新視圖消息,並驗證其有效性。如果有效,則進入v+1狀態,並啟動o中的預準備消息處理流程。
?
在上面的算法流程中,為了保證在視圖改變的過程中能夠恢復之前的請求,每個副本節點在本地日誌中記錄壹些消息,副本節點執行完請求後需要清除之前請求記錄的消息。
最簡單的方法是在回復消息後再進行壹次當前狀態的* * *知識同步,代價比較大,所以可以在執行多個請求k(例如100)後再進行壹次狀態同步。該狀態同步消息是檢查點消息。
副本節點I發送
這是壹種理想的情況。實際上,副本節點I向其他節點發送檢查點消息後,其他節點還沒有完成k個請求,所以不會立即響應I的請求,會按照自己的節奏前進,只是此時發送的檢查點還沒有形成穩定。
為了防止I的處理請求過快,設置了上面提到的高低水位區間[h,H]來解決這個問題。低水位H等於最後壹個穩定檢查點的數量,高水位H = h+L,其中L是我們指定的值,等於checkpoint周期性處理的請求數量的整數倍,可以設置為L = 2K。當副本節點I處理超出高水位H的請求時,它將在此時停止,並等待穩定檢查點發生變化,然後繼續前進。
?
在區塊鏈場景中,壹般適用於需要強壹致性的私有鏈和聯盟鏈場景。例如,在IBM領導的區塊鏈超級賬本項目中,PBFT是壹個可選協議。在Hyperledger的Fabric項目中,* * *識別模塊被設計成壹個可插拔的模塊,支持PBFT、Raft等* * *識別算法。
?
?
Raft基於壹個Leader-driven * * *知識模型,在這個模型中會選出壹個優秀的Leader,Leader將全面負責管理集群,Leader將負責管理Raft集群所有節點之間的復制日誌。
?
在下圖中,將在啟動過程中選擇群集(S1)的領導者,並將為來自客戶端的所有命令/請求提供服務。Raft集群中的所有節點都維護壹個分布式日誌(復制日誌)來存儲和提交客戶端發出的命令(日誌條目)。領導者接受來自客戶端的日誌條目,並在Raft集群中的所有追隨者(S2、S3、S4、S5)之間復制它們。
在Raft集群中,需要最少數量的節點來提供預期級別的知識保證,這也稱為仲裁。在Raft集群中執行壹個操作所需的最小票數是(N/2 +1),其中N是組中成員的總數,即至少有壹半的票數被投出,這也是集群節點通常為奇數的原因。所以在上面的例子中,我們至少需要3個節點才有* * *知識保障。
如果法定仲裁節點因任何原因不可用,即投票未超過半數,則本次協商未達成壹致,無法提交新日誌。
?
數據存儲:Tidb/TiKV
華爾街日報:阿裏巴巴的錢德勒
服務發現:咨詢& amp;etcd
集群調度:HashiCorp Nomad
?
只能容納失敗的節點(CFT),而不能容納邪惡的節點。
順序投票只能串行應用,所以在高並發場景下性能很差。
?
Raft通過解決圍繞領導者選舉、管理分布式日誌和算法的安全功能的三個主要子問題來解決分布式知識的問題。
當我們開始壹個新的Raft集群或者壹個領導者不可用時,壹個新的領導者將通過集群中所有成員節點之間的協商來選舉。因此,在給定的實例中,Raft集群的節點可以處於以下任何狀態:追隨者、候選人或領導者。
系統啟動時,所有節點都是追隨者。如果他們在壹段時間內沒有收到領導者的心跳信號,追隨者就會轉化為候選人;。
如果壹個候選節點收到了大部分節點的票,就可以轉化為領導者,剩下的候選節點回到追隨者狀態;
壹旦領導者發現系統中某個領導者節點的任期($ TERM)比自己高,就會轉化為跟隨者。
Raft使用基於心跳的RPC機制來檢測何時開始新的選舉。在正常期間,領導者會定期向所有可用的追隨者發送心跳消息(實際上,日誌可能會與心跳壹起發送)。因此,其他節點以從者狀態開始,並且只要它接收到來自當前領導者的周期性心跳,就保持在從者狀態。
當跟隨器超時時,它將以下列方式啟動選舉過程:
根據候選節點收到的來自簇內其他節點的響應,可以得到三個選舉結果。
* * *知識算法的實現壹般基於復制狀態機。什麽是復制狀態機?
簡單來說:相同的初始狀態+相同的輸入=相同的結束狀態。不同的節點應該用相同的確定性函數處理輸入,而不引入不確定值,例如本地時間。使用復制日誌是壹個好主意,它具有持久性和順序保持的特性,是大多數分布式系統的基石。
有了Leader,客戶端的所有並發請求都可以在Leader端形成壹個有序的日誌(狀態)序列,以表示這些請求的處理順序。然後,領導者將自己的日誌序列發送給跟隨者,以維護整個系統的全局壹致性。註意不是強壹致性,是最終壹致性。
日誌由帶有有序編號(日誌索引)的日誌條目組成。每個日誌條目都包含創建時的術語編號($ TERM),以及日誌中包含的數據。日誌中包含的數據可以是任何類型,從簡單類型到區塊鏈。每個日誌條目可以由[$ term,index,data]序列對表示,其中$ term代表術語,index代表索引號,data代表日誌數據。
領導者嘗試在集群中的大多數節點上執行復制命令。如果復制成功,命令將提交給群集,響應將發送回客戶端。類似於兩階段提交(2PC),但與2PC不同的是,領導者只需要壹半以上的節點同意(工作狀態下)。
領導者和跟隨者都可能崩潰,所以跟隨者維護的日誌與領導者相比可能會出現以下情況。
當leader與follower不壹致時,leader強制follower復制自己的日誌,Leader會從後向前嘗試,每次AppendEntries失敗後嘗試前面的日誌條目(遞減nextIndex值),直到成功找到每個Follower的日誌壹致位置點(基於以上兩個保證),然後逐個覆蓋Follower的條目。因此,丟失或額外的條目可能會持續多個術語。
?
要求候選人的日誌至少與其他節點壹樣是最新的。否則,追隨者節點不會投票給候選人。
這意味著每個提交的條目必須存在於這些服務器中的至少壹個中。如果候選人的日誌至少與大多數日誌中的其他日誌壹樣是最新的,它將保存所有提交的條目,並避免日誌回滾事件的發生。
也就是說,在任何任期內,最多選舉壹名領導人。這壹點非常重要,在壹個復制集中,任何時候都只能有壹個領導者。系統中同時多了壹個領導,這個領導叫腦分裂,這是壹個非常嚴重的問題,會導致數據覆蓋的丟失。在raft中,這個屬性由兩點保證:
因此,在某個任期內必須只有壹個領導人。
?
當集群中節點的狀態發生變化(集群配置發生變化)時,系統很容易出現系統故障。因此,為了防止這種情況,Raft使用了壹種稱為兩階段的方法來改變集群成員。因此,在這種方法中,在實現新的成員配置之前,集群首先被改變到中間狀態(稱為聯合知識)。聯合知識使系統即使在配置之間切換時也能響應客戶機請求,其主要目的是提高分布式系統的可用性。