共識問題:區塊鏈如何確認記賬權?

电报nft119發表於2024-02-20

區塊鏈可以說是最近幾年最熱的技術領域之一,區塊鏈起源於中本聰的比特幣,作為比特幣的底層技術,本質上是一個去中心化的資料庫,其特點是去中心化、公開透明,作為分散式賬本技術,每個節點都可以參與資料庫的記錄。


區塊鏈是一個注重安全和可信度勝過效率的一項技術,如果說網際網路技術解決的是通訊問題,區塊鏈技術解決的則是信任問題。


今天我們關注區塊鏈中的核心問題:作為分散式賬本,每個參與者都維護了一份資料,那麼如何確認記賬權,最終的賬本以誰為準呢?


區塊鏈的共識


區塊鏈是一種去中心化的分散式賬本系統,區塊鏈的共識問題實際上是來源於分散式系統的一致性問題。


共識(Consensus)故名思義,共同的認識,共識問題研究的是多個成員如何達成一致,典型的比如投票選舉。


共識機制在區塊鏈中扮演著核心的地位,共識機制決定了誰有記賬的權利,以及記賬權利的選擇過程和理由。不同的虛擬貨幣採用共識機制也不同,常見的共識機制有 POW、POS、DPOS等。


我們前面提到 CAP 中的 C 是 Consistency(一致性),Consistency 和 Consensus 有什麼區別呢?


Consistency 側重的是內容在時間順序上的一致和統一,而 Consensus 則是指由許多參與者對某項內容達成共識,所以一般把 Consistency 翻譯為“一致性”,把 Consensus 翻譯為“共識”。


拜占庭將軍問題


前面的課程中我們已經分享了幾個經典的一致性演演算法,如果把共識機制延伸到分散式系統中,就是系統需要有一個主程式來協調,系統的所有決定都由主程式來達成一致性。


到了區塊鏈中,由於區塊鏈是一種去中心化的分散式系統,所以區塊鏈中是沒有類似於團隊裡的領導,以及分散式系統中的 master 角色,這樣就需要有某種共識機制,以便保證系統一致性。


一般在網路通訊中,把節點故障,也就是通道不可靠的情況稱為“非拜占庭錯誤”,惡意響應,也就是系統被攻擊,傳遞錯誤訊息稱為“拜占庭錯誤”。


為什麼叫拜占庭錯誤呢?實際上是來自於一個故事模型:


拜占庭帝國就是中世紀的土耳其帝國,擁有巨大的財富,周圍 10 個鄰邦垂誕已久,但拜占庭高牆聳立,固若金湯,沒有一個單獨的鄰邦能夠成功入侵。任何單個鄰邦入侵都會失敗,同時也有可能自身被其他 9 個鄰邦入侵。


拜占庭帝國防禦能力如此之強,至少要有十個鄰邦中的一半以上同時進攻,才有可能攻破。然而,如果其中的一個或者幾個鄰邦本身答應好一起進攻,但實際過程出現背叛,那麼入侵者可能都會被殲滅。


於是每一方都小心行事,不敢輕易相信鄰國,這就是拜占庭將軍問題。




(圖片來自維基百科)


在拜占庭問題裡,各鄰國最重要的事情是:所有將軍如何能過達成共識去攻打拜占庭帝國。拜占庭將軍問題核心描述是軍中可能有叛徒,卻要保證進攻一致,由此引申到計算機領域,發展成了一種容錯理論:


一群將軍想要實現某一個目標,比如一致進攻或者一致撤退,單獨行動是行不通的,必須合作,達成共識;由於叛徒的存在,將軍們不知道應該如何達到一致。


其實,拜占庭將軍問題(Byzantine Generals Problem)和我們前面提到的 Paxos 演演算法、邏輯時鐘等,都是由 Leslie Lamport 提出的。


Lamport 可以說是分散式系統的奠基人之一,由於在分散式領域的一系列貢獻,Lamport 獲得了 2013 年的圖靈獎。




拜占庭將軍問題和我們今天要討論的記賬權有什麼聯絡呢?


在記賬權的歸屬中,關鍵的是如何避免惡意共識的出現,也就是錯誤的記賬,類似如何處理拜占庭將軍中的叛徒。


比特幣是區塊鏈技術最廣泛的應用,在比特幣中如何決定記賬權呢?答案就是 POW 機制,接下來我們分析 POW 工作量證明機制。


POW 工作量證明


PoW(Proof of Work,工作量證明)被認為是經過驗證最安全的拜占庭解決機制,最早是用來防垃圾郵件的,典型的就是 Google 郵箱的反垃圾郵件系統。


Google 郵箱強制要求每一個給 Google 伺服器傳送郵件的傳送者,必須先完成一定量的計算工作,造成一小段時間的延遲,比如延遲 1 秒,如果是正常的郵件傳送,這個時間是可以接受;如果是廣告郵件傳送者,因為要進行大量的傳送工作,這種無價值的計算是無法忍受的。


挖礦的由來


挖礦是比特幣系統中一個形象化的表達,那麼挖礦是怎麼來的呢?


比特幣挖礦是將一段時間內比特幣系統中發生的交易進行確認,並記錄在區塊鏈上形成新區塊的過程,由於需要競爭記賬權,利用計算機去計算 Hash 數值,隨機碰撞解題,這個過程就是挖礦。


換句話說,就是比特幣系統出一道數學題,大家搶答最優解,挖礦就是記賬的過程,礦工是記賬員,區塊鏈就是賬本。


比特幣的 POW 實現


比特幣中的 POW 實現,是透過計算來猜測一個數值(Nonce),得以解決規定的 Hash 問題,下面是比特幣的區塊結構,可以看到區塊頭有個隨機數字段,這個就是 Nonce 值:




中本聰在比特幣系統中設定了一道題目,透過不斷調節 Nonce 的值,來對區塊頭算 Hash,要求找到一個 Nonce 值,使得算出來的 Hash 值滿足某個固定值。


具體的 Hash 方法一般是使用 SHA256 演演算法 ,你可以檢視這個小工具來測試 線上加密解密。


我們來簡化一下計算過程,假設第 100 個區塊給出的區塊值是下列字串,最早計算出該字串的節點可以獲得比特幣:


f7684590e9c732fb3cf4bf0b8e0f5ea9511e8bbaacb589892634ae7938e5700c


由於 Hash 演演算法是一個不可以逆的演演算法,沒法透過具體的 Hash 值倒推出原文,這樣每個節點只能採用窮舉的方法,也就是選擇各種字串,比如開始的 a、b、c、1、2、3、…,不斷的嘗試。


比特幣系統自身會調節難度,控制解題的時間,一般來講,約每 10 分鐘挖出一個區塊,在這 10 分鐘內,計算機只能不停地去計算,去試各種字串。


這個過程實際上是考驗各個節點的伺服器效能,也就是算力。如果你算力非常強大,有幾萬臺伺服器,可以很快得到 Nonce 值,也就是正確答案:lagou,對應 Hash 值和題目要求一致。


接下來你就可以把這個 Nonce 值放在結構體裡,透過 P2P 網路廣播出去,其他的系統節點收到後,發現這個 Nonce 值是合法的,能滿足要求,會認為你挖礦成功。


由於解出了題目,你會獲得系統對應的比特幣獎勵,以及本區塊內所有交易產生的手續費。其他節點發現有人已經算出來了,就會放棄本次計算,然後開啟下一個區塊的題目,去尋找下一個區塊頭的 Nonce 值。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70035240/viewspace-3006875/,如需轉載,請註明出處,否則將追究法律責任。

相關文章