1. 程式人生 > >區塊鏈 || PoW共識機制的學習

區塊鏈 || PoW共識機制的學習

注:本文章通過閱讀討論工作量共識在垃圾郵件的使用的 Proof-of-Work-Proves-Not-to-Work-version-0.2 文章以及部落格知乎上關於 PoW 機制的討論完成。

原理:

首先 PoW 是一種共識機制,處於區塊鏈架構的共識層中。上次作業的學習中有了解到區塊鏈的核心優勢之一就是能夠在決策權高度分散的去中心化系統中使得各節點高效地針對區塊資料的有效性達成共識。而要達成共識就要採用我們通常所說的共識機制,其中 PoW 就是一種最常見的共識機制(比特幣中的挖礦)。在比特幣挖礦中各節點貢獻自己的計算資源來競爭解決一個難度可動態調整的數學問題, 成功解決該數學問題的礦工將獲得區塊的記賬權, 並將當前時間段的所有比特幣交易打包記入一個新的區塊、按照時間順序連結到比特幣主鏈上. 比特幣系統同時會發行一定數量的比特幣以獎勵該礦工, 並激勵其他礦工繼續貢獻算力。

所以其核心思想是通過引入分散式節點的算力競爭來保證資料一致性和共識的安全性。比特幣系統中, 各節點 (即礦工) 基於各自的計算機算力相互競爭來共同解決一個求解複雜但驗證容易的 SHA256 數學難題 (即挖礦), 最快解決該難題的節點將獲得區塊記賬權和系統自動生成的比特幣獎勵. 該數學難題可表述為: 根據當前難度值, 通過搜尋求解一個合適的隨機數 (Nonce) 使得區塊各元資料的雙 SHA256 雜湊值小於或等於目標雜湊值。一般說來, PoW 共識在區塊鏈系統中實現過程如下:

  • 先定義一個固定的 256 位長度初始數,比如:長度為 256 位字元 0000…0001 (32 位元組,64 字元)
  • 設定難度係數值,比如:如果難度係數定義為前面 4 個 0,即 16 位長度(0000 0000 0000 0001 = 4 個字元 = 2 個位元組)。
  • 按照難度係數值進行移位操作,將 Hash 工作量值擴大,向左移(256-難度係數 N 位)比如:將初始數 0000…0001 向左移(256-16 位)得到:0000 0000 0000 0001 0000 …0000。
  • 將隨機數 Nonce 遞增加 1 再加上區塊頭(Block Header)Hash 值拼接,然後進行 SHA256 Hash 運算。
  • 將計算結果值與當前難度係數目標值作對比,如果當前計算值大於難度係數條件 值,即繼續遞增 Nonce 值再進行下一次的 SHA256 Hash 運算,直到計算出的結果 Hash 值少於目標值,則才認為解題成功,此次的工作量證明完成並獲得記賬權,然後進行對 交易區塊進行打包確認並廣播給全節點,並從 Coinbase 中獲得 gas 獎勵。
    Ps:
    如果要求 Hash 值前面的 N 位 0 越大,即它的計算難度就越大,每增加一位 0,它 的計算次數就變得高出很多倍,當要求計算難度值前 N 位要求為 7 位是 0 的時候,它 的計算次數就達到 5.6 億次,所以工作量非常大,如果作弊那是幾乎不可能。

優缺點:

優點:

1)演算法簡潔,很容易實現。
2)答案唯一且容易驗證,節點間無需交換額外資訊,容易達成共識。
3)公平性好,將記賬權公平的分派到其他節點。礦工能夠獲得的幣的數量,取決於挖礦貢獻的有效工作。
4)安全性高,破壞系統需要投入極大的成本,如果想作弊,要有壓倒大多數人的算力(51%攻擊)。因為作弊要付出一定成本,作弊者就會謹慎對待了。在比特幣 PoW 機制中,由於獲得計算結果的概率趨近於所佔算力比例,因此在不掌握51%以上算力的前提下,礦工欺詐的成本要顯著高於誠實挖礦,甚至不可能完成欺詐(由於概率過低)。

缺點:

1)挖礦造成大量的資源浪費,目前 bitcoin 已經吸引全球大部分的算力,其它再用 Pow 共識機制的區塊鏈應用很難獲得相同的算力來保障自身的安全。這讓依據算力公平分配獎勵的機制,演變為了對礦機算力的大舉投入。
2)網路效能太低,需要等待多個確認,容易產生分叉,區塊的確認共識達成的週期較長(10 分鐘),現在每秒交易量上限是 7 筆( visa 的平均每秒交易量上萬,支付寶峰值接近 9 萬),不適合商業應用。
3)PoW 共識演算法算力過於集中化,慢慢的偏離了原來的去中心化軌道。從比特幣擴容之爭可以看到,算力高的大型礦池是主人,而持幣的人沒有參與決定的權利,比特幣分叉出很多子叉,即將失去“去中心化”的標籤。

對存在的問題的解決:

由於 PoW 存在著很多需要改進的缺點,感覺很重要一點就是資源消耗量過大。於是針對此問題提出 PoS 共識, PoS 共識本質上是採用權益證明來代替 PoW 中的基於雜湊算力的工作量證明, 是由系統中具有最高權益而非最高算力的節點獲得區塊記賬權. 權益體現為節點對特定數量貨幣的所有權, 也就是幣齡. 幣齡是特定數量的幣與其最後一次交易的時間長度的乘積, 每次交易都將會消耗掉特定數量的幣齡。採用 PoS 共識機制的系統在特定時間點上的幣齡總數是有限的, 長期持幣者更傾向於擁有更多幣齡, 因此幣齡可視為其 PoS 系統中的權益. 此外, PoW 共識過程中各節點挖礦難度相同, 而 PoS 共識過程中的難度與交易輸入的幣齡成反比, 消耗幣齡越多則挖礦難度越低. 節點判斷主鏈的標準也由 PoW 共識的最高累計難度轉變為最高消耗幣齡, 每個區塊的交易都會將其消耗的幣齡提交給該區塊, 累計消耗幣齡最高的區塊將被連結到主鏈. 由此可見, PoS 共識過程僅依靠內部幣齡和權益而不需要消耗外部算力和資源, 從根本上解決了 PoW 共識算力浪費的問題, 並且能夠在一定程度上縮短達成共識的時間, 因而比特幣之後的許多競爭幣均採用 PoS 共識機制。

以上摘抄自區塊鏈論文中 PoS 的介紹,從中可以看出採用 PoW 機制的數字貨幣不是理想狀態的數字貨幣,因為它們的安全性不直接與使用者相關,而是要通過礦工這個媒介。在這種情況下,PoW 機制對於 51%攻擊有潛在隱患,攻擊者並不需要擁有比特幣,如果要做 51%攻擊,所需要的花費跟挖礦難度相關而不是直接跟比特幣價格相關。而在 PoS 機制下,進行 51%攻擊的代價更高,因為想要進行51%攻擊的話,你得擁有 51%的貨幣——這東西越值錢,攻擊的成本就越高。但這也就意味著存在另一個問題,也就是常說的無利益攻擊問題:對於 PoS 共識機制的貨幣,你越有錢,作惡付出的代價就越大;然而對於沒有錢的人,作惡代價很小,所以一些作惡行為對他們而言是有益的。

針對以上問題又出現了 Casper Pos 共識,Casper PoS 是一種基於保證金的經濟激勵共識協議。協議中的節點,作為“鎖定保證金的驗證人”,必須先繳納保證金(這一步叫做鎖定保證金)才可以參與出塊和共識形成。Casper 共識協議通過對這些保證金的直接控制來約束驗證人的行為。具體來說就是,如果一個驗證人作出了任何 Casper 認為“非法”的事情,他的保證金將被罰沒,出塊和參與共識的權利也會被取消。保證金的引入解決了無利益攻擊。也就是經典 PoS 協議中做壞事的代價很低的問題,現在有了代價,而且被客觀證明做錯事的驗證人將會付出這個代價。

針對背離去中心化思想的解決方案,以太坊選用的 PoW 演算法是線性記憶體困難的。該演算法被設計成算出一個 nonce 值需要大量的記憶體和頻寬。即使是超高速計算機,也無法在需要大量的記憶體和頻寬的條件下同時計算出多個 nonce 值。這減少了中心化的風險,為節點建立一個公平競爭的環境。