1. 程式人生 > >POW共識機制原理及優缺點

POW共識機制原理及優缺點

PoW共識機制

POW工作量證明(英文全稱為Proof of Work)在比特幣之前就已經出現,中本聰在設計區塊鏈的共識機制的時候就是借鑑了POW工作量證明。常見的是利用HASH運算的複雜度進行CPU運算實現工作量確定。

定義

工作量證明(Proof-of-Work,PoW)是一種對應服務與資源濫用、或是阻斷服務攻擊的經濟對策。一般是要求使用者進行一些耗時適當的複雜運算,並且答案能被服務方快速驗算,以此耗用的時間、裝置與能源做為擔保成本,以確保服務與資源是被真正的需求所使用。

在一個PoW系統中, 一定會有兩個角色, 一個是工作者, 一個是驗證者 對於工作者

  • 需要完成的工作必須有一定的量,這個量由工作驗證者給出。
  • 工作者無法自己"創造工作",必須由驗證者釋出工作。
  • 無法找到很快完成工作的辦法。 對於驗證者
  • 可以迅速的檢驗工作量是否達標。

HashCash

區塊鏈的PoW共識機制, 借鑑了很多HashCash方面的東西, 所以先講HashCash。

簡述

HashCash 最早是用來處理垃圾郵件的,首先一個垃圾郵件的傳送者發一個郵件出去不能花費很多時間, 如果花太多時間,那麼和人發郵件就沒什麼區別, 而要遮蔽這些垃圾郵件, 一個核心的想法就是正確的傳送方發的郵件一定要經過一段時間的處理, 而且這個處理是不能很快, 也不能找到捷徑, 也就是要有一定的工作量,這樣垃圾郵件沒有工作量,所以會被拋棄。

那麼問題又來了

首先如何產生工作量的方法是什麼?, 傳送方如何在郵件裡新增我已經完成很多工作(也就是工作量證明),第三個就是接收方如何驗證工作量

垃圾郵件處理例子

下面以一個垃圾郵件處理的例子來回答三個問題

在HashCash系統中,發件方向郵箱伺服器傳送的郵件資訊中必須包含一段郵件簽名,郵件簽名中包含有收件人地址、發件時間和一個數字counter,counter需要使郵件簽名滿足條件:

利用SHA-1雜湊演算法對郵件簽名生成一個160-bit長度的雜湊值,該雜湊值前20位全為0 。此演算法利用了雜湊演算法的不可預測性,SHA-1的碰撞概率決定了演算法的安全性。

在目前的認知中,發件方除了窮舉嘗試,無法很快的找到滿足條件的簽名串

。於是發件方在傳送郵件之前的工作就是不斷地counter++生成新的郵件簽名,然後獲取SHA-1雜湊值判斷前20位是否全為0,如果不是的話重新生成。而對於郵件伺服器而言,只需要做一次SHA-1判斷生成的簽名是否滿足條件即可,完全符合POW易於驗證的定義。

演算法簡介 傳送方簽名

counter = 0;

while(1) {   
	//time為時間戳  
	result = SHA1(mailAdress + time + counter);   
	if (result.substring(0, 20) == "00000000000000000000") { 
	    break;   
	}   
	counter++; 
}
sig = mailAdress + time + counter;

服務端驗籤

if (SHA1(sig).substring(0, 20) == "00000000000000000000") {
   return true;
}

由於雜湊函式的隨機性, 每一次hash得到的160位中的每一位是0 或1 的概率相同, 那麼要得到這樣一個正確的hash值每次雜湊成功的概率為1/2^20次方

當雜湊成功後把雜湊前的值 當做sig 放到郵件裡, 接收方通過對sig再做SHA-1雜湊,如果前20位為0, 說明是有工作量證明的。

那麼上面的問題就能回答了

  1. 產生工作量的方法是什麼? 不斷雜湊不同的值, 知道雜湊值符合一定的條件
  2. 如何新增工作量證明? 得到正確雜湊值的 雜湊前的值是證明
  3. 如何驗證? 接收方雜湊證明, 看是否符合上述條件

區塊鏈如何運用PoW共識機制

剛才說區塊鏈的共識機制就是PoW共識,而且借鑑了很多的HashCash的處理方法, 下面我們就來說說區塊鏈如何進行PoW共識的。

區塊的構成

在此之前需要先了解一下區塊的構成, 在這裡插入圖片描述

由上圖可知區塊分為區塊頭和區塊體, 期中區塊之間的聯絡是通過父區塊雜湊得到的。 區塊頭由什麼構成呢?

  • 父區塊頭雜湊值: 前一區塊的雜湊值,使用**SHA256(SHA256(父區塊頭))**計算。佔32位元組

  • 時間戳:該區塊產生的近似時間,精確到秒的UNIX時間戳,必須嚴格大於前11個區塊時間的中值,同時全節點也會拒絕那些超出自己2個小時時間戳的區塊。佔4位元組

  • 難度:該區塊工作量證明演算法的難度目標,已經使用特定演算法編碼。佔4位元組

  • 隨機數(Nonce):為了找到滿足難度目標所設定的隨機數,為了解決32位隨機數在算力飛昇的情況下不夠用的問題,規定時間戳和coinbase交易資訊均可更改,以此擴充套件nonce的位數。佔4位元組

  • Merkle根:該區塊中交易的Merkle樹根的雜湊值,同樣採用SHA256(SHA256())計算。佔32位元組

PoW證明過程

這也就是俗稱的挖礦過程, 找到合適的雜湊值

這裡不詳細說明區塊打包過程, 區塊通過一定的演算法被生成, 當然生成是需要一定的代價的。 區塊頭裡的各個值並不是隨機的, 而是有固定的演算法得出, Merkle根雜湊值就是把交易變成一顆Merkle樹, 最後得出根的雜湊值, 難度值是根據演算法不斷調整, 要維持出塊速率是10分鐘處塊。

下面將給出挖礦過程

在這裡插入圖片描述

首先我們把所有交易打包 生成Merkle樹, 計算Merkle根的雜湊值, 然後組裝區塊頭, 把區塊頭不斷進行SHA256(SHA256(區塊頭))操作, 然後判斷是否小於網路目標值這裡其實就是把它變成2進位制, 二進位制前面有多少位是沒有0的, 因為有1的話, 這個十進位制的值肯定是很大的, 就不會符合條件。 如果大於這個目標值, 說明前面的位數 沒有滿足 前多少位為0的條件 雜湊不成功, 那麼就改變隨機數值,組成新的區塊頭,繼續雜湊。

這是就是是挖到曠了,驗證的話也簡單 只要做一次SHA256(SHA256(驗證區塊頭))來判斷。 後面的操作下次再說

PoW優缺點

優點:

  • 去中心化,將記賬權公平的分派到其他節點 記賬權是通過看節點的PoW, 誰挖礦最快, 誰就能拿到這個礦

  • 安全性高,破壞系統需要投入極大的成本 因為獲得正確雜湊值的概率和算力成正比, 如果沒有掌握51%的算力就不能作弊。這樣代價要高於誠實挖礦,所以安全性高

缺點

  • 會造成資源浪費 因為挖礦需要大量的雜湊運算,需要電力和各種算力資源,而且找到合適的雜湊值實際上並沒有其他的作用

  • 網路效能太低 因為比特幣出塊的時間是10分鐘, 所以交易確認至少需要10分鐘,而且目前支援支援每秒7筆交易的速度,不適合商業用處。

  • PoW共識演算法算力集中化。 目前挖礦礦池是主力, 算力高的礦池有選擇權, 持本人麼有參與決定的權利

目前的一些解決方案

PoS (Proof of Stake)股權證明機制

一個根據使用者持有貨幣的多少和時間(幣齡),發放利息的一個制度。現實中最典型的例子就是股票,或者是銀行存款。如果使用者想獲得更多的貨幣,那麼就開啟客戶端,讓它保持線上,就能通過獲得“利息”獲益,同時保證網路的安全。

DPoS (Delegated Proof of Stake)授權股權證明機制

無人控制的公司發行股份,產生利潤,並將利潤分配給股東。實現這一切不需要信任任何人,因為每件事都是被硬編碼到軟體中的。通俗點講就是:公司股份制,股東持有這些公司的股份,公司為股東產生回報,無需挖礦。

PBFT (Practical Byzantine Fault Tolerance)實用拜占庭容錯演算法

拜占庭共識演算法(Practical Byzantine Fault Tolerance- PBFT)也是一種常見的共識證明。它與之前兩種都不相同,PBFT以計算為基礎,也沒有代幣獎勵。由鏈上所有人蔘與投票,少於(N-1)/3個節點反對時就獲得公示資訊的權利。

POI (Proof of Importance)

PoI(Proof of Importance)重要度證明共識演算法引了賬戶重要程度的概念,使用賬戶重要性評分來分配記賬權的概率。

POP (Proof of Participation)

這是標準鏈(CZR)的創新,基於賬戶參與度的 PoP(ProofofParticipation)演算法,POP 將 POI 和DPOS 的思想結合,既能確保對裝置的公平性,又擁有社群的共識。

我的解決方案

曾經聽說過 計算雜湊值沒有什麼意義, 單其實數學上有一些問題需要大計算才能得到結果, 有一個聽過的方案就是不求雜湊, 而是把問題變成求最大的素數,或者想很多模擬問題需要大量的計算而且對科學發展有幫助,比如模擬黑洞,模擬銀河系,模擬宇宙早期形態,這些問題可以當做問題來處理。畢竟這些算力還是很龐大的。

或者其他大算力的問題 大素數分解, 密集線性代數。

或者通過競標, 向區塊鏈發出問題,以解決此問題當做工作量證明,然後用其算力解決問題,這也是有幫助的。

以上都是單考慮如何讓這些算力不浪費這個方面, 還有其他類似於POS等不用大量算力的方法值得去發現。