區塊鏈關鍵技術一覽
我們可能已經通過各種媒體、科普文章看到過多次關於區塊鏈技術中的各個點,常見的如鏈式結構、P2P、挖礦演算法、加密演算法等等。事實上, 其中多數技術都是有著幾十年的發展歷史,之後被中本聰放到比特幣中使用,今天我們結合上次簡單改過的比特幣代碼,用簡單易懂的語言做一概述。
鏈式的數據結構
區塊鏈之所以被稱為「鏈」,就是因為其數據結構的巧妙設計:多個收支記錄打包為一個數據塊(第一條記錄指定為挖礦所得),數據塊附加有描述信息(頭部信息),其中除了版本號/數據校驗值/時間戳/難度值/隨機數等常規信息外,還包含了前一個數據塊的哈希值,這也是區塊鏈機制中,數據不可修改的原因---所有數據都是通過這種鏈狀的結構鏈接起來。每個數據塊都是通過大量計算才打包的,修改中間數據意味著要修改其後所有的數據,除非擁有超級計算能力,或者說全網計算能力的一半以上,這也就是所謂的「51%攻擊」,在計算能力出現理論機制級別的提升之前,我們不用擔心主要數字貨幣的「51%攻擊」問題。
鏈式的數據結構中,存儲的實際上是所有交易的記錄,所以,又被成為「賬本」,或者ledger。
在源碼的 src/primitives/block.h 中,可以查看 CBlock的結構信息。文件中也包含了對區塊數據的描述:節點收集交易數據進行打包,不斷嘗試隨機數進行哈希計算,似的計算結果符合POW工作量證明機制的條件,一旦達到條件,既是挖塊成功,節點會將信息廣播到網路中,交易信息的第一條數據是特殊定義,其中記錄的是當前區塊的挖礦所得。
P2P去中心化網路技術
點對點技術並不新鮮,我們之前經常聽到的「P2P下載」也是基於此機制。相對於傳統的server-client方式服務,P2P的所有節點都處於對等地位、都擁有全量數據,每一個節點既是server也是client,這使的系統整體的可擴展性、健壯性、性能等方面都非常優秀。在區塊鏈技術中,也意味著,任何接入者都有權獲取所有的賬目信息(公有鏈、聯盟鏈、私有鏈的劃分我們在未來單獨說明)。
在源碼的 src/net.cpp ,net.h中有P2P相關的實現。
為了使系統在啟動時自動獲得其他節點的信息,需要有至少一個「種子地址」,所以,在源碼的src/chainparams.cpp 中設定了多個種子地址(詳見 vSeeds.emplace_back 調用的參數),這都是能夠持續穩定提供服務的節點。同時程序還提供了指定節點的參數。
加密演算法:hash函數、橢圓曲線密碼
hash函數是將任意長度的輸入,經過不可逆的處理過程,轉換為固定長度的輸出內容。主要有兩大類:Message Digest Algorithm(最常見的MD5,以及其前身MD2,MD3,MD4)以及Secure Hash Algorithm(常見的SHA-1,SHA-2,SHA-3,RIPEMD160)。
既然hash演算法是把內容處理之後得到限長度內容,那理論上就存在重複的可能(碰撞),隨著計算能力的增強,MD5、SHA系列的函數都面臨著碰撞攻擊,事實上,SHA-3就是在這樣的環境下誕生的更高級別的處理機制。而未來,加密機制和計算能力一定是循環遞進的過程。
我們知道,比特幣錢包中包含了一系列的密鑰對,每個密鑰對是由一個私鑰和公鑰構成。公鑰由私鑰生成、公鑰再生成比特幣地址。其中公鑰和私鑰的生成,用到了橢圓曲線演算法。具體機制我們在這裡不展開講,可搜索引擎查詢。與傳統的RSA非對稱加密演算法相比,橢圓曲線演算法安全性更高、計算量更小,所佔用的存儲空間也更小,這對於每個節點都記錄完整交易信息的數字貨幣來講,是極其重要的。
相關函數實現,在代碼的 src/crypto/ 目錄下。
共識演算法
比特幣使用工作量證明機制(POW)的共識演算法。這可以說是經濟學和計算機學的一種創新:由計算機的工作量來證明其無差別的勞動價值。從概率上講,計算節點算力佔全網算力的比例,既是它挖礦成功的概率。也正是因為這個機制,使得挖礦、礦機、礦池成為數字貨幣產業鏈條中的重要部分。當然這也是數字貨幣被詬病的地方:人為製造出來的社會資源的消耗。支持者認為這是一種合理的機制,正如實體經濟中的採礦---付出代價獲得礦物,這就是礦物的價值基礎。反對者認為這種資源消耗是一種無謂的浪費,並以此認定數字貨幣沒有價值。
POW機制中,具體計算的成本消耗在了哪裡呢?就是大量的SHA256計算(參見 src/crypto/sha256.cpp )。
除工作量證明,數字貨幣常見的還有股權證明(POS,Proof of Stake),委任權益證明(DPOS,Delegated Proof of Stake)。
Merkle Tree
Merkle Tree,或稱為Hash Tree,是一種樹狀的Hash結構。常在大量數據傳輸(或被分割成大量數據塊的傳輸)中被用於校驗數據一致性。比特幣數據塊的頭部信息中,包含了一個叫做 hashMerkleRoot 的欄位(詳見src/primitives/block.h),其中保存的就是本數據塊中所有交易信息的Merkle根。我們借用Wikipedia的一張圖來描述生成merkle tree的過程:
對數據塊中的每筆交易信息進行hash計算,並按照hash值進行排序,這就是merkle tree的「葉子」。然後對相鄰兩個hash值進行hash計算,層層遞進,直到只有一個hash值,就是merkle tree的根。
具體可參考代碼的: src/consensus/merkle.cpp
上面只是簡要介紹了部分技術點,其中沒有包括智能合約、側鏈/跨鏈等技術,我會在接下來的時間裡單獨介紹。


※火星的表面是怎樣的?
※雷蛇做的出來,用它打 Dota 會被人說作弊吧
TAG:科技與理論 |