最近區(qū)塊鏈異?;鸨揖椭皇窃谶@一兩個(gè)月內(nèi)的事情,無疑,今年應(yīng)該會成為區(qū)塊鏈爆發(fā)元年,相應(yīng)地,對區(qū)塊鏈技術(shù)人員的需求將會大幅度增加,為了讓大家早日入門區(qū)塊鏈開發(fā)領(lǐng)域,以取得先發(fā)優(yōu)勢,從而在這場區(qū)塊鏈革命浪潮中立于不敗之地,因此,我決定提前編寫系列文章,跟大家聊聊區(qū)塊鏈技術(shù)。
微觀區(qū)塊鏈
相信不少人都聽到說區(qū)塊鏈是分布式賬本、分布式數(shù)據(jù)庫、去中心化的等等,有了一些大概的認(rèn)知,但也只是一些碎片化的認(rèn)知,還無法形成體系,所以也還不能理解區(qū)塊鏈的本質(zhì)。下面,我將從微觀到宏觀簡單講解區(qū)塊鏈,力求讓大伙更容易理解區(qū)塊鏈的真正本質(zhì)。
那么,從微觀上理解區(qū)塊鏈,就要從理解區(qū)塊鏈最底層的數(shù)據(jù)結(jié)構(gòu)開始。區(qū)塊鏈(Blockchain),簡單來說就是按時(shí)間順序?qū)?shù)據(jù)區(qū)塊通過哈希指針的方式連接起來的一個(gè)鏈表。哈希指針是區(qū)塊鏈里最常用的數(shù)據(jù)結(jié)構(gòu),其實(shí)就是一串?dāng)?shù)據(jù)的哈希值,我們知道,一串?dāng)?shù)據(jù)的哈希值就是這串?dāng)?shù)據(jù)的指紋/摘要,因此就可以用這個(gè)哈希值來指向這串?dāng)?shù)據(jù),如下圖:

區(qū)塊鏈里的每一個(gè)區(qū)塊都有對應(yīng)本區(qū)塊的哈希指針,而除了創(chuàng)世區(qū)塊(即第一個(gè)區(qū)塊)之外,其他每個(gè)區(qū)塊都存儲了前一個(gè)區(qū)塊的哈希指針,從而形成如下所示的一個(gè)鏈條,即區(qū)塊鏈:

這樣的數(shù)據(jù)結(jié)構(gòu)可以保證數(shù)據(jù)無法篡改,因?yàn)橐坏┐鄹牧巳魏螀^(qū)塊的數(shù)據(jù),對應(yīng)的哈希指針就會出錯(cuò),因此一旦有惡意篡改就能校驗(yàn)到。數(shù)據(jù)的無法篡改也是區(qū)塊鏈本質(zhì)上最核心的一個(gè)特性。
接著,再來看看區(qū)塊鏈的基本單元——區(qū)塊(block),以比特幣為例,每個(gè)區(qū)塊的數(shù)據(jù)結(jié)構(gòu)大致如下:

其中,Tx0 ~ Tx3 表示每一筆交易數(shù)據(jù),Hash0 則是 Tx0 這筆交易數(shù)據(jù)的哈希指針,Hash01 則是 Hash0 + Hash1 的哈希指針,這樣層層疊加上去,得到最后的 Root Hash。從圖中也可以看出,從Hash0 到 Root Hash 是一個(gè)三層的二叉樹,由于這顆樹的所有節(jié)點(diǎn)都是 Hash 值,所以也稱為 Hash Tree,但更專業(yè)的名稱叫 Merkle Tree。不過 Merkle Tree 不一定是二叉樹,也可以是多叉樹。Merkle Tree 的葉子節(jié)點(diǎn)(即Hash0 ~ Hash3)是數(shù)據(jù)塊的 Hash 值,而非葉子節(jié)點(diǎn)的 value 則是根據(jù)下面的葉子節(jié)點(diǎn)的 Hash 值串聯(lián)起來后再計(jì)算 Hash 得出的。通過 Merkle Tree 結(jié)構(gòu),底層的每一筆交易也都無法篡改,一旦篡改,Root Hash 就會不一致。
另外,該結(jié)構(gòu)也簡化了支付校驗(yàn),比如,我們要校驗(yàn) Tx3 這筆交易的有效性,那只要校驗(yàn)從 Tx3 到 Root Hash 的分支 Hash 值即可,如下圖所示,計(jì)算 Tx3 的 Hash值得到 Hash3,再結(jié)合 Hash2,計(jì)算出 Hash23,再拼上 Hash01 計(jì)算出 Merkle Root,只要計(jì)算出來的 Merkle Root 和實(shí)際存儲的 Root Hash 一致,則表明該該筆交易是有效的。

Root Hash 會保存在區(qū)塊頭里,區(qū)塊頭里一般會保存有以下信息:
- Block Hash:當(dāng)前區(qū)塊的 Hash 值
- Prev Block:上一個(gè)區(qū)塊的 Hash 值
- Next Block:下一個(gè)區(qū)塊的 Hash 值,如果下一個(gè)區(qū)塊還未確定,則為空
- Merkle Root:即上面所說的 Merkle Tree 的 Root Hash
- Height:區(qū)塊高度,即在區(qū)塊鏈中,當(dāng)前區(qū)塊是第幾個(gè)區(qū)塊
- Time:區(qū)塊的時(shí)間
- Tx Count:區(qū)塊的交易數(shù)
- Size:區(qū)塊大小
- Difficulty:區(qū)塊難度
- Nonce:隨機(jī)數(shù)
這是比特幣的一個(gè)區(qū)塊:https://btc.com/0000000000000000005b8d4d2508c14f6ea5cbbb3f1104566612dfb29d281b7a。比特幣的每一筆交易,可以有多個(gè)輸入和多個(gè)輸出。比如說,我們要做一筆轉(zhuǎn)賬,從 A 轉(zhuǎn) 3.3 個(gè) BTC 到 B,假設(shè) A 的錢包地址上原本有 10 個(gè) BTC。那這筆轉(zhuǎn)賬,會有一個(gè)輸入,即 A 的地址有 10 個(gè) BTC,交易完成后變成兩個(gè)輸出,一個(gè)是 B 的地址增加 3.3 個(gè) BTC,一個(gè)是 A 的地址變成 6.7 個(gè) BTC。這樣子,每一個(gè)地址的所有交易其實(shí)都是可以追溯的,每一個(gè)比特幣的轉(zhuǎn)賬記錄也是可以追溯的。
不過,以太坊的區(qū)塊結(jié)構(gòu)則復(fù)雜得多,每個(gè)區(qū)塊并非只有一顆 Merkle Tree,而是有三顆 Merkle Tree,除了交易樹,還有狀態(tài)樹和收據(jù)樹。另外,使用的 Merkle Tree 也是復(fù)雜得多,叫 Merkle Patricia Tree。詳細(xì)結(jié)構(gòu)就不展開了,感興趣的讀者自行去搜索了解即可。
簡而言之,從微觀上來說,區(qū)塊鏈就是一種哈希鏈條,其核心本質(zhì)特征是不可篡改且可追蹤溯源。
宏觀區(qū)塊鏈
如果只是從微觀上理解區(qū)塊鏈,那就像井底之蛙,是看不到區(qū)塊鏈即將改變世界的未來的。畢竟,從微觀上來看的話,要實(shí)現(xiàn)不可篡改且可追蹤溯源的特性,并不一定需要使用區(qū)塊鏈技術(shù)。所以,還要看懂區(qū)塊鏈宏觀上的本質(zhì),才能預(yù)見到區(qū)塊鏈真實(shí)的未來。
當(dāng)然,宏觀上來說,區(qū)塊鏈的本質(zhì)是什么,不同人會有不同觀點(diǎn),不少人認(rèn)為其本質(zhì)特征是去中心化的,另一幫人認(rèn)為其本質(zhì)就是分布式數(shù)據(jù)庫/分布式公共賬本,而在我看來,其核心本質(zhì)就是一種自信任的新一代互聯(lián)網(wǎng)基礎(chǔ)協(xié)議。下面我將逐步剖析我的觀點(diǎn)。
首先,宏觀上的區(qū)塊鏈就是一種基礎(chǔ)協(xié)議,而不是指代具體的技術(shù)。作為一種基礎(chǔ)協(xié)議,有幾個(gè)基本特征是必備的,那就是分布式存儲、P2P 網(wǎng)絡(luò)和共識機(jī)制,當(dāng)然,還有微觀層面的不可篡改且可追蹤溯源,如果不具備這幾個(gè)特征,哪怕只缺了一個(gè),都不能稱為區(qū)塊鏈。
先來聊聊第一個(gè)基本特征——分布式存儲。前面我們已經(jīng)了解到,區(qū)塊鏈最底層的數(shù)據(jù)結(jié)構(gòu)就是一種哈希鏈條,是用來存儲數(shù)據(jù)的,當(dāng)然,采用哪種具體的數(shù)據(jù)庫來存儲區(qū)塊鏈數(shù)據(jù)則是由各區(qū)塊鏈的開發(fā)團(tuán)隊(duì)自己決定的,比如,比特幣和以太坊就選擇了 LevelDB。分布式存儲,就是說,區(qū)塊鏈數(shù)據(jù)的存儲是分布式的,也因此很多人將區(qū)塊鏈稱為分布式數(shù)據(jù)庫,但區(qū)塊鏈的分布式存儲與傳統(tǒng)的分步式存儲有所不同。傳統(tǒng)的分布式存儲是將數(shù)據(jù)分散存儲到多個(gè)服務(wù)器上,每個(gè)存儲服務(wù)器上的數(shù)據(jù)只是全量數(shù)據(jù)的一部分。但區(qū)塊鏈的分布式存儲,每個(gè)數(shù)據(jù)節(jié)點(diǎn)存儲的都是全量數(shù)據(jù)。不過,區(qū)塊鏈的節(jié)點(diǎn)可分為全節(jié)點(diǎn)和輕節(jié)點(diǎn),全節(jié)點(diǎn)存儲了整條區(qū)塊鏈的所有數(shù)據(jù),包括所有區(qū)塊頭和所有交易數(shù)據(jù),而輕節(jié)點(diǎn)則只存儲了整條鏈的所有區(qū)塊頭。那如果要在輕節(jié)點(diǎn)查詢某筆交易的有效性,就需要轉(zhuǎn)去全節(jié)點(diǎn)查詢了,那節(jié)點(diǎn)之間如何通信呢?這就涉及到第二個(gè)基本特征——P2P 網(wǎng)絡(luò)。另外,既然是分布式存儲,那就還要解決數(shù)據(jù)一致性的問題,就這涉及到第三個(gè)基本特征——共識機(jī)制。
P2P 網(wǎng)絡(luò),即對等網(wǎng)絡(luò),也稱點(diǎn)對點(diǎn)網(wǎng)絡(luò)或端對端網(wǎng)絡(luò),是區(qū)塊鏈系統(tǒng)中不同節(jié)點(diǎn)之間通信的方式,也是一種分布式的網(wǎng)絡(luò)結(jié)構(gòu)。通過 P2P 網(wǎng)絡(luò),不同節(jié)點(diǎn)之間可以直接交互,而且彼此連接的每個(gè)節(jié)點(diǎn)都處于對等的地位。每個(gè)節(jié)點(diǎn)既充當(dāng)服務(wù)器,為其他節(jié)點(diǎn)提供服務(wù),同時(shí)也享用其他節(jié)點(diǎn)提供的服務(wù)。那么,既然每個(gè)節(jié)點(diǎn)的地位都是對等的,那不同節(jié)點(diǎn)之間出現(xiàn)分歧時(shí),要如何達(dá)成一致共識呢?這也是共識機(jī)制所解決的問題。
共識機(jī)制是區(qū)塊鏈的一個(gè)核心特征,是保證區(qū)塊鏈系統(tǒng)在分布式架構(gòu)下的一致性方案。要理解共識機(jī)制,我們先來了解下交易寫入?yún)^(qū)塊鏈的簡要過程。首先,當(dāng)你在某個(gè)節(jié)點(diǎn)發(fā)起一筆交易時(shí),比如從地址 A 轉(zhuǎn) 0.1 個(gè) BTC 到地址 B,該節(jié)點(diǎn)接收到交易信息后就對其進(jìn)行校驗(yàn),如果地址 A 上的未消費(fèi) BTC 的余額大于 0.1 個(gè)則可認(rèn)為該筆交易是合法的,那就會將這筆交易信息放入本節(jié)點(diǎn)的 pending 池(待寫入?yún)^(qū)塊的交易池),并將這筆交易信息廣播給其他已建立連接的節(jié)點(diǎn),其他節(jié)點(diǎn)接收到交易信息后也做同樣的校驗(yàn)并廣播,當(dāng)其中某個(gè)節(jié)點(diǎn)獲得記賬權(quán)時(shí)則可將它當(dāng)前的區(qū)塊(包含上面那筆交易)寫入本節(jié)點(diǎn)存儲的區(qū)塊鏈中并將這個(gè)區(qū)塊廣播出去,其他大部分節(jié)點(diǎn)校驗(yàn)了此區(qū)塊為有效,也同樣寫入它們自己存儲的區(qū)塊鏈中,這樣,你的這筆交易就算真正寫入到區(qū)塊鏈中了。那如果你同時(shí)向 B 和 C 地址分別轉(zhuǎn) 0.1 個(gè) BTC,但你的地址 A 的未消費(fèi) BTC 余額只有 0.1 個(gè)的情況下,假設(shè)有些節(jié)點(diǎn)可能只接收到轉(zhuǎn)給 B 的交易,而有些節(jié)點(diǎn)則只接收到轉(zhuǎn)到 C 的交易,這些節(jié)點(diǎn)分別校驗(yàn)通過并寫入了它們的 pending 池,但最終只有其中一筆交易能被寫入?yún)^(qū)塊鏈,取決于哪個(gè)節(jié)點(diǎn)先獲得記賬權(quán)并被其他大部分節(jié)點(diǎn)所接受,而另一筆交易就算已經(jīng)被那些將其寫入了 pending 池的節(jié)點(diǎn)所接受,其他節(jié)點(diǎn)再次校驗(yàn)后也不會通過。所以,一筆交易是否合法,以及一個(gè)新增區(qū)塊是否有效,不是由某一個(gè)節(jié)點(diǎn)說了算,而是需要經(jīng)過多數(shù)節(jié)點(diǎn)的最終一致共識。
根據(jù)區(qū)塊鏈的這幾個(gè)基本特征,明顯可以看出,區(qū)塊鏈的確是分布式的:分布式存儲、分布式網(wǎng)絡(luò)、分布式共識。分布式的確是一個(gè)重要的特征,但分布式只是一種手段,而不是目的。區(qū)塊鏈之所以能被稱為革命性的技術(shù),是因?yàn)樗淖兞藗鹘y(tǒng)的信任機(jī)制。傳統(tǒng)的信任機(jī)制是怎樣的呢?其實(shí)就是有一個(gè)中間機(jī)構(gòu)為信任背書,比如銀行、淘寶、滴滴等,我們通過信任這些中間機(jī)構(gòu)和其他人進(jìn)行交易。而區(qū)塊鏈則沒有中間機(jī)構(gòu)這一層了,用戶之間直接點(diǎn)對點(diǎn)交易,區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)、分布式存儲特性和共識機(jī)制結(jié)合在一起,保證了數(shù)據(jù)是可靠且不可篡改的,從而實(shí)現(xiàn)了一個(gè)不需要中間機(jī)構(gòu)的自信任系統(tǒng)。也由于沒有了中間機(jī)構(gòu),所以也可以說區(qū)塊鏈?zhǔn)?strong>去中心化的,但這里更準(zhǔn)確的說法可能是去中介化。但去中介化和分布式一樣,只是手段,而不是目的,核心目的還是構(gòu)建一個(gè)自信任系統(tǒng)。
那自信任系統(tǒng)相比有中間機(jī)構(gòu)的信任機(jī)制有什么好處呢?我們就舉個(gè)跨境支付的栗子就明白了。傳統(tǒng)的交易支付都要經(jīng)過銀行體系,要經(jīng)過開戶行、對手行、清算組織、境外銀行等多個(gè)機(jī)構(gòu)和非常繁冗的處理流程。而且,整個(gè)過程中每一個(gè)機(jī)構(gòu)都有自己的賬務(wù)系統(tǒng),彼此之間需要建立代理關(guān)系,每筆交易都需要在本銀行記賬,與交易對手進(jìn)行清算和對賬等,導(dǎo)致整個(gè)過程花費(fèi)時(shí)間較長、使用成本較高。而有了區(qū)塊鏈,交易雙方就可以實(shí)現(xiàn)點(diǎn)對點(diǎn)支付,而無需這么多中間機(jī)構(gòu),從而簡化流程、提高效率。
總結(jié)
最后,總結(jié)一下,我分別從微觀和宏觀兩個(gè)層面簡單聊了下區(qū)塊鏈,微觀上,其實(shí)就是區(qū)塊鏈最底層的數(shù)據(jù)結(jié)構(gòu),本質(zhì)就是一種不可篡改且可追蹤溯源的哈希鏈條;宏觀上,區(qū)塊鏈還具備了另外三個(gè)基本特征:分布式存儲、P2P 網(wǎng)絡(luò)和共識機(jī)制,從這幾個(gè)基本特征可以看出,區(qū)塊鏈?zhǔn)?strong>分布式的,但分布式只是手段,而不是目的,區(qū)塊鏈的核心目的是構(gòu)建一個(gè)自信任系統(tǒng),相比依賴中間機(jī)構(gòu)的信任機(jī)制,可以簡化流程、提高效率,這才是區(qū)塊鏈之所以能被稱為革命性技術(shù)的本質(zhì)原因。
思考和實(shí)踐
智能合約為區(qū)塊鏈帶來了什么?區(qū)塊鏈?zhǔn)欠癖仨氂袛?shù)字代幣?公有鏈、聯(lián)盟鏈、私有鏈本質(zhì)上有什么區(qū)別?