走近比特幣:一個故事看懂“區塊鏈”

發表於2017-07-10

區塊鏈是比特幣的底層技術和基礎架構,本質上是一個去中心化的資料庫。區塊鏈是一串使用密碼學方法相關聯產生的資料塊,每一個資料塊中包含了一次比特幣網路交易的資訊,用於驗證其資訊的有效性(防偽)並生成下一個區塊。

狹義來講,區塊鏈是一種按照時間順序將資料區塊以順序相連的方式組合成的一 種鏈式資料結構, 並以密碼學方式保證的不可篡改和不可偽造的分散式賬本。

以上定義摘自百度百科。很多菜鳥朋友看完這段解釋依然滿臉懵逼,到底什麼是“區塊鏈”?

起因

除非你完全沒有接觸過資訊保安,否則一定聽說過比特幣和區塊鏈。畢竟這兩個名詞也是近兩年來各大國內外媒體爭相報導的熱詞。尤其是繼今年5月爆發的WannaCry病毒爆發以後,很多從未接觸過的人都開始加入討論大軍。

我的很多朋友都不懂技術。最近幾周他們一個個都變身好奇寶寶,圍著我問比特幣和區塊鏈。我想這兩個名詞的熱度一定還會持續攀高,對他們不夠了解的人也還有很多很多。何不採用通俗的語言對“區塊鏈”做一個解釋,把這個概念傳播開來?

和網上一般的名詞解釋不同(不管三七二十一,下個定義再說,其實並沒有什麼卵用),我們以它的作用為切入點來理解區塊鏈的工作機制。

故事的開端

Joe是你最好的朋友。他出國旅遊後的第五天給你打了個電話:“兄弟,我需要點錢,出國之後把身上的錢都花完了。”

你回覆:“我馬上打過來”,然後掛了電話。

1

接著你又打電話給你的銀行客戶經理:“麻煩你馬上從我的賬戶轉1000美元給Joe。”

客戶經理:“好的,明白。”

客戶經理隨後確認了你的賬戶是否有足夠的餘額。因為你是百萬富翁,所以客戶經理進行了如下的操作:

1

交易賬單

你打電話給Joe說你已經把1000美元轉過去了。

1

回頭我們再來看看剛剛到底發生了什麼。你和Joe都信任那家銀行來管理你們各自的財產。整個過程中實際並沒有真實貨幣的物理流動。整個過程只涉及錄入系統的兩個賬戶即可。更準確地說,全程只需主動權屬於該銀行的兩個賬戶就可以完成。

在這樣傳統的貨幣體系中,我的問題就來了。

交易雙方的信任機制建立需要藉助第三方。這種“中間人”的方式由來已久。那麼你可能又要問了:“這種信任機制有什麼問題嗎?”問題在於除交易雙方以外的“監督者”只是單個個體。這種情況可能存在以下風險:

世界上有沒有無需藉助銀行就能幫助我們完成安全轉賬的系統?

要想解決這個問題,我們首先應該靜下心來好好思考,問自己一個更深層次的問題:我們能不能自己掌握賬戶和歷史交易的資訊呢?

這的確是一個值得探討的問題。答案當然你一定也已經猜到了——那就是“區塊鏈”。現在我們就開始學習這個分散式賬本是如何運作的。

故事的發展

該方法得以實行的必要條件是必須有足夠多的人願意在交易時不依賴於第三方。只有這樣,這一部分的人才能夠自己掌控賬本資料。

那麼人數要達到多少才足夠呢?在下面的例子中,我們假設有10個人願意放棄銀行或其它任何第三方機構。在雙方達成協議的前提下,他們互相之間能夠在不知道對方身份的情況下時刻掌握對方賬戶的一切資訊和動態。

1

1. 一個空資料夾

一開始每個人都會獲得一個空資料夾。隨著時間推進,這十個人都會在他們現在空的資料夾裡不斷新增記錄交易資訊的紙張。

2. 交易發生時

接下來,這個交易網路中的每個人都帶著紙和筆坐下來,準備記錄下在這個系統中發生的每一筆交易。

假設,2號想給9號10美元。

為了完成這筆交易,2號大聲地告訴每個人:“我要轉10美元給9號。請大家都在自己的紙上記下來。”

1

然後每個人都檢查確認2號是不是有10美元及以上的餘額能夠轉給9。如2號餘額足夠,那麼大家都在空白紙上記錄下這筆交易。

1

紙上的第一筆交易

這筆交易這樣就算完成了。

3. 持續發生的交易

隨著時間的流逝,這個交易網路中出現交易需求的人越來越多。無論何時他們產生交易需求,都會通知網路中的每個人。只要有人聽到了這個通知,他/她就會在他們各自的紙上記錄下來。

這個過程會持續進行,直到這張紙上的空間不足。假設每張紙只能記錄10次交易,那麼只要第10次交易完成,每個人紙上的空間也就隨之耗盡。

1

當白紙被填滿

這時候我們就需要把這張紙放進資料夾並拿出另一張新的白紙,重複上面步驟2的過程。

4. 把紙張放進資料夾的注意點

在把紙張放進資料夾之前,我們需要對這張紙用網路中每個人都認可的專有金鑰進行密封。但是密封后我們要確保的是,這張紙就只能塵封在資料夾裡,無論是誰無論何時都不能對其作任何修改。並且如果每個人都相信這個“封印”,那麼也就意味著每個人都絕對信任這張紙上的內容。這種密封方式也是區塊鏈的關鍵所在。

以前第三方或中間人都會說服我們相信無論他們在登錄檔中記錄了什麼,裡面的內容都不會發生改變。但在現在這個分散式的、去中心化的系統中,這個印章(金鑰)就為我們建立了這種信任機制。

故事的高潮 (一)

新的問題又來了。我們應該如何密封這張紙?

在學習如何密封之前,我們先來了解印章的工作原理。

假設我們現在有一個機器,如果你把一個裡面裝著東西的盒子從左邊放進去,這個魔法機器會從右邊吐出一個裝著其它東西的盒子。

【術語解析】這個機器實際叫作“雜湊函式”,但是今天我們不討論技術。所以我們暫且稱它為“魔法機器”。

1

魔法機器(即雜湊函式)

如果我們把裝有數字4的盒子從左邊放進去,它會從右邊給出下列字元:dcbea。

1

如果已知條件是輸出結果為“dcbea”,要想知道從左邊輸入的是什麼非常困難。但是每次如果你把4放進去,最終的輸出結果“dcbea”是肯定的。

我們來試試傳送其它數字。如果放入26會得到什麼呢?

1

雜湊(26)=94c8e

這次我們得到的是“94c8e”。從26的輸出結果來看,結果也可以包含數字。

瞭解到這兒,我們可以開始思考下一個更加深入的問題了:

“如果我想從右邊得到一個以3個零為開頭的結果(如000ab、00098、000fa等),那麼我應該從機器的左邊放入什麼內容?”

1

預測輸入的內容

這個機器有一個單向性的屬性:給出右邊的預期結果後,我們無法計算出左邊放入的內容。那是不是意味著這個問題無解?倒也未必。

我能想到一種方法——把每個數字都輸入一遍,直到機器輸出以3個零為開頭的結果。

1

把每個數字都嘗試一遍

有耐心的人試上幾千次可能也就找到了這個符合我們輸出要求的數字。

1

通過輸出結果來獲得輸入數字這種逆向計算的確非常困難。但是如果我們得到了預測的輸入內容,驗證該輸入是否能得出我們想要的結果就非常非常容易了。記住,這個機器最大的特點就是每個結果只對應一個數字,絕無例外的“一夫一妻制”。

如果我給你72533這個數字,然後問你:“這個數字輸入魔法機器後會不會輸出以3個零為開頭的結果?”這個問題就簡單到簡直在侮辱我們的智商了。

因此這個機器最最最重要的屬性是——知道結果,要想算出輸出非常困難,但是如果我們知道輸入的數字和輸出結果,驗證兩者是否匹配很簡單。

如何利用這個機器密封紙張?

怎樣利用魔法機器生成每張紙獨有的封印?還是老辦法,採用情境模擬的方法展開解釋。

假設我給了你兩個盒子。第一個盒子裡面有數字20893,你能不能想出一個數字,這個數字與第一個盒子裡的數字相加後的結果放入魔法機器後,我們能夠得到一個以3個零為開頭的字元結果。

1

這個情景和之前的難題幾乎相同。唯一的辦法就是把每個數字都放入機器嘗試一遍。

經過幾千次的嘗試,我們會在21191這個數字這裡停下,21191+20893=42084,把42084放入這個機器後所得到的結果正是我們想要的。

1

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

1

被密封的數字

【術語解析】用來密封的數字實際被稱為“工作證明(Proof Of Work)”,因為這個數字是通過努力計算得來的。本文為了簡單易懂,我們稱它為“密封數字”。

無論誰想驗證這個頁面是否被改動過,只要把頁面上的內容與密封號碼疊加後放入魔法機器。如果機器輸出的內容是以3個零為開頭的,那麼該頁面內容是沒有被“汙染”過的。但如果結果不滿足這個特點,我們就應果斷丟棄這個頁面,因為上面的內容已經被改動、已經失效。

密封過程總結

要想密封記錄整個交易網路中交易流水的頁面,我們需要找到那個加入交易內容並輸入機器後會得到以3個零為開頭的字元的關鍵數字。

1

注意:“以3個零為開頭的字元”只是一個舉例,簡單地反應雜湊函式的工作原理。實際問題處理起來會複雜得多。

只要花費一定的時間,交易網路中的參與者就能夠計算出這個數字,該頁面也就隨之密封。一旦有人更改了頁面上的內容,任何人都能夠通過這個密封號碼來驗證這個頁面的完整性。

故事的高潮(二)

瞭解如何密封頁面後,我們再把思緒拉回10個人用完了一張紙上所有空間的時候。

當這個頁面上記不下更多的交易記錄時,交易網路中的每個人都會停下來計算該頁面的密封數字,然後將其放入資料夾。如果第一個人算好了密封數字,他就會向所有人公佈。

1

聽到密封號碼後,大家都去驗證這個數字是否能滿足輸出需求。如是,則在他們的頁面上貼上這個標籤,再把這個頁面放進資料夾。

但是如果7號算出了密封號碼並“昭告了天下”,但結果大家發現這個數字並不滿足他們的輸出需求怎麼辦?這樣的情況也很常見。原因可能有以下幾點:

1. 公佈交易資訊時聽錯了;

2. 記錄交易資訊時出現筆誤;

3. 為了一己之利,記錄交易時故意犯錯。

不管出於什麼原因,7號只有一種選擇——丟棄自己這張紙,然後從別人那裡複製一份副本放進他自己的資料夾。如果不把這個頁面放進資料夾,他就不能繼續記錄接下來的交易記錄,這也就相當於把他從這個交易網路中踢掉了。

說到這裡,我相信有的人腦海裡又出現了一個疑惑:既然有人計算好密封號碼後會公佈,為什麼我們每個人還要花費那麼多時間都去計算一遍?其他人為什麼不歇著、坐等公佈?

Good question!區塊鏈包含特殊的獎勵機制,網路中每個人都有資格獲得獎勵。第一個計算出密封號碼的人能夠獲得一定獎勵。

我們再來簡單地假設一下,如果5號第一個算出了頁面的密封號碼,並獲得了1美元的金額獎勵,那麼這1美元就是憑空出現的。換句話說,假如他賬戶裡本來餘額5美元,現在增加了1元,但是這1元沒有從其它任何人的賬戶里扣除,即沒有減少任何人的賬戶餘額。

這就是比特幣的起源。它是在區塊鏈(分散式賬目)上發生交易的第一種貨幣。如果在這個交易網路上持續努力,你同樣也能獲得回報,這個過程就是我們所說的“挖礦”。

擁有比特幣的人越來越多,這些人一刻不閒著地開始炒這種虛擬貨幣,不斷擴大市場對比特幣的需求,再進一步提高比特幣的價值。就這樣周而復始地把比特幣的價格炒得很高。

這種獎勵機制讓交易網路中的每個人都勤勤懇懇地勞作。

他們把紙張放進資料夾後,拿出一張新的空白紙張,然後再次重複前面的過程——迴圈往復、永無止境。

假設資料夾中已經有5個被密封的頁面。如果我為了謀取私利修改了第二個頁面的其中一筆交易會發生什麼?前面已經提到過,所有人都可以通過密封號碼查出交易內容已經發生改變。但是如果我根據修改的內容重新計算密封號碼,然後把新號碼貼在紙上,出現這樣的情況怎麼辦?

為了防止有人同時修改頁面和密封號碼,計算密封號碼時有一個小技巧。

如何防止密封號碼被重新計算、更改?

還記得之前我假設你有兩個盒子,一個包含20893這個數字,一個是用於計算的空盒子嗎?在區塊鏈中計算密封號碼,實際上存在三個盒子,而不是兩個,其中兩個是有內容的,一個是待計算填充的。

當三個盒子的內容都填好放入機器後,機器右邊輸出的結果能夠滿足我們的需求。

一個盒子裡是交易記錄、一個盒子是密封號碼,第三個盒子是通過雜湊函式計算出來的前一頁的輸出結果。

1

通過這個小技巧,我們能夠確保每一頁的密封號碼都與前一頁的內容相關聯。因此如果有人修改了歷史頁面的內容,他需要改動接下來每一頁的密封號碼,從而保證整個鏈路的一致性。

我們假設十個人中有一個人想要惡意修改區塊鏈中的內容(包含記錄了交易歷史頁面的資料夾),那麼他需要調整很多頁面,計算改動頁面之後所有頁面的密封號碼。我們都知道計算密封號碼的工作非常困難。因此,整個交易網路中的一個叛徒最終還是會輸個剩下的9個好人。

從這個叛徒想要更改內容的頁面開始,他就需要在整個網路中建立另一個區塊鏈,但是這個區塊鏈幾乎不可能趕上好人們建立的鏈路——一個人的力量趕不上剩下9個人的共同努力。因此,有一點非常明確,區塊鏈規模越大,安全性和可信度越高。

1

但是如果10個人中有6個人都叛變了怎麼辦?

如果出現這樣的情況,這個協議就有點打臉了。這種情況被稱為“51%攻擊”。如果整個網路中的大多數人都決定叛變,欺騙剩下不到半數的人,那麼整個協議就自然而然地走向了滅亡。

這是區塊鏈最大的弱點。儘管這樣的情況不可能出現,但我們還是要謹記這個系統的弱點。整個體系都是基於一個假設:整個交易網路中的大多數人都不會叛變。

結 局

解釋到這裡也就差不多了。還請親愛的們再回頭看看百度百科給出的定義,現在是不是理解起來容易很多了?

如果還有人問起到底什麼是區塊鏈,比特幣的運作機制是怎樣的,我相信本文的讀者都能夠解釋給更多的小白們聽啦。

相關文章