拜占庭將軍問題(Byzantine failures)是由萊斯利·蘭伯特提出的點(diǎn)對(duì)點(diǎn)通信中的基本問題。含義是在存在消息丟失的不可靠信道上試圖通過消息傳遞的方式達(dá)到一致性是不可能的。因此對(duì)一致性的研究一般假設(shè)信道是可靠的,或不存在本問題。這個(gè)難題也被稱為“拜占庭容錯(cuò)”、“拜占庭將軍問題”、或者“兩軍問題”。
拜占庭將軍問題是一個(gè)協(xié)議問題,拜占庭帝國(guó)軍隊(duì)的將軍們必須全體一致的決定是否攻擊某一支敵軍。問題是這些將軍在地理上是分隔開來的,并且將軍中存在叛徒。叛徒可以任意行動(dòng)以達(dá)到以下目標(biāo):欺騙某些將軍采取進(jìn)攻行動(dòng);促成一個(gè)不是所有將軍都同意的決定,如當(dāng)將軍們不希望進(jìn)攻時(shí)促成進(jìn)攻行動(dòng);或者迷惑某些將軍,使他們無法做出決定。如果叛徒達(dá)到了這些目的之一,則任何攻擊行動(dòng)的結(jié)果都是注定要失敗的,只有完全達(dá)成一致的努力才能獲得勝利。
拜占庭假設(shè)是對(duì)現(xiàn)實(shí)世界的模型化,由于硬件錯(cuò)誤、網(wǎng)絡(luò)擁塞或斷開以及遭到惡意攻擊,計(jì)算機(jī)和網(wǎng)絡(luò)可能出現(xiàn)不可預(yù)料的行為。拜占庭容錯(cuò)協(xié)議必須處理這些失效,并且這些協(xié)議還要滿足所要解決的問題要求的規(guī)范。
首先,不要把比特幣當(dāng)成一種貨幣,而是一個(gè)總賬。它是個(gè)電子賬本,網(wǎng)絡(luò)上的每一個(gè)參與者的電腦都會(huì)有一份賬本的備份,并且所有的備份都是在實(shí)時(shí)的持續(xù)的更新、對(duì)賬、以及同步著。每一個(gè)參與者都能在這本賬本里記上一筆,這一筆記錄著一定數(shù)量的幣從一個(gè)參與者那里被發(fā)送到另一個(gè)參與者那里,并且每一條這樣的記錄都接著就實(shí)時(shí)的廣播到網(wǎng)絡(luò)了,所以在每一臺(tái)電腦上的每一分份拷貝都是幾乎同時(shí)更新的,并且所有的賬本拷貝都保持著同步。這本公開的分布式的賬本就可以稱為“區(qū)塊鏈(blockchain)”,并且它使用了BT技術(shù)以保證所有的拷貝都是同步的。
可以把比特幣當(dāng)作一個(gè)對(duì)于在分布式系統(tǒng)領(lǐng)域的一個(gè)復(fù)雜的算法難題的通用解決方法。
這一問題的趣味非正式表述如下:想象一下,在拜占庭時(shí)代有一個(gè)墻高壁厚的城邦,拜占庭,高墻之內(nèi)是它的鄰居想象不到之多的財(cái)富。它被其他10個(gè)城邦所環(huán)繞,這10個(gè)城邦也很富饒,但和拜占庭相比就微不足道了。它的十個(gè)鄰居都覬覦拜占庭的財(cái)富,并希望侵略并占領(lǐng)它。
但是,拜占庭的防御是如此的強(qiáng)大,沒有一個(gè)相鄰的城邦能夠成功入侵。任何單個(gè)城邦的入侵行動(dòng)都會(huì)失敗,而入侵者的軍隊(duì)也會(huì)被殲滅,使得其自身容易遭到其他九個(gè)城邦的入侵和劫掠。這十個(gè)城邦之間也互相覬覦對(duì)方的財(cái)富并持續(xù)互相對(duì)抗著。而且,拜占庭的防御如此之強(qiáng),十個(gè)鄰居的一半以上同時(shí)進(jìn)攻才能攻破它。
也就是說,如果六個(gè)或者更多的相鄰敵軍一起進(jìn)攻,他們就會(huì)成功并獲得拜占庭的財(cái)富。然而,如果其中有一個(gè)或者更多背叛了其他人,答應(yīng)一起入侵但在其他人進(jìn)攻的時(shí)候又不干了,也就導(dǎo)致只有五支或者更少的軍隊(duì)在同時(shí)進(jìn)攻,那么所有的進(jìn)攻軍隊(duì)都會(huì)被殲滅,并隨后被其他的(包括背叛他們的那(幾)個(gè))鄰居所劫掠。這是一個(gè)由不互相信任的各方構(gòu)成的網(wǎng)絡(luò),但他們又必須一起努力以完成共同的使命。
而且,是個(gè)鄰居之間通訊和協(xié)調(diào)統(tǒng)計(jì)時(shí)間的唯一途徑是通過騎馬在他們之間傳遞信息。他們不能聚在一個(gè)地方開個(gè)會(huì)(所有的王都不互相信任他們的安全在自己的城堡或者軍隊(duì)范圍之外能夠得到保障)。然而,他們可以在任意時(shí)間以任意頻率派出任意數(shù)量的信使到任意的對(duì)方。每條信息都包含類似如下的內(nèi)容:“我將在第四天的6點(diǎn)鐘進(jìn)攻,你愿意加入嗎?”。
如果收信人同意了,他們就會(huì)在原信上附上一份簽名了的/認(rèn)證了的/蓋了圖章的/驗(yàn)證了的回應(yīng),然后把新合并了的信息的拷貝再次發(fā)送給九個(gè)鄰居,要求他們也如此這樣做。最后的目標(biāo)是,通過在原始信息鏈上蓋上他們所有十個(gè)人的圖章,讓他們?cè)跁r(shí)間上達(dá)成共識(shí)。最后的結(jié)果是,會(huì)有一個(gè)蓋有十個(gè)同意同一時(shí)間的圖章信息鏈,可能還會(huì)有一些被拋棄了的包含部分但不是全部圖章的信息鏈。
但是,問題在于如果每個(gè)城邦向其他九個(gè)城邦派出一名信使,那么就是十個(gè)城邦每個(gè)派出了九名信使,也就是在任何一個(gè)時(shí)間又總計(jì)90次的傳輸,并且每個(gè)城市分別收到九個(gè)信息,可能每一封都寫著不同的進(jìn)攻時(shí)間。除此以外,部分城邦會(huì)答應(yīng)超過一個(gè)的攻擊時(shí)間,故意背叛發(fā)起人,所以他們將重新廣播超過一條的信息鏈。這個(gè)系統(tǒng)迅速變質(zhì)成不可信的信息和攻擊時(shí)間相互矛盾的糾結(jié)體。
比特幣通過對(duì)這個(gè)系統(tǒng)做出一個(gè)簡(jiǎn)單的(事后看是簡(jiǎn)單的)修改解決了這個(gè)問題,它為發(fā)送信息加入了成本,這降低了信息傳遞的速率,并加入了一個(gè)隨機(jī)元素以保證在一個(gè)時(shí)間只有一個(gè)城邦可以進(jìn)行廣播。它加入的成本是“工作量證明”,并且它是基于計(jì)算一個(gè)隨機(jī)哈希算法的。哈希是一種算法,它唯一做的事情就是獲得一些輸入然后進(jìn)行計(jì)算,并得到遺傳64位的隨機(jī)數(shù)字和字母的字符串,就像這個(gè):
d70298566aa2f1a66d892dc31fedce6147b5bf509e28d29627078d9a01a8f86b
在比特幣的世界中,輸入數(shù)據(jù)包括了到當(dāng)前時(shí)間點(diǎn)的整個(gè)總賬(區(qū)塊鏈)。并且盡管單個(gè)哈希值用現(xiàn)在的計(jì)算機(jī)可以幾乎即時(shí)的計(jì)算出來,但只有一個(gè)前13個(gè)字符是0的哈希值結(jié)果可以被比特幣系統(tǒng)接受成為“工作量證明”。這樣一個(gè)13個(gè)0的哈希值是極其不可能與罕見的,并且在當(dāng)前需要花費(fèi)整個(gè)比特幣網(wǎng)絡(luò)大約10分鐘的時(shí)間來找到一個(gè)。在一臺(tái)網(wǎng)絡(luò)中的機(jī)器隨機(jī)的找到一個(gè)有效哈希值之前,上十億個(gè)的無效值會(huì)被計(jì)算出來,這就是減慢信息傳遞速率并使得整個(gè)系統(tǒng)可用的“工作量證明”。下面是一個(gè)例子:
f51d0199c4a6d9f6da230b579d850698dff6f695b47d868cc1165c0ce74df5e1
d70298566aa2f1a66d892dc31fedce6147b5bf509e28d29627078d9a01a8f86b
119c506ceaa18a973a5dbcfbf23253bc970114edd1063bd1288fbba468dcb7f8
在找到一個(gè)有效值之前,成百萬上億個(gè)更多的類似上面這樣的字符串被計(jì)算出來。
000000000000084b6550604bf21ad8a955b945a0f78c3408c5002af3cdcc14f5
那臺(tái)發(fā)現(xiàn)下一個(gè)有效哈希值的機(jī)器(或者說在我們類比中的城邦),把所有的之前的信息放到一起,附上它自己的,以及它的簽名/印章/諸如此類,并向網(wǎng)絡(luò)中的其他機(jī)器廣播出去。只要其他網(wǎng)絡(luò)中的機(jī)器接收到并驗(yàn)證通過了這個(gè)13個(gè)0的哈希值和附著在上面的信息,他們就會(huì)停止他們當(dāng)下的計(jì)算,使用新的信息更新他們的總賬拷貝,然后把新更新的總賬/區(qū)塊鏈作為哈希算法的輸入,再次開始計(jì)算哈希值。哈希計(jì)算競(jìng)賽從一個(gè)新的開始點(diǎn)重新開始。如此這般,網(wǎng)絡(luò)持續(xù)同步著,所有網(wǎng)絡(luò)上的電腦都使用著同一版本的總賬。
與此同時(shí),每一次成功找到有效哈希值以及區(qū)塊鏈更新的間隔大概是10分鐘(這是故意的,算法難度每?jī)芍苷{(diào)整一次以保證網(wǎng)絡(luò)一直需要花費(fèi)10分鐘來找到一個(gè)有效的哈希值)。在那10分鐘以內(nèi),網(wǎng)絡(luò)上的參與者發(fā)送信息并完成交易,并且因?yàn)榫W(wǎng)絡(luò)上的每一條機(jī)器都是使用同一個(gè)總賬,所有的這些交易和信息都會(huì)進(jìn)入遍布全網(wǎng)的每一份總賬拷貝。當(dāng)區(qū)塊鏈更新并在全網(wǎng)同步之后,所有的在之前的10分鐘內(nèi)進(jìn)入?yún)^(qū)塊鏈的交易也被更新并同步了。因此分散的交易記錄是在所有的參與者之間進(jìn)行對(duì)賬和同步的。
最后,在個(gè)人向網(wǎng)絡(luò)輸入一筆交易的時(shí)候,他們使用內(nèi)嵌在比特幣客戶端的標(biāo)準(zhǔn)公鑰加密工具來同時(shí)他們的私鑰以及接收者的公鑰來為這筆交易簽名。這對(duì)應(yīng)于拜占庭將軍問題中他們用來簽名和驗(yàn)證消息時(shí)使用的“印章”。因此,哈希計(jì)算速率的限制,加上公鑰加密,使得一個(gè)不可信網(wǎng)絡(luò)變成了一個(gè)可信的網(wǎng)絡(luò),使得所有參與者可以在某些事情上達(dá)成一致(比如說攻擊時(shí)間、或者一系列的交易、域名記錄、政治投票系統(tǒng)、或者任何其他的需要分布式協(xié)議的地方)。
這里是比特幣為何如此特別的關(guān)鍵:它代表了一個(gè)對(duì)于一個(gè)困難的算法上的難題的解決方案,這一解決方案在一系列的歷史事件發(fā)生之前是不可能的,這些事件有:
· 互聯(lián)網(wǎng)的創(chuàng)造
· 公鑰加密算法的發(fā)明
· 點(diǎn)對(duì)點(diǎn)Bitorrent(BT)協(xié)議的發(fā)明。BT協(xié)議最開始是開發(fā)來用于在網(wǎng)絡(luò)上的相對(duì)小的用戶子集之間共享許多文件的,但比特幣用它來在所有用戶之間共享單個(gè)文件。
· 人們意識(shí)到,在系統(tǒng)中添加一個(gè)簡(jiǎn)單的時(shí)間延遲,同時(shí)使用公鑰加密算法以驗(yàn)證每筆交易,可以解決這個(gè)問題。
如果說一些最棒的想法在事后看來是很簡(jiǎn)單的,那么上述的第四點(diǎn)就完全符合條件,盡管整個(gè)項(xiàng)目是站在了巨人的肩膀上的。
最后,這一對(duì)于拜占庭將軍問題的解決方案,可以推廣到任何核心問題是在分布式網(wǎng)絡(luò)上缺乏信任的領(lǐng)域。如我們已經(jīng)提到樂的,人們正在為互聯(lián)網(wǎng)建設(shè)一個(gè)分布式的域名系統(tǒng),以及為政治選舉建設(shè)分布式的投票系統(tǒng)(還沒有網(wǎng)站)。如果人們認(rèn)為單純的文件分享攪亂了這個(gè)世界,那么比特幣解決方案和協(xié)議才剛剛打開洪水的閘門。
評(píng)論
查看更多