區塊鏈技術 | Cosmos SDK 文檔概述

概述

SDK 介紹

Cosmos-SDK 是支持構建多種資產,共識機制爲POS(權益證明)或者POA(權威證明)的一個區塊鏈框架,例如Cosmos Hub。

Cosmos SDK的目標是允許開發者輕鬆地從0開始構建自定義區塊鏈,同時可以與其他區塊鏈交互。我們想象一下,SDK可以作爲類似NPM框架,以Tendermint爲核心,構建穩定的區塊鏈應用。

它主要基於以下兩個原則:

模塊化:任何人可以爲Cosmos-SDK創建模塊,並且很容易的導入你自己的區塊鏈應用,使得它與原有的模塊融爲一體。

功能性:SDK在設計是考慮了基礎功能的安全性,參考了多年在區塊鏈狀態機設計的經驗。絕大多數開發者在開發自己的模塊時會需要引入第三方模塊,考慮到Cosmos-SDK是一個開放的框架,一些模塊可能是惡意的,這意味着需要一些安全規則來控制模塊之間的交互。這些原則基於面向對象,在實踐中,這意味着不是爲每個模塊保留一個其他模塊可以訪問控制的列表,而是每一個模塊實現一個被叫做keeper的特殊對象,通過預先定義的功能來傳遞給其他模塊。例如,一個實例模塊A的keeper被傳遞給模塊B,模塊B可以調用模塊A一些受限的函數集。每一個keeper對象的功能由模塊的開發者定義,開發者的工作在於理解和審計每一個基於功能性導入的第三方模塊的外部代碼是否安全。對於想要深入理解功能性的話可以閱讀這篇文章。

 

SDK 應用結構

狀態機

它的核心在於區塊鏈是一個被複制的確定性的狀態機。

狀態機是計算機科學概念,意味着一個機器可以有多種狀態,但是在確定時間內只有一種狀態。狀態描述了系統當前狀態,而交易是一種狀態轉換的表達形式。

給定一個狀態S和交易T,這個狀態機將會返回一個新的轉態S`。

在實踐中,交易被打包成區塊,來提升系統的效率。給定一個狀態S和在區塊上的交易B,狀態機將會返回一個新的狀態S`。

在區塊鏈的環境中,狀態機是確定的,它意味着你開始一個給定的狀態,並且重複同樣的一系列交易,你總是以同樣的最終狀態結束。

Cosmos SDK給定你最大的靈活性來定義你的區塊鏈應用的狀態、交易類型、狀態轉移函數。如何使用SDK構建狀態機將在後文更加深入的介紹。但是對於我們來說,首先要了解如何複製並使用Tendermint。

 

Tendermint

作爲一個開發者,你只要使用Cosmos-SDK來定義狀態機即可,Tendermint將會在你的網絡上處理狀態機的複製。

Tendermint是一個與應用程序無關的引擎,用來處理你區塊鏈的網絡層和共識層。在實踐中,這意味着Tendermint負責去發送和排序你的交易字節。Tendermint核心依賴於一個命名爲拜占庭容錯機制(BFT)的共識算法來達成交易排序的共識。想要了解更多的Tendermint,點擊這。

Tendermint共識算法由一組被稱作驗證者的特殊的節點實現的。驗證者負責將包含交易的區塊添加到區塊鏈中。在任何一個確定的區塊中,使用算法從驗證者集合中選擇出驗證者A作爲下一個區塊的提議者。如果區塊被超過2/3的驗證者V在預投票和預提交階段簽名並且包含的交易是有效的,這個區塊被認爲是有效的。驗證者集合可以通過寫入狀態機的規則被改變。想要深入瞭解算法,請點擊這裏。

Cosmos SDK應用程序的主要部分是運行在每一個節點本地網絡的區塊鏈守護程序,如果惡意驗證者小於1/3,那麼每一個節點在同樣的時間查詢狀態會獲得同樣的結果。

 

ABCI

Tendermint通過被稱作ABCI的接口將交易從網絡層傳到應用,應用必須實現該接口。

注意Tendermint只負責處理交易字節的發送和排序,它意味着Tendermint不知道這些交易字節意味着什麼。所有的Tendermint只是確定這些交易字節的順序。Tendermint通過ABCI將字節發送給應用程序,如果交易中被包含的消息被成功處理或者沒有處理,則可以返回代碼來通知應用程序。

這兒有ABCI最重要的消息:

CheckTx:當Tendermint核心收到一個交易,它將發送給應用去檢查是否滿足一些基本要求。CheckTx被用作保護全節點的交易池以防止垃圾交易。一個被稱作"Ante Handler"的特殊的處理程序被用作執行一系列的驗證步驟例如檢查是否有足夠的費用和驗證簽名。如果檢查是有效的,交易將會被添加到交易池和發送到其他對等節點。注意沒有使用CheckTx處理交易(沒有修改狀態),因爲還沒有包含在區塊中。

DeliverTx:當Tendermint核心收到一個可用的區塊,給定區塊中的每一個交易經由DeliverTx處理髮送到應用。在這個階段,當前的交易狀態發生了改變。"Ante Handler"和實際中每一個交易中的消息被再次執行。

BeginBlock/EndBlock:這個消息被執行在每一個區塊的開始和結束,無論該區塊是否包含交易。觸發自動執行的邏輯上是非常有用的,但要謹慎行事,計算昂貴的循環可能會降低區塊鏈的性能,甚至死循環會破壞區塊鏈。

任何構建在Tendermint上的應用程序都需要實現ABCI接口,以便與底層的本地Tendermint引擎進行通信。幸運的是,您不必直接實現ABCI接口。Cosmos SDK以Base app的形式提供了它的demo實現。

接下來,讓我們介紹一下SDK的高級設計原則。

 

Cosmos SDK設計概況

Cosmos SDK是一個在Tendermint基礎上來安全開發狀態機的區塊鏈框架。SDK在覈心使用Go語言開發的ABCI接口的模塊。它包括了一個持久化數據存儲multistore數據存儲模塊和處理交易的router路由模塊。

 

下面是一個簡化的流程,當交易通過DeliverTx從Tendermint發送時基於Cosmos SDK構建的頂層應用如何處理交易。

1.解碼從Tendermint共識引擎收到的交易(記住在Tendermint上僅僅處理的是字節)。

2.從交易中提取消息,並進行基本的正常檢查。

3.將每條消息通過路由傳遞到適當的模塊,以便對其進行處理。

4.提交狀態更改。

應用程序還允許創建交易,對它們進行編碼,並將它們傳遞給底層Tendermint引擎來廣播它們。

Baseapp

baseApp是Cosmos SDK ABCI接口的案例實現,它還包含一個router去將交易路由到它們各自的模塊處理。你的應用程序的主程序文件app.go將會自定義你的app類型來嵌入baseapp。通過這種方法,你的自定義app 類型將會自動繼承baseapp的ABCI方法。瞭解這個例子請看SDK 應用教程

 

base app的目標是在存儲和可擴展的狀態機之間提供一個安全的接口,同時儘可能少地定義狀態機(保持對ABCI的原生性)。

想要了解更多baseapp,請點擊

Multistore

Cosmos SDK提供多種方式存儲來實現持久化存儲。多種存儲方式意味着允許開發者聲明任意數量的KVStores。KVStores存儲只接受字節類型數組([]BYTE)的值。也就是說,任何自定義的數據結構在被存儲前都需要使用go-amino進行序列化。

 

Multistore抽象上來說被用來將狀態劃分爲不同的分區,每一個分區有自己的模塊來管理。想要了解更多Multistore,請點擊這兒

Modules

Cosmos SDK的強大之處在於它的模塊化,SDK應用被一堆可互操作的模塊構建。每個模塊定義了狀態的子集和包含了與自己有關的消息/交易處理程序,而SDK負責將每一個消息路由到與它們有關的模塊。

 

這是一個簡單的流程圖,當接受到一個可用的區塊時,每一個全節點的應用如何處理交易過程。

(譯者注:交易由Tendermint engine通過DeliverTx發送到應用程序,應用程序通過baseapp的方法解碼字節數組,提取消息,分發到不同路由模塊,模塊處理消息更新狀態,返回成功結果到Tendermint)

每一個模塊都可以被視爲最小的狀態機。開發者需要定義每一個模塊可以處理的狀態的子集,同樣需要自定義修改狀態的消息類型(注意:消息使用baseapp的方法從交易中提取)。在實踐中,每一個模塊通常都聲明它們自己的鍵值存儲KVStore在multistore中實現狀態子集的持久存儲。絕大多數開發者在開發自己的模塊時會需要引入第三方模塊,考慮到Cosmos-SDK是一個開放的框架,一些模塊可能是惡意的,這意味着需要一些安全規則來控制模塊之間的交互。這些原則基於面向對象,在實踐中,這意味着不是爲每個模塊保留一個其他模塊可以訪問控制的列表,而是每一個模塊實現一個被叫做keeper的特殊對象,通過預先定義的功能來傳遞給其他模塊。

SDK模塊在SDK的x/文件夾中定義。一些核心模塊包括:

x/auth:用於管理帳戶和簽名。

x/bank:用於啓用代幣和實現代幣轉移。

x/staking + x/slashing:用於構建POS區塊鏈

除了x/中已經存在的模塊(任何人都可以在其應用程序中使用)之外,SDK還允許您構建自己的自定義模塊。您可以在本教程中查看該示例

接下來,瞭解有關Cosmos SDK的OCAP的安全模型的更多信息

原文地址:https://cosmos.network/docs/intro/sdk-design.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章