·2008年,一個叫做中本聰(Satoshi Nakamoto)的人(或團體)定義了第一個區塊鍊。
·2009年1月,中本聰将區塊鍊作為比特币的核心組成部分推出,它是網絡上所有交易的公共分類帳。
由于使用了區塊鍊技術,比特币成為了第一個解決雙重支付問題的數字貨币,它不再需要第三方信任機構,并且成為其他許多應用創新的技術基礎。
我相信在一百年後,區塊鍊将像今天的電力一樣普遍。它會變得像經濟體的基本組成部分一樣,為每個人服務。也會像水一樣平常,以至于我們往往會忽視它的存在。
可以預料的是,在接下來的幾十年中,區塊鍊應用群組織将呈爆炸式增長,就像幾十年前的網際網路或上世紀初的電氣化一樣。
如果上述一切成真,那麼我們很有必要對區塊鍊有一個基本了解,特别要知道它們的重要性以及它們的工作機制。
“許多名人發表演講時都會提到一句名言,盡管這句話說的并不怎麼正确:我們應該培養思考行為的習慣。但文明的進步卻是由越來越多無需思索卻得以運作的重要操作推動。”
——Alfred North Whitehead(艾爾弗雷德·諾思·懷特海,現代著名數學家、哲學家和教育理論家)
以區塊鍊中一方将比特币發送給另一方的交易為例,該交易中諸如比特币來源、目的地和日期/時間戳等細節會被添加到區塊中。
由于密碼學的使用,區塊鍊極大地提高了社會發展的可擴充性(social scalability),個體之間越來越多的合作,正成為文明的必要特征。
在過去的曆史中,人類通常隻以部落為機關,在小圈子裡與有血緣關系的人交易,因為當時人類無法信任部落之外的個體。
在過去幾千年中,各種各樣的技術創新促使人類在更大的群體中進行合作,社交可擴充性被進一步提高。
現代法律制度的完善減少了暴力,盜竊和欺詐的發生幾率,使沒有預先存在關系(pre-existing relationship)的群體或個體以互動。
網際網路則通過評級系統(rating system),促進了預先存在很少或根本沒有社會關系的個體之間的交易。
區塊鍊有潛力将社交可擴充性提高到以前技術所沒有達到的水準。這是我們第一次擁有一種不需要依賴可信的第三方,卻能讓一個網際網路使用者安全地将數字資産轉移到另一個網際網路使用者的方式。如此偉大的交易創舉是如何誇大也不為過的。
除此之外,數字合約、數字密鑰,以及實物資産的數字所有權,包括汽車、房屋、股票、債券,以及數字貨币也值得深思。
什麼是區塊鍊技術
我們先來給區塊鍊技術下個定義:
區塊鍊是一種分類帳,它使用加密技術和激勵措施并以防篡改的方式記錄交易。這使匿名雙方進行信任最小化(trust-minimized)交易,而不需要可信中介。
現在,讓我們整合這些零散的知識,以便你在文章的最後對區塊鍊技術有一個完整認識。
基元
在我們深入研究區塊鍊之前,需要建立一些基元。基元類似于建築材料。如果你想建造一間房子,你需要木料、螺絲、電鑽和鋸子。在你開始建造之前,最好對每個工具都足夠了解。區塊鍊也類似。
區塊鍊的基本構成要素就是加密基元。
而密碼學是研究在第三方(即敵人)的存在下安全通信的技術。
在曆史上,軍方已經進行了大量的密碼學研究,以確定他們能夠安全地進行通信,而不讓敵人閱讀他們的電報或無線電資訊。
現代密碼學被應用于網址、信用卡晶片和計算機密碼之中。它用來阻止第三方(黑客,小偷等)竊取敏感資料,如信用卡資訊。
第一個基本構成要素是哈希函數。
哈希函數
哈希函數是一種允許你對資料進行加密的數學函數。
哈希函數有三個屬性:
它的輸入可以是任意大小。
例如,我可以使用“我喜歡冰淇淋”這個短語作為輸入,或者我也可以使用《戰争與和平》的全部文本,兩者都行。
不論使用任何大小的輸入,哈希函數的特定雜湊演算法決定了其固定大小的輸出。為了讓算法過于簡單,我們将使用256位輸出(它是比特币所使用的)。
不論我使用“我喜歡冰淇淋”這一短語作為輸入,還是使用《戰争與和平》的全文作為輸入,兩者都會産生相同大小的輸出。
使用SHA 256算法,短語“我喜歡冰淇淋”(沒有引号)建立輸出:
138F4504A873C01D0864343FAD3027F03CA9BEA2F0109005FA4FC8C7DCC12634
從古騰堡計劃(project Gutenberg)複制的整本《戰争與和平》(全587,287詞)建立輸出:
57027F5B3877ABBE43ACB101D59E963BC2CC0E86A6EBCCC34DFD035BBF83B096
即使輸入的文本長度相差146,821倍,你也可以獲得相同大小的輸出。這一點很酷也很有用。
函數是可高效計算的,對于任何給定的輸入字元串,你可以在合理的時間内獲得輸出。
即使我使用《戰争與和平》的整個文本作為輸入,它仍然可以在較短時間内将其轉換為輸出。
以上是一般哈希函數的屬性。一般哈希函數允許你将大量資料映射到一個小空間,這有助于存儲和處理不同類型的資料。
不過,我們應把重點放在加密哈希函數上,因為它是區塊鍊中使用的函數。
加密哈希函數有三個附加屬性:
·抗碰撞性(Collision Resistance)
·确定隐匿性(Deterministic Hiding)
·難題友好性(Puzzle Friendliness)
加密哈希函數
抗碰撞性
這裡的碰撞是指兩個不同的輸入産生相同的輸出。雖然輸出大小相同,但輸出本身不會與其他輸出相同。“我喜歡冰淇淋”與《戰争與和平》的整個文本産生相同大小的輸出,但字元不同。
如果它們産生完全相同的輸出,你解密了我發送給你的加密文本之後,并不會知道我是想告訴你“我喜歡冰淇淋”還是你應該閱讀《戰争與和平》。
值得注意的是,兩個“鄰近”輸入不會産生鄰近的輸出。《戰争與和平》的哈希與改變了一個字元的《戰争與和平》的哈希完全不同。
使用SHA 256,整本《戰争與和平》生成哈希值:
57027F5B3877ABBE43ACB101D59E963BC2CC0E86A6EBCCC34DFD035BBF83B096
如果我删除最後一個句點,但保留其他所有内容,則會生成哈希值:
E2E2E4FFD582E20474F0310C2132EAE5F2D766C6A253C1BC4AF57861095B30FA
這非常類似于混沌系統中的兩個“鄰近”起點非常迅速地導緻兩個完全不同的未來軌迹。哈希函數的這種“混亂不規則性”會産生抗碰撞性。它的輸出幾乎随機(理論上并不随機),是以不太可能發生碰撞。我們還能壓縮資料,因為它可以将「無窮大」映射到有限空間。
這一特性在彙款時尤其重要。錢包的公鑰是使用加密哈希函數從私鑰生成的。誰都不希望其他人能夠通過逆向工程擷取公鑰來計算你的私鑰(因為你的錢可能被偷)。
如果沒有人能找到碰撞的情況,則可以認為哈希函數是抗碰撞的。從理論上講,我們知道碰撞的存在是因為輸入的數量是無限的,但輸出的數量是有限的——隻有有限種方法可以排列64個字元。
但在實踐中,加密哈希函數SHA 256是抗碰撞的,因為沒有人發現過碰撞,并且它發生的幾率是天文數字。如果人類制造的每台計算機自宇宙開始以來一直試圖發現碰撞,那麼它發生的可能性低于地球在接下來的兩秒鐘内被巨大的流星摧毀的可能性。
是以,碰撞是可能發生的,但我們首先還有很多其他更重要的問題要解決。
确定隐匿性
哈希值看起來是随機的,但實際上是确定的。是以,它們的輸出是可重制的,隻要你使用相同的輸入,就可以持續獲得相同的輸出。這意味着,知道輸入的兩方可以通過向第三方顯示他們的哈希來驗證對方是否知道輸入。
加密哈希函數的第二個屬性是隐匿性。隐匿性意味着即便給出輸出,也沒有可行的方法來計算輸入。
也就是說,第三方觀察者無法知道
138F4504A873C01D0864343FAD3027F03CA9BEA2F0109005FA4FC8C7DCC12634
的意思是“我喜歡冰淇淋。”
但是,如果我知道輸入是“我喜歡冰淇淋”,那麼通過檢查你的哈希,我可以輕松驗證你是否知道輸入。
然而,如果其他人看到哈希,他們就無法使用它來計算輸入。這允許知道輸入的人使用散列後的輸出在公共頻道中安全地進行通信,而不必擔心第三方觀察者擷取資訊。
難題友好性
第三個屬性是加密哈希函數的難題友好性。這意味着如果有人想要生成一個與“我喜歡冰淇淋”相同的輸出的哈希,那麼找到一個完全符合這一輸出的另一個值是非常困難的。
生成哈希的算法是嘗試每個可能的字元串,按長度排序,然後按字母順序排序,直到得到哈希為相同值的字元串。這等于是大海撈針,是以我們得到的機率表明,小行星消滅地球上的所有生命是一個更緊迫的問題。
另一方面是加密哈希函數難以逆轉(reverse)。相較于資料結構或壓縮算法中使用的哈希,這是加密哈希的主要特點。
這也是區塊鍊軍備競賽的一部分——黑客在逆向推演哈希函數方面做得越來越好,是以密碼學家總是得想出更強大的哈希函數。
除此之外,難題友好屬性使區塊鍊難以篡改。如果我想替換像“我喜歡冰淇淋”這樣的項,我不可能在沒有其他參與者知道的情況下做到。
image
被加密哈希函數散列後,輸入的微小變化也會導緻輸出的顯著不同,進而達到防篡改的目的。
加密哈希函數看起來是随機的(是以沒有碰撞),無法逆轉,并隐匿輸入,但同時它們又是完全确定的。這就是它們有用的原因!
這就是加密哈希函數的基礎知識,下面我們來談談如何用這些哈希函數來建構區塊鍊。
區塊鍊内的傳遞哈希函數
上面關于哈希函數的部分實際上隻是對如何散列單個資訊(例如書籍或密碼中的單詞)的詳細介紹。
如果你想要散列資料集合(如一堆文檔或一系列交易),該怎麼辦?
讓我們從「連續散列的線性序列」講起。首先從一些資料A開始,然後将其散列以獲得A#。
現在你想“混入”資料B。是以隻需要添加B(A#+ B)并擷取整個資料的哈希值。現在你有了一個新的哈希(B#),它包含一些關于A(來自你使用的哈希A#)和B的資訊。
你得到的是一個改變A或B的任何東西都會産生不同的最終哈希值的哈希函數。這是一個傳遞哈希函數。
image
當人們談起區塊鍊,其中一個被大量提到的詞是“信任最小化”。
一般而言,哈希,特别是哈希指針,是區塊鍊信任最小化屬性的核心元件。哈希指針隻是指向某些其他資料結構(如前一個區塊)的哈希。
這是一個了不起的元件,因為它很容易看出是否有人篡改資料。
假設我們有一個包含100個區塊的區塊鍊,而第十個區塊包含整個《戰争與和平》文本的哈希,我在文本中更改了一個字母,它将改變該區塊和所有後續區塊中的哈希指針。
哈希指針確定分類帳的完整性(即不被修改)。區塊鍊被稱為三重登帳(triple entry accounting)的原因是哈希指針這種資料結構難以被篡改。
例如,如果有兩個人在一個項目上進行協作,而一個人試圖回去修改某些東西以便他們能賺更多的錢,那麼他們的合作夥伴就會立即獲悉他們正在作弊——他們最終得到的哈希是不同的。
Merkle樹
現在,我們想要散列的不僅僅是一個線性序列,而是一系列集合,比如比特币在其區塊序列中的交易集合。那麼就需要建構的是周遊每組資料的規則,通過再次減少問題以加密連續的一系列事物(A#,B#等)。
這裡就引出了Merkle樹。Merkle樹允許你對資料區塊進行分組并将它們一起散列到一個樹枝結構中。
image
與區塊鍊一樣,隻要我們知道樹的“根”處的哈希點,我們就可以知道樹中任何資料是否被篡改過。
如果一個交易中的一個比特被更改,那麼它會更改後續的每個哈希并顯示篡改。
使用Merkle樹優于僅使用記錄所有交易的摘要,因為它能更快更簡單地檢測某特殊交易是否包含在所有交易的集合中。
區塊鍊
在上文中,我們提到了哈希函數以及它的三個屬性:抗碰撞性,确定隐匿性和難題友好性。那麼接下來,我們就将加密哈希函數連接配接在一起以建立傳遞加密哈希函數。
首先,當我們将一個Merkle樹添加到傳遞加密哈希函數時,會得到一個區塊鍊。每個區塊包含一組“merkleized”交易,并且這些區塊被連結在一起。
image
區塊鍊工作量證明
中本聰的偉大在于他制定了一個新規則:你必須先解決一個非常困難的數學問題,才能将一組新交易(即一個區塊)添加到現有鍊中。
這就是“礦工”的工作。他們需要解決一個非常困難的數學問題,在解決問題後他們會收到相應的獎勵。這也被稱作“工作量證明”,它是解決問題所消耗計算量的證明。
“區塊鍊工作量證明”的發明是中本聰的最大創新。
由于使用工作量證明,像比特币這樣的區塊鍊變得更有價值,礦工憑此賺到更多的錢,同時它激勵更多的礦工進入網絡,當然也會增加數學問題的難度。
任何人都可以在他們的計算機上下載下傳區塊鍊,并且連續驗證每個區塊是否可以正确地散列。
他們還可以通過讀取每個區塊的難度并驗證礦工的解決方案來計算生成此資料所需的計算量。
具有最多累積工作量證明的區塊鍊(即最困難和最昂貴的)被認為是真正的區塊鍊。
如果你擁有包含整個目前比特币區塊鍊的磁盤,你可以快速地估算出用于建構這些資料所消耗的巨大能量。
這樣做的好處是如果沒有達到相應的算力,沒有人可以“僞造”比特币區塊鍊
至2018年中,如果從頭開始建構比特币區塊鍊,可能需要花費數十億美元購買計算機和電力。
數字簽名(即私鑰/公鑰加密)
數字簽名是架構區塊鍊的最後基元。可行的數字簽名方案與手寫簽名大緻相同,它們都具有兩個核心屬性。
首先是可驗證性。如果我使用私鑰簽署交易,則其他人必須能夠使用我的公鑰對其進行驗證。類似的,隻有你自己可以簽署自己的簽名,但任何人都可以看到它是你簽署的。
私鑰和公鑰比對為密鑰對。私鑰不與其他人共享,它用于簽署并證明交易。
公鑰則可以提供給每個人,他們用公鑰驗證你的簽名,而無需他們自己簽名。
你的公鑰是私鑰的哈希值。而你的位址(例如接收比特币的位址)是你的公鑰的哈希值。
如下所示:
私鑰==散列==公鑰==散列==位址
由于加密哈希函數的隐匿性,你可以毫無顧慮地釋出自己的位址,其他人可以向你發送比特币、以太币等加密貨币,卻無法反向找出你的私鑰。
第二個屬性是不可僞造性。你的簽名與特定文檔相關聯。自然地,你不會希望其他人能夠從一個檔案中“剪掉”你的簽名再将其粘貼到另一個檔案的底部。
比特币使用橢圓曲線數字簽名算法(Elliptic Curve Digital Signature Algorithm)來實作這兩個屬性。其他區塊鍊和數字加密貨币使用不同的數字簽名方案,但都具有可驗證性和不可僞造性這兩個屬性。
區塊鍊類似于書籍
我認為将區塊鍊視作書籍可能是研究它的最簡單的方法。一本書是一系列頁面:
1.資料——每頁上的文字。
2.中繼資料——中繼資料是資訊本身。在每一頁的頂部或底部,有一些關于書籍的資訊,如書名,章節标題和頁碼。
區塊鍊是一系列的區塊:
1.資料——區塊的内容
2.中繼資料——對前一個區塊的引用和該區塊中包含的資料的哈希。
即便你撕下書中所有頁面,你仍可以重新按照頁碼組合它們。
同樣,在區塊鍊中,每個區塊都引用前一個區塊的哈希值,進而可以驗證交易發生的順序。
哈希實際上比頁碼更強大,因為哈希包含該頁面的所有資料。而撕下一本書中的某一頁并塗改其他相關頁碼是有可能騙過你的。
然而在區塊鍊“書”中執行相同的操作是極其困難的,因為更改頁面上的任何一個字母都會改變哈希值。
區塊鍊技術的演變
現在,讓我們組合這些基元,看看它們如何建構簡單的區塊鍊。
以下這些類型的區塊鍊是比特币和以太坊等數字加密貨币的基礎。了解它們的工作原理對了解其他所有區塊鍊和數字加密貨币都有幫助。
Goofy Coin
GoofyCoin是我們可以設想的最簡單的區塊鍊。
Goofy可以随時創造新的虛拟貨币,并且這些新創造的虛拟貨币歸他所有。每一個币有Goofy用私鑰簽名的唯一ID,這樣所有人都可以使用Goofy的公鑰來确認币是有效的GoofyCoin。
image
擁有Goofycoin的人可以通過加密操作将其轉移給其他人。如果Goofy想要将一枚虛拟貨币轉移給Alice,他會建立一個交易,說“将這筆錢(this coin)交給Alice”。
因為Goofycoin隻能通過加密操作發送,是以“this”是指向所讨論虛拟貨币的哈希指針。Goofy用他的私鑰簽署此交易,使其成為有效的交易。任何人都可以通過确認Goofy的簽名來檢查它是否為有效的交易。
image
但是,事實上GoofyCoin存在安全問題,Alice可以用她剛獲得的虛拟貨币進行一項交易,比如向Bob支付三明治的費用。
image
但是,如果Alice又使用它來購買Chuck的奶昔呢?
image
Bob和Chuck都會認為他們現在擁有一枚GoofyCoin。它們看起來都像是有效的交易,因為Chuck和Bob可以看到Alice的簽名并在區塊鍊上追蹤它,并發現它是有效貨币。
這種情況被稱為雙重支付攻擊。我們當然不能容忍用同一枚虛拟貨币既買到三明治又買到奶昔。
雙重支付攻擊是功能性加密貨币需要防範的主要問題之一。
為了解決雙重支付問題,我們需要建立一個名為ScroogeCoin的新虛拟貨币。
ScroogeCoin
ScroogeCoin類似于GoofyCoin,但有做出了一些不同的改變。
與GoofyCoin不同的是,Scrooge釋出了一個包含所有交易曆史的區塊鍊。
Scrooge會簽署區塊鍊中每個區塊的哈希指針。那麼任何人都可以通過檢查區塊上的Scrooge簽名來驗證交易是否有效。
image
因為Scrooge檢視過每筆交易,是以他可以確定沒有人雙重支付。如果Alice使用虛拟貨币從Bob那裡購買三明治,Scrooge能通過拒絕驗證該交易來防止Alice使用該貨币從Chuck處購買奶昔。
因為所有區塊都由哈希指針連接配接到區塊鍊中,是以Alice、Bob、Chuck和其他任何使用ScroogeCoin的人都可以監視Scrooge是否回去更改過資料。由于Scrooge是區塊鍊的控制者,他們無法阻止Scrooge更改資料,但他們至少是知情的。
假設一年前,Alice買了Bob的三明治并支付了1個ScroogeCoin,Scrooge将交易記錄改變成Alice支付了10個ScroogeCoin,那麼後續每個區塊的哈希指針都會發生變化。人們很容易知道Scrooge已經篡改了資料。這就是我們之前提到的難題友好屬性。
這樣做能提升人們對區塊鍊中資料的信任。
ScroogeCoin的工作原理是讓每個人知道哪些貨币有效。隻要Scrooge監控所有交易并拒絕雙重支付,雙重支付問題就不存在了。同時區塊鍊上的所有參與者也可以确認Scrooge的驗證。
ScroogeCoin的潛在問題在于Scrooge本人。如果Scrooge願意,他可以通過幾種方法讓自己暴富。比如要求參與交易的每個人為交易支付大筆小費,或者他可以自己建立一堆ScroogeCoin,或者他可能僅僅是因為感到無聊而停止驗證交易。
簡而言之,問題出在中心化。盡管Scrooge很開心,但使用者可能對系統并不滿意。這個系統與我們現在使用的中心化系統沒有什麼不同。
Scrooge:“别擔心,我很誠實的。”
你可以将“Scrooge”替換為其他許多銀行的名字,Scrooge與現有銀行系統的運作方式沒有什麼不同。在大多數情況下,我們相信銀行或其他金融中介不會篡改交易,因為這些機構受到國家監管并與同業競争。由于現存銀行系統運作良好,許多人特别是發達國家的人不能看到區塊鍊的價值所在。
但是,現存銀行系統并不是百分之百可靠。
當一個國家制造過多的鈔票時會出現惡性通貨膨脹。比如,20世紀30年代的魏瑪共和國,2000年初的阿根廷和辛巴維(威),以及2010年的委内瑞拉。
以上這些情況相當于Scrooge為自己制作大量的Scrooge貨币。
區塊鍊從中心化(例如ScroogeCoin)轉向去中心化主要有兩種方式。
·私有區塊鍊(即Permissioned blockchains)
·公共區塊鍊(即Permissionless blockchain)
公共區塊鍊和私有區塊鍊之間的差別,在于允許加入網絡的身份限制。
·公共區塊鍊網絡是完全開放的,任何人都可以加入。比特币和以太坊就是典型的公有鍊。(非許可鍊)
·私有區塊鍊網絡則需要邀請。它對允許參與網絡或交易的身份設定限制。MultiChain,R3的Corda,Hyperledger Fabric和Chain Core是典型的私有區塊鍊。(許可鍊)
身份限制如此重要是因為它影響了去中心化的實作程度。在ScroogeCoin的示例中,它遇到了同樣的中心化問題,即單個的受信任第三方控制整個系統。
公共區塊鍊由加密經濟學和加密貨币挖掘機制保證運作。(即,使用經濟激勵、博弈論、密碼學和計算機科學等技術來保證分類賬的一緻性)。
私有區塊鍊由其共識過程預先標明的一組參與者(例如,個人、公司和聯盟成員)控制。例如,你可以擁有15個庫,并且每個庫都有權寫入分類帳,每個庫必須對每個區塊進行簽名才能使該區塊有效。
它比僅使用單一方驗證所有交易的區塊鍊更加去中心化。
文章開頭我們讨論了區塊鍊為何如此重要:
它允許大量沒有預先存在社會關系的個體進行交易。
接着我們探索了區塊鍊的基元即加密哈希函數,它具有三個重要屬性:
·抗碰撞性
·确定隐匿性
·難題友好性
然後,我們介紹了哈希函數如何串聯成一個傳遞哈希函數。當我們将Merkle樹添加到傳遞加密哈希函數時,我們得到一個區塊鍊。每個區塊包含一組“merkleized”交易,并且塊被連結在一起。
緊接着我們講解了比特币使用一種稱為工作量證明的技術來確定區塊鍊的安全性。
下一步,我們設計了Goofycoin和Scroogecoin,由此看到區塊鍊技術如何進化并完美解決雙重支付問題。
最後,我們談到了私有鍊與公有鍊在實作去中心化機制上的差別。
區塊鍊仍然是一項非常年輕的技術,在2009年才問世,我們可以預料到在未來幾十年内,大量的區塊鍊應用和網絡會呈爆炸式增長。
目前已有數千個不同的項目緻力于提升區塊鍊技術并研究其在各領域的應用。相信讀完這篇文章,你也已經對區塊鍊技術背後的基本要素以及區塊鍊的工作原理有了一個整體的認識。
最後,我認為,下一代區塊鍊技術的最大創新尚未出現,但現在就是學習和投入區塊鍊技術最好的時間。