進入網站
進入網站

區塊鏈教學(基礎知識入門)

區塊鏈教學(基礎知識入門)

早在1999 年,文件共享網絡Napster 就出現了,可方便用戶在混合對等網絡(之所以使用“混合”一詞是因為它使用了中央目錄服務器)上輕鬆共享音頻文件(通常包含音樂)。文件共享網絡不僅僅可用於共享音樂文件,還允許所有用戶保留這些共享文件的副本。這樣一來,單個數字資產就會跨全球網絡生成無限個合理副本。這項技術簡單易用,只要有計算機,任何人都可以利用它。這讓備受尊崇的淘兒唱片業績意外下滑。到2006 年,淘兒唱片被迫關閉了它在美國國內的所有89 家門店。

2008 年,金融危機爆發。在此期間,成立已久、實力強大的美國金融機構和保險公司紛紛宣布破產或瀕臨破產邊緣。在這種情況下,聯邦政府必須立即乾預,以免爆發全國性乃至全球金融危機。這一重大事件讓民眾對中央銀行心存疑慮,並揭露了資金賬本不接受公眾監督的危險性。2008 年3 月,哈特蘭支付系統公司數據洩露曝光了超過1.3 億信用卡號,導致其中許多信用卡號後來被盜用於進行欺詐性購買。

這些事件說明了生活在數字化互聯世界的極大危險性,不僅依賴交易費用生成中間商,還易受數字攻擊、貪婪和犯罪行為影響。學術挑戰在於,如何創建脫媒數字基礎結構,用於在所有者之間公開可靠地轉讓(而不是複制和共享)數字資產,既沒有腐敗或不可靠的中央集權機構,而又安全且可信任。

比特幣區塊鏈入門

2009 年1 月3 日,出現了一種新型基礎結構,似乎是在歷史背景下應運而生。它挖礦獲得50 個數字幣,並將它們記錄在防篡改公用賬本上。此帳本被複製到由已聯網計算機組成的分散式對等網絡上。這50 個加密貨幣單位就稱為“比特幣”,記錄為創世區塊,即被認為是比特幣區塊鏈的第一個鏈接。

這種由區塊鏈提供技術支持的加密貨幣的非凡之處在於,不通過任何信任或監管機構(如銀行或政府)驗證每筆交易。此外,它還讓交易脫媒,即使用不涉及中間商(如代理或代理機構)的全球網絡,在全球範圍內轉讓數字貨幣。由於依賴新式加密,因此區塊鏈中的數據是防篡改的匿名數據。此外,因為給定區塊鏈被複製到對等網絡中的每個節點,所以沒有單一故障點,確保了這項技術的可用性和可靠性。

自比特幣推出以來,區塊鏈技術快速發展,不斷成熟完善。區塊鏈實現細節的差異很大,這就讓區塊鏈研究成為一項不斷變化且非常複雜的龐大任務。實際上,“區塊鏈”一詞不再只適用於通常所說的加密貨幣,特別是比特幣。區塊鏈正在不斷優化和完善,旨在成為更快更智能的技術。實際上,一些區塊鏈技術允許編寫腳本來支持智能合同,這樣就可以將自定義規則應用於交易。這樣一來,區塊鏈就已演變成一種新型可編程的防黑客存儲技術。正是出於這一原因,IT專業人士、企業、金融機構等強烈要求發揮它的真正潛能。

如果一直在局外觀望區塊鏈,現在是時候急起直追了。這是一篇介紹性文章,不可能涵蓋所有區塊鏈技術的詳盡技術細節,每項技術都有自己的規則、功能和自定義。不過,我在本文中介紹了許多概念,將有助於讀者了解眾多新式區塊鏈技術所依據的核心技術基礎。

區塊鏈的工作原理

比特幣區塊鍊是世界上首個區塊鏈技術實例。由於這種特質,“區塊鏈”經常被誤解為與比特幣密不可分。不過,新式區塊鏈技術產品/服務跟踪除數字貨幣外的數字資產,此類區塊鏈的工作原理與比特幣區塊鏈大不相同。此外,比特幣區塊鏈還推廣了一種觀念,即區塊鍊是數位化銀行賬本的數據結構,具體是通過跟踪借貸,同時提供有創意的加密解決方案,以有效禁止加密貨幣單位的雙重支出。因此,“數字賬本”和“雙重支出”術語就與加密貨幣區塊鏈關聯起來。不過,這兩個術語分別廣泛應用於跟踪所有權和強制單次轉讓數字資產。看到這兩個術語時,不要以為它們只是指面向加密貨幣的區塊鏈技術。

從本質上講,區塊鍊是一種防篡改數據結構,可以跟踪在所有者之間傳遞的有價值或感興趣內容。這裡所指的“內容”可以是任何一種數字資產,如數字幣、Word 文檔或Microsoft Surface 平板電腦序列號。實際上,只要是可以與唯一數字指紋關聯的項,就能在區塊鏈上進行跟踪。區塊鏈要求轉讓數字資產所有權,而不是複製或共享,解決了所謂的“雙重支出”問題。不過,區塊鏈技術的有趣之處在於,它不僅建立了協議和強制執行交易規則,還能夠讓計算機分佈式網絡中的節點自我監督整個操作。而且,它是在沒有中央服務器或信任頒發機構的情況下,迅速在全球範圍內完成了這一非凡壯舉。這樣的前景激起了人們的興趣,希望通過它來消除中間商、減少或停徵交易費用,同時讓企業和使用者都能提高商務效率。

區塊鏈核心組成部分

比特幣區塊鍊網絡是公用的。也就是說,任何人可以隨時隨地參與進來。不過,新式區塊鏈產品/服務(如Microsoft Azure 託管區塊鏈)可以配置為公用網絡、專用網絡或特權網絡。雖然區塊鍊是分散的,但分散的含義需要進一步澄清。正如Vitalik Buterin 所解釋(bit.ly/2tEUYyT),“分散式區塊鏈”是指它們“不僅在政治上是分散的(不受任何監管),在體系結構上也是分散的(無基礎結構中心故障點),但它們在邏輯上並不是分散的(有一個共同商定的狀態,且系統就像一台計算機一樣運轉)”。分散化提供容錯、攻擊防禦和勾結防禦(稍後我將介紹工作量證明,屆時此含義就會變得清晰明了)。

若要了解如何設計公用區塊鏈,需要了解加密哈希、公鑰加密(PKC)、二叉哈希鏈(特別是Merkle 樹)和一致性算法。我將簡要回顧一下這些概念,並介紹區塊鍊是包含交易哈希鏈​​的哈希鏈。掌握此嵌套哈希鏈概念後,就會理解區塊鏈技術的基本設計。

加密哈希:雖然有許多單向加密哈希算法變體,但通常選用的是SHA-256 (bit.ly/29kkpft)。這是一種單向哈希函數,接受最大為(264-1)/8字節的消息,並返回32字節的哈希值(64個十六進製字符),十進制範圍介於0和約1.16 x 1077之間。為了能夠正確看待數量級,需要指出的是,一滴水大約包含5 x 1012個原子;可觀測宇宙的原子數估計介於1078和1082之間。調整消息中的任何字符,並重新計算SHA-256哈希值,就可以生成全新的哈希值。(若要試驗,請訪問onlinemd5.com,並將文件或文本校驗和類型設置為SHA-256。)

如果輸入相同,SHA-256 算法始終生成相同的定長輸出。對於區塊鏈技術,使用SHA-256 加密哈希的價值在於,它們是唯一的,可同時用作數字指紋和校驗和。此外,(作為慣例)單向哈希函數不能進行解碼。以我名字的SHA-256 值為例:8F12D83BA54AC0EA7687AD4AFDE5E258BBFF970AA8D60C6588381784C502CA8E。由於這是哈希值,因此實際上無法使用算法反向推出我的名字。(一種黑客技術利用的是彩虹表,其中列出了已計算出的常見字符串(如“密碼”)哈希值,但這也不是通過算法來反向推出哈希。為了抵禦此類攻擊,慣例做法是通過附加隨機字符串(稱為“加密鹽”值),修飾要哈希處理的字符串。)

如果沒有SHA-256 生成器可用,請參閱圖1 中的表,它表明不同長度的字符串始終生成64 位十六進制哈希值,以及對任何字符串稍作更改就會導致結果完全不同。

圖1:使用SHA-256 算法對各種長度的字符串進行哈希處理

輸入字符串

SHA-256 哈希值

m

62C66A7A5DD70C3146618063C344E531E6D4B59E379808443CE962B3ABD63C5A

M

08F271887CE94707DA822D5263BAE19D5519CB3614E0DAEDC4C7CE5DAB7473F1

M1

2D214CA69B86C255BE416D42CCA977A59B34A7492873105522C35015FAB806F0

M2

0892A10ECE1F933EE98F5D554601B28F8437801D1AA1B77799E4035DDCB6950C

三月

9D95A2CF0D7180B5089691163B188A7203B0CDE179346B8CFAA8AB6C2C3E6414

March 1, 2018

767328E7367048FA9DB37354CFA43DBB1691E8330DB54D54F52C1A444CA2E680

March 2, 2018

CCF33BF1C08B74EDE6A7C15C56EEC16269D83967670032ACDA6EE395361B7595

有時,哈希值會進行雙重哈希處理。也就是說,通過應用第二輪SHA-256 算法,再次對第一個哈希值進行哈希處理。如果對圖1 中的值進行雙重哈希處理,最終會生成圖2 中的結果。

圖2:對圖1 中的值進行雙重哈希處理

輸入字符串

雙重SHA-256 哈希值

m

A5FCE7E78734EC317F83F9019C80FFAF2508689B06EFA02191495A7D21FECE9A

M

6F6DCF58526B0D29EE664A708A939B7CDAC124A6A8569FCACE46FEAD38868E2E

M1

6C5D08BE9FFBBABD24B5F19AFFE6590FD402D347A50B519A59D40E15DCC0A6CB

M2

B2307311CC5877D5A581EDC821F3BFD5F99EB4E3B1D1B4009D9545BCF07E2E1A

三月

B5410E155022AE6EB22CA21FADEDE65F0F7296DE14CA1D7A720A4937BD23AA5D

March 1, 2018

345DD725FEE80F8C5953A66C1495605E4ED01C4CE5AEF6C0A6D238999266A1A6

March 2, 2018

3E85B3D910BA77F88ECD5E24D1396457C532C73B89C032DED9AD0CBB4D4D9794

公鑰加密:回顧一下,區塊鏈的主要功能之一是,跟踪數字資產的所有權。相關數字資產可能一文不值,也可能價值數百萬美元。因此,所有權測試必須確保所有者是無法假冒的。為了在數字領域進行此類測試,區塊鏈利用的是PKC,以便所有者能夠對資產進行數字簽名,以證明所有權和授權資產轉讓。與使用一個私鑰加密和解密消息的對稱密鑰加密不同,PKC使用非對稱密鑰加密。

由於數字資產所有權的精確驗證算法對區塊鏈至關重要,因此它們採用依賴橢圓曲線數字簽名算法(ECDSA) 的高安全係數公鑰/私鑰對生成策略。ECDSA 的優點在於,它創建的密鑰雖然長度較短,但加密安全係數高於常用算法數字簽名授權(DSA) 生成的相同長度密鑰。只要需要,用戶就可以訪問軟件應用程序,以使用ECDSA 生成加密密鑰對。用戶必須保留私鑰備份,因為必須使用此密鑰,才能轉讓或利用在區塊鏈中存儲的數字資產的價值。如果只有權訪問私鑰/公鑰對中的私鑰,可以重新生成公鑰,因為這兩個密鑰之間存在一種數學關係。不過,無法通過公鑰生成私鑰。也就是說,如果只備份一個密鑰,請務必備份私鑰!

通常採用兩種方式之一使用這些密鑰。第一個用例(見圖3)是,希望有人向你發送只有你才能打開的加密消息。為此,請向對方提供你的公鑰,讓其使用此公鑰加密文檔,具體是通過軟件應用加密算法,並生成已加密文本(即加密版消息)。然後,對方就會向你只發送已加密文本。由於對方使用的是公鑰來加密文檔,因此必須使用正確配對的私鑰才能解密文檔。

區塊鏈教學

圖3:希望有人向你發送只有你才能打開的加密文檔/消息時使用PKC

第二個用例(見圖4)是,希望加密消息並證明它確實由你發送。為此,請使用私鑰創建文檔的已加密文本。然後,將此已加密文本發送給其他人。對方會使用你的公鑰來解密文檔。由於只有你的公鑰才能解密文檔,因此收件人可以認為文檔是由你的私鑰加密。也就是說,除非私鑰被盜用,否則文檔就是由你發送。

區塊鏈教學

圖4:希望向其他人發送加密文檔/消息並證明它確實由你發送時使用PKC

第三個用例使用PKC 通過數字簽名流程來證明數字資產所有權。在此用例(見圖5)中,假設Bill 已編寫具有法律約束力的Word 文檔,他需要通過電子郵件方式將文檔發送給Susan。Susan 希望確定她從Bill 處收到的文檔副本確實是由Bill 發送,而且在途中尚未被篡改。Bill 先創建Word 文檔的SHA-256 哈希,並將值記錄為H(W)。接下來,他使用自己的私鑰對文檔哈希進行加密,生成Enc(H(W)),再向Susan 發送Word 文檔(可視情況加密)和Enc(H(W)) 值(這是Bill對文檔W 的數字簽名)。

區塊鏈教學

圖5:使用PKC 和加密哈希對文檔/消息進行數字簽名

Susan 通過她收到的Word 文檔副本重新計算H(W) 值,再使用Bill 的公匙解密Enc(H(W)) 值(見圖6)。如果Susan 計算的哈希值等於解密的H(W) 值,Susan 可以得出下列結論:Bill 對文檔進行了簽名,並且她收到的副本與Bill 簽名的文件完全相同。

區塊鏈教學

圖6:使用PKC 和加密哈希驗證文檔/消息是否由預期方進行簽名

使用哈希和PKC,區塊鏈維護了數字資產所有權的交易歷史記錄。交易數據對象相互鏈接,形成稱為“哈希鏈”的數據結構。工作原理是,每個交易記錄都會構成消息(m),此類消息先通過函數(H) 進行哈希處理,再通過所有者私鑰(s) 進行簽名。(慣例做法是,使用“secret”的首字母“s”表示私鑰,以免與表示公鑰的“p”混淆。) 這就生成了簽名(sig):

sig =  signature ( H ( m ) , s )

在數字資產從一個所有者轉讓給另一個所有者後,新所有者會檢查、驗證它的數字簽名並進行數字簽名,再將它註冊為哈希鏈上的新節點。儘管實現細節因區塊鏈技術和版本差異很大,但對於所有這些技術和版本,基本概念是相同的。例如,如圖7 所示,Bill 是數字資產的所有者,他使用私鑰發起向Susan 轉讓數字資產。Susan 的交易記錄使用Bill 的公鑰來驗證他的簽名。在此之後,Susan 使用公鑰對數字資產進行簽名,讓Susan 成為新所有者。這就會新建交易記錄,即交易哈希鏈​​上的新鏈接。

區塊鏈教學

圖7:交易哈希鏈​​使用數字簽名轉讓數字資產所有權;每個交易記錄都保留有對哈希鏈中上一個交易的加密反向鏈接

此交易哈希鏈​​受加密保護,並且防篡改。對交易0 的任何更改都會導致Sig0 變化,要求更新在交易1 中存儲的哈希值,以及哈希鏈上的每個後續交易。

圖中的交易對象包含數據。每個交易包含的數據因各個區塊鏈實現而異。所以鑑於此,我已抽象化處理基礎數據,因為要明白的要點是,哈希鍊是一種加密鏈接的交易鏈,即由上一個所有者的交易記錄的哈希值鏈接起來。(在加密貨幣區塊鏈中,每個交易對像都包含數字貨幣輸入和輸出列表,以及元數據(如時間戳和可選的交易費用)。這些加密貨幣輸入和輸出提供對財務賬本進行精確建模所需的交易詳情。)

Merkle樹:一些區塊鏈使用另一種哈希鏈捆綁交易,即二叉哈希鍊或Merkle樹。完整的Merkle樹稱為“二叉樹結構”,因為它從根開始每個級別都有兩個分支,如圖8所示。

區塊鏈教學

圖8:Merkle 樹是一種生成Merkle 根哈希的二叉哈希樹;此數據結構可以有效添加葉節點,併計算新Merkle 根,而無需完全重新計算

Merkle 樹的創建方式是,計算每個交易對像中數據的SHA-256 哈希,以創建一系列葉節點(比特幣區塊鏈對每個Merkle 節點進行雙重哈希處理;雙重哈希處理有助於在SHA-256 算法中發現漏洞的情況下,強化哈希結果中的加密值)。Merkle 樹要求必須有偶數個葉節點。也就是說,如果開始時為奇數,慣例做法是複制最後一個葉節點。然後,每一對葉節點一起進行哈希處理,生成新哈希值。在圖8 中,葉A 將交易A 的哈希顯示為H回答:;葉B 將交易B 的哈希顯示為HB 表示同一個數字。此模式繼續應用於每個樹級別,一直應用到最終的根節點。根節點的哈希值是樹中其他所有哈希和的加密哈希和。對任意葉節點中數據的任何更改,都會導致重新計算的Merkle 樹根哈希值發生變化。

Merkle 二叉哈希樹結構具有一些優點。例如,它可以輕鬆更新交易中的數據,併計算新Merkle 根哈希,而無需從頭開始生成整個Merkle 樹。例如,如果(圖8 中突出顯示的)交易E 發生了變化,只需高效地為樹中每個級別反向計算一次新哈希,一直計算到Merkle 根即可。因此,先計算新葉哈希HE;再計算HEF ,依據為HE 和HF;再計算HEFGH ,依據為HEF和HGH;再計算新Merkle 根哈希,依據為HABCD 和HEFGH。更新Merkle 根哈希只需進行4 次計算,而從頭開始生成Merkle 樹則需要進行15 次計算!

生成區塊鏈

若要生成區塊鏈(見圖9),必須以某種方式將包含交易的二叉哈希鏈數據對象提交到可供所有人使用的防篡改數據存儲中(請注意,這是公用區塊鏈,網絡上的任何節點都可以對它執行讀取或寫入操作)。由於Merkle 樹結構包含交易且防篡改,因此似乎可以用作區塊鏈。不過,存在幾個問題。Bill 必須信任以代理身份處理他的數字資產轉讓請求的服務或網站,並且必須信任暫留哈希結構的服務器,才能將他的數字資產發送給Susan。如果沒有處理新交易的中央節點,或沒有委託處理事務的中央集權機構,任何節點都可以處理Bill 的掛起交易。具有超高處理能力的未授權節點或基準節點會縱容無效或欺詐性交易發生,這些交易可能會傳播到可靠節點。為了解決此問題,網絡可以嘗試隨機分配一個節點來處理Bill 的交易,但這會再次集中控制權,並要求相信隨機數生成器確實是在強制實現隨機性。為了杜絕此問題,區塊鏈使用一致性算法,如下所述。

區塊鏈教學
圖9:區塊鏈由區塊組成,這些區塊繼而包含交易哈希樹;區塊鏈上的區塊反向鏈接到前面的區塊,並通過工作量證明算法進行驗證

一致性算法:區塊鏈技術通過遵循規定如何添加和維護區塊的協議,杜絕了集中數據存儲和信任授權問題。為此,它們強制執行區塊鏈生成一致性算法。一致性算法有多種不同的種類,我將介紹的是工作量證明(PoW)算法工作原理。

PoW 的依據是,網絡上的一個節點需要通過產生的費用和解決計算難題所需的耗時,證明它的合理意圖。為了讓節點參與此類系統並遵守規則,網絡提供激勵(通常是金錢獎勵)。也就是說,節點運算符向區塊鏈添加區塊時就會得到報酬。為了贏取金錢獎勵,節點必須驗證所有交易(以確保它們符合區塊鏈的特定規則),再解決加密難題。

我在前面提到過,中央集權機構可以隨機分配節點來處理一批新交易。這種方法需要使用中央隨機數生成器,但它可能會有缺陷、遭黑客攻擊或禁用。不過,為節點提供待解決的難題可以帶來預期效果。無法預先確定第一個解決難題的節點,這就形成了網絡節點的某種不可預測性。無需中央集權機構,這是區塊鏈技術的關鍵創新之一。我還提到了區塊鍊是分散式的,因此提供勾結防禦。由於PoW 在計算能力方面投入了時間和成本,因此任何一個節點或一組節點都幾乎無法在網絡上進行勾結,並且與其他對等節點相比,具有區塊鏈生成優勢。(存在“51% 攻擊”風險,表明如果一組節點的計算能力最終達到51%,就會出現勾結;但如果採用PoW 一致性算法,就不可能發生這種攻擊。)

為了構造交易區塊,節點需要獲取在網絡上存儲的未處理交易,並生成Merkle 樹來計算Merkle 根哈希。因此,候選區塊包含交易列表和區塊標頭,其中標頭包括Merkle 根哈希值、當前時間戳和PoW 難度級別(有時還附加有標頭數據)。然後,它必須解決PoW 難題,這涉及計算雙重哈希的整個256 位區塊哈希值,再找到32 位數字nonce。可以將此數字與哈希值連接,生成288 位數字的哈希,這樣結果中就帶有一定數量的前導零。此32 位nonce 介於0 和232 (4,294,967,295) 之間。因此,慣常做法不是直接嘗試猜測nonce,而是從nonce 0 開始,生成SHA-256 哈希,並確定它是否有目標數量的前導零(也就是說,生成的哈希值小於目標值);如果沒有,節點會增加nonce 值,並再次嘗試。如果節點嘗試了所有nonce 值都未能解決難題,它會重新計算區塊哈希值。這就保證生成不同的區塊哈希值,因為區塊標頭中的時間戳包含在區塊哈希計算中。節點可以隨時選擇一批不同的掛起交易,以供添加到新區塊中(或添加自上次檢查起可能出現的新掛起交易),這會更改Merkle 根哈希值,並會連同時間戳一起更改新計算出的區塊哈希值。每次重新計算區塊哈希時,節點都會再次遍歷所有超過40 億個nonce。

隨著時間的推移,網絡上的某節點將會解決加密難題。此時,它會將新區塊添加到區塊鏈副本末尾(每個節點維護一個區塊鏈副本),再將新區塊廣播到網絡上的其他所有節點,這樣它們就可以更新自己的區塊鏈副本了。如果節點廣播新區塊,其他節點不會簡單地相信新區塊是有效的,它們會通過驗證區塊向自己證明這一點。若要進行驗證,節點只需通過計算與nonce 值連接的區塊SHA-256 哈希,即可驗證PoW 難題解決方案,並驗證生成哈希的結果是否包含區塊PoW 難度值所指定數量的前導零。

順便提一句,在某些區塊鏈上,協議會不斷調整PoW 難度值,以便按規定的時間間隔將新區塊添加到區塊鏈中。這種持續調整是必要的,因為節點在網絡中不斷出現和消失,導致節點的平均計算能力總是在變化中。請注意,在PoW 中,向區塊鏈添加區塊是有激勵的。因此,節點管理員通常會增強硬件,以競爭獲取獎勵。在比特幣區塊鏈上,難度值每2016 個區塊調整一次,這樣區塊就可以每區塊10 分鐘的平均速率繼續添加。

有時會出現分支。這是因為在大型網絡中,新區塊傳播需要時間。在傳播過程中可能會出現的情況是,另一個節點解決PoW 難題,向區塊鏈副本添加新區塊,再在網絡上廣播區塊鏈。接收節點始終都會向區塊鏈副本添加有效區塊,而且由於每個區塊都以加密方式連接到上一區塊,兩個不同節點發布的兩個新區塊會在鏈末尾生成鏈接到同一個區塊的分支。不過,沒關係。隨著時間的推移,節點會在協議認為的“最長鏈”末尾添加新區塊。例如,對於給定分支,最長鏈可以定義為具有最新區塊時間戳的鏈。隨著時間的推移,一個分支會在長度方面佔上風,已放棄(更短)分支中的區塊會遭刪除,同時它們的交易會返回到未處理交易池中。

總結

本文介紹瞭如何構造由分散式對等節點網絡上的加密鏈接區塊組成的公用區塊鏈,每個鏈接區塊都有自己的加密鏈接交易哈希鏈​​。我介紹了區塊鏈技術的基礎知識,將重心盡量不放在任何單一實現上,而是放在它們共有的一些更為典型的技術特性上。如果希望進一步探索此主題,建議選擇一種區塊鏈技術(如比特幣、以太坊或Ripple),並嘗試掌握它具體實現的詳細信息。

 

 

本文分享自微信公眾號- 程序你好(codinghello)

原文出處及轉載信息見文內詳細說明,如有侵權,請聯繫我們刪除。

原文章標題 :  區塊鏈- 區塊鏈基礎知識入門