區塊鏈基本原理,Part 1 拜占庭容錯

2021-09-20 02:53:34 字數 3281 閱讀 4015

拜占庭將軍問題引介

區塊鏈本質上是分布式系統,其中包含不同的參與者,基於各自動機和可用資訊行動。

每當一筆新交易在網路中廣播出來,節點有權選擇將該交易納入其持有的賬本副本之中,或者將其忽略。當網路中的大部分參與者選定某一狀態之時,就能達成共識

分布式計算和多智慧型體系統的乙個基本問題是如何在一些錯誤流程存在的情況下實現總體系統的可靠性。這通常需要各個流程就計算中所需的某些資料值達成一致意見。¹

這些過程被稱為共識。

要建立一種安全的共識協議,必須實現容錯性。

首先,我們將簡要談談無法解決的「兩軍問題(two generals' problem)」。之後我們會延伸至拜占庭將軍問題並討論在分布式和去中心化系統中的拜占庭容錯。最後,我們會**上述內容與區塊鏈領域有何關聯。

這一問題(最早於2023年提出,並於2023年得名)描述了乙個兩軍共同抗敵的場景。將軍1是領導者,而將軍2是跟隨者。兩位將軍各自的軍隊不足以擊敗敵軍,因此他們需要聯手同時進攻。雖然這看似是乙個簡單的場景,卻內含警示之意:

為了雙方能夠交流並選定時間,將軍1需要派遣一名通訊兵穿越敵軍陣營通知將軍2進攻時間。然而,通訊兵有可能被敵方捕獲,致使訊息傳遞失敗。結果導致將軍1在發動進攻之時將軍2仍駐守原地。

即便第一次傳信成功了,將軍2必須承認(即ack(acknowledge),注意這與tcp協議的「三次握手」相似)已收到訊息,於是他派遣了一名通訊兵回信,因此又會出現之前通訊兵**獲的情況。這就會引起無數次地重傳 ack 確認符,導致兩位將軍無法達成共識。

要實現這兩位將軍都確認對方同意作戰方案的第二點要求是不可能的。兩位將軍總是會心存疑惑,想知道他們的最後一名通訊兵是否成功穿越了敵方陣營。

兩軍問題已經被證明是無解的

lamport、shostak和pease在2023年發表的一篇著名文章中描述了拜占庭將軍問題,它是改編後的兩軍問題的廣義版本。該問題描述了乙個相同的場景,只不過需要由兩位以上共同抗敵的將軍就進攻時間達成一致。其複雜性更強,因為一位或多位將軍可能叛變,此即表明他(們)可能會在做出選擇時撒謊(例如,他們會假意同意在9點發起攻擊但並不行動)。

兩軍問題中描述的領導者-跟隨者模式轉變成了指揮官-副官模式。在拜占庭將軍問題中,為了達成共識,指揮官和每位副官必須就同一決定達成一致意見(簡單來說就是攻擊或撤退)。

此外,上圖中的條件 ic2 還可能出現一種有趣的情況,如果指揮官叛變了,依然要達成共識。結果,所有副官取得了多數票。

在這種情況下,達成共識的演算法依據的是由副官觀察到的大多數成員決定的值。

原理:取任意值m,如果將軍人數為3m以上,叛徒的人數不超過m,演算法om(m)則達成共識。

這表明只要有 2/3 的參與者是忠誠的,該演算法就能達成共識。如果叛徒的人數超過 1/3 ,則無法達成共識,同盟軍無法協調進攻,敵方獲勝。

m = 0→沒有叛徒,所有副官選擇一致m > 0→每位副官的最終選擇取決於絕大多數副官的選擇 -

從副官2的視角圖示舉例會更加直觀清楚——以c代指指揮官,l代指副官i:

om(1):副官3是叛徒——副官2的視角-

步驟:指揮官將v傳送給所有副官

l1將v傳送給l2 | l3將x傳送給l2

l2計算收集到的訊息可知:v是大多數,l2 ←majority(v,v,x) == v

最終決定取決於l1, l2, l3中的多數票,因此達成了共識。

要記住的重要一點是該演算法旨在讓多數副官選擇相同的決定,而非某一決定。

讓我們**一下指揮官叛變的情況:

om(1):指揮官是叛徒-

步驟:指揮官分別向l1, l2, l3傳送 x, y, z

l1 向l2, l3 傳送x | l2向l1, l3傳送y | l3向l1, l2傳送z

l1 ← majority(x,y,z) | l2 ← majority(x,y,z) | l3 ← majority(x,y,z)

因為三位副官得到的值相同,因此達成了共識。此處請略微思考一下,即使x, y, z均不相同,對於三位副官來說majority(x, y, z)得出的值也是一樣的。在這種情況下,x,y,z是完全不同的指令,我們可以假定他們採取了預設選項撤退。

拜占庭容錯定義了一類系統的特徵,即允許出現屬於拜占庭將軍問題的錯誤。拜占庭容錯是最難的一類容錯模式。它沒有限制條件,也沒有對節點可能做出的行為進行假設(例如,乙個節點在充當乙個誠實的參與者之時可以生成任意資料)。

拜占庭容錯是最難解決的。航空發動機系統、核能工廠,以及幾乎所有依靠大量感測器的結果決定行動的系統都需要拜占庭容錯。甚至連 spacex 都認為其系統對此有著潛在需求。

上一節提到的演算法是拜占庭容錯以及叛徒人數不超過將軍人數的 1/3 的情況。此外還存在其它能使該問題更容易解決的方案,其中包括使用數字簽名或在網路中設定節點之間的交流限制。

從定義上來看,區塊鏈是不受任一中心主體控制的分布式賬本。由於這些賬本內蘊藏的價值,不良參與者有著極大的經濟激勵來試圖引發錯誤。此即表明,區塊鏈很需要拜占庭容錯,即解決拜占庭將軍問題的方案。

在沒有拜占庭容錯的情況下,乙個節點能夠傳送並發布錯誤交易,極大地破壞區塊鏈可靠性。更糟糕的是,沒有中心主體能夠掌握控制權並且修復損傷。

正如中本聰在這封郵件中深入描述的那樣,位元幣的問世帶來了一項重大突破,即使用工作量證明作為拜占庭將軍問題的概率解決方案。

在本文中,我們討論了分布式系統共識的幾個基本概念。

-part-2:工作量證明與權益證明

證書鏈的基本原理

pki public key infrastructure 規範體系,包含 問題 數字簽名技術 基於公鑰密碼技術。ca 數字簽名兩個過程 簽發證書的過程 撰寫證書元資料 使用通用的hash 演算法 如sha 256 對證書元資料計算生成數字摘要使用issuer 的私鑰對該數字摘要進行加密,生成乙個加...

1 基本原理與概念

n 1 10方括號中的數字1表示從n的第乙個元素開始顯示。物件 1.命名 名字必須以乙個字母開頭,中間可包含字母,數字,點.下劃線 區分大小寫 2.建立 通過賦值操作,其中賦值符號 n 15 n 1 15 5 n n 1 53.刪除 rm x 一些函式 rnorm n 3 rnorm 1 乙個服從平...

樹鏈剖分基本原理

樹鏈剖分本質上就是將一棵樹拆分為多條樹鏈,並按照一定的規則進行有規律的儲存,簡化我們樹上的操作。幾個定義 size k 以k為根節點時,k的子樹的節點個數。重兒子 u的子節點中size 最大的點 輕兒子 除了重兒子,剩餘的節點都為輕兒子 重邊 若根節點為u,u的重兒子為v,則 u,v 為重邊 輕邊 ...