今日獻丑,給大家講一下拜占庭將軍問題——保證通俗易懂。背景介紹拜占庭將軍問題是一位名叫萊斯利·蘭伯特(Leslie Lamport)的高手(曾獲得圖靈獎)
今日獻丑,給大家講一下拜占庭將軍問題——保證通俗易懂。
背景介紹
拜占庭將軍問題是一位名叫萊斯利·蘭伯特(Leslie Lamport)的高手(曾獲得圖靈獎)在1982年提出的,關于點對點信息傳輸、系統(tǒng)容錯等問題。這個拜占庭將軍問題一提出來,大家覺得“嗯,以故事來講技術理論”很有意思。
幾乎每本關于比特幣的書都會講這個問題,只是這個問題翻譯到中國之后呢,講得有點詭異難懂。每個研究比特幣的人,都會看到拜占庭將軍問題??纯春孟穸?,又好像沒懂。那么,到底懂沒懂呢?答案是,沒懂。
拜占庭將軍問題本身我認為是一個好的引子,但并不算是一個好的故事,咱中國人不熟悉呀。一雙臭腳萬人捧,時間長了,似懂非懂也就這樣了。咱沒有人家萊斯利的水平,這個故事講給有計算機密碼學功底的人聽,是個好類比,對我們未必是。
軍師聯(lián)盟
今天我們從新解構(gòu)這個問題,用大家熟知的三國故事更加細致地講解所謂的拜占庭將軍問題。
把時間軸拉回到三國時代,咱們設定一個前提,當時的時代背景下,只要一個書信文件是你寫下來的信息,有你的簽名和的蓋章就要認賬,信譽很重要。再設定一個背景,當時的老大是曹操,他軟禁了正牌兒的皇帝漢獻帝。曹操的都城周邊有十個將軍或者軍師,有諸葛亮、荀彧、郭嘉、孫策、徐庶等等軍師聯(lián)盟。這十個人呢,分居各地(如同分布式的節(jié)點),半數(shù)以上的人聯(lián)合的話就可以打敗曹操,商量著要不要打曹操。
當時傳輸信息主要用的是信鴿飛來飛去,十個軍師之間飛鴿傳書,就是模擬點對點的信息傳輸。
這里面有兩個問題:
第一,如果出現(xiàn)了奸細,其實,都不用出現(xiàn)奸細,諸葛亮的信鴿飛到了郭嘉那里,郭嘉一看要打主公呀,我給你改成不打,再發(fā)出去。行不行?如何保證每一個節(jié)點不會篡改另一個節(jié)點發(fā)出的信息(所謂的惡意節(jié)點冒充正常節(jié)點)?
第二,怎么樣保證每一個節(jié)點(軍師或?qū)④?信息的記錄是一致的?
第一個問題怎么解決呢?用非對稱加密技術。
比如,諸葛亮說要打曹操,對發(fā)出的信件蓋章簽名,這個過程是用自己的私鑰進行加密;加完密之后,信鴿飛呀飛到郭嘉那里,郭嘉一看,要打主公呀,想改成不打曹操,但是看得見改不了呀。
第二個問題呢,怎么保證每個節(jié)點(軍師或者將軍)記錄的信息是一樣的呢?
現(xiàn)在的問題已經(jīng)不是打不打曹操的問題,關鍵是大家記錄的軍令信息是一樣的。
比如,
諸葛亮的信息:下個月三號早上八點從岐山發(fā)兵進攻曹操;
郭嘉:我不打曹操;
荀彧:曹丞相還不錯,先不要打;
魯肅:我走水路去打曹操;
司馬懿:我過三十年再打,兄弟們先上……
打不打都可以,但是大家記錄的這些信息需要一致。
每個軍師都有資格記錄軍令信息,那誰記錄的為準呢?設置一個數(shù)學題,然后誰先算出來這個數(shù)學題呢誰就來記錄信息。交給一個人來記錄然后發(fā)布給大家。誰智商高,誰算力大,誰先算出數(shù)學題的概率就比較大。讓他來記這個信息,然后張貼告示英雄榜,讓大家都知道,誰打誰不打這些信息(類比比特幣的交易信息)。然后大家一看數(shù)學題都算出來了,這次的算數(shù)題就算了,開始爭取下張英雄榜算下一個題。
激勵機制
各位想想,我去發(fā)英雄榜(記賬、廣播)這是個勞動呀,為什么還要我累死累活得去算數(shù)學題?這時候加入一個激勵機制。以比特幣原理為例,算出一個數(shù)學題挖出一個區(qū)塊,獎勵50個BTC(四年獎勵減半的事兒今天不講,簡化模型)。三國時代,一位軍師每次先算出來數(shù)學題,記錄好信息并貼出告示發(fā)出英雄榜,就送你50錠金子或者50個美女或者50座城池——這其實類似比特幣發(fā)明人中本聰設計的激勵機制。
這個時候呢,大家就有積極性了,都去搶著算這個數(shù)學題,算出來后就記好信息,張貼英雄榜。這就是PoW工作量證明機制,用PoW工作量證明機制保證記錄的信息是一致的。
完美地解決了拜占庭將軍問題。
招三千門客挖礦
故事進行到這里,打不打曹操就更不重要了。這十個軍師呢,每個人都想就想去算數(shù)學題,然后記錄好信息,張貼這個告示發(fā)英雄榜(發(fā)布到全網(wǎng)),可以得到獎勵,50錠金子或50座城池(50個比特幣)的誘惑力太大了。
這個時候,有人就雞賊了,比如諸葛亮,一個人不好算嘛。我的腦子變聰明了,我的智商升高了,比如從CUP到GPU到ASIC芯片級別了。但是,發(fā)現(xiàn)郭嘉、荀彧的智商也升高了,從100變成200了。好吧,我有錢,我招門客,你招300門客,我招3000門客,3000個門客3000個人給我一起算這個數(shù)學題!智商基數(shù)更高,算力更高,我先算出來的概率就大了。我先算出來題了,一公布出來,別的軍師(節(jié)點、礦工)就不用再算這個題了,去算下一個題。
這3000門客就相當于3000臺礦機,這就是比特幣的挖礦原理。
當然,大家還可以繼續(xù)開腦洞,諸葛亮養(yǎng)門客的食宿費用就像礦機的電費、維護費用;3000門客在一起就組成了礦場;還有礦池、接入算力平臺等等。朋友們可以自行腦補,在此不再贅述。
總結(jié):比特幣解決了拜占庭將軍問題。第一個解決的問題是保證我(一個誠實節(jié)點)發(fā)出的信息不會被人(另一個節(jié)點)修改,方法是非對稱的加密技術;第二個解決的問題保證是每個人發(fā)出的信息被人記錄下來的數(shù)據(jù)是一致的。方法是PoW工作量證明機制。