014 | 從微觀到巨集觀理解區塊鏈

Keegan小鋼發表於2018-02-24

原創文章,轉載請註明:轉載自Keegan小鋼

並標明原文連結:http://keeganlee.me/post/blockchain/20180224

微信訂閱號:keeganlee_me

寫於2018-02-24


專欄地址:xiaozhuanlan.com/fullstack


最近區塊鏈異常火爆,而且就只是在這一兩個月內的事情,無疑,今年應該會成為區塊鏈爆發元年,相應地,對區塊鏈技術人員的需求將會大幅度增加,為了讓大家早日入門區塊鏈開發領域,以取得先發優勢,從而在這場區塊鏈革命浪潮中立於不敗之地,因此,我決定提前編寫系列文章,跟大家聊聊區塊鏈技術。

微觀區塊鏈

相信不少人都聽到說區塊鏈是分散式賬本、分散式資料庫、去中心化的等等,有了一些大概的認知,但也只是一些碎片化的認知,還無法形成體系,所以也還不能理解區塊鏈的本質。下面,我將從微觀到巨集觀簡單講解區塊鏈,力求讓大夥更容易理解區塊鏈的真正本質。

那麼,從微觀上理解區塊鏈,就要從理解區塊鏈最底層的資料結構開始。區塊鏈(Blockchain),簡單來說就是按時間順序將資料區塊通過雜湊指標的方式連線起來的一個連結串列。雜湊指標是區塊鏈裡最常用的資料結構,其實就是一串資料的雜湊值,我們知道,一串資料的雜湊值就是這串資料的指紋/摘要,因此就可以用這個雜湊值來指向這串資料,如下圖:

014 | 從微觀到巨集觀理解區塊鏈

區塊鏈裡的每一個區塊都有對應本區塊的雜湊指標,而除了創世區塊(即第一個區塊)之外,其他每個區塊都儲存了前一個區塊的雜湊指標,從而形成如下所示的一個鏈條,即區塊鏈:

014 | 從微觀到巨集觀理解區塊鏈

這樣的資料結構可以保證資料無法篡改,因為一旦篡改了任何區塊的資料,對應的雜湊指標就會出錯,因此一旦有惡意篡改就能校驗到。資料的無法篡改也是區塊鏈本質上最核心的一個特性。

接著,再來看看區塊鏈的基本單元——區塊(block),以比特幣為例,每個區塊的資料結構大致如下:

014 | 從微觀到巨集觀理解區塊鏈

其中,Tx0 ~ Tx3 表示每一筆交易資料,Hash0 則是 Tx0 這筆交易資料的雜湊指標,Hash01 則是 Hash0 + Hash1 的雜湊指標,這樣層層疊加上去,得到最後的 Root Hash。從圖中也可以看出,從Hash0 到 Root Hash 是一個三層的二叉樹,由於這顆樹的所有節點都是 Hash 值,所以也稱為 Hash Tree,但更專業的名稱叫 Merkle Tree。不過 Merkle Tree 不一定是二叉樹,也可以是多叉樹。Merkle Tree 的葉子節點(即Hash0 ~ Hash3)是資料塊的 Hash 值,而非葉子節點的 value 則是根據下面的葉子節點的 Hash 值串聯起來後再計算 Hash 得出的。通過 Merkle Tree 結構,底層的每一筆交易也都無法篡改,一旦篡改,Root Hash 就會不一致。

另外,該結構也簡化了支付校驗,比如,我們要校驗 Tx3 這筆交易的有效性,那隻要校驗從 Tx3 到 Root Hash 的分支 Hash 值即可,如下圖所示,計算 Tx3 的 Hash值得到 Hash3,再結合 Hash2,計算出 Hash23,再拼上 Hash01 計算出 Merkle Root,只要計算出來的 Merkle Root 和實際儲存的 Root Hash 一致,則表明該該筆交易是有效的。

014 | 從微觀到巨集觀理解區塊鏈

Root Hash 會儲存在區塊頭裡,區塊頭裡一般會儲存有以下資訊:

  • Version:版本號
  • Prev Block:上一個區塊的 Hash 值
  • Merkle Root:即上面所說的 Merkle Tree 的 Root Hash
  • Time:區塊的時間
  • Difficulty:區塊難度
  • Nonce:隨機數

這是比特幣的一個區塊:btc.com/00000000000…。比特幣的每一筆交易,可以有多個輸入和多個輸出。比如說,我們要做一筆轉賬,從 A 轉 3.3 個 BTC 到 B,假設 A 的錢包地址上原本有 10 個 BTC。那這筆轉賬,會有一個輸入,即 A 的地址有 10 個 BTC,交易完成後變成兩個輸出,一個是 B 的地址增加 3.3 個 BTC,一個是 A 的地址變成 6.7 個 BTC。這樣子,每一個地址的所有交易其實都是可以追溯的,每一個比特幣的轉賬記錄也是可以追溯的。

不過,以太坊的區塊結構則複雜得多,每個區塊並非只有一顆 Merkle Tree,而是有三顆 Merkle Tree,除了交易樹,還有狀態樹收據樹。另外,使用的 Merkle Tree 也是複雜得多,叫 Merkle Patricia Tree。詳細結構就不展開了,感興趣的讀者自行去搜尋瞭解即可。

簡而言之,從微觀上來說,區塊鏈就是一種雜湊鏈條,其核心本質特徵是不可篡改且可追蹤溯源

巨集觀區塊鏈

如果只是從微觀上理解區塊鏈,那就像井底之蛙,是看不到區塊鏈即將改變世界的未來的。畢竟,從微觀上來看的話,要實現不可篡改且可追蹤溯源的特性,並不一定需要使用區塊鏈技術。所以,還要看懂區塊鏈巨集觀上的本質,才能預見到區塊鏈真實的未來。

當然,巨集觀上來說,區塊鏈的本質是什麼,不同人會有不同觀點,不少人認為其本質特徵是去中心化的,另一幫人認為其本質就是分散式資料庫/分散式公共賬本,而在我看來,其核心本質就是一種自信任的新一代網際網路基礎協議。下面我將逐步剖析我的觀點。

首先,巨集觀上的區塊鏈就是一種基礎協議,而不是指代具體的技術。作為一種基礎協議,有幾個基本特徵是必備的,那就是分散式儲存、P2P 網路和共識機制,當然,還有微觀層面的不可篡改且可追蹤溯源,如果不具備這幾個特徵,哪怕只缺了一個,都不能稱為區塊鏈。

先來聊聊第一個基本特徵——分散式儲存。前面我們已經瞭解到,區塊鏈最底層的資料結構就是一種雜湊鏈條,是用來儲存資料的,當然,採用哪種具體的資料庫來儲存區塊鏈資料則是由各區塊鏈的開發團隊自己決定的,比如,比特幣和以太坊就選擇了 LevelDB。分散式儲存,就是說,區塊鏈資料的儲存是分散式的,也因此很多人將區塊鏈稱為分散式資料庫,但區塊鏈的分散式儲存與傳統的分步式儲存有所不同。傳統的分散式儲存是將資料分散儲存到多個伺服器上,每個儲存伺服器上的資料只是全量資料的一部分。但區塊鏈的分散式儲存,每個資料節點儲存的都是全量資料。不過,區塊鏈的節點可分為全節點輕節點,全節點儲存了整條區塊鏈的所有資料,包括所有區塊頭和所有交易資料,而輕節點則只儲存了整條鏈的所有區塊頭。那如果要在輕節點查詢某筆交易的有效性,就需要轉去全節點查詢了,那節點之間如何通訊呢?這就涉及到第二個基本特徵——P2P 網路。另外,既然是分散式儲存,那就還要解決資料一致性的問題,就這涉及到第三個基本特徵——共識機制

P2P 網路,即對等網路,也稱點對點網路端對端網路,是區塊鏈系統中不同節點之間通訊的方式,也是一種分散式的網路結構。通過 P2P 網路,不同節點之間可以直接互動,而且彼此連線的每個節點都處於對等的地位。每個節點既充當伺服器,為其他節點提供服務,同時也享用其他節點提供的服務。那麼,既然每個節點的地位都是對等的,那不同節點之間出現分歧時,要如何達成一致共識呢?這也是共識機制所解決的問題。

共識機制是區塊鏈的一個核心特徵,是保證區塊鏈系統在分散式架構下的一致性方案。要理解共識機制,我們先來了解下交易寫入區塊鏈的簡要過程。首先,當你在某個節點發起一筆交易時,比如從地址 A 轉 0.1 個 BTC 到地址 B,該節點接收到交易資訊後就對其進行校驗,如果地址 A 上的未消費 BTC 的餘額大於 0.1 個則可認為該筆交易是合法的,那就會將這筆交易資訊放入本節點的 pending 池(待寫入區塊的交易池),並將這筆交易資訊廣播給其他已建立連線的節點,其他節點接收到交易資訊後也做同樣的校驗並廣播,當其中某個節點獲得記賬權時則可將它**當前的區塊(包含上面那筆交易)**寫入本節點儲存的區塊鏈中並將這個區塊廣播出去,其他大部分節點校驗了此區塊為有效,也同樣寫入它們自己儲存的區塊鏈中,這樣,你的這筆交易就算真正寫入到區塊鏈中了。那如果你同時向 B 和 C 地址分別轉 0.1 個 BTC,但你的地址 A 的未消費 BTC 餘額只有 0.1 個的情況下,假設有些節點可能只接收到轉給 B 的交易,而有些節點則只接收到轉到 C 的交易,這些節點分別校驗通過並寫入了它們的 pending 池,但最終只有其中一筆交易能被寫入區塊鏈,取決於哪個節點先獲得記賬權並被其他大部分節點所接受,而另一筆交易就算已經被那些將其寫入了 pending 池的節點所接受,其他節點再次校驗後也不會通過。所以,一筆交易是否合法,以及一個新增區塊是否有效,不是由某一個節點說了算,而是需要經過多數節點的最終一致共識。

根據區塊鏈的這幾個基本特徵,明顯可以看出,區塊鏈的確是分散式的:分散式儲存、分散式網路、分散式共識。分散式的確是一個重要的特徵,但分散式只是一種手段,而不是目的。區塊鏈之所以能被稱為革命性的技術,是因為它改變了傳統的信任機制。傳統的信任機制是怎樣的呢?其實就是有一箇中間機構為信任背書,比如銀行、淘寶、滴滴等,我們通過信任這些中間機構和其他人進行交易。而區塊鏈則沒有中間機構這一層了,使用者之間直接點對點交易,區塊鏈的資料結構、分散式儲存特性和共識機制結合在一起,保證了資料是可靠且不可篡改的,從而實現了一個不需要中間機構的自信任系統。也由於沒有了中間機構,所以也可以說區塊鏈是去中心化的,但這裡更準確的說法可能是去中介化。但去中介化分散式一樣,只是手段,而不是目的,核心目的還是構建一個自信任系統

那自信任系統相比有中間機構的信任機制有什麼好處呢?我們就舉個跨境支付的栗子就明白了。傳統的交易支付都要經過銀行體系,要經過開戶行、對手行、清算組織、境外銀行等多個機構和非常繁冗的處理流程。而且,整個過程中每一個機構都有自己的賬務系統,彼此之間需要建立代理關係,每筆交易都需要在本銀行記賬,與交易對手進行清算和對賬等,導致整個過程花費時間較長、使用成本較高。而有了區塊鏈,交易雙方就可以實現點對點支付,而無需這麼多中間機構,從而簡化流程、提高效率

總結

最後,總結一下,我分別從微觀和巨集觀兩個層面簡單聊了下區塊鏈,微觀上,其實就是區塊鏈最底層的資料結構,本質就是一種不可篡改且可追蹤溯源的雜湊鏈條;巨集觀上,區塊鏈還具備了另外三個基本特徵:分散式儲存、P2P 網路和共識機制,從這幾個基本特徵可以看出,區塊鏈是分散式的,但分散式只是手段,而不是目的,區塊鏈的核心目的是構建一個自信任系統,相比依賴中間機構的信任機制,可以簡化流程、提高效率,這才是區塊鏈之所以能被稱為革命性技術的本質原因。

思考和實踐

智慧合約為區塊鏈帶來了什麼?區塊鏈是否必須有數字代幣?公有鏈、聯盟鏈、私有鏈本質上有什麼區別?


掃描以下二維碼即可關注訂閱號。

014 | 從微觀到巨集觀理解區塊鏈

相關文章