区块链基础设施纵览:基本框架原则——揭示存储、计算和通信元素
http://www.infoq.com/cn/articles/blockchain-infrastructure-landscape
以太坊、IPFS/Filecoin和BigchainDB之間是怎樣的關系?Golem、Polkadot或Interledger又是什么情況?我經常被問到諸如此類的問題,所以決定寫下這篇文章,從基本框架層面回答這些問題。
簡單來說:并不存在名為“區塊鏈”的無所不能的神奇系統。相比之下,倒是有很多優秀的計算構件塊,可以組合起來創建實用的去中心化應用。以太坊可以充當此類角色,此外還有很多類似的選擇。接下來具體分析。
背景
構成計算技術的基本元素是存儲、處理和通信。大型主機、PC、移動設備和云服務都以各自的方式展現這些元素。各個元素之內還有專門的構件塊來分配資源。
例如,在存儲元素內,既有文件系統也有數據庫。文件系統使用目錄文件的層級結構存放mp3這樣的blob(二進制大對象)數據,而數據庫用來存放結構化的元數據,使用SQL[1]這樣的查詢接口。在中心化的云平臺上,我們可能使用Amazon S3服務存放文件,用MongoDB Atlas運行數據庫,并使用Amazon EC2處理運算需求。
本文聚焦于區塊鏈的大框架:介紹區塊鏈中各個計算元素的模塊以及各個模塊的一些實現案例,偏向概論而非詳解。
區塊鏈的組成模塊
以下是去中心化技術中各個計算元素的構件塊:
- 存儲:代幣存儲、數據庫、文件系統/blob
- 處理:有狀態的業務邏輯、無狀態的業務邏輯、高性能計算
- 通信:數據、價值和狀態的連接網絡
區塊鏈的基礎架構縱覽
區塊鏈技術體現在每個模塊中,如下圖所示[2]:
存儲
作為基本計算元素,存儲部分包含了以下構件塊。
代幣存儲。代幣是價值的存儲媒介(例如資產、證券等),價值可以是比特幣、航空里程或是數字作品的版權。代幣存儲系統的主要作用是發放和傳輸代幣(有多種變體),同時防止多重支付之類的事件發生。
比特幣和Zcash是兩大“純凈”的、只關注代幣本身的系統。以太坊則開始將代幣用于各種服務,以實現其充當全球計算中心的理想。這些例子中代幣被用作運營整個網絡架構的內部激勵。
還有些代幣不是網絡用來推動自身運行的內部工具,而是用做更高級別網絡的激勵,但它們的代幣實際上是存儲在底層架構中的。一個例子是像Golem這樣的ERC20代幣,運行在以太坊網絡層上。另一個例子是Envoke的IP授權代幣,運行在IPDB網絡層上。
最后我用“.*”來說明大多數區塊鏈系統都有一套代幣存儲機制。
數據庫。數據庫專門用來存儲結構化的元數據,例如數據表(關系型數據庫)、文檔存儲(例如JSON)、鍵值存儲、時間序列或圖數據庫。數據庫可以使用SQL這樣的查詢快速檢索數據。
傳統的分布式(但中心化)數據庫如MongoDB和Cassandra通常會存儲數百TB甚至PB級的數據,性能可達到每秒百萬次寫入。
SQL這樣的查詢語言是很強大的,因為它將實現與規范區分開來,這樣就不會綁定在某個具體的應用上。SQL已經作為標準應用了數十年,所以同一個數據庫系統可以用在很多不同的行業中。
換言之,要在比特幣之外討論一般性,不一定要拿圖靈完備性說事。你只需要一個數據庫就夠了,這樣既簡潔又方便擴展。有些時候圖靈完備也是很有用的,我們將在“去中心化處理”一節具體討論。
BigchainDB是去中心化的數據庫軟件,是專門的文檔存儲系統。它基于MongoDB(或RethinkDB),繼承了后者的查詢和擴展邏輯。但它也具備了區塊鏈的特征,諸如去中心化控制、防篡改和代幣支持。IPDB是BigchainDB的一個受監管的公開實例。
在區塊鏈領域,也可以說IOTA是一個時間序列數據庫。
文件系統/blob數據存儲。這些系統以目錄和文件的層級結構來存儲大文件(電影、音樂、大數據集)。
IPFS和Tahoe-LAFS是去中心化的文件系統,包含去中心化或中心化的blob存儲。FileCoin、Storj、Sia和Tieron是去中心化的blob存儲系統,古老而出色的BitTorrent也是如此,雖然后者使用的是p2p體系而非代幣。以太坊Swarm、Dat、Swarm-JS基本上都支持上述兩種方式。
數據市場。這種系統將數據所有者(比如企業)與數據使用者(比如AI創業公司)連接在一起。它們位于數據庫與文件系統的上層,但依舊是核心架構,因為數不清的需要數據的應用(例如AI)都依賴這類服務。Ocean就是協議和網絡的一個例子,可以基于它創建數據市場。還有一些特定應用的數據市場:Enigma Catalyst用于加密市場,Datum用于私人數據,DataBroker DAO則用于物聯網數據流[2]。
處理
接下來討論處理這個基本計算元素。
“智能合約”系統,通常指的是以去中心化形式處理數據的系統[3]。它其實有兩個屬性完全不同的子集:無狀態(組合式)業務邏輯和有狀態(順序式)業務邏輯。無狀態和有狀態在復雜性、可驗證性等方面差異巨大。第三種去中心化的處理模塊是高性能計算(HPC)。
無狀態(組合式)業務邏輯。這是一種任意邏輯,不在內部保留狀態。用電子工程術語來說,它可以理解為組合式數字邏輯電路。這一邏輯可以表現為真值表、邏輯示意圖、或者帶條件語句的代碼(if/then、and、or、not等判斷的組合)。因為它們沒有狀態,很容易驗證大型無狀態智能合約,從而創建大型可驗證的安全系統。N個輸入和一個輸出需要O(2^N)個計算來驗證。
跨賬本協議(ILP)包含crypto-conditions(CC)協議,以便清楚地標出組合電路。CC很好理解,因為它通過IETF成為了互聯網標準,而ILP則在各種中心和去中心化的支付網絡(例如超過75家銀行使用的瑞波)中廣泛應用。CC有很多獨立實現的版本,包括JavaScript、Python、Java等。BigchainDB、瑞波等系統也用CC,用以支持組合式業務邏輯/智能合約。
Bitshare和Eos也支持無狀態業務邏輯。
因為有狀態邏輯是無狀態邏輯的超集,支持有狀態邏輯的系統也自然支持無狀態邏輯(但代價是增加復雜性,可驗證性方面也要考慮更多問題)。
BigchainDB、Bitshares、Eos還支持事件。它提供了一種持久的層級,使功能更接近有狀態的業務邏輯(感謝Ian Grigg指出這一點[2])。
有狀態(順序)業務邏輯。這是一種在內部保留狀態的任意邏輯。也就是說,它有記憶,或者說它是一種帶有至少一個反饋回路(和一個時鐘)的組合邏輯電路。例如,一顆微處理器有一個內部寄存器,根據發送給它的機器碼指令進行更新。更一般地說,有狀態的業務邏輯是一個圖靈機,接受一系列輸入并返回一系列輸出。有這種(實際近似)表現的系統被稱為圖靈完備系統[4]。
以太坊是最知名的使用有狀態業務邏輯/智能合約的區塊鏈系統,其智能合約直接在鏈上運行。Lisk、RChain、DFINITY、Aeternity、Tezos、Fabric、Sawtooth和很多其它系統也有智能合約。運行“在某處”的代碼是個強大的理念,有很多使用場景。這也能部分解釋為什么以太坊一飛沖天,為什么它的生態系統如此興旺,以及為什么會有這么多競爭者在這一領域崛起。
因為順序邏輯是組合邏輯的超集,這類系統也支持組合邏輯。
正如DAO黑客所示,代碼中的小錯誤可能導致嚴重后果。芯片產業采用的形式化驗證也能在這里發揮作用,以太坊基金會正在這方面做出努力。但它有規模限制:對于組合電路,可能的映射數量最多有2^(輸入數量)種。對于時序電路,內部狀態的上限是2^(內部狀態變量的數量),前提是內部的變量都是布爾值。例如,對于一個帶有3個輸入的組合電路,它有2^3=8種可能的狀態供驗證。但如果它是一個帶有32位寄存器的時序電路,要完整驗證就要檢查2^32=42億種狀態。這一限制約束了時序電路的復雜程度(如果要保證可信度)。“按結構修正”是另一種驗證有狀態智能合約的手段,比如Rchain使用的rho微積分。
如果需要去中心化的處理,很多場景下有個更簡單的方法:只要把處理過程放在客戶端一側,運行在瀏覽器或移動設備中,用JS或Swift代碼編寫就行了。這個時候就要信賴客戶端的處理過程,如果設備是你自己控制的那就沒什么問題。我們把它叫做“胖客戶端”,是相對于“胖協議”架構來說的。這種體系對主流web開發者很友好。例如,很多web應用需要用到應用狀態。要開發這樣的系統只需要用到JS+IPDB(使用js-bigchaindb驅動)。如果你的應用也需要blob存儲和支付功能,就再加上JS的IPFS客戶端版本(ipfs.js)和以太坊版本(web3.js),比如:
?
高性能計算(HPC)。這是一種處理“重負載”計算任務的過程,諸如渲染、機器學習、電路模擬、氣象預報、蛋白質折疊等任務都是這種類型。這類計算任務往往花費幾個小時、甚至數周時間,運行在整套機器集群上(CPU、GPU甚至TPU)。
這些方法可以讓HPC去中心化:
- Golem和iEx.ec可以用來組成去中心化的超級計算機及相關的應用框架。
- Nyriad可以組成存儲處理框架。基本上這個處理過程與中心化的存儲是放在一起的(Nyriad也有適合后者的方案)。
- TrueBit實現第三方計算,并進行后期計算檢查(空閑時進行隱式檢查,出現問題時進行顯式檢查)。
- 有些人只是用VM或Docker容器執行復雜的計算任務,將結果(VM最終狀態或單純的計算結果)放到blob存儲里,只提供有限的訪問權限。然后他們把存儲訪問授權賣給容器使用者,比如代幣讀取權限。這種方式需要更多客戶端來驗證結果,好處在于技術都很成熟。當TrueBit成熟后,這種方法自然會與其融合。
通信
這一節我們會談到第三個也是最后一個基本的計算元素,通信。描繪通信框架的方法很多,我會重點介紹網絡連接。它有三個層級:數據、價值和狀態。
數據。60年代,ARPA.net誕生了。它的成功催生了一系列類似的網絡,諸如NPL和CYCLADES。新的問題隨之出現:它們無法互相交流。Cerf和Kahn在70年代發明了TCP/IP來連接這些網絡,創建一個網絡組成的聯網系統,也就是今天我們熟知的Internet。TCP/IP是當今網絡連接的事實標準。OSI協議棧曾經是它的競爭對手,但很早就消亡了;然而諷刺的是,OSI的模型被證明是有用的。于是,雖然TCP/IP歷史悠久,但它仍然是連接網絡數據的去中心化構件。
Tor項目可以被視為TCP/IP的上層,用來保護用戶的隱私。然而它有很多中心化的特點,更不要說它獲得了國防部的資助,令很多人不滿。代幣化的類Tor項目正在興起,可以拭目以待[2]。
價值。TCP/IP只在數據層連接不同網絡。你可以復送分包——將一個分包一次發送到很多目的地——也無所謂。但如果要在網絡中發送價值時,該怎樣連接網絡呢?比如比特幣到以太坊,乃至SWIFT清算網絡到瑞波XRP網絡。你需要代幣能一次只發送到一個目的地。防止重復發送的一種聯網方式是使用匯票,但這種做法往往消耗很多資源。但是,我們可以只保留匯票的核心要素,拋開信任中介,使用密鑰托管。愛麗絲可以通過馬洛里向鮑勃匯款,款項經過馬洛里之手但他不能動用(并且有期限約束,馬洛里不能一直占著款子不放)。這就是跨賬本協議(ILP)的核心要素。這也是雙向掛鉤(想想側鏈)和狀態管道(比如Lightning和Raiden)的理念;但重點完全在于為價值交換連接網絡。除了ILP,Cosmos等系統會更復雜一些,以換取更多便利。
狀態。除了連接價值網絡,我們能否更進一步?想象一個計算機病毒,其帶有自己的比特幣錢包,可以在網絡間跳轉;或者以太坊主網中的一個智能合約,可以將其狀態轉向另一個以太坊網絡乃至另一個兼容網絡?或者,為什么將AI DAO局限在單一網絡中?
于是誕生了Polkadot,用來連接網絡的狀態。Aeternity也介于價值網絡和狀態網絡之間。
案例
現在我們研究了三大計算元素(存儲、處理、通信),探討了每種元素的去中心化構件,以及每種構件的項目實例。
人們開始發展組合式的系統。有很多由兩種構件組成的模式,通常使用IPFS+以太坊或IPFS+IPDB。甚至有人使用三個或更多的模塊組合。以下是一些前沿案例:
- Ujo使用IPFS|Swarm+IPDB+以太坊,用于去中心化音樂網絡。IPFS或Swarm用在文件系統和blob存儲上。IPDB(和BigchainDB)用于元數據存儲和查詢。以太坊用于代幣存儲和有狀態業務邏輯。
- Innogy使用IPFS+IPDB+IOTA,用于供應鏈/物聯網應用。IPFS用于文件系統和blob存儲。IPDB(和BigchainDB)用于元數據存儲和查詢。IOTA用于時間序列數據。
相關工作
以下是區塊鏈社區其他研究者的相關框架,我很高興能與他們進行很好的交流。
Joel Monegro的“胖協議”框架強調每個構件都是一個協議。我覺得這是一個很酷的框架,盡管它要求構件之間只能使用網絡協議交流。還有一種方式:模塊可以簡單地成為“導入”語句或庫調用。
使用導入的原因可以是為了(a)更低的延遲:一個網絡呼叫要花費時間,可能影響乃至破壞可用性;(b)簡潔:使用庫調用(乃至嵌入代碼)往往比連接到一個網絡、支付代幣等更簡單;(c)更加成熟:協議棧才剛剛興起。我們有歷史數十年之久的優秀Unix庫,甚至Python和JS模塊也有15年以上的歷史。
Fred Ehrsam的“Dapp開發者協議棧”強調web商業模式。雖然它很有幫助,但它不是要針對給定計算元素(比如文件系統與數據庫)在模塊之間進行細化區分的。
BigchainDB白皮書(最早發布于2016年2月)第一部分展示了其早期版本的形態,如下所示:
它關注于處理、文件系統和數據庫這幾大構件。它沒有使用“計算元素”的框架,沒有區分去中心化處理的類型。本文是我在過去一年半根據這份白皮書進一步思考的成果;我在5月22日在Consensus 2017上的演講進一步補充了我的觀點,與本文內容很接近。(我寫這篇文章的部分原因是很多人請我將這些思考化作文字)。
該圖還指出了一個頻譜,最左邊是完全的中心化,最右是完全的去中心化。這有助于將已有的軟件系統升級為更加去中心化的形式,將最有必要升級的模塊優先去中心化。
Stephan Tual的“Web 3.0重構”堆棧與本文的思想基本一致,只不過更偏重于以太坊。它為社區提供了很好的服務,用一張映射圖將很多項目歸類到相似的構件中。我驚喜地意識到它與我的思想非常相似。不過它的應用服務模塊層(消息模塊、存儲模塊、共識模塊、管理模塊……)實際上將三種事物混合在一起:應用、“是什么”和“怎樣做”。對我而言,模塊應該是“是什么”的類別。所以消息是一個應用(應該在應用層);存儲應該更加細粒化;共識是“怎樣做”的部分(隱藏在一些模塊里);管理也是“怎樣做”的部分(所以也該隱藏起來)。它也有“網絡”協議,用作單獨的底層模塊,不過我將它們視為模塊間交互的一種可行方式,與庫調用類似。不管怎樣,我認為這是非常出色的堆棧。
Alexander Ruppert的“映射去中心化世界”有大約20類組織,x軸有四個高級類,依次是基礎設施層、中間件層、流動層、應用層。這也是很棒的部分;我很高興能幫助Alex做出這個映射。它對核心基礎設施著墨不多,更注重廣泛的趨勢;而本文主要寫的是核心基礎設施的框架原則。
未來
Ujo這樣的系統將很多模塊合并在一起,諸如IPFS或Swarm(用于blob)+以太坊(用于代幣和業務邏輯)+IPDB和BigchainDB(用于可快速查詢的數據庫),所以綜合了所有系統的優點。
我希望隨著人們更好地理解構件之間的關系,這種趨勢也會隨之加速。這也比把所有東西都塞入名為“區塊鏈”的單一框架更有效率。
我希望這一理念隨著去中心化生態系統一起繼續進化。AWS一開始只有一種服務:為blob存儲提供的S3服務;之后它有了處理服務:EC2;它繼續進化。AWS現在有50多個模塊,當然其中少數模塊依舊是最關鍵的。下圖列出了AWS的所有服務。
aws.amazon.com的完整服務截圖,2017年7月15日
我發現類似的故事正在去中心化世界上演。初看起來,我們可以設想每一個AWS模塊的去中心化版本。但也會有不同點,因為每種生態系統(云、移動、去中心化)都有自己的特定模塊,比如去中心化的代幣存儲。這將是很有趣的旅程!
注釋
[1] 其實我們可以進一步對這些構件進行分級。例如數據庫是在文件系統之上的。后者則在原始數據(blob)存儲之上。分布式數據庫推動通信發展。例如,多數現代數據庫使用Ext4、XFS或GridFS等文件系統與底層存儲。本文中我給出的框架是應用開發者的視點:文件系統的UX是什么,數據庫的UX是什么,等等。
[2] 2017年8月我在此加入了一些新內容。
[3] 我從未真正喜歡過“智能合約”這種說法。在AI語境下它們并不算智能。它們也和”合約“這個法律概念沒有關系。如果它們的確包含法律元素,它們通常會加上狀態,比如說用Ricardian合約。”去中心化處理“的稱謂和其中的”去中心化業務邏輯“更加合理。不過現在“智能合約”的叫法如此普及,就這么叫也可以。相比糾結稱謂,我們有更有意義的事情要做。
[4] 這里我提到的“圖靈完備”是實踐層面的,不是純粹理論層面的。理論上,機器根據輸入數據及其當前內部狀態返回一系列輸出數據;但實踐上,機器無法永續運行,無法解決“機器何時停止”的問題(停止問題)。
原文鏈接:https://blog.bigchaindb.com/blockchain-infrastructure-landscape-a-first-principles-framing-92cc5549bafe
轉載于:https://www.cnblogs.com/davidwang456/articles/8743473.html
總結
以上是生活随笔為你收集整理的区块链基础设施纵览:基本框架原则——揭示存储、计算和通信元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个简单可参考的API网关架构设计
- 下一篇: Docker说了这么多 最全的一篇在这里