014 | 從微觀到宏觀理解區塊鏈

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

並標明原文連接:http://keeganlee.me/post/blockchain/20180224服務器

微信訂閱號:keeganlee_me微信

寫於2018-02-24網絡


專欄地址:xiaozhuanlan.com/fullstack數據結構


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

微觀區塊鏈

相信很多人都聽到說區塊鏈是分佈式帳本、分佈式數據庫、去中心化的等等,有了一些大概的認知,但也只是一些碎片化的認知,還沒法造成體系,因此也還不能理解區塊鏈的本質。下面,我將從微觀到宏觀簡單講解區塊鏈,力求讓大夥更容易理解區塊鏈的真正本質。分佈式

那麼,從微觀上理解區塊鏈,就要從理解區塊鏈最底層的數據結構開始。區塊鏈(Blockchain),簡單來講就是按時間順序將數據區塊經過哈希指針的方式鏈接起來的一個鏈表。哈希指針是區塊鏈裏最經常使用的數據結構,其實就是一串數據的哈希值,咱們知道,一串數據的哈希值就是這串數據的指紋/摘要,所以就能夠用這個哈希值來指向這串數據,以下圖:post

區塊鏈裏的每個區塊都有對應本區塊的哈希指針,而除了創世區塊(即第一個區塊)以外,其餘每一個區塊都存儲了前一個區塊的哈希指針,從而造成以下所示的一個鏈條,即區塊鏈:區塊鏈

這樣的數據結構能夠保證數據沒法篡改,由於一旦篡改了任何區塊的數據,對應的哈希指針就會出錯,所以一旦有惡意篡改就能校驗到。數據的沒法篡改也是區塊鏈本質上最核心的一個特性。代理

接着,再來看看區塊鏈的基本單元——區塊(block),以比特幣爲例,每一個區塊的數據結構大體以下:

其中,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 一致,則代表該該筆交易是有效的。

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 網絡和共識機制,從這幾個基本特徵能夠看出,區塊鏈是分佈式的,但分佈式只是手段,而不是目的,區塊鏈的核心目的是構建一個自信任系統,相比依賴中間機構的信任機制,能夠簡化流程、提升效率,這纔是區塊鏈之因此能被稱爲革命性技術的本質緣由。

思考和實踐

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


掃描如下二維碼便可關注訂閱號。

相關文章
相關標籤/搜索