區塊鏈是什麼?

除非你完全不食人間煙火,否則我相信你一定聽說過比特幣和區塊鏈。畢竟它們是時下流行的熱門話題,就連從未開採過加密貨幣也不知道它是如何運作的人都在談論它。這就是這篇文章的目的:用簡單的中文寫出來,讓任何普通的網路使用者都能理解。

區塊鏈:為什麼我們會需要搞個這麼複雜的東西?

我們將先了解區塊鏈解決的問題,而不是告訴你區塊鏈的定義。

想象一下,小明是你最好的朋友。他正在國外旅行,在假期的第五天,他打電話給你說:「哥,我需要一些盤纏。我的錢用完了。」

你的回覆是:「好,馬上匯你。」,然後結束通話。

然後你打電話給銀行經理,告訴他:「請把 1000 塊從我的賬戶轉到小明的賬戶。」

銀行經理回答:「好的。」

他開啟帳本,檢查你的賬戶餘額,看你是否有足夠的餘額,將 1000 塊轉移給小明。最後,他在登記冊上登記了「你將 1000 塊匯給了小明。」

你打電話給小明,並告訴他,「我把錢轉過去了。你去你那邊的銀行,就可以提取我剛轉的 1000 塊。」

好,我們來看看剛才發生了什麼。你和小明都信任銀行來管理你的錢。你並沒有真的拿一張鈔票來轉移資金。整件事所需要的只是在帳冊上交換金額。或者更準確地說,登記在帳冊的這一條記錄,既不是你也不是小明控制或擁有的。

而這就是現有系統的問題所在。

我們必須要依靠第三方來建立自己的信用。

多年來,我們一直依靠這些中間人來相互信任。你可能會問:「這能有什麼問題?」

問題是他們是整體的少數。今天如果有人要存心搗亂,他只需要搞垮一個人或是一個組織,而這件事情可能是有意或甚至無意的。

  • 如果交易的記錄被燒燬了呢?
  • 如果你的銀行經理寫的是 10000 塊而不是 1000 塊怎麼辦?
  • 如果他故意要搞你呢?

是否有一個系統可以在不需要銀行的情況下轉移資金?

要回答這個問題,我們需要進一步深入並換個方法問問題。想想看,轉移資金意味著什麼? 只是登記冊上的一個條目。那麼,更好的問題將是:

有沒有一種方法可以讓我們自己來維護註冊,而不是別人替我們做這件事?

這是一個值得探討的問題。答案是你可能已經猜到了。區塊鏈是對這個深奧問題的答案。它是一種可以在我們自己之間登記帳本的方法,而無需依賴第三方。

有跟上嗎?很好。因為現在,當你的腦海中開始出現幾個問題時,我們將瞭解這個去中心化的銀行是如何工作的。

好,但是告訴我,它是怎麼運作的?

使用區塊鏈的基本要求是,必須有足夠多的人願意用。只有這樣,這個團隊才能自己維護帳本。

「如果比特幣能夠流行,那比特幣就會有意義。如果有足夠多的人以同樣的方式思考,比特幣就會變成一個自我實現的預言」這是中本聰在 2009 年時發表的看法。

那麼有多少人才足夠?至少要有三個人。對於我們的例子,我們假設有 10 個人想放棄銀行或任何第三方。在相互同意的情況下,他們會 在不知道對方身份的情況下,一直擁有對方賬戶的詳細資訊

1. 一個空的資料夾

每個人都包含一個空的資料夾。隨著我們的進展,這 10 個人將不斷地往他們當前空的資料夾中新增頁面。這些頁面的集合將形成跟蹤事務的暫存器。

2. 當一則交易發生時

接下來,網路上的每個人都坐在一張白紙上,手裡拿著一支筆。每個人都可以編寫在系統中發生的任何事務。

現在,如果甲想要把十塊錢給到乙。

為了完成交易,甲大喊並告訴每個人,「我想把十塊錢轉移到乙。」所以,每個人,請在你的頁面上記下它。

每個人都在檢查甲是否有足夠的餘額將十元轉到乙的帳戶。如果她有足夠的餘額,每個人都會在他們的空白頁上記錄交易。

然後該事務被認為是完整的。

3. 交易繼續發生

隨著時間的推移,越來越多的人覺得需要把錢轉到別人身上。每當他們想要交易時,他們就會向其他人宣佈。一旦一個人聽了這個通知,他就會把這個交易結果寫在自己的頁面上。

這個步驟會一直持續下去,直到所有人都在自己的頁面上耗盡空間。假設一個頁面有記錄 100 次交易的空間,當第 100 個交易完成時,每個人的頁面都寫滿了。

那麼,現在是時候把頁面放到資料夾中,開啟一個新的頁面,並從上述的步驟 2 中重複這個過程。

4. 把寫滿的頁面收藏起來

在我們把頁面放到我們的資料夾之前,我們需要用一個唯一的金鑰來封住它,這個金鑰是網路中每個人都同意的。通過這個金鑰封印,我們將確保沒有人可以對被封印的內容進行任何修改,一旦它的副本被放在每個人的資料夾裡,不管是今天、明天、甚至是一年之後。只要頁面被封印在資料夾中,他的內容就不可能被竄改。如果每個人都相信金鑰的公正,那麼每個人都相信這一頁的內容是正確的。所以這個金鑰就是整件事情的關鍵了。

透過金鑰進行封印的這個動作,就是著名的「挖礦」,用來確保資料的安全。但為了簡單起見,我們將繼續稱之為「封印」。

真有趣!那麼我們如何封印頁面?

在我們學習如何封印頁面之前,我們要先知道金鑰是如何運作的。為了方便我們講解,我喜歡稱它做…

魔法機器

想象一下,一台機器被厚厚的牆包圍著。如果你從左邊放入一個包含若干東西的盒子,它會從右邊吐出一個內容物變成其他東西的盒子。

這台機器被稱為「雜湊函數」,但今天我們沒有心情太過專業。反正講的太深入也用不著,我們就都稱他們做「神奇的機器」。

假設,你把數字 4 從左邊放進去,我們會發現它的右邊會吐出一個詞:dcbea。

它是如何將數字 4 轉換成這個單詞的?沒有人知道,所以才是魔法嘛。此外,這是一個不可逆轉的過程。考慮到「dcbea」這個詞,我們不可能知道這臺機器的左邊是什麼。但是每次你把數字 4 餵給機器時,它總是會吐出同樣的單詞「dcbea」。

讓我們試著傳送一個不同的數字。26 怎麼樣?

這次我們得到了 94c8e。有趣!所以,單詞也可以包含數字。

如果我現在問你以下問題:

「你能告訴我放什麼東西進去可以得到一組 000 開頭的結果嗎?」例如,000ab 或 00098 或 000fa 或其他字串。

思考一下這個問題。

我已經告訴過你們機器有一個屬性我們不能計算我們必須從左邊傳送什麼我們得到了右邊的期望輸出。有了這樣一台機器,我們怎麼能回答我提出的問題呢?

我想到了一個方法:為什麼不把宇宙中的每一個數字都試一遍,直到我們得到一個從三個導零開始的單詞呢?

樂觀一點,經過幾千次的嘗試,我們最終會得到一個能在右邊產生所需輸出的數字。

計算輸入的輸出是極其困難的。但與此同時,要驗證預測的輸入是否會產生所需的輸出,總是非常容易。記住,機器每次都用同一個詞表示數字。

如果我給你一個數字,比如 72533,問你這個問題,你認為答案是什麼?這個數字,當輸入到機器中時,會產生一個從三個 0 開始的單詞嗎?你所需要做的就是,把這個數字扔進機器裡,看看你在它的右邊得到了什麼。就是這樣。

這類機器最重要的特性是:「給定一個輸出,計算輸入是極其困難的,但考慮輸入和輸出,就很容易驗證輸入是否導致輸出。」

現在,我們已經記住了這個神奇機器(或雜湊函式)的一個特性:

給定一個輸出,計算輸入是非常困難的,但是給定輸入和輸出,就很容易驗證輸入是否導致輸出。

如何使用這些機器來封印一頁?

我們將使用這個神奇的機器為我們的頁面生成一個印章。像往常一樣,我們從一個假想的情況開始。

假設我給你兩個盒子。第一個盒子包含數字 20893。然後,我問你,「你能算出一個數字嗎?當把第一個盒子裡的數字放進機器時,它會給我們一個從三個 0 開始的單詞?」

這和我們之前看到的情況是一樣的,我們已經知道,計算這樣一個數字的唯一方法是嘗試整個宇宙中可用的每一個數字。

經過上千次的嘗試,我們會遇到一個數字,比如 21191,當它被新增到 20893(即 21191 + 20893 = 42084)的時候,它會產生一個滿足我們需求的單詞。

在這樣的情況下,21191 成為 20893 號的封印。假設有一頁上面寫著 20893 的數字。為了封印這一頁(即沒有人可以更改它的內容),我們會在上面貼上「21191」標記。一旦封口數(即 21191)被卡在頁面上,頁面就會被密封。

這個封印本身被稱為「工作證明」,意思是這個數字證明了計算它的努力。我們稱它為「封印」是為了簡單解釋。

如果有人想要驗證頁面是否被篡改,他所要做的就是:將頁面的內容加上封口號,然後輸入魔法機器。如果機器發出一個帶有三個前導零的字,內容就不會被改動。如果出現的單詞不符合我們的要求,我們可以扔掉這個頁面,因為它的內容被破壞了,並且沒有使用。

我們將使用類似的密封機制來密封所有的頁面,並最終將它們安排在各自的資料夾中。

最後,封印我們的頁面…

要在包含網路事務的頁面上簽名,我們需要找出一個數字,當它被新增到事務列表並輸入到機器時,我們會得到一個單詞,它從右側的三個前導零開始。

注意:我一直在用「從三個前導零開始」這個短語作為一個例子。它說明了雜湊函式是如何工作的。真正的挑戰要比這複雜得多。

一旦這個數字是在機器上花費時間和電力之後計算出來的,那麼這個頁面就會被這個數字封住。如果有人試圖更改頁面的內容,那麼封口號將允許任何人驗證頁面的完整性。

既然我們已經知道了如何封頁,我們就會回到我們寫完第 10 筆交易的時候,我們就沒有空間寫更多的東西了。

當每個人都跑出頁面去寫更多的事務時,他們就會沉迷於計算頁面的封號,這樣就可以把它隱藏在資料夾中。網路中的每個人都在計算。第一個在網路中找出封口號碼的人告訴其他人。

在聽到密封號的時候,每個人都會驗證它是否能得到所需的輸出。如果是這樣,每個人都會用這個數字給自己的頁面打上標籤,然後把它放在資料夾裡。

但是,如果有人說丙宣佈的封號不產生所需的輸出,那該怎麼辦?這種情況並不罕見。可能的原因可能是:

  1. 他可能 聽錯 了網路上宣佈的交易。
  2. 他可能 寫錯 了網路上宣佈的交易。
  3. 他可能在寫交易時試圖欺騙或不誠實,要麼是為了討好自己,要麼是為了別人。

不管原因是什麼,丙只有一個選擇:放棄他的頁面並從別人那裡複製,這樣他也可以把它放在資料夾裡。除非他沒有把他的頁面放在資料夾裡,否則他不能繼續寫進一步的交易,就會被這個網路給踢出。

所以無論多數人同意的封印是什麼,都會被視為是正確的封印。

那麼,為什麼每個人在知道別人會計算並向他們宣佈時,卻花費資源來計算呢?為什麼不坐下來等待宣佈呢?

好問題。這就是激勵的來源。區塊鏈的每個成員都有資格獲得獎勵。第一個計算封號的人可以得到免費的報酬(即消耗 CPU 和電力)。

簡單地想象一下,如果丁計算一個頁面的封口數,他就會得到一些免費的錢,比如一塊錢美金,這是憑空產生的。換句話說,丁的帳戶餘額會增加 1 美元,但是其他人的帳戶餘額並不會減少。

比特幣就是這樣誕生的。它是第一個在區塊鏈 (即分散式暫存器) 上進行交易的貨幣。作為回報,為了繼續在網路上進行努力,人們獲得了比特幣。

當足夠多的人擁有比特幣時,他們的價值就會增長,讓其他人想要比特幣、使比特幣進一步增值、讓更多的人想要比特幣、使它們更有價值… 這就是比特幣的循環。

獎勵可以確保網路中的每個人都願意花時間計算金鑰,並且封印交易的結果。一旦每個人都把頁面放在資料夾裡,他們就會拿出一個新的空白頁,然後重複整個過程:永遠做下去。

我們說的每個「頁面」其實就是一個「區塊」,而將該資料夾則是這些區塊的「鏈」。所我們操作的這個東西就是… 區塊鏈。

這就是區塊鏈的工作原理。但是還有一件小事情沒有說。

想象一下資料夾裡已經有 5 頁了——都是密封的。如果我返回到第二個頁面,修改一個事務來支援自己呢?封號會讓任何人察覺到交易中的不一致,對嗎? 如果我繼續為修改後的事務計算一個新的封號,然後用它來標記頁面,會怎麼樣呢?

為了防止有人返回並修改頁面 (塊) 和封口號,對於如何計算封口數有一個小小的曲折。

如何保護金鑰號碼

記得我告訴過你我給了你兩個盒子——一個是 20893,另一個是空的給你計算?在實際中,要計算區塊鏈的封口數,而不是兩個盒子,有 3 – 2 個預填充的和一個要計算的。

當所有這三個盒子的內容被新增到機器上時,從右邊出來的答案必須滿足要求的條件。

我們已經知道,一個盒子包含交易列表,一個盒子包含封號。第三個方框包含了前一頁的神奇機器的輸出。

有了這個巧妙的小技巧,我們確保每個頁面都依賴於它的前一頁。因此,如果有人要修改歷史頁面,他還必須修改所有頁面的內容和封口數,以保持鏈的一致性。

如果一個人,在我們最初設想的 10 中,試圖欺騙和修改區塊鏈的內容(包含有事務列表的頁面的資料夾),那麼他必須調整之前所有的頁面,並計算所有這些頁面的新金鑰。我們已經知道封印一個文件有多難。因此,一個不誠實的人在網路上幾乎不可能擊敗九個誠實的人。

會發生的是,在這個不誠實的傢伙試圖欺騙的頁面上,他會在網路中建立另一個鏈條,但是這個鏈條永遠不能追上誠實的鏈條——僅僅因為一個人的努力和速度不能超過九個人的累計努力和速度。因此,保證網路中最長的鏈是誠實的鏈。

如果兇手不只一個,而是六個呢?

在這種情況下,協議將會完全失敗。它被稱為「51% 攻擊」。如果網路中的大多數人決定不誠實,欺騙剩下的人,那麼這個協議就會失敗。

這也是為什麼區塊鏈可能會崩潰的唯一原因。雖然這不大可能發生,但我們必須都知道系統的弱點。區塊鏈是建立在大多數人都是誠實的假設之上的。

這就是關於區塊鏈你該具備的入門知識。如果你發現有人想知道「WTF 是區塊鏈?」但是又沒朋友,那你可以請他們看看這篇文章。分享按鈕就在下面。