【乾貨】區塊鏈技術生態的設計|《白話區塊鏈》作者蔣勇分享實錄

HiBlock區塊鏈社群發表於2018-03-09




1
區塊鏈技術棧


本節內容主要是關於區塊鏈本身的一個技術棧的介紹。現在關於區塊鏈的文章話題、應用場景有很多,今天我想站在一個比較基礎的、相對技術的角度,來介紹區塊鏈的組成原理。


區塊鏈系統




上圖中列了一些區塊鏈系統,可以看到在所有的系統裡分成兩種主要的型別:


第一類叫基礎服務鏈,比特幣也屬於一種基礎服務鏈,雖然它的功能是以幣這麼一個形態體現。以太坊是能提供自定義指令碼合約的基礎服務鏈,而側鏈以及中繼鏈是屬於多鏈連線的基礎服務。基礎服務鏈本身不帶有任何的應用方面的定製功能,它主要是像作業系統一樣提供一個基礎設施,擁有完整的區塊鏈技術棧。


第二類是鏈上應用。包括基於以太坊的預測服務;基於以太坊的通訊系統,類似微信;以及其他各種分散式應用。


今天重點分享的是基礎服務鏈包括哪些組成部分。


基礎鏈技術棧



就這一套基礎的區塊鏈系統來講,它無論是哪些型別,比如比特幣、萊特幣、以太坊、或是其他的位元股等等,核心技術都主要由這六大模組組成:共識演算法、密碼演算法、指令碼系統、賬戶模型、區塊鏈賬本、網路服務下文會分別介紹每個模組的工作原理。


區塊鏈賬本



從這六個模組,我們也可以發現,其實拆分成技術底層來看,它跟我們傳統的技術開發也沒什麼兩樣,仍然是由這些最基礎的技術來組成的。就拿區塊鏈賬本來說,如果去掉各種區塊鏈的術語和一些帶有神祕性的描述,它其實就是一種資料庫系統,核心就是賬本資料庫。那麼這個賬本資料庫裡的賬戶怎麼體現呢?是通過密碼演算法裡的公開金鑰演算法來體現的。


舉一些比特幣或以太坊的例子,比如我們知道在比特幣裡有一個公鑰和私鑰的概念,地址就是通過公鑰轉化而來的,所以在這種賬本資料庫裡,它的賬戶主要是通過這種公開金鑰演算法的形式來提供,跟我們通常的系統通過註冊的方式來直接產生,儲存在一個使用者表中的方式是很不相同的。


密碼演算法在一個區塊鏈系統裡的應用是非常多的,除了賬戶地址以外,還有雜湊。所謂的區塊鏈是一個一個的區塊連結,這些區塊通過什麼來連結呢?雜湊,每一個區塊的雜湊。一個區塊裡還包括很多交易事務,比如比特幣一個區塊裡包含了眾多的一條一條的交易事務,每一個交易事務會被計算為一個雜湊值,所有的雜湊值會計算成一棵梅克爾樹(梅克爾樹是一個樹狀結構的雜湊值聚集而成的雜湊樹),並且通過密碼演算法執行在指令碼系統裡。


什麼叫指令碼系統這裡簡單闡述一下比特幣的轉賬機制


首先以銀行為例,在銀行裡,如果我的賬戶要向另一個賬戶轉賬100元,通常是先從我的賬戶扣掉100元,然後在目標賬戶增加100元。但幾乎所有的區塊鏈系統都不是這麼做的(當然並不完全絕對,某些系統會同時支援這種直接扣除和增加的轉賬資料操作),以比特幣為例,所謂的我轉100塊錢,不是扣掉我100,而是尋找之前別人給我的轉賬,滿足100這個金額,然後建立新的發出的事務。也就是說它不是扣除跟增加這麼一個通常的動作,而是一個發出的動作程式,指定到目標地址。


什麼叫目標地址呢?就是我指向的另外一個目標的比特幣地址。因為這個資料會在全網廣播所有的比特幣節點都可以接收到。如何保證目標地址的所有者能收到這筆金額呢?前面有說到,地址是由公鑰轉化而來的,要使用我轉發的這一筆交易事務的話,對方只有通過自己的私鑰才能跟他的公鑰來進行匹配,匹配成功以後就意味著他能夠花這筆金額。也就是說這個轉賬的過程在比特幣內部其實是通過一個程式的方式來匹配的,這也是指令碼系統的一個作用,類似於虎符的匹配。


共識演算法對於一個分散式系統來講,是指執行在網際網路非同步網路的環境之下,如何保證每個節點的資料一致的機制,是整個區塊鏈系統的核心,沒有一個有效的共識機制,區塊鏈作為一個分散式的系統將不能成為一個統一的網路存在。


我們知道如果一套系統是執行在一個公司的內部機房裡,或者是在一個聯盟裡,比如銀行之間,要保持資料的一致性並不是很困難,因為網路環境是良好的,而且節點數和節點狀態,包括各種許可等都是鑑權的。但在一個公開的網際網路上這一切都是未知的。所以無論是以太坊還是比特幣這種公鏈系統,它所能實現的節點一致性都叫最終一致性,也就是說它不存在一個數學上的證明是確定一致的。如果有人做過一些日常的轉賬操作體驗的話,通常會看到要求確認多個區塊,比如比特幣會建議等待六個區塊的確認,才能夠確保轉賬是沒有問題的。以太坊會建議等待至少15個區塊的確認等。就是說它無法保證一個最終的完全一致性,只能從概率上來解決這個問題。


如果我轉賬的這一筆事務已經經過了很多個區塊的確認,那就表示它被棄用的概率很低。這是公鏈區塊鏈技術的一些特點。

 

賬戶模型


我們可以簡單地把區塊鏈系統裡的賬戶看成是一個狀態機。不同的區塊鏈系統對於賬戶物件的實現方式是不一樣的,比如比特幣,它是一個純粹的地址,私鑰和公鑰;而以太坊,它不但是具備這種私鑰和公鑰的地址的形式,也包含類似銀行的賬戶物件。每一個區塊鏈系統都有自己的一些特點,但無論是怎樣的系統,我們都可以統一將賬戶物件看成是一個狀態機。



如圖所示,這個賬戶物件會經過一個初始狀態,然後經過各種轉賬(當然也不一定是轉賬,區塊鏈系統並不是只能用來轉賬,只是以此為例),總之就是經過一些操作,狀態發生了各種變化,每一個狀態發生變化之後再寫入狀態回執,回寫一個狀態的回執,形成一個閉環的驗證過程。這就是區塊鏈系統裡的賬戶模型。


賬戶模型的本質


 

我這裡舉的是比特幣的例子,在比特幣裡我們可以看到它就是不斷地輸入輸出輸入輸出。也可以說就像庫存一樣,有入庫的有出庫的,每一個出庫都要對應之前的入庫,它是這麼一個銜接關係。


密碼演算法


 

密碼演算法的應用,到目前為止所出現的區塊鏈系統中,整個密碼演算法的應用都包含在如圖所示的範圍裡。


1)區塊雜湊、交易雜湊。雜湊值的計算就不多贅述


2)賬戶地址、交易簽名


3)指令碼匹配就是前文提到的公私鑰的匹配。


4)隱私通道一般是在聯盟鏈裡,所謂的聯盟鏈就是它不是執行在一個公鏈系統的,比如我們想開發一個公司與公司之間的供應鏈系統,或者銀行與銀行之間的結算支付,它是在機構之間執行的系統,往往具有安全性的要求,比如希望資料是加密的,不能像公鏈系統那樣將資料向全網廣播,而是定向地向某些節點廣播,這時需要通過一個通道的形式來進行管理,這個通道就是隱私通道。


5)身份鑑權、許可登記。


6)零知識證明先簡單介紹一下公鏈和聯盟鏈的差別,通常我們將完全沒有限制的、完全執行在網際網路系統之上的,稱之為公鏈;執行在機構之間,甚至公司內部的,稱之為聯盟鏈或私鏈。只有在聯盟鏈或私鏈的場景下,身份鑑權等才會有意義,在公鏈上做身份鑑權是沒什麼意義的(當然,類似以太坊這種支援合約程式設計的公鏈,您也是可以部署一個支援身份鑑權的合約的,只是以太坊本身並不需要通過身份鑑權來使用)。


7)零知識證明主要用在公鏈上。零知識證明的一個主要作用是:在我的資料處於加密的狀態之下,如何讓其它節點依然能夠驗證我的資料是合法的。它所採用的仍然是屬於密碼學裡的應用,比如同態加密、公私鑰加解密技術的應用。


共識演算法


 

共識的本質在於對併發差異執行序列。因為它沒有一箇中心伺服器,所以沒有一個實際的參照,以哪個資料為主,而且在網際網路的公鏈這麼一種非同步網路模型之下,根據FLP理論,在非同步網路中不存在一種能夠完全確定的保持一致的演算法。共識演算法的目的就是在這樣一個場景之下,來對每一個節點之間資料的併發差異進行序列。


在確定型網路中,比如我們在公司內部搞一個溯源系統,由於這時的網路是確定型的,所以通常使用的是基於投票的機制。


在非同步網路中,比如比特幣、以太坊,到目前為止最實用的做法就是基於某種難度的競爭機制,像比特幣的挖礦。因為在非同步網路中如果通過投票來實現一致性的話,效率太低,而且不太現實,當然這也不是絕對的,某些公鏈的共識演算法會綜合設計不同的演算法思想。


 

如圖,我大概列了一些目前主流的共識演算法的種類。


1)工作量證明比特幣、以太坊都是用的這種。


2)權益證明。類似於公司的股票,誰擁有更多的幣,一直沒有發出去,等等這些引數使他擁有更多的股權,那麼他就擁有打包權。


3)授權權益證明。這個方式認為如果大家都來證明的話效率太低,所以通過選擇代表的形式。


4)Raft和PBFT主要用於內部的區塊鏈系統,一般不適用於公鏈系統,它們都是類似於投票的機制。


5)權威證明主要用在測試鏈,比如我們需要測試一些系統,那在測試的過程中,我們不希望每一次都打包區塊去進行一次挖礦,而是希望確定某些節點,讓他擁有打包權,這時這些節點我們認為是權威的,當然一開始也可以通過某種投票的機制來設定。


6)時間消逝證明這是英特爾在超級賬本專案之下所貢獻出來的一種做法。這種思路比較侷限,目前並沒有廣泛的使用。


總之,共識演算法就是通過某種做法,選出一個有代表和權力打包的這麼一個節點。


指令碼系統


 

指令碼系統首先是進行資料資產所有權的匹配執行。整個指令碼系統做得比較完善的代表是以太坊,它能夠做合約的開發。所謂的智慧合約,其實就是指令碼系統。比特幣裡的指令碼系統功能相對比較弱,因為它的設計只是為了實現幣這麼一個東西,而以太坊擴充套件了指令碼系統,它使得我們可以用圖靈完備的語言來開發自己的一些業務邏輯,在這上面我們可以開發一個遊戲,像之前流行的那個加密數字貓,也可以開發一個眾籌合約,還可以開發自己的合約代幣,或者放某一個商業應用,比如融資租賃或某個溯源管理等。


以太坊整個指令碼系統其實就包含了資料跟業務邏輯,可以在被驗證以後執行。注意這個執行是在所有的節點上都可以執行,而不是某個指定的或者特殊的節點。


網路服務


 

網路服務這一塊也是非常核心的,如圖列出了幾個比較重要的點:


1)節點的發現因為是分散式的系統,所以沒有一個特有的伺服器,一般對於公鏈來說,會設定一些種子節點,即部署在公開地址的初始節點,一般是由官方或一些志願者社群來設定。如果是內部的鏈,這個一般就不太需要,因為內部的節點是明確的,是許可登記的。


2)節點同步就是節點之間的一個資料賬本的同步,只有通過所有同步之後的資料形成的網路,就叫主鏈網路。


3)遠端功能服務就是對節點的資料訪問,比如我通過rpc的一個命令呼叫獲得當前區塊的資訊,或某個交易事務的資訊等。


2
區塊鏈的應用價值


前面是從技術的範圍對區塊鏈技術棧進行簡單介紹,那麼區塊鏈技術到底有什麼特點,能解決什麼實際問題呢?它的價值在哪裡呢?本節將重點探討區塊鏈技術的價值。


通證設計


 

其價值主要在通證這一方面通常我們在設計一個區塊鏈系統的時候,我個人建議不能避免對經濟模型的設計。如果把它純粹看成一個資料庫系統,我們是有更好的替代方案的,傳統的叢集設計資料庫系統完全可以解決各種溯源、交易之類的問題,比如京東的電商,就是一個交易系統,沒必要做成區塊鏈。


區塊鏈技術價值的體現在於對一個經濟模型的設計。比如比特幣,為什麼大家會一直執行這個東西,先不說它的炒作,就從其機制來看,它首先通過一個挖礦的方式,實現了幣的發行,通過獎勵的形式使得社群中的礦工以及其他打包者能夠得到收益。它通過這樣一個經濟模型,使得整個網路在沒有一個實際的權威公司來進行服務的同時能夠良好的執行。


這個也適用於其他的領域,我們在設計區塊鏈系統的時候,一定要看它是不是擁有經濟模型,如果它不擁有經濟模型,那一般來說它就是可替代或者說不是必須使用區塊鏈技術的。經濟模型的意義在於它是一個公共執行的系統,是一個公鏈系統。


擴充套件技術


 

擴充套件技術是非區塊鏈的一個核心技術棧,它是一個很重要的補充。


1)預言機。比如我們設定了一個系統,希望在區塊鏈裡捕獲它的資訊,或捕獲電商的某些商品資訊,這些商品資訊進入到鏈內,就是所謂的上鍊。問題是鏈內的資料是通過種種共識協議,包括各種校驗,是經過了信任處理的,但鏈外的資料對於鏈內來講是不受信任的。預言機就是解決這個問題的。


2)預言機技術到目前為止還沒有一個特別成熟的方案,所採取的做法也都是一些類似於投票的機制,就是有一些驗證節點、投票節點,如果大多數節點認為取得的這個資料是可信的,那麼就認為該資料可被信任,當然其中也會使用一些金鑰證書之類的驗證機制。


3)側鏈和閃電網路主要是對主鏈效能的補充,側鏈和閃電網路的概念都來源於比特幣系統的擴充套件。當主鏈系統特別繁忙的時候,一個區塊的確認要等待很長的時間,如何對這種平常的事務進行快速交易,有人就設計出單獨另開一個鏈,這個鏈上的資料可以秒級地進行收發確認,然後在最後再用主鏈通過合約的形式進行一個信用擔保或者結算,如果執行的側鏈跟閃電網路中的資料,有人耍賴或者提供一些破壞的話,最終會被主鏈的懲罰合約以沒收幣的形式來進行監管。


4)零知識證明之前已經介紹過了,它也是屬於一個非必須的擴充套件技術。


5)跨鏈協議我個人認為跨鏈可能是未來的一個形態,在一條鏈上執行各種應用不太現實,未來更可能出現的是擁有各種不同的專門的定製化的鏈。但這些鏈不能是一個個的孤島,它們彼此之間必須能夠互相交換信任和資料,這就是跨鏈協議。雖然到目前為止仍然沒有出現成熟的跨鏈的技術,還都是一些概念的驗證,但這將會是未來的一個發展方向。


側鏈和閃電網路


 

如圖所示就是側鏈/閃電網路跟主鏈的關係,它是跟主鏈配合,可以認為它相當於是叢集的備份,負載均衡。


預言機


 

預言機就是外部資訊如何進入到鏈內,以及鏈上資料如何到外部。Reality Keys、 Oraclize是兩個目前比較典型的開源方案,我們可以在GitHub上看到它們的程式碼,這兩個方案目前都沒有經過嚴格而完整的實戰驗證。


零知識證明


 

零知識證明主要是對加密演算法的使用,就是隱匿傳送方與接收方的交易資訊,但是在隱匿了之後別人怎麼來驗證你的資料是沒有問題的、是合法的呢?在這種情況之下來進行這種技術應用。


Zk-SNARKS演算法是目前比較主流的零知識證明演算法框架一般在開發零知識證明這一塊的程式碼的時候,主要都是使用這一套方法,它是來源於zcash的一個發展。還有其他的一些零知識證明演算法的應用,包括同態隱藏、盲評價多項式、知識係數測試和假設等。


在商業應用環境之下,零知識證明擁有比較重要的地位,因為它是對資料在加密情況之下的一個檢測,在公鏈上一般不太適用於直接的商業化的使用,因為商業化應用對資料加密有更健壯的要求。


跨鏈協議


 

跨鏈協議是通過中繼鏈提供多種鏈系統的資料交換。它的目的一方面是減緩單鏈的效能壓力,另一方面是提供鏈之間的層次性。之前在以太坊我們發現,它的網路極其擁堵的時候(比如數字加密貓的出現,導致整個網路極其擁堵,幾乎不可用),以太坊官方曾經提出過一個分片的做法,但這個做法其實是以降低安全性為代價的。它的一個基本理念是認為以前要全網廣播這些資料最終一致性,現在認為比如說全網是一萬個節點的話,有4000個節點已經同步就可以了。這種做法對於帶有資產的鏈而言,其實是降低安全性的。


更好的做法其實是提供分層鏈,也就是每一條鏈依然是完整的,兩個鏈或者說多個鏈之間進行同步的多點共識。目前以太坊官方也在全球招募技術開發者來做這一塊的探討和實踐。


3
目前主流系統



公有鏈:比特幣、以太坊、位元股、瑞波網路。


聯盟鏈Fabric,超級賬本之下的一個子專案,它不是一個鏈,而是聯盟鏈的一個開放框架,開源的,可以直接拿來用。


EEA叫企業級以太坊,以太坊本身是公鏈,但應用在企業場景之下時提出了EEA企業級以太坊的概念。企業級以太坊目前有一套已經提供原始碼的實現是Quorum,它是摩根提供的EEA實現,它的原始碼也在GitHub上,可以去看看。


公有鏈和聯盟鏈之間在功能板塊上的主要差別是聯盟鏈支援更多鑑權、綜合驗證等,聯盟鏈一般來說它本身不是一條鏈,更多的是一個技術開發框架,使用者可以自己來部署網路。


4
區塊鏈生態



著眼於整個區塊鏈的生態,上圖表示我個人意見上的一個劃分。


1)開發層面,目前有不少東西是缺乏的,比如開發環境,現在並沒有專用的區塊鏈的開發環境,也沒有比較成熟的標準庫,包括跨鏈協議,都是缺乏的,建議技術研發的同學可以往這些方向去做一些貢獻。


2)安全,比如應用審查方面,程式碼的健壯性。我們要注意的是區塊鏈系統上的資料往往是帶有資產性質的。早期出現過一個事故:一個以太坊合約的程式碼漏洞導致數億美元的資產丟失,其實導致這個事故發生的原因很簡單,就是寫合約程式碼的時候出現了一個漏洞,被黑客攻擊,在安全上缺乏標準的測試環節。


3)監管。公司內部或機構之間其實沒什麼關係,但公鏈是需要國家監管的。監管包括對資料審計、沙盒監管等,到目前為止主要是靠人為管理,沒有一個技術機制,所以很難保證鏈上執行資料的合法性。國家也一直在努力尋找解決方案。需要注意的是,這裡說的監管並不是指由某一個部門或人來決定,而是一套法律機制。


4)運營。這裡特意把版本管理列出來,通常一個軟體的版本管理不至於放到運營的高度來,但對於區塊鏈系統來講,版本管理是一個非常重要的事件。我們知道它不是一箇中心化的系統,那就意味著當開發團隊釋出新版本以後,如果這個新版本做了很大的改動,甚至包括底層協議都改了,它是無法保證所有的使用者都會去升級的,比如比特幣,如果有10萬個使用者的話,可能8萬個使用者升級了,還有2萬個使用者不想升級,那就會導致這個鏈的分叉。所以版本管理是運營的一個非常大的事情。異常管理主要是針對發生網路擁堵等問題的管理。


開發工具鏈


 

開發工具鏈是未來在這一塊的開發,今年其實也出現了一些相關工具,包括:


1)針對區塊鏈的領域特定IDE;


2)標準資產定義嚮導,標準資產定義嚮導,比如基於以太坊的代幣,它本身不是一個標準,但因為用的多了很多人會在上面去定義這個東西,於是很多機構認為有必要對它進行一個介面的約定,當你寫這份合約程式碼的時候,按照標準去實現它特意命名的這些函式介面,以使得其他人可以直接識別這個合約,這其實是一個標準化的例子;


3)關鍵演算法庫如共識演算法、加解密演算法庫等,比如石墨烯就是一個工具庫,位元股就是基於它開發的一個去中心化交易所。


測試沙盒


 

測試沙盒主要是對於智慧合約的程式碼安全測試節點模擬沙盒測試,模擬大規模的節點、模擬節點的時效、模擬惡意節點等;攻擊測試多版本分叉測試,每次分叉對於區塊鏈都是一個重大的事件,因為通常意味著它原始的共識網路會被打斷,就可能會帶來一系列的安全問題。包括公司內部也一樣,節點數量更多的時候,當你不能同步升級就會導致分叉。


5
當前問題



總的來看,當前的問題主要表現為:智慧合約的安全性、系統可用性、多鏈互聯協議缺乏標準和產品驗證、網際網路審計監管技術方案缺乏、以及專業特定的開發及測試工具缺乏。更多的問題主要在公鏈,聯盟鏈在公司或機構之間,問題會少很多。


加入知識星球

和蔣勇老師交流


本文內容為《白話區塊鏈》作者蔣勇老師於京東大學區塊鏈專題公開課的分享實錄。       

    本文編輯:Cynthia


以下是我們的社群介紹,歡迎各種合作、交流、學習:)



相關文章