編者注:本文對 Cosmos 網絡中區塊鏈和比特幣、以太坊進行了鉅細靡遺的比較。做者先從區塊鏈系統的棧層出發,分析了比特幣、以太坊在不一樣棧層上的技術要點,最後迴歸到 Cosmos 網絡中的區塊鏈,概念解釋尤其清晰,是不可多得的解釋文。前端
鑑於文章實在太長,咱們在文首附上了目錄。算法
Cosmos 是什麼?數據庫
區塊鏈結構簡介編程
比特幣棧層結構後端
以太坊棧層結構安全
基於比特幣與以太坊構建應用程序網絡
Cosmos 區塊鏈結構架構
Cosmos 共識層app
Cosmos 網絡層框架
Cosmos 應用層
結論
密碼學貨幣產業從未停下腳步。
一切都始於2010年比特幣的問世。比特幣剛問世時,全部人都認爲它是數字貨幣的聖盃。曾經被認爲不可能的事情如今變成了現實:第一個點對點(peer-to-peer,P2P)支付網絡出現了。
即使在今天,對事物的信任仍然是最難以琢磨而且最珍貴的資產。比特幣經過建立第一個「免信任型」系統,繞過了這一問題。但這僅僅是一個開始。
從那以後,比特幣就成爲了催生更普遍密碼學創新的催化劑,這些創新也致使了一系列新型去中心化系統與金融基礎設施的出現:以太坊(Ethereum)、閃電網絡(Lighting Network)、EOS、Tezos、Maker…… 這個名單還在不斷延長。
可是有一個項目不同凡響:Cosmos。
在區塊鏈領域,Cosmos 是一個「新生兒」。雖然它的理念已經出現有一段時間了,但其開發團隊一直在背後慢慢地開發以確保 Cosmos 設計及實現的正確性。這也使得 Cosmos 最近才公開推出。
所以,有不少人看過 Cosmos 項目以後卻不理解它也就不足爲奇了。簡單瀏覽 Cosmos 相關資料並不會讓他們可以直觀地瞭解 Cosmos,反而會讓他們有更多疑問:
什麼是 Cosmos?
Cosmos 的工做原理是什麼?
與比特幣、以太坊相比 Cosmos 有什麼不一樣?
Cosmos 的特色是什麼?
我已經知道 Cosmos 團隊快兩年了。老實說,當我第一次據說他們在作什麼的時候,我和其餘人同樣對它的概念一無所知。
但當我更深刻地瞭解 Cosmos 以後,我開始很是欣賞它。我這麼說不只是爲了引人注目,是真正地發自心裏。
我對 Cosmos 很是着迷,因此咱們決定將 TruStory 應用構建爲一個 Cosmos 區塊鏈應用。(插播:我將在以後的文章中更詳細地闡述咱們爲何會作出這個決定)
儘管如此,關於 Cosmos 仍然有不少困惑。因此我決定專門爲此寫一篇文章。我想讓讀者對 Cosmos 是什麼以及它在區塊鏈世界中的定位有一個更深層次的理解。
你準備好開始了麼?理清思緒,帶上你的思考帽,繫好安全帶。咱們要開車啦!
Cosmos 是這樣定義本身的:
「一個由多條獨立平行區塊鏈組成的去中心化網絡,每條平行區塊鏈均採用 BFT 共識算法(例如:Tendermint 共識)。」
哇,好拗口啊!讓咱們把這個定義拆分紅幾個容易理解的部分。
我在這裏假設讀者已經對區塊鏈很是瞭解了!不過,我仍是快速回顧一下:
簡單來講,區塊鏈是一個分佈在許多計算機上的數據庫,每臺計算機上的數據庫都保持相同的狀態。換句話說,每臺計算機上的數據庫所包含的數據都徹底相同。這些計算機共同組成了所謂的「區塊鏈網絡」。
比特幣和以太坊都是區塊鏈,而 Cosmos 是由許多這樣並行運行的區塊鏈組成的區塊鏈網絡。
若是你不能徹底理解剛纔說的,那麼在進一步瞭解 Cosmos 工做原理以前,你最好再多讀一些關於區塊鏈的基礎知識。(編者注:中譯本見文末超連接《區塊鏈是什麼鬼》)
BFT 是 「Byzantine Fault-Tolerant(拜占庭容錯)」的縮寫。一條拜占庭容錯的區塊鏈可以在網絡中部分節點宕機 以及/或者 做惡(即所謂「拜占庭式節點」)的狀況下,保證網絡依舊具有「安全性」與「活性」等性質。安全性與活性可以確保區塊鏈網絡中每一個節點維護相同的狀態。
插播:若是你想要更深刻地瞭解什麼是安全性(Safety)與活性(Liveness),請閱讀個人這篇有關分佈式共識的文章。(編者注:中譯本見文末超連接《分佈式共識的工做原理,Part-2》)
所以,一種 「BFT 共識算法」 乃是定義了計算機間通訊與協調、使得區塊鏈具備拜占庭容錯能力的算法。Cosmos 網絡中的全部區塊鏈都採用某種 BFT 共識算法。
比特幣和以太坊的共識算法不是典型的 BFT 算法。因此它們不符合 Cosmos 網絡中區塊鏈的定義。(值得注意的是,雖然它們不是拜占庭容錯的,但仍然可讓比特幣和以太坊等區塊鏈加入 Cosmos 網絡,僅僅須要一些額外的步驟。若是你以爲費解,不用擔憂——咱們將稍後對此進行更深刻的研究。)
插播:若是你仍是不清楚什麼是 BFT,我在這篇文章中寫得蠻清楚了。(編者注:中譯本見文末超連接《分佈式共識的工做原理,Part-3》)
Tendermint 是由 Cosmos 開發者提出並構建的一種 BFT 共識算法。Cosmos 網絡中的區塊鏈可使用 Tendermint 共識或任何其餘 BFT 共識算法。稍後咱們將在本文了解更多關於 Tendermint 的內容。
簡單來講,Cosmos 網絡是一個由多條並行運行的獨立拜占庭容錯區塊鏈組成的生態系統。這些區塊鏈是 獨立運行的,而且可以與其餘區塊鏈進行 互操做。
如今你可能會想,「爲何區塊鏈之間要進行互操做呢?」
好問題!咱們很快就會講到。但首先咱們要回顧一下區塊鏈的結構。
在深刻研究 Cosmos 生態系統中區塊鏈是如何工做和互操做的以前,讓咱們先回顧一下區塊鏈結構的基礎知識。
正如咱們前面所討論的,區塊鏈是一個多機複製數據庫,而且在每臺計算機上維護相同的數據。這種類型的分佈式系統也被稱爲「複製狀態機」。
複製狀態機是一種多機複製的肯定性狀態機,但由於網絡中每臺計算機都維護着相同的狀態,所以在功能上看起來就像一臺單機。
聽起來很熟悉,對吧?回顧上文區塊鏈的定義,這裏的定義僅僅是將「數據庫」替換爲「狀態機」、「數據」替換爲「狀態」,相信你能明白個人意思。
「肯定性」 能夠簡單地理解爲,給定一個肯定的輸入,狀態機將始終產生相同的輸出。在區塊鏈系統中,「肯定性」意味着若是你從一個給定狀態開始執行相同的事務序列,你老是會獲得相同的最終狀態。
複製狀態機從某個狀態啓動。每筆有效事務都將致使系統狀態轉變到下一個狀態(這與數據庫中條目更新相同:若是你更新某個條目,數據庫將遷移到包含該更新後數據條目的新狀態)。
複製狀態機在概念上有三個棧層:
1)應用層
應用層負責定義狀態變遷,並在事務發生後更新狀態機狀態。
2)網絡層
網絡層負責將在某一個狀態機上執行的事務傳播到網絡中其餘全部狀態機上。
3)共識層
共識層由算法組成,負責確保在事務執行後每一臺狀態機都存儲相同的狀態(即,某一狀態機沒法僞造不存在的事務)。
3a)抗女巫攻擊層
試圖在去中心化公網運行的複製狀態機還須要第四層(「抗女巫攻擊層」),確保任何一臺狀態機都不能破壞網絡。若是沒有這一層,狀態機能夠經過建立許多假身份來篡改狀態,從而得到與其投入不成比例的影響或收益(即,發起女巫攻擊)。
總之,應用層負責定義狀態與管理狀態遷移。網絡與共識層負責保持每臺機器上狀態一致(即,確保網絡中每一個數據庫數據一致)。抗女巫攻擊層(顯然)負責避免女巫攻擊。
如今,讓咱們看看在比特幣區塊鏈和以太坊區塊鏈中是如何定義與實現這些棧層的。
1)應用層
比特幣的主要應用是 P2P 交易。比特幣使用 Script(一種堆棧式非圖靈完備的語言)來定義與執行交易。當發送方經過交易發送比特幣時,發送方將使用腳原本編碼指定誰才能掌控這筆資金。Script 包含一組操做碼或者說命令,發送方可使用這些操做碼來指定要花費一筆比特幣所需知足的條件。
2)網絡層
當發送方向接收方發送比特幣時,該轉帳交易必須被廣播到網絡中,才能使礦工將其打包進區塊中。比特幣使用一種「Gossip 協議」來確保每一個節點都會將其接收的全部新區塊或交易發送至鄰居節點(peer)。Gossip 協議是確保消息在所有節點間傳播的 P2P 協議。比特幣網絡中全部節點都會將其新接收的有效交易當即發送給其鄰居節點,從而使得待打包交易可以在幾秒鐘內經過點對點網絡傳播到大多數節點。
3)共識層
在交易被轉播到網絡中後,還須要將其添加到區塊鏈中才能完成轉帳(即讓網絡中的計算機都來執行這個事務)。驗證交易並將其打包到區塊中的過程稱爲「中本聰共識(Nakamoto Consensus)」。中本聰共識的運行原理能夠在其餘論壇或文章找到。若是你想深刻了解,這篇文章是一個很好的入門文章。
3a)抗女巫攻擊層
中本聰共識依賴於「工做量證實(Proof-of-Work)」來防止女巫攻擊。基本上,產生一個新區塊所需的算力使得比特幣共識協議自身可以抵抗女巫攻擊。因爲礦工須要大量的算力來產生下一個區塊,使得他們沒法在不增長大量算力(與資金)投入的狀況下「僞造」多個身份。
1)應用層
與比特幣不一樣,以太坊的設計初衷是構建一個可以運行去中心化應用的平臺。以太坊包含一種高級語言(即,Solidity),使得開發者可以經過編寫智能合約定義去中心化應用的具體功能。EVM(以太坊虛擬機,Ethereum Virtual Machine)是以太坊應用層的核心。EVM 使用 EVM 編譯器將智能合約代碼編譯成字節碼,用戶能夠經過交易的形式,將該字節碼上傳到區塊鏈以後,EVM 就能夠執行這些字節碼,從而改變去中心化應用的狀態(即,更新以太坊節點存儲的該智能合約相關狀態)。因爲以太坊網絡中全部節點均運行 EVM,這也保證全部節點的狀態一致。
2)網絡層
與比特幣類似,以太坊也使用 Gossip 協議,使得節點可以與其鄰居節點通訊。
3)共識層
爲了達成共識,以太坊使用了與中本聰共識類似的「Ethash」,但 Ethash 與中本聰共識有一些關鍵區別。若是你須要瞭解以太坊共識算法的工做原理,請閱讀我以前的一篇文章。(編者注:中譯本見文末超連接《以太坊的工做原理》)
3a)抗女巫攻擊層
與比特幣同樣,Ethash 依賴於工做量證實(目前爲止,譯者注:將來以太坊 2.0 將切換到 PoS 共識機制)來抵禦女巫攻擊。
我但願以上內容讓你對區塊鏈結構有了必定了解。當咱們討論 「比特幣」 或 「以太坊」時,這些名字指的是相關的全部棧層。由於比特幣和以太坊是由這些棧層組成的總體。
你沒法將以太坊智能合約與其底層 Ethhash 共識層分開,也所以單獨討論這兩個主題都沒有意義。比特幣也是如此,不使用中本聰共識與工做量證實你就沒法進行比特幣交易。
另外一方面,Cosmos 採用了一種稍微不一樣的模式:它將應用層與共識層和網絡層分開。
由於 Cosmos 的目標是創建一個區塊鏈網絡,因此這樣設計是有意義的。在這個區塊鏈網絡中,每條區塊鏈是獨立的,而且有它本身的須要和要求(即,它本身的應用)。在這種狀況下,想要提出一種一刀切的、適合全部區塊鏈的應用層,是行不通的。讓咱們用幾個例子來研究一下緣由。
假設咱們準備構建一個貨幣應用程序。在這種狀況下,像 Bitcoin Scrypt 這種簡單的基於堆棧的腳本語言是最佳選擇。比特幣腳本語言不只能夠很好地實現從一個地址到另外一個地址的價值轉移,而且很是簡單、不是圖靈完備的。
所以,它不太容易受到各類類型安全漏洞的影響,而這些安全漏洞可能會嚴重影響圖靈完備的編程語言。這正是咱們在處理貨幣與價值存儲時想要的。可是這種簡單也有其侷限性。
使用 Scrypt 作任何更復雜的事情(例如:去中心化預測市場)都很是困難。比特幣腳本語言不只受其可執行代碼複雜性限制,對於開發者來講也十分不友好。更糟糕的是,比特幣區塊鏈交易的處理速度很慢(大約每秒 7 筆交易)。所以,直接在比特幣區塊鏈上構建須要高交易吞吐量的應用是不現實的。
與比特幣相反,以太坊的 EVM 與智能合約語言(Solidity)是爲了支持更靈活的應用程序而設計的。Solidity 是一種圖靈完備的編程語言,所以理論上它能夠執行任意算法複雜度的代碼。
在實際應用中,因爲 Solidity 易出錯並易受到安全攻擊,因此使用 Solidity 開發任意複雜度的程序是至關困難的。這種特性與處理價值轉移的應用程序背道而馳,在後者這個場景種,安全性是最重要的。
此外,智能合約也很是難以升級,從而使得迭代開發很是困難。合約一旦部署上鍊,你所能作的就只有祈禱它可以平穩運行!與比特幣同樣,以太坊交易處理速率也很是低(大約每秒可以處理 15 筆交易),所以在以太坊區塊鏈上構建須要高交易吞吐量的應用也是不現實的。
Cosmos 的提出就是爲了知足這種實際業務須要,儘管它爲此作了一些較大的犧牲。接下來咱們將深刻研究具體的細節。但在那以前,咱們還必須理解 Cosmos 中區塊鏈的三個棧層是什麼樣的。
首先,咱們將從共識層開始瞭解 Cosmos,以便更好地理解在 Cosmos 上開發應用程序與使用比特幣或以太坊有何不一樣。
Cosmos 網絡中區塊鏈使用 Tendermint 共識算法。Tendermint 是一個 2014 年誕生的開源項目,「旨在解決比特幣工做量證實(Proof-of-Work, PoW)共識算法的速度、可擴展性與環境問題」。
Tendermint 共識算法是一個 「無視應用層(application-agnostic)的共識引擎」。從本質上講,這意味着任何區塊鏈均可以使用 Tendermint 共識算法,它是拜占庭容錯的,而且使用 PoS 算法來抵禦女巫攻擊。
又是一大堆術語!咱們好好說道說道。
回顧一下,共識算法的存在是爲了保證事務執行後,狀態機中保存的狀態一致;而 Tendermint 共識算法定義了一種「能讓全部節點對下個區塊達成共識」的規則。
讓咱們看看相關因素及規則是如何運做的吧!
驗證者
負責達成狀態一致的節點稱爲「驗證者」。任何願意協助整個網絡達成共識的參與節點都能成爲驗證者;做爲回報,驗證者會得到交易手續費和區塊獎勵。Tendermint 整合這些驗證者的投票結果,肯定下一個區塊的正確狀態。
經過質押對抗女巫攻擊
每一個驗證者的票都有本身的投票權重,投票權重一般是在創世塊產生時肯定,或是在開始運行後根據應用層開發者所設計的某些邏輯來決定。通常來講,由驗證者鎖在系統中的代幣量(做爲質押品)決定投票權重的大小,這種質押物也被稱爲「保證金」。
Consensus 共識
按照規則,驗證者要按輪次(round)對每個區塊達成共識。每一輪都包含三個基本步驟:提議階段(Propose)、預投票階段(Prevote)、預提交階段(Precommit),以及兩個後續步驟:提交階段(Commit)、新高度階段(NewHeight)。從抽象角度來看,驗證者按照如下協議規則共同決定下一高度要使用什麼區塊:
首先是提議階段,由指定的驗證者提出一個區塊——每一輪中的提議者都是從有序的列表中按照投票權重的比例,肯定性地選擇出來的。
接着進入預投票階段——每一位驗證者廣播他們各自的預投票。
當該輪次中某一區塊收到超過 2/3 的預投票,咱們就稱其爲 「polka」。一旦出現 「polka」,就進入下一個階段。
進入預提交階段,由每個驗證者廣播他們的預提交的投票。
若是某一特定區塊收到超過 2/3 的預投票,就進入提交階段,這個階段會將區塊加入區塊鏈,並增長區塊高度。每當有新的區塊加入區塊鏈,所在區塊鏈的區塊高度就 +1。
若是失敗,則要麼返回預投票階段,要麼回到預提交階段。
要注意的是,在任何高度上,都有可能須要一輪以上的投票才能提交一個區塊。由於可能出現如下狀況:
被指定的「提議者」在應該提出區塊時掉線
提議者所提出的區塊違反一些預先定義的規則
Tendermint 依靠超時機制確保區塊鏈出塊不會遇到延宕。若是在超時前,提議區塊沒有收到超過 2/3 的預投票,則由新的提議者再次進行提出區塊流程。
協議細節詳見此處。
總的來講,Tendermint 選擇了與比特幣的中本聰共識、以太坊 Ethash 不一樣的路線, 讓咱們作一些重點對比:
肯定性與機率性
與中本聰共識和 Ethash 這類機率性共識不一樣, Tendermint 是肯定共識——這意味着 Tendermint 每一個區塊都是最終肯定的,而不像比特幣的區塊只是處於「極可能」被肯定的狀態。
咱們回顧一下中本聰共識,區塊老是處於「未肯定」狀態——只有肯定某個區塊在「最長鏈」上,纔能有把握認爲該塊正在被最終肯定,這也是爲何比特幣交易須要等「6 個區塊確認」。
而在 Tendermint 中,驗證者成功投票及提交後,區塊就當即被確認了。
固定驗證者 vs. 可變驗證者
中本聰共識及 Ethash 容許礦工隨時選擇加入或退出,並不須要其餘礦工提早知曉。相反地,Tendermint 共識要求維護一個事先知曉且固定的驗證者集合,驗證者身份是靠他們的公鑰來辨認的。
領導 vs. 無領導
中本聰共識及 Ethash 沒有指定領導者來提議下一個區塊(i.e. 任何礦工都有可能挖到下一個區塊)。另外一方面,Tendermint 選擇領導者,或稱爲提議者,負責提出下一個區塊。
明確的 vs. 模糊的超時機制
中本聰共識和 Ethash 沒有使用超時機制來確保礦工必定能出塊,而 Tendermint 有明確的超時機制保證區塊鏈的出塊過程不會遭遇延宕。
100 個驗證者 vs. 1000 個驗證者
Tendermint 遵循傳統的一致性共識算法,每一個驗證者之間都要進行通訊。考慮到通訊開銷,Tendermint 沒法像比特幣或以太坊那樣能夠無限增長驗證者。Tendermint 共識安排了 100 個驗證者。
所以 Tendermint 的缺點之一就是,它要求事先知曉全部驗證者,並且不容許驗證者隨時加入或退出;這與比特幣或以太坊不一樣。
除此以外,Tendermint 還要求整個系統維持統一時鐘;雖然在實踐中 Tendermint 已經證實經過整合每一個節點的時間戳就能維護統一時鐘,但你們都知道同步時間是個很是複雜的理論問題。
Tendermint 的驗證者少於比特幣,並且要求事先知道驗證者集合,所以可能會有人提出 Tendermint 共識協議「不夠去中心化」的質疑。
可是,去中心化是見仁見智的。Okay,先不抖機靈,我想說的是去中心化是爲了達到某種目標的手段,而不是目標自己;我不喜歡在瞭解去中心化的目標前就妄下評論。
我認爲在許多案例(甚至是大部分狀況)下,只要破壞系統的代價夠大,而且有針對攻擊者的防護及懲罰機制,則 Tendermint 要求固定且事先知曉驗證者集合的保守方法是可行的。
若是咱們回顧預測市場的例子,我會說去中心化預測市場應用,根本不須要像健全貨幣或是價值存儲應用同樣具有這麼高級別的去中心化程度,有 10 、20 或 100 個驗證者足矣。
以 TruStory 爲例,咱們使用 Cosmos SDK 構建後端應用邏輯,將應用的狀態和邏輯存在區塊鏈上,而前端某種程度上是私有的——Cosmos SDK 容許咱們創建用來賞善罰惡的激勵系統、透明化展現數據層、容許用戶分享網絡的全部權及治理權,還能夠共同決議將來的事務、踢出惡意使用者,並按照我的喜愛針對用戶層或基礎層設計網絡。對於開發者來講,他們也能基於後端區塊鏈邏輯構建本身的開發工具及服務。所以有 10 個或 100 個執行並驗證交易的驗證者,就可以保障使用者和開發者對於透明性、全部權、責任歸屬的需求。
若是你能明白 Tendermint 以「選擇固定且事先知曉的驗證者集合」做爲犧牲,所帶來的利益,你會對這些本來不可能實現的神奇特性充滿讚歎:
安全性及活躍度
Tendermint 的協議保證安全性及活躍度。假設超過 2/3 的驗證者投票權重沒有掌握在拜占庭驗證者手中(也就超過 2/3 驗證者是遵照協議的),換句話說少於 1/3的投票是惡意的 ,則協議就能保證網絡的安全性及活躍度(i.e. 驗證者永遠不會在相同的塊高度提出衝突區塊,區塊鏈永遠會正常出塊)。
高性能
Tendermint 共識的出塊時間能夠低至 1 秒,達到每秒處理數千筆交易的速度,讓 Tendermint 更適合須要頻繁交易的應用。
即時確認
在區塊鏈世界中,最終肯定性(Finality)意味着一旦區塊被提交上鍊,咱們就能肯定直至該區塊以前的整個區塊鏈的狀態。
如咱們前面提到的,中本聰共識有其機率性,因此沒有辦法保證最終肯定性。你只能基於大多數礦工可能還在該分叉中挖礦的機率,保證你的交易所在的分叉鏈是共識鏈。
可是,Tendermint 要求驗證者對每一個區塊進行投票及最終確認。因此咱們能夠說,在少於 1/3 惡意驗證者的狀況下,交易可以被「即時確認」——當區塊被建立出來,使用者就知道他們的交易已經被確認了。
責任制
Tendermint 使用 PoS 做爲抗女巫攻擊機制——要求驗證者質押代幣(i.e. 他們的「保證金」),以確保節點不會經過建立多個虛假帳戶來欺騙系統。
PoS 比 PoW(PoW 的證實來自礦工解出下個區塊哈希所耗費的算力)更節能,可是它固有的「無利害關係」缺陷致使驗證者能輕易做弊。
Tendermint 經過罰沒保證金來處罰違反協議規則(e.g. 替衝突區塊投票,及廣播未驗明的投票)的驗證者,避免發生無利害關係問題。說得更具體點,協議存在「鎖定規則」,規範了每一個驗證者在投票給特定區塊時能作的行爲。舉例來講,一旦驗證者預提交投票後,它就被「鎖定」在該區塊;只有在下一輪中要讓一個不一樣的區塊成爲 polka 時,該驗證者才能解鎖並預提交另外一個區塊。若是違反鎖定規則,驗證者會被罰沒保證金。
更簡單的輕客戶端
輕客戶端比全節點「更輕巧」,由於它們不存儲區塊鏈的全部狀態,只存儲區塊頭。除非是負責驗證和出塊的挖礦節點,或驗證者節點,否則大部分節點其實不須要存儲區塊鏈全狀態。
輕客戶端下載從創世區塊開始到當前區塊的區塊頭,而不去下載和存儲整條鏈。相比於全節點,輕客戶端只須要存儲少許數據,由於區塊頭就足以驗證某些特定交易的有效性。
最酷的事情在於,基於 Tendermint 的區塊鏈的輕客戶端甚至無需同步全部區塊頭,只要週期性的下載區塊頭就行。
就像咱們前面討論的,Tendermint 與比特幣、以太坊不一樣,其全部區塊都要通過投票及最終確認;由於每一個區塊都通過最終確認,因此輕客戶端只要注意驗證者集合的變化——只要知道最新的驗證者集合,輕客戶端就能下載最新的區塊頭,並驗證這些區塊都有大於 2/3 的驗證者投票。
如咱們上面所說的,Tendermint 的共識依靠驗證者在每一輪進行投票來完成。所以,節點間必須能溝通及傳遞訊息,確保網絡中全部參與者都能看到相同數據。
與比特幣和以太坊同樣,Tendermint 使用 gossip 協議快速傳播最新的區塊鏈狀態。
網路中的節點不必定要成爲驗證者才能在網絡共識過程當中發揮做用。舉例來講,節點能夠是輕節點或是全節點,而不是驗證者;這類節點也被稱爲 「非驗證者節點」。
驗證者及非驗證者節點都要肩負傳遞數據的責任(例如提案數據、區塊數據和投票數據),以確保全部節點都能收到系統正在產生的信息和交易。
目前,咱們已經瞭解 Tendermint 網絡層及共識層的核心組成部分;網絡層負責網絡中全部計算機之間交易的傳遞,Tendermint 共識算法確保狀態機的一致性(即全部節點中的區塊鏈都是一致的)。
但咱們傳遞和驗證的究竟是什麼交易?這裏就引出了應用層。
Cosmos 應用層負責:
定義和提交須要被記錄進區塊鏈的交易
在交易經過共識層提交後,持續更新區塊鏈狀態
使用 Cosmos SDK 構建應用程序
Cosmos SDK 提供一套構建應用層的框架,就像是區塊鏈界的 Ruby-on-Rails (Ruby-on-Rails 是一種讓開發者輕鬆經過默認設置構建網頁端應用的框架),Cosmos SDK 也爲開發者提供了一種基於 Tendermint 內核構建安全的區塊鏈應用的框架。
要記住,區塊鏈就是一個在全部節點將狀態作相同備份的狀態機,而 Cosmos SDK 讓你能夠構建能在多個節點間進行復制的實際狀態機。SDK 讓你自定義應用的狀態、事務類型,及狀態-轉變函數所需的功能和工具。
Cosmos 應用如何運行(抽象視角)
Cosmos SDK 提供一種「multistore」機制來定義及維護應用層狀態機的狀態。Multistore 將應用層的狀態劃分到不一樣組件,經過各自的「模塊」進行管理。
Cosmos SDK 的強大之處就是它獨特的模塊化設計,每一個模塊定義及維護一個狀態子集,這些狀態子集構成完整的區塊鏈。舉例來講:
銀行模塊:容許你在應用中持有代幣,及進行代幣轉帳
權限模塊:容許你建立及管理帳戶和簽名
質押與罰沒模塊:容許你經過編碼構建 PoS 共識機制
每一個模塊都是個小狀態機,能夠相互聚合生成整體狀態機。
應用開發者按照每一個模塊和修改狀態的慣用邏輯來定義子集,除了 Cosmos SDK 提供的模塊,開發者還能調用第三方模塊。
這種用於構建區塊鏈應用的插件模塊很是強大,由於它賦予開發者使用 SDK 或外部模塊的靈活性。
應用層如何與共識層交互?
發生在應用層的交易經過區塊鏈應用交互界面(ABCI, Application Blockchain Interface)與 Tendermint 共識及網絡層通訊。
ABCI 是 Socket 通訊協議,鏈接 Tendermint 核心(共識 + 網絡)與應用。它能夠兼容任何編程語言,也就是說使用 Cosmos SDK 構建的區塊鏈應用理論上能以任何語言編寫,而不只僅是 Tendermint 底層共識和網路層所用的編程語言。
注意:當前版本的 Cosmos 主要支持 Golang,後續會加入更多語言。
總而言之,Cosmos SDK 容許開發者基於 Tendermint 內核構建去中心化應用,這個應用理論上能用任何語言開發,並經過 ABCI 鏈接 Tendermint 共識引擎。
將應用層(Cosnos SDK、ABCI)與網路層、共識層(Tendermint 內核)剝離,能讓開發者在開發各類類型應用的時候有更大的靈活性,再加上 Cosmos SDK 容許這些應用以任何語言開發(e.g. Golang),讓區塊鏈 App 開發過程更像日常的應用開發的樣子。
這與在以太坊上開發應用造成鮮明對比,由於後者要求開發者學習新語言 Solidity ,還要克服 Solidity 的諸多限制和缺陷,並且 Golang 比 Solidity 具有更多的開發工具,開發體驗好上 10 倍。
除此以外,所有的以太坊 App 都基於單一網絡進行操做,這麼作的優點是這些 App 可以共享以太坊的標準,以及相應而生的規模效應;缺點是全部這些 App 都共享以太坊共識層,會受到新加入的應用體量大小的影響。 此外,整個網絡必須做爲一個巨大的單元來管理,會被治理理念和意識形態分歧所束縛,使得擴展難以進行。
Cosmos 區塊鏈應用不會受到這些限制,每一個應用都有獨立的網絡、本身的共識層及治理層。
開發者有很大的自主性來決定它們的共識層權限,還能選擇基於代幣質押數量推舉公開的驗證者集合,或是經過預受權設置私密驗證者集合。這種自由選擇驗證者集合的規則,意味着區塊鏈對於本身的鏈有更大的自主性。
固然,這樣的好處伴隨某些犧牲:Cosmos 網路中的每一個區塊鏈應用都必須導入本身的驗證者、社羣,及經濟體系;沒法像以太坊通常,直接蹭用全部驗證者、強大的社羣,及已有的經濟體系。
在這第一篇文章裏,咱們對比了 Cosmos 網絡中的區塊鏈架構與比特幣、以太坊的不一樣。這種架構賦予區塊鏈應用對於本身的鏈更大的自主性。
在第二部分,咱們要深刻討論 Cosmos 中相互獨立的區塊鏈如何進行交互;更重要的是回答「爲何區塊鏈須要互相進行交互」。