寫給小白的「區(qū)塊鏈」故事

英文:Mohit Mamoria
翻譯:賽博朔方
區(qū)塊鏈?zhǔn)潜忍貛诺牡讓蛹夹g(shù)和基礎(chǔ)架構(gòu),本質(zhì)上是一個去中心化的數(shù)據(jù)庫。區(qū)塊鏈?zhǔn)且淮褂妹艽a學(xué)方法相關(guān)聯(lián)產(chǎn)生的數(shù)據(jù)塊,每一個數(shù)據(jù)塊中包含了一次比特幣網(wǎng)絡(luò)交易的信息,用于驗證其信息的有效性(防偽)并生成下一個區(qū)塊。
狹義來講,區(qū)塊鏈?zhǔn)且环N按照時間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成的一 種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu), 并以密碼學(xué)方式保證的不可篡改和不可偽造的分布式賬本。
以上定義摘自百度百科。大家看完這段解釋依然滿臉懵逼,到底什么是“區(qū)塊鏈”呢?相信看完下面的故事你就能搞懂啦!
故事的開端
Joe 是你最好的朋友。他出國旅游后的第五天給你打了個電話:“兄弟,我需要點錢,出國之后把身上的錢都花完了。”
你回復(fù):“我馬上打過來”,然后掛了電話。

接著你又打電話給你的銀行客戶經(jīng)理:“麻煩你馬上從我的賬戶轉(zhuǎn) 1000 美元給 Joe。”
客戶經(jīng)理:“好的,明白。”
客戶經(jīng)理隨后確認(rèn)了你的賬戶是否有足夠的余額。因為你是百萬富翁,所以客戶經(jīng)理進(jìn)行了如下的操作:

交易賬單
你打電話給 Joe 說你已經(jīng)把 1000 美元轉(zhuǎn)過去了。

回頭我們再來看看剛剛到底發(fā)生了什么。你和 Joe 都信任那家銀行來管理你們各自的財產(chǎn)。整個過程中實際并沒有真實貨幣的物理流動。整個過程只涉及錄入系統(tǒng)的兩個賬戶即可。更準(zhǔn)確地說,全程只需主動權(quán)屬于該銀行的兩個賬戶就可以完成。
在這樣傳統(tǒng)的貨幣體系中,我的問題就來了。
交易雙方的信任機(jī)制建立需要借助第三方。這種“中間人”的方式由來已久。那么你可能又要問了:“這種信任機(jī)制有什么問題嗎?”問題在于除交易雙方以外的“監(jiān)督者”只是單個個體。這種情況可能存在以下風(fēng)險:
如果有人有意或無意地摧毀了某個人或某個第三方組織機(jī)構(gòu)就可能足以引起社會混亂。
如果記錄了某個交易的注冊表遭遇火災(zāi)怎么辦?
萬一你的客戶經(jīng)理不小心劃了 1500 美元到你朋友的賬戶怎么辦?
如果他是故意這么做的呢?
世界上有沒有無需借助銀行就能幫助我們完成安全轉(zhuǎn)賬的系統(tǒng)?
要想解決這個問題,我們首先應(yīng)該靜下心來好好思考,問自己一個更深層次的問題:我們能不能自己掌握賬戶和歷史交易的信息呢?
這的確是一個值得探討的問題。答案當(dāng)然你一定也已經(jīng)猜到了——那就是“區(qū)塊鏈”。現(xiàn)在我們就開始學(xué)習(xí)這個分布式賬本是如何運(yùn)作的。
故事的發(fā)展
該方法得以實行的必要條件是必須有足夠多的人愿意在交易時不依賴于第三方。只有這樣,這一部分的人才能夠自己掌控賬本資料。
那么人數(shù)要達(dá)到多少才足夠呢?在下面的例子中,我們假設(shè)有 10 個人愿意放棄銀行或其它任何第三方機(jī)構(gòu)。在雙方達(dá)成協(xié)議的前提下,他們互相之間能夠在不知道對方身份的情況下時刻掌握對方賬戶的一切信息和動態(tài)。

1. 一個空文件夾
一開始每個人都會獲得一個空文件夾。隨著時間推進(jìn),這十個人都會在他們現(xiàn)在空的文件夾里不斷添加記錄交易信息的紙張。
2. 交易發(fā)生時
接下來,這個交易網(wǎng)絡(luò)中的每個人都帶著紙和筆坐下來,準(zhǔn)備記錄下在這個系統(tǒng)中發(fā)生的每一筆交易。
假設(shè),2 號想給 9 號 10 美元。
為了完成這筆交易,2 號大聲地告訴每個人:“我要轉(zhuǎn) 10 美元給 9 號。請大家都在自己的紙上記下來。”

然后每個人都檢查確認(rèn) 2 號是不是有 10 美元及以上的余額能夠轉(zhuǎn)給 9。如 2 號余額足夠,那么大家都在空白紙上記錄下這筆交易。

紙上的第一筆交易
這筆交易這樣就算完成了。
3. 持續(xù)發(fā)生的交易
隨著時間的流逝,這個交易網(wǎng)絡(luò)中出現(xiàn)交易需求的人越來越多。無論何時他們產(chǎn)生交易需求,都會通知網(wǎng)絡(luò)中的每個人。只要有人聽到了這個通知,他/她就會在他們各自的紙上記錄下來。
這個過程會持續(xù)進(jìn)行,直到這張紙上的空間不足。假設(shè)每張紙只能記錄 10 次交易,那么只要第 10 次交易完成,每個人紙上的空間也就隨之耗盡。

當(dāng)白紙被填滿
這時候我們就需要把這張紙放進(jìn)文件夾并拿出另一張新的白紙,重復(fù)上面步驟 2 的過程。
4. 把紙張放進(jìn)文件夾的注意點
在把紙張放進(jìn)文件夾之前,我們需要對這張紙用網(wǎng)絡(luò)中每個人都認(rèn)可的專有密鑰進(jìn)行密封。但是密封后我們要確保的是,這張紙就只能塵封在文件夾里,無論是誰無論何時都不能對其作任何修改。并且如果每個人都相信這個“封印”,那么也就意味著每個人都絕對信任這張紙上的內(nèi)容。這種密封方式也是區(qū)塊鏈的關(guān)鍵所在。
以前第三方或中間人都會說服我們相信無論他們在注冊表中記錄了什么,里面的內(nèi)容都不會發(fā)生改變。但在現(xiàn)在這個分布式的、去中心化的系統(tǒng)中,這個印章(密鑰)就為我們建立了這種信任機(jī)制。
故事的高潮 (一)
新的問題又來了。我們應(yīng)該如何密封這張紙?
在學(xué)習(xí)如何密封之前,我們先來了解印章的工作原理。
假設(shè)我們現(xiàn)在有一個機(jī)器,如果你把一個里面裝著東西的盒子從左邊放進(jìn)去,這個魔法機(jī)器會從右邊吐出一個裝著其它東西的盒子。
【術(shù)語解析】這個機(jī)器實際叫作“哈希函數(shù)”,但是今天我們不討論技術(shù)。所以我們暫且稱它為“魔法機(jī)器”。

魔法機(jī)器(即哈希函數(shù))
如果我們把裝有數(shù)字 4 的盒子從左邊放進(jìn)去,它會從右邊給出下列字符:dcbea。

如果已知條件是輸出結(jié)果為 “dcbea”,要想知道從左邊輸入的是什么非常困難。但是每次如果你把4放進(jìn)去,最終的輸出結(jié)果 “dcbea” 是肯定的。
我們來試試發(fā)送其它數(shù)字。如果放入 26 會得到什么呢?

哈希(26)=94c8e
這次我們得到的是 “94c8e”。從 26 的輸出結(jié)果來看,結(jié)果也可以包含數(shù)字。
了解到這兒,我們可以開始思考下一個更加深入的問題了:
“如果我想從右邊得到一個以 3 個零為開頭的結(jié)果(如 000ab、00098、000fa 等),那么我應(yīng)該從機(jī)器的左邊放入什么內(nèi)容?”

預(yù)測輸入的內(nèi)容
這個機(jī)器有一個單向性的屬性:給出右邊的預(yù)期結(jié)果后,我們無法計算出左邊放入的內(nèi)容。那是不是意味著這個問題無解?倒也未必。
我能想到一種方法——把每個數(shù)字都輸入一遍,直到機(jī)器輸出以 3 個零為開頭的結(jié)果。

把每個數(shù)字都嘗試一遍
有耐心的人試上幾千次可能也就找到了這個符合我們輸出要求的數(shù)字。

通過輸出結(jié)果來獲得輸入數(shù)字這種逆向計算的確非常困難。但是如果我們得到了預(yù)測的輸入內(nèi)容,驗證該輸入是否能得出我們想要的結(jié)果就非常非常容易了。記住,這個機(jī)器最大的特點就是每個結(jié)果只對應(yīng)一個數(shù)字,絕無例外的“一夫一妻制”。
如果我給你 72533 這個數(shù)字,然后問你:“這個數(shù)字輸入魔法機(jī)器后會不會輸出以 3 個零為開頭的結(jié)果?”這個問題就簡單到簡直在侮辱我們的智商了。
因此這個機(jī)器最最最重要的屬性是——知道結(jié)果,要想算出輸出非常困難,但是如果我們知道輸入的數(shù)字和輸出結(jié)果,驗證兩者是否匹配很簡單。
如何利用這個機(jī)器密封紙張?
怎樣利用魔法機(jī)器生成每張紙獨有的封印?還是老辦法,采用情境模擬的方法展開解釋。
假設(shè)我給了你兩個盒子。第一個盒子里面有數(shù)字 20893,你能不能想出一個數(shù)字,這個數(shù)字與第一個盒子里的數(shù)字相加后的結(jié)果放入魔法機(jī)器后,我們能夠得到一個以 3 個零為開頭的字符結(jié)果。

這個情景和之前的難題幾乎相同。唯一的辦法就是把每個數(shù)字都放入機(jī)器嘗試一遍。
經(jīng)過幾千次的嘗試,我們會在 21191 這個數(shù)字這里停下 21191+20893=42084 把 42084 放入這個機(jī)器后所得到的結(jié)果正是我們想要的。

在這個案例中,21191 這個數(shù)字就是 20893 這個數(shù)字的“封印”。假設(shè)有張紙上寫著 20893 這個數(shù)字。為了密封這張紙(即沒有人能夠再對其內(nèi)容作改動),我們把帶有 21191 標(biāo)簽的徽章貼在紙上,密封完成。

被密封的數(shù)字
【術(shù)語解析】用來密封的數(shù)字實際被稱為“工作證明(Proof Of Work)”,因為這個數(shù)字是通過努力計算得來的。本文為了簡單易懂,我們稱它為“密封數(shù)字”。
無論誰想驗證這個頁面是否被改動過,只要把頁面上的內(nèi)容與密封號碼疊加后放入魔法機(jī)器。如果機(jī)器輸出的內(nèi)容是以 3 個零為開頭的,那么該頁面內(nèi)容是沒有被“污染”過的。但如果結(jié)果不滿足這個特點,我們就應(yīng)果斷丟棄這個頁面,因為上面的內(nèi)容已經(jīng)被改動、已經(jīng)失效。
密封過程總結(jié)
要想密封記錄整個交易網(wǎng)絡(luò)中交易流水的頁面,我們需要找到那個加入交易內(nèi)容并輸入機(jī)器后會得到以 3 個零為開頭的字符的關(guān)鍵數(shù)字。

注意:“以 3 個零為開頭的字符”只是一個舉例,簡單地反應(yīng)哈希函數(shù)的工作原理。實際問題處理起來會復(fù)雜得多。
只要花費一定的時間,交易網(wǎng)絡(luò)中的參與者就能夠計算出這個數(shù)字,該頁面也就隨之密封。一旦有人更改了頁面上的內(nèi)容,任何人都能夠通過這個密封號碼來驗證這個頁面的完整性。
故事的高潮(二)
了解如何密封頁面后,我們再把思緒拉回 10 個人用完了一張紙上所有空間的時候。
當(dāng)這個頁面上記不下更多的交易記錄時,交易網(wǎng)絡(luò)中的每個人都會停下來計算該頁面的密封數(shù)字,然后將其放入文件夾。如果第一個人算好了密封數(shù)字,他就會向所有人公布。

聽到密封號碼后,大家都去驗證這個數(shù)字是否能滿足輸出需求。如是,則在他們的頁面上貼上這個標(biāo)簽,再把這個頁面放進(jìn)文件夾。
但是如果7號算出了密封號碼并“昭告了天下”,但結(jié)果大家發(fā)現(xiàn)這個數(shù)字并不滿足他們的輸出需求怎么辦?這樣的情況也很常見。原因可能有以下幾點:
1. 公布交易信息時聽錯了;
2. 記錄交易信息時出現(xiàn)筆誤;
3. 為了一己之利,記錄交易時故意犯錯。
不管出于什么原因,7 號只有一種選擇——丟棄自己這張紙,然后從別人那里復(fù)制一份副本放進(jìn)他自己的文件夾。如果不把這個頁面放進(jìn)文件夾,他就不能繼續(xù)記錄接下來的交易記錄,這也就相當(dāng)于把他從這個交易網(wǎng)絡(luò)中踢掉了。
說到這里,我相信有的人腦海里又出現(xiàn)了一個疑惑:既然有人計算好密封號碼后會公布,為什么我們每個人還要花費那么多時間都去計算一遍?其他人為什么不歇著、坐等公布?
Good question! 區(qū)塊鏈包含特殊的獎勵機(jī)制,網(wǎng)絡(luò)中每個人都有資格獲得獎勵。第一個計算出密封號碼的人能夠獲得一定獎勵。
我們再來簡單地假設(shè)一下,如果 5 號第一個算出了頁面的密封號碼,并獲得了 1 美元的金額獎勵,那么這 1 美元就是憑空出現(xiàn)的。換句話說,假如他賬戶里本來余額 5 美元,現(xiàn)在增加了 1 元,但是這 1 元沒有從其它任何人的賬戶里扣除,即沒有減少任何人的賬戶余額。
這就是比特幣的起源。它是在區(qū)塊鏈(分布式賬目)上發(fā)生交易的第一種貨幣。如果在這個交易網(wǎng)絡(luò)上持續(xù)努力,你同樣也能獲得回報,這個過程就是我們所說的“挖礦”。
擁有比特幣的人越來越多,這些人一刻不閑著地開始炒這種虛擬貨幣,不斷擴(kuò)大市場對比特幣的需求,再進(jìn)一步提高比特幣的價值。就這樣周而復(fù)始地把比特幣的價格炒得很高。
這種獎勵機(jī)制讓交易網(wǎng)絡(luò)中的每個人都勤勤懇懇地勞作。
他們把紙張放進(jìn)文件夾后,拿出一張新的空白紙張,然后再次重復(fù)前面的過程——循環(huán)往復(fù)、永無止境。
假設(shè)文件夾中已經(jīng)有 5 個被密封的頁面。如果我為了謀取私利修改了第二個頁面的其中一筆交易會發(fā)生什么?前面已經(jīng)提到過,所有人都可以通過密封號碼查出交易內(nèi)容已經(jīng)發(fā)生改變。但是如果我根據(jù)修改的內(nèi)容重新計算密封號碼,然后把新號碼貼在紙上,出現(xiàn)這樣的情況怎么辦?
為了防止有人同時修改頁面和密封號碼,計算密封號碼時有一個小技巧。
如何防止密封號碼被重新計算、更改?
還記得之前我假設(shè)你有兩個盒子,一個包含 20893 這個數(shù)字,一個是用于計算的空盒子嗎?在區(qū)塊鏈中計算密封號碼,實際上存在三個盒子,而不是兩個,其中兩個是有內(nèi)容的,一個是待計算填充的。
當(dāng)三個盒子的內(nèi)容都填好放入機(jī)器后,機(jī)器右邊輸出的結(jié)果能夠滿足我們的需求。
一個盒子里是交易記錄、一個盒子是密封號碼,第三個盒子是通過哈希函數(shù)計算出來的前一頁的輸出結(jié)果。

通過這個小技巧,我們能夠確保每一頁的密封號碼都與前一頁的內(nèi)容相關(guān)聯(lián)。因此如果有人修改了歷史頁面的內(nèi)容,他需要改動接下來每一頁的密封號碼,從而保證整個鏈路的一致性。
我們假設(shè)十個人中有一個人想要惡意修改區(qū)塊鏈中的內(nèi)容(包含記錄了交易歷史頁面的文件夾),那么他需要調(diào)整很多頁面,計算改動頁面之后所有頁面的密封號碼。我們都知道計算密封號碼的工作非常困難。因此,整個交易網(wǎng)絡(luò)中的一個叛徒最終還是會輸個剩下的 9 個好人。
從這個叛徒想要更改內(nèi)容的頁面開始,他就需要在整個網(wǎng)絡(luò)中創(chuàng)建另一個區(qū)塊鏈,但是這個區(qū)塊鏈幾乎不可能趕上好人們創(chuàng)建的鏈路——一個人的力量趕不上剩下 9 個人的共同努力。因此,有一點非常明確,區(qū)塊鏈規(guī)模越大,安全性和可信度越高。

但是如果 10 個人中有 6 個人都叛變了怎么辦?
如果出現(xiàn)這樣的情況,這個協(xié)議就有點打臉了。這種情況被稱為 “51%攻擊”。如果整個網(wǎng)絡(luò)中的大多數(shù)人都決定叛變,欺騙剩下不到半數(shù)的人,那么整個協(xié)議就自然而然地走向了滅亡。
這是區(qū)塊鏈最大的弱點。盡管這樣的情況不可能出現(xiàn),但我們還是要謹(jǐn)記這個系統(tǒng)的弱點。整個體系都是基于一個假設(shè):整個交易網(wǎng)絡(luò)中的大多數(shù)人都不會叛變。
結(jié)局
解釋到這里也就差不多了。還請親愛的們再回頭看看百度百科給出的定義,現(xiàn)在是不是理解起來容易很多了?
如果還有人問起到底什么是區(qū)塊鏈,比特幣的運(yùn)作機(jī)制是怎樣的,我相信本文的讀者都能夠解釋給更多的小白們聽啦。
??「點擊關(guān)注」更多驚喜等待你的發(fā)現(xiàn)??
