被新聞刷屏了的區塊鏈它到底是個啥?
可能有一些讀者有疑問,“區塊鏈”到底是什麼?為什麼會這麼受重視呢?今天,小編就來帶大家一起了解一下。首先,區塊鍊是一種電子化數據的存儲方法。數據是以區塊的形式出現的,想像一下有很多存儲著數字化數據的區塊。這些區塊都鏈接在了一起,為其內部數據賦予了不可變性。
當一個數據塊被鏈接到了這條鏈上,其內部數據就再也無法更改了。一旦某個區塊被添加到了鏈上,裡面的數據對任何人都是公開可見的。這項技術具有非凡的革新意義,可以用來記錄我們能想到的幾乎所有數據(例如,產權、身份、餘額、病歷等等),同時不存在被篡改記錄的風險。假設我買了一套房子,把產權證拍照上傳到了區塊鏈上,我就可以證明我在那個時刻享有這套房產的所有權。也就是說,區塊鍊是一種存儲數據且保證數據不被篡改的方法。這聽上去不錯,不過隨之而來的問題是:我們是怎麼實現這樣的技術的?
(校對注:吹毛求疵來說,這一段表述並非無懈可擊,但姑且可以這麼先記著。)
第一階——交易數據
好吧,我們先拿比特幣區塊鏈做個例子。比特幣區塊鍊是現存歷史最悠久的區塊鏈。在比特幣區塊鏈上,每個區塊的大小在1 MB 左右。至截稿日,這條鏈上已經累積了52.5 萬個區塊,鏈上存儲的數據總量約為52.5 萬MB 。(校對注:其實遠遠沒有52.5萬MB,因為在早期,很多區塊都沒有打滿1MB。)
比特幣區塊鏈上僅存儲比特幣的交易數據。它就像是一個龐大的交易記錄庫,可追溯至第一筆比特幣交易。在本文中,我們假設有一條存儲交易數據的區塊鏈,就像比特幣區塊鏈那樣。
第二階——(通過哈希運算)鏈接區塊
想像有三個存儲著交易數據的區塊(如圖一所示)。
這三個區塊內都存有一些交易數據。這沒什麼特別的。就好比是三個獨立的word 文檔,裡面描述了交易的內容和余額變化情況。文檔1 會按照時間順序從第一筆交易開始記錄,直到數據量達到1 MB 為止,之後的交易會記錄在文檔2 中,直到數據量達到1 MB 為止,以此類推。這些文檔就是數據塊。它們一個接著一個聯繫(鏈接)在一起。為此,每個區塊會根據其內部數據串生成一個特殊的(數字)簽名。如果這個區塊中的數據發生任何變動,即使只改變了一個數字,這個區塊的簽名也會發生改變。這是如何實現的?欲知詳情,請閱讀步驟三中的哈希運算部分。
(校對注:如上文所述,實際情形中的區塊並不是個個都接近區塊大小的上限,實際數據大小要看把區塊打包上鍊的礦工在區塊中記錄了多少交易,而他們並不會等到有了1MB 交易數據才開始動手。實際情形見下文)
假設區塊1 中記錄了兩筆交易,分別是交易1 和交易2 。這兩筆交易的總數據量達到了1 MB (實際上一個區塊中包含的交易筆數遠不止這點)。根據這個區塊內的數據串會生成一個簽名。假設這個簽名是“X32” 。如下圖所示:
請記住,即使區塊1 中存儲的數據改動了一個數字,也會得到一個完全不同的簽名!只要將區塊1 的簽名添加到區塊2 中,就可以將區塊1 的數據與區塊2 關聯起來。區塊1 的簽名也包含在區塊2 的數據串內,因此這個簽名與區塊2 中的其它數據一樣,成了區塊2 簽名的數據基礎。如下圖所示:
正是這些簽名將區塊鏈接在了一起,形成了一條區塊鏈。現在加上區塊3 ,整條鏈的情況如下圖所示:
現在,假設區塊1 中的數據被更改了。比方說Damian 和George 之間的交易被更改了。Damian 向George 發送了500 個而非100 個比特幣。由於區塊1 中的數據串改變了,其簽名也相應改變了。更改過數據之後,區塊1 的簽名不再是“X32” ,而是變成了“W10” ,如下圖所示:
這樣一來,區塊1 的新簽名“W10” 跟之前添加進區塊2 數據串的舊簽名“X32” 產生了衝突。區塊1 和區塊2 之間的鏈接就斷了。這條鏈上的其他用戶就會知道區塊1 中的數據被更改了。為了維護區塊鏈的不可變性,其他用戶會拒絕同步更改後的交易信息,依舊維持原有的交易記錄(即Damian 向George 發送100 BTC )不變,整條鏈依舊保持完整。這就意味著,要想不露痕跡地篡改交易,必須將區塊2 數據串中區塊1 的舊簽名替換成新簽名。然而,一旦區塊2 中的數據串發生變化,區塊2 的簽名也會隨之發生變化。假設區塊2 的簽名從“9BZ” 變成了“PP4” 。那麼區塊2 和區塊3 之間的鏈接就斷了!
區塊鏈上的區塊對所有人都是可見的。因此,如果篡改者真想要不露痕跡地篡改交易,就必須保證篡改之後的區塊仍然都聯繫在一起(否則人們就很容易發現哪個區塊跟其他區塊並不相連,進而判斷出該區塊已經被改過了)。也就是說,改掉一個區塊必須為後續的所有區塊計算新的簽名。可以認為這幾乎是不可能的,但要理解這是為什麼,請看下文。
第三階——生成簽名(哈希值)
那麼,我們以區塊1 為例再畫一個示意圖。假設區塊1 只記錄一筆交易,即Thomas 向David 發送100 BTC 。需要根據這個數據串生成一個簽名。在區塊鏈上,這個簽名是通過密碼學哈希函數生成的。密碼學哈希函數是一個極其複雜的數學公式:將任意數據串作為輸入值代入公式,可以得到一個獨一無二的64 位輸出值。例如,你可以將“Jinglebells” 一詞代入這個哈希函數(哈希函數的種類有很多,這只是其中一例),得到的輸出為:
761A7DD9CAFE34C7CDE6C1270E17F773025A61E511A56F700D415F0D3E199868
只要這個輸入中有一個字符發生變化,包括改變大小寫或是增加空格和標點,就會得到截然不同的輸出。如果你在這個輸入後面加上一個句號變成了“Jinglebells。”,得到的輸出就變成了:
B9B324E2F987CDE8819C051327966DD4071ED72D998E0019981040958FEC291B
如果我們把句號去掉,還是能得到跟之前一樣的輸入:
761A7DD9CAFE34C7CDE6C1270E17F773025A61E511A56F700D415F0D3E199868
對於同一個密碼學哈希函數來說,相同的輸入必定會得到相同的輸出,不同的輸入必定會得到不同的輸出。比特幣區塊鏈就是利用哈希函數為區塊生成簽名的,將區塊中的數據作為輸入,得到的輸出就是區塊的簽名。我們再來看看只含有一筆交易( Thomas 向David 發送100 BTC )的區塊1 示意圖。
假設區塊1 中的數據串如下所示:
Block 1 Thomas -100 David +100
將這個數據串輸入哈希函數,得到的輸出(簽名)如下所示:
BAB5924FC47BBA57F4615230DDBC5675A81AB29E2E0FF85D0C0AD1C1ACA05BFF
這個簽名會被添加進區塊2 的中。再假設現在David 向Jimi 轉了100 BTC ,這筆交易被打包進了區塊2 。那麼如下圖所示:
區塊2 的數據串如下所示:
Block 2 David -100 Jimi +100 BAB5924FC47BBA57F4615230DDBC5675A81AB29E2E0FF85D0C0AD1C1ACA05BFF
將這個數據串輸入哈希函數,得到的輸出(簽名)如下所示:
25D8BE2650D7BC095D3712B14136608E096F060E32CEC7322D22E82EA526A3E5
這就是區塊2 的簽名。每一個區塊都會通過這個密碼學哈希函數生成一個數字簽名。哈希函數種類繁多,比特幣區塊鏈用的是SHA-256 哈希算法。
但是,(僅有上述措施顯然還不夠)如果有人想篡改區塊中的數據,TA 可以在篡改之後生成新的簽名,塞下一個區塊中,然後逐個逐個區塊生成新的簽名,這些改動後的區塊還是形成了一條鏈,他人就沒法分辨出數據已經被更改過了。如何防止這種情形呢?
答案是只有符合特定要求的哈希值(簽名)才會被區塊鏈接受。這就是第四階中介紹的挖礦。
第四階——什麼是合格的簽名?由誰來簽署區塊?
並非所有的簽名都符合要求。區塊鏈協議會預先確定一些要求,比如,在比特幣區塊鏈上,只有以連續的零開頭的數字簽名相對應的區塊才能上鍊。例如,只有在數字簽名以不少於連續10 個零開頭的情況下,對應的區塊才能上鍊。
然而,由第三小節可知,每個數據串對應的哈希值都是唯一的。如果一個區塊的簽名(哈希值)開頭少於10 個零呢?為了獲得符合條件的區塊簽名,需要反復改變輸入的數據串,直到能生成以連續10 個零開頭的簽名為止。但由於交易數據和元數據(區塊編號、時間戳等等)需要保持原樣(否則意義就改變了),每個區塊裡面還另外添加了一段特定長度的、可以改動的數據。想把區塊添加到鏈上時,人們可以不斷改變這段數據,直到找到一個合格的簽名,然後確定下這段數據的具體值。這段數據就是區塊的nonce 。nonce 不是預先確定的數據,而是應實際需要而找出的一串完全隨機的數字(注:圖中所示的其他數據可以由任意字符組成,nonce 只能由數字組成)。
綜上所述,區塊包含:1)交易數據;2)上一個區塊的簽名;3)nonce 。這種通過反復更改nonce、對區塊數據進行哈希運算、尋找合格簽名的過程就叫做挖礦,也就是礦工所做的事。礦工投入大量電力,轉化成算力,不斷代入nonce 進行哈希運算,直到找到合格的簽名(輸出)為止。礦工手中掌握的算力越多,哈希運算的速度就越快,搶先找到合格簽名的可能性就越高。這是一種反複試錯的過程,如下圖所示:
-注:nonce 必須是數字(詳情請閱讀r/BlockchainSchool 上的講解)-
區塊鍊網絡上的任何用戶都可以通過下載並啟動挖礦軟件來參與挖礦,實際上,這就是用他們的硬件計算能力來計算區塊的nonce 。以比特幣區塊鏈上的Block #521,477 為例:
-源自區塊鏈瀏覽器blockchain.com –
可以看出,這個區塊的哈希值(簽名)和上一個區塊的哈希值都是以相同數量的零開頭的。找到這樣一個哈希值並非易事,需要付出大量算力和時間,或者運氣爆棚。沒錯,有時候運氣爆棚的礦工在幾分鐘之內就能算出合格的簽名,花的算力也很少。Block #523034 就是一個極其罕見的例子。一個算力很少的小礦工很快就找到了合格的簽名,而其他礦工的算力加起來是他的7 萬億倍。相比之下,贏得Powerball 彩票頭獎的概率是2.92 億分之一,而這位幸運兒挖到礦的概率是中頭獎的1/24000 。
不要小看這些零。這一小節的重點是,找到一個合格的簽名很難。
第五階——區塊鏈的不可變性是如何是實現的?
正如第三階中所述,更改某個區塊會導致它的簽名改變,與後續區塊記錄的對不上,從而與後面的區塊斷開鏈接。要想讓網絡中的其他參與者接受這個被更改過的區塊,就要把它跟後面的區塊重新鏈接起來。也就是說,一個區塊的簽名變了,跟在它後面的所有區塊的簽名都要改變,才能讓別人覺得這是一條前後一致的鏈。
你想起什麼事沒有?
如第四節所述,簽名必須符合要求!雖然更改所有區塊的簽名看似可行,但是要花費很多成本和時間,因此被認為是不可能的,原因如下:
假設有一個礦工惡意篡改了某個區塊內的交易,然後根據哈希運算為這個區塊連同跟在它後面的所有區塊生成了新的簽名,以此讓網絡中的其他參與者都接受被篡改過的交易。問題在於,網絡中的其他礦工也在原來的鏈上不斷為新的區塊計算簽名。隨著新的區塊不斷上鍊,作惡的礦工也要重新計算這些區塊的簽名。他必須保證所有區塊都鏈接在一起,包括不斷被添加到鏈上的新區塊。除非這個礦工擁有的算力超過全網其他人的總算力,否則他永遠赶超不了其他礦工。
(校對注:這一段的實際意思是,只要礦工都在自己看到的最長區塊鏈上挖礦,所有算力就會隨時間自然匯聚到一條主鏈上,而攻擊者只有製造出一條比當前主鏈更長的鏈,才能成功改變大家共同認可的交易記錄。這種始終以最長鍊為主鏈(有效鏈)的原則,就是所謂的“最長鏈規則”,是Nakamoto Concensus(中本聰共識機制)的一部分。另,並不是所有區塊鏈都採用了中本聰共識。)
如今有數百萬用戶在比特幣區塊鏈上挖礦,由此可以推定某個惡意參與者或實體的算力是不可能超過全網剩餘算力的。這就意味著網絡中的其他參與者不可能接受任何對區塊鏈的修改,從而實現了區塊鏈的不可變性。一旦數據被添加到區塊鏈上,就無法再修改了。
只有一種例外,就是惡意參與者的算力真的超過全網其他人的算力總和。從理論上來說,這種情況下是有可能篡改區塊鏈的(即改變大家共同認可的歷史記錄)。這就叫做51% 攻擊(我寫了另一篇文章來解釋這種情形),過去也有很多區塊鏈遭受過這種攻擊。
(校對注:目前為止,遭受過51% 攻擊的著名區塊鏈有bitGold、Verge、Ethereum Classic。)
實際上,對比特幣區塊鏈發動51% 攻擊所能獲得的收益遠抵不上高昂的攻擊成本。要想獲得足夠多的算力,除了要負擔硬件、冷卻設備和存儲空間方面的成本,還要承擔風險,更重要的是,會對被攻擊區塊鏈的生態系統造成極大的損害,攻擊所得的收益也會大幅貶值。51% 攻擊實際上就是以一己之力對抗區塊鏈上的其他用戶。這也就是為何參與挖礦的用戶人數越多,整條鏈的安全性就越高。
恭喜你已經又進了一階!現在,你應該已經理解(大型)區塊鏈被認為具有不可更改性的原因了吧。不過現在又出現一個很重要的問題:如何防止礦工將偽造的交易數據添加到區塊鏈上?從技術上來說是做不到的。關於區塊鏈交易的詳細解釋可參見這篇文章。
(校對注:只有私鑰掌控者才能花費相應地址中的資金,而礦工並不知道你的私鑰,他人只能通過你公開的公鑰來驗證某筆交易是不是你發起的。所以偽造交易並不可行)
第六階——如何治理區塊鏈?由誰決定規則?
……區塊鏈協議自動以最長鏈上的交易記錄為準,將這條鏈視為代表絕大多數參與者的鏈。打造最長鏈需要消耗全網絕大部分算力。被篡改過的區塊就與最長鏈斷開了鏈接,因此會被全網絕大多數節點自動拒絕。
在比特幣區塊鏈上, 所有交易歷史和錢包餘額都是公開可見的(blockchain.info)。任何人都可以查看任一錢包的餘額情況,或是始自(2009 年1 月3 日的)第一筆交易的所有交易記錄。雖然任何人都能查看錢包餘額,但是這些錢包的所有者大多都是不為人知的。例如,一個錢包裡存有6.9 萬個比特幣,至本文截稿之時價值約5 億美元。這個錢包在2015 年4 月使用過一次,之後就再也沒有過交易。
(校對注:這一部分其實並沒有回答“由誰決定規則” 的問題,隻大概說明了“根據現有規則,這種技術是可以實現的”。公鏈治理是一個複雜的問題,也超出了這篇文章需要說明的範圍了。)
第七階——這些對密碼學貨幣有何意義?
密碼學貨幣從本質上來說都是比特幣的變體。絕大多數加密貨幣都是按照自己的區塊鏈協議搭建的,遵循不同於比特幣的規則。比特幣應當被歸類為一種貨幣,也就是說它明確具備貨幣功能。門羅幣也是一種具有相同功能的加密貨幣,不過它的區塊鏈協議還增加了一些規則來增強隱私性(提高交易溯源的難度)。
不過,用區塊鏈發行的資產可以被賦予很多種不同的用途,這點由發行方決定,如此發行的資產一般被稱為“代幣”。這些代幣可以賦予其所有人某種權利,例如社交媒體渠道、 水電等等。所有這些資產交易都記錄在不同的區塊鏈上,並且可以通過幣安之類的交易所進行線上交易。
代幣其實是一種新型互聯網貨幣,可能會影響到一部分行業,其中一個典型的例子就是股票市場。在未來,公司股份之類的產權很有可能會以代幣的形式存儲到區塊鏈上。區塊鏈不僅限於以代幣的形式代表實物價值,也可以安全地記錄病歷、身份、歷史記錄、納稅記錄等數據。