一個故事看懂“區塊鏈”
區塊鏈是比特幣的底層技術和基礎架構,本質上是一個去中心化的數據庫。區塊鏈是一串使用密碼學方法相關聯產生的數據塊,每一個數據塊中包含了一次比特幣網絡交易的信息,用于驗證其信息的有效性(防偽)并生成下一個區塊。
狹義來講,區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,并以密碼學方式保證的不可篡改和不可偽造的分布式賬本。
以上定義摘自百度百科。很多菜鳥朋友看完這段解釋依然滿臉懵逼,到底什么是“區塊鏈”?
起因
除非你完全沒有接觸過信息安全,否則一定聽說過比特幣和區塊鏈。畢竟這兩個名詞也是近兩年來各大國內外媒體爭相報道的熱詞。尤其是繼今年5月爆發的WannaCry病毒爆發以后,很多從未接觸過的人都開始加入討論大軍。
我的很多朋友都不懂技術。最近幾周他們一個個都變身好奇寶寶,圍著我問比特幣和區塊鏈。我想這兩個名詞的熱度一定還會持續攀高,對他們不夠了解的人也還有很多很多。何不采用通俗的語言對“區塊鏈”做一個解釋,把這個概念傳播開來?
和網上一般的名詞解釋不同(不管三七二十一,下個定義再說,其實并沒有什么卵用),我們以它的作用為切入點來理解區塊鏈的工作機制。
故事的開端
Joe是你最好的朋友。他出國旅游后的第五天給你打了個電話:“兄弟,我需要點錢,出國之后把身上的錢都花完了。”
你回復:“我馬上打過來”,然后掛了電話。
接著你又打電話給你的銀行客戶經理:“麻煩你馬上從我的賬戶轉1000美元給Joe。”
客戶經理:“好的,明白。”
客戶經理隨后確認了你的賬戶是否有足夠的余額。因為你是百萬富翁,所以客戶經理進行了如下的操作:
交易賬單
你打電話給Joe說你已經把1000美元轉過去了。
回頭我們再來看看剛剛到底發生了什么。你和Joe都信任那家銀行來管理你們各自的財產。整個過程中實際并沒有真實貨幣的物理流動。整個過程只涉及錄入系統的兩個賬戶即可。更準確地說,全程只需主動權屬于該銀行的兩個賬戶就可以完成。
在這樣傳統的貨幣體系中,我的問題就來了。
交易雙方的信任機制建立需要借助第三方。這種“中間人”的方式由來已久。那么你可能又要問了:“這種信任機制有什么問題嗎?”問題在于除交易雙方以外的“監督者”只是單個個體。這種情況可能存在以下風險:
1. 如果有人有意或無意地摧毀了某個人或某個第三方組織機構就可能足以引起社會混亂。
2. 如果記錄了某個交易的注冊表遭遇火災怎么辦?
3. 萬一你的客戶經理不小心劃了1500美元到你朋友的賬戶怎么辦?
4. 如果他是故意這么做的呢?
世界上有沒有無需借助銀行就能幫助我們完成安全轉賬的系統?
要想解決這個問題,我們首先應該靜下心來好好思考,問自己一個更深層次的問題:我們能不能自己掌握賬戶和歷史交易的信息呢?
這的確是一個值得探討的問題。答案當然你一定也已經猜到了——那就是“區塊鏈”。現在我們就開始學習這個分布式賬本是如何運作的。
故事的發展
該方法得以實行的必要條件是必須有足夠多的人愿意在交易時不依賴于第三方。只有這樣,這一部分的人才能夠自己掌控賬本資料。
那么人數要達到多少才足夠呢?在下面的例子中,我們假設有10個人愿意放棄銀行或其它任何第三方機構。在雙方達成協議的前提下,他們互相之間能夠在不知道對方身份的情況下時刻掌握對方賬戶的一切信息和動態。
1. 一個空文件夾
一開始每個人都會獲得一個空文件夾。隨著時間推進,這十個人都會在他們現在空的文件夾里不斷添加記錄交易信息的紙張。
2. 交易發生時
接下來,這個交易網絡中的每個人都帶著紙和筆坐下來,準備記錄下在這個系統中發生的每一筆交易。
假設,2號想給9號10美元。
為了完成這筆交易,2號大聲地告訴每個人:“我要轉10美元給9號。請大家都在自己的紙上記下來。”
然后每個人都檢查確認2號是不是有10美元及以上的余額能夠轉給9。如2號余額足夠,那么大家都在空白紙上記錄下這筆交易。
紙上的第一筆交易
這筆交易這樣就算完成了。
3. 持續發生的交易
隨著時間的流逝,這個交易網絡中出現交易需求的人越來越多。無論何時他們產生交易需求,都會通知網絡中的每個人。只要有人聽到了這個通知,他/她就會在他們各自的紙上記錄下來。
這個過程會持續進行,直到這張紙上的空間不足。假設每張紙只能記錄10次交易,那么只要第10次交易完成,每個人紙上的空間也就隨之耗盡。
當白紙被填滿
這時候我們就需要把這張紙放進文件夾并拿出另一張新的白紙,重復上面步驟2的過程。
4. 把紙張放進文件夾的注意點
在把紙張放進文件夾之前,我們需要對這張紙用網絡中每個人都認可的專有密鑰進行密封。但是密封后我們要確保的是,這張紙就只能塵封在文件夾里,無論是誰無論何時都不能對其作任何修改。并且如果每個人都相信這個“封印”,那么也就意味著每個人都絕對信任這張紙上的內容。這種密封方式也是區塊鏈的關鍵所在。
以前第三方或中間人都會說服我們相信無論他們在注冊表中記錄了什么,里面的內容都不會發生改變。但在現在這個分布式的、去中心化的系統中,這個印章(密鑰)就為我們建立了這種信任機制。
故事的高潮 (一)
新的問題又來了。我們應該如何密封這張紙?
在學習如何密封之前,我們先來了解印章的工作原理。
假設我們現在有一個機器,如果你把一個里面裝著東西的盒子從左邊放進去,這個魔法機器會從右邊吐出一個裝著其它東西的盒子。
【術語解析】這個機器實際叫作“哈希函數”,但是今天我們不討論技術。所以我們暫且稱它為“魔法機器”。
魔法機器(即哈希函數)
如果我們把裝有數字4的盒子從左邊放進去,它會從右邊給出下列字符:dcbea。
如果已知條件是輸出結果為“dcbea”,要想知道從左邊輸入的是什么非常困難。但是每次如果你把4放進去,最終的輸出結果“dcbea”是肯定的。
我們來試試發送其它數字。如果放入26會得到什么呢?
哈希(26)=94c8e
這次我們得到的是“94c8e”。從26的輸出結果來看,結果也可以包含數字。
了解到這兒,我們可以開始思考下一個更加深入的問題了:
“如果我想從右邊得到一個以3個零為開頭的結果(如000ab、00098、000fa等),那么我應該從機器的左邊放入什么內容?”
預測輸入的內容
這個機器有一個單向性的屬性:給出右邊的預期結果后,我們無法計算出左邊放入的內容。那是不是意味著這個問題無解?倒也未必。
我能想到一種方法——把每個數字都輸入一遍,直到機器輸出以3個零為開頭的結果。
把每個數字都嘗試一遍
有耐心的人試上幾千次可能也就找到了這個符合我們輸出要求的數字。
通過輸出結果來獲得輸入數字這種逆向計算的確非常困難。但是如果我們得到了預測的輸入內容,驗證該輸入是否能得出我們想要的結果就非常非常容易了。記住,這個機器最大的特點就是每個結果只對應一個數字,絕無例外的“一夫一妻制”。
如果我給你72533這個數字,然后問你:“這個數字輸入魔法機器后會不會輸出以3個零為開頭的結果?”這個問題就簡單到簡直在侮辱我們的智商了。
因此這個機器最最最重要的屬性是——知道結果,要想算出輸入非常困難,但是如果我們知道輸入的數字和輸出結果,驗證兩者是否匹配很簡單。
如何利用這個機器密封紙張?
怎樣利用魔法機器生成每張紙獨有的封印?還是老辦法,采用情境模擬的方法展開解釋。
假設我給了你兩個盒子。第一個盒子里面有數字20893,你能不能想出一個數字,這個數字與第一個盒子里的數字相加后的結果放入魔法機器后,我們能夠得到一個以3個零為開頭的字符結果。
這個情景和之前的難題幾乎相同。唯一的辦法就是把每個數字都放入機器嘗試一遍。
經過幾千次的嘗試,我們會在21191這個數字這里停下,21191+20893=42084,把42084放入這個機器后所得到的結果正是我們想要的。
在這個案例中,21191這個數字就是20893這個數字的“封印”。假設有張紙上寫著20893這個數字。為了密封這張紙(即沒有人能夠再對其內容作改動),我們把帶有21191標簽的徽章貼在紙上,密封完成。
被密封的數字
【術語解析】用來密封的數字實際被稱為“工作證明(Proof Of Work)”,因為這個數字是通過努力計算得來的。本文為了簡單易懂,我們稱它為“密封數字”。
無論誰想驗證這個頁面是否被改動過,只要把頁面上的內容與密封號碼疊加后放入魔法機器。如果機器輸出的內容是以3個零為開頭的,那么該頁面內容是沒有被“污染”過的。但如果結果不滿足這個特點,我們就應果斷丟棄這個頁面,因為上面的內容已經被改動、已經失效。
密封過程總結
要想密封記錄整個交易網絡中交易流水的頁面,我們需要找到那個加入交易內容并輸入機器后會得到以3個零為開頭的字符的關鍵數字。
注意:“以3個零為開頭的字符”只是一個舉例,簡單地反映哈希函數的工作原理。實際問題處理起來會復雜得多。
只要花費一定的時間,交易網絡中的參與者就能夠計算出這個數字,該頁面也就隨之密封。一旦有人更改了頁面上的內容,任何人都能夠通過這個密封號碼來驗證這個頁面的完整性。
故事的高潮(二)
了解如何密封頁面后,我們再把思緒拉回10個人用完了一張紙上所有空間的時候。
當這個頁面上記不下更多的交易記錄時,交易網絡中的每個人都會停下來計算該頁面的密封數字,然后將其放入文件夾。如果第一個人算好了密封數字,他就會向所有人公布。
聽到密封號碼后,大家都去驗證這個數字是否能滿足輸出需求。如是,則在他們的頁面上貼上這個標簽,再把這個頁面放進文件夾。
但是如果7號算出了密封號碼并“昭告了天下”,但結果大家發現這個數字并不滿足他們的輸出需求怎么辦?這樣的情況也很常見。原因可能有以下幾點:
1. 公布交易信息時聽錯了;
2. 記錄交易信息時出現筆誤;
3. 為了一己之利,記錄交易時故意犯錯。
不管出于什么原因,7號只有一種選擇——丟棄自己這張紙,然后從別人那里復制一份副本放進他自己的文件夾。如果不把這個頁面放進文件夾,他就不能繼續記錄接下來的交易記錄,這也就相當于把他從這個交易網絡中踢掉了。
說到這里,我相信有的人腦海里又出現了一個疑惑:既然有人計算好密封號碼后會公布,為什么我們每個人還要花費那么多時間都去計算一遍?其他人為什么不歇著、坐等公布?
Good question!區塊鏈包含特殊的獎勵機制,網絡中每個人都有資格獲得獎勵。第一個計算出密封號碼的人能夠獲得一定獎勵。
我們再來簡單地假設一下,如果5號第一個算出了頁面的密封號碼,并獲得了1美元的金額獎勵,那么這1美元就是憑空出現的。換句話說,假如他賬戶里本來余額5美元,現在增加了1元,但是這1元沒有從其他任何人的賬戶里扣除,即沒有減少任何人的賬戶余額。
這就是比特幣的起源。它是在區塊鏈(分布式賬目)上發生交易的第一種貨幣。如果在這個交易網絡上持續努力,你同樣也能獲得回報,這個過程就是我們所說的“挖礦”。
擁有比特幣的人越來越多,這些人一刻不閑著地開始炒這種虛擬貨幣,不斷擴大市場對比特幣的需求,再進一步提高比特幣的價值。就這樣周而復始地把比特幣的價格炒得很高。
這種獎勵機制讓交易網絡中的每個人都勤勤懇懇地勞作。
他們把紙張放進文件夾后,拿出一張新的空白紙張,然后再次重復前面的過程——循環往復、永無止境。
假設文件夾中已經有5個被密封的頁面。如果我為了謀取私利修改了第二個頁面的其中一筆交易會發生什么?前面已經提到過,所有人都可以通過密封號碼查出交易內容已經發生改變。但是如果我根據修改的內容重新計算密封號碼,然后把新號碼貼在紙上,出現這樣的情況怎么辦?
為了防止有人同時修改頁面和密封號碼,計算密封號碼時有一個小技巧。
如何防止密封號碼被重新計算、更改?
還記得之前我假設你有兩個盒子,一個包含20893這個數字,一個是用于計算的空盒子嗎?在區塊鏈中計算密封號碼,實際上存在三個盒子,而不是兩個,其中兩個是有內容的,一個是待計算填充的。
當三個盒子的內容都填好放入機器后,機器右邊輸出的結果能夠滿足我們的需求。
一個盒子里是交易記錄、一個盒子是密封號碼,第三個盒子是通過哈希函數計算出來的前一頁的輸出結果。
通過這個小技巧,我們能夠確保每一頁的密封號碼都與前一頁的內容相關聯。因此如果有人修改了歷史頁面的內容,他需要改動接下來每一頁的密封號碼,從而保證整個鏈路的一致性。
我們假設十個人中有一個人想要惡意修改區塊鏈中的內容(包含記錄了交易歷史頁面的文件夾),那么他需要調整很多頁面,計算改動頁面之后所有頁面的密封號碼。我們都知道計算密封號碼的工作非常困難。因此,整個交易網絡中的一個叛徒最終還是會輸給剩下的9個好人。
從這個叛徒想要更改內容的頁面開始,他就需要在整個網絡中創建另一個區塊鏈,但是這個區塊鏈幾乎不可能趕上好人們創建的鏈路——一個人的力量趕不上剩下9個人的共同努力。因此,有一點非常明確,區塊鏈規模越大,安全性和可信度越高。
但是如果10個人中有6個人都叛變了怎么辦?
如果出現這樣的情況,這個協議就有點打臉了。這種情況被稱為“51%攻擊”,如果整個網絡中的大多數人都決定叛變,欺騙剩下不到半數的人,那么整個協議就自然而然地走向了滅亡。
這是區塊鏈最大的弱點。盡管這樣的情況不可能出現,但我們還是要謹記這個系統的弱點。整個體系都是基于一個假設:整個交易網絡中的大多數人都不會叛變。
結局
解釋到這里也就差不多了。還請親愛的們再回頭看看百度百科給出的定義,現在是不是理解起來容易很多了?
如果還有人問起到底什么是區塊鏈,比特幣的運作機制是怎樣的,我相信本文的讀者都能夠解釋給更多的小白們聽啦。