一文讀懂主流共識機制 PoW PoS和DPoS

2021-10-19 23:08:50 字數 1988 閱讀 5905

目錄

一文讀懂主流共識機制:pow、pos和dpos

01 pow(proof-of-work)工作量證明機制

02 pos(proof-of-stake)權益證明機制

03 dpos(delegate-proof-of-work)委託權益證明機制

04 結束語

pow、pos和dpos可以說是最廣為認知的共識機制。網路上有很多介紹這三種機制的文章,但大部分的文章都只停留在科普和基本原理的層面。對於區塊鏈工程師來說,淺嘗輒止是遠遠不夠的,本文章以技術視角來詳細介紹3種共識的技術原理。

所謂的共識機制,是保證區塊資訊在全網節點中保持一致共識的機制。如舊文關於「共識機制」,你知道的很可能是錯的提到,共識機制可分為兩個階段:1)提出共識內容;2)對內容達成共識。

上述的三種共識演算法在階段2的都是遵循最長鏈原則,而這類共識也統稱為中本聰共識,本文對此不再進一步展開,重點介紹階段1的差異。

工作量證明pow(proof of work),通過算力的比拼來選取乙個節點,由該節點決定下一輪共識的區塊內容(記賬權)。pow要求節點消耗自身算力嘗試不同的隨機數(nonce),從而尋找符合算力難度要求的雜湊值,不斷重複嘗試不同隨機數直到找到符合要求為止,此過程稱為「挖礦」。具體的流程如下圖:

第乙個找到合適的nonce的節點獲得記賬權。節點生成新區塊後廣播給其他節點,其他節點對此區塊進行驗證,若通過驗證則接受該區塊,完成本輪共識,否則拒絕該區塊,繼續尋找合適的nonce。

至今為止,尋找乙個滿足要求的nonce是非常困難的,要求節點消耗大量的算力。隨著有效區塊的不斷積累,惡意節點需要消耗極大的算力才有可能推翻以前的區塊,完成「雙花」攻擊。

pow要求所有的節點消耗大量的算力來爭奪記賬權,但在每一輪共識中,只有乙個節點的工作量有效,意味著有大量的資源被浪費,因此,權益證明機制proof of stake(pos)在2023年被提出並首次應用在peercoin系統中,目的是解決資源浪費的問題。

在pos共識中,節點爭奪記賬權依靠的不是算力而是權益(代幣)。pos同樣需要計算雜湊值,但與pow不同的是,不需要持續暴力計算尋找nonce值,具體流程如下: 

每個節點在每一輪共識中只需要計算一次hash,當擁有的權益越多,滿足hash目標的機會越大,獲得記賬權的機會越大。可以說,pos是乙個資源節省的共識協議。peercoin定義的權益除了與代幣數量有關,引入了幣齡(coin age),100個代幣持有兩天,幣齡為200,因此持有的代幣數量越多,時間越長,獲得記賬權的機會越大。

委託權益證明 delegate proof of stake(dpos), 是由pos演化而來的。持幣使用者通過抵押代幣獲得選票,以投票的方式選出若干的節點作為區塊生產者,代表持幣使用者履行產生區塊的義務。dpos與公司董事會制度相似,讓持幣使用者將生產區塊的工作委託給更有能力勝任的專業人士去完成,同時也能享受參與出塊獲得的獎勵。

使用者投票最多的若干節點成為出塊節點,以eos為代表是21個節點。在每一輪共識中,輪流選出乙個出塊節點產生區塊,並廣播給其他的出塊節點進行驗證。若節點在規定時間內無完成出塊,或產生無效區塊,會被取消資格,取而代之的是重新投票選取新的出塊節點。

值得一提的是,eos初期的dpos的共識方法才採用的是最長鏈共識,意味著與pow一樣區塊沒有絕對的最終性,交易的不可逆需要等待多個區塊確認。在18年時,eos使用拜占庭共識代替最長鏈共識,名為bft-dpos。 

一文讀懂Mysql的鎖機制

懂的越多,不懂的越多 今天只說mysql本身的鎖機制和innodb的鎖,有不對的地方,歡迎指正。mysql自帶的鎖機制 全域性鎖,表級鎖 而行級鎖由引擎來實現,但是要記住不是所有引擎都對行級鎖有支援,比如myisam就不支援行級鎖,所以基本沒有太多的應用場景了。全域性鎖 主要是用來進行全庫邏輯備份使...

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...