1. 摘要
Cosmos項目有個宏偉的目標顽分,就是在DPOS+BFT的共識引擎的基礎上司志,能夠實現區(qū)塊鏈開發(fā)簡便佃乘,互通互聯凳谦。本文介紹以下內容:
(1)Cosmos架構
(2)Cosmos Hub
(3)Cosmos SDK
(4)IBC協議
(5)PegZone
2.Cosmos架構
Cosmos是Tendermint團隊推出的一個支持跨鏈交互的異構網絡份蝴,它最終的目標是創(chuàng)建一個區(qū)塊鏈互聯網犁功,允許大量自主且易開發(fā)的區(qū)塊鏈互相擴展和交互』榉颍基于Tendermint開發(fā)浸卦,采用的Tendermint共識算法,是一個類似實用拜占庭容錯共識引擎案糙,具有高性能限嫌、一致性、具備拜占庭容錯等特點时捌。Tendermint共識算法參考《【深度知識】Tendermint共識算法原理和框架流程》怒医。
Cosmos網絡由許多獨立的并行區(qū)塊鏈組成,網絡中第一個區(qū)塊鏈是Cosmos Hub奢讨,其他的并行鏈稱為Zone稚叹,通過跨鏈協議(IBC)與Hub進行跨鏈操作。
Cosmos官方網站:https://cosmos.network拿诸。
圖所示是Cosmos 網絡的詳細架構圖扒袖,Cosmos為方便平行鏈開發(fā)提供了基本服務CosmosSDK包括:共識、網絡以及IBC協議等亩码,這樣基于Cosmos SDK開發(fā)的子鏈之間都能夠方便地互相交互季率。此外對于非Cosmos SDK 開發(fā)的區(qū)塊鏈需要使用Peg Zone進行橋接,如圖中的Ethereum描沟。
3.Cosmos Hub
Cosmos上的第一個Hub叫做Cosmos Hub飒泻。Cosmos Hub是一種多資產權益證明加密貨幣網絡,它通過簡單的管理機制來實現網絡的改動與更新吏廉。此外蠢络,Cosmos Hub還可以通過連接其他Zone來實現擴展。 Cosmos網絡的Hub及各個Zone可以通過區(qū)塊鏈間通信(IBC)協議進行溝通迟蜜,這種協議就是針對區(qū)塊鏈的虛擬用戶數據報協議(UDP)或者傳輸控制協議(TCP)刹孔。代幣可以安全快速地從一個Zone傳遞到另一個Zone,兩者之間無需體現匯兌流動性。Zome內部所有代幣的轉移都會通過Cosmos Hub髓霞,它會記錄每個Zone所持有的代幣總量卦睹。這個中心會將每個Zone與其他故障Zone隔離開。因為每個人都將新Zone連接到Cosmos Hub方库,所以個Zone今后也可以兼容新的區(qū)塊鏈技術结序。
4. Cosmos SDK
從Github上可以看出Cosmos主要的代碼是cosmos-sdk,它包含Cosmos Hub的程序代碼纵潦,同時也是一個區(qū)塊鏈開發(fā)框架徐鹤,為其他區(qū)塊鏈開發(fā)者提供一些通用的功能模塊,比如:共識邀层,P2P網絡返敬,IBC,賬戶寥院,治理劲赠,認證等。
不難看出cosmos-sdk其實就是一個ABCI應用秸谢。主要有:
- baseapp:定義了一個基本ABCI應用的模版凛澎,與Tendermint通信。開發(fā)者也可以根據自己的需求重寫估蹄。
- 應用程序:包括gaia塑煎、basecoin、democoin臭蚁。其中gaia就是hub主程序最铁,basecoin以及democoin是提供的兩個示例應用。
- plugins:cosmos-sdk的基本單元刊棕,每個plugin都是baseapp的功能擴展,包含各自的消息和交易處理邏輯待逞。目前SDK已經集成了一些重要的plugin:
-staking:POS相關的實現甥角,包括:綁定,解綁识樱,通貨膨脹嗤无,費用等操作。
-ibc:跨鏈協議IBC的實現怜庸,也是Cosmos支持跨鏈的主要插件当犯。
-governance:治理相關的實現,如提議割疾、投票等嚎卫。
-auth:定義了一個標準的多資產賬戶結構(BaseAccount),開發(fā)者可以直接嵌入自己的賬戶體系中宏榕。
-bank:定義資產的轉移拓诸。
4.1)源代碼結構
整個SDK源代碼目錄如下圖所示:
4.2)基本數據結構
a)Actor & Context
Actor以及Context定義在context.go代碼中侵佃。
Actor定義了某個鏈上某個App的一個賬戶(地址)。
Context定義一些基本信息的函數集合:權限查詢奠支,Nonce/ChainID/BlockHeight查詢等等馋辈。
b)Tx
Tx定義在txinner_wrapper.go文件中。Tx會貫穿整個SDK的處理倍谜,是整個SDK最重要的數據結構迈螟。
Tx是個數據結構,其中的TxInner是接口:Wrap以及ValidateBasic尔崔。也就是說一個Tx必須要實現TxInner接口答毫。
c)Handler
Handler接口定義在handler.go文件中。
Handler定義module執(zhí)行的接口:CheckTx(查看Tx)您旁,DeliverTx(區(qū)塊中交易處理)烙常,InitState以及InitValidator(初始化狀態(tài)和Validator),Name是執(zhí)行模塊的名稱鹤盒。有關module的具體解釋蚕脏,請看Stack和Module的介紹。
4.3)Stack
Stack的相關代碼在stack目錄中侦锯。Stack有關的數據類型如下圖:
Stack有兩部分組成:builder(middleware)以及Dispatcher驼鞭。Dispatcher和middleware的區(qū)別是:middleware提供Next函數,可以訪問下一個“middleware”尺碰,Dispatcher是一組Dispatchable構成挣棕。
Stack上的所有Middleware被wrap成一個sdk.Handler。
4.4)Client客戶端
Client的邏輯在client的目錄中亲桥。介紹一下Client端將sdk.Tx封裝的邏輯(實現在client/txs/wrapper.go)洛心。
Wrapps.Wrap函數將當前傳入的sdk.Tx進行wrap,形成類似洋蔥樣的封裝题篷。
4.5)Server服務器端
與客戶端相對應的是服務器端词身,服務器端主要是接收sdk.Tx,檢查后調用Tendermint的RPC提交或者查詢信息番枚。邏輯實現在client/rest目錄下法严。以txs.go為例,解釋一下服務器的實現原理:
服務器端利用mux.Router機制葫笼,注冊響應函數(如上圖中的PostTx)深啤。
4.6)ABCI App程序
ABCI App程序的邏輯實現在app以及server目錄。App程序的邏輯相對簡單路星,主要是實現ABCI的接口溯街,調用Stack,具體的操作由Stack的一個個的middleware處理。
一個交易的大致處理流程如下圖:
4.7)example示例
Cosmos SDK提供了示例代碼苫幢,在examples目錄下访诱。感興趣的小伙伴,可以查看basecoin的實現韩肝。
4.8)module實現
在Cosmos SDK中實現了一些通用module触菜,在modules目錄下:fee,coin哀峻,ibc, nonce, auth等等涡相。fee module的邏輯相對簡單,可以看出一個模塊大致需要實現的邏輯:
實現一個module剩蟀,要實現三個接口:commands/wrap.go(client端的封裝)催蝗,handler.go(Stack中的middleware的接口,也就是sdk.handler接口)育特,以及tx.go(此模塊的交易定義以及TxInner的實現)丙号。
因此基于cosmos-sdk框架,利用其插件功能缰冤,可以非橙В快速的開發(fā)出屬于自己應用的區(qū)塊鏈,同時也可以很方便的加入Cosmos生態(tài)網絡棉浸,支持不同鏈之間的互操作怀薛,在插件的設計上和EOS也有異曲同工之妙。
那么如何使用這些插件功能呢迷郑?可以參考cosmos-sdk提供的示例應用枝恋,以basecoin為例,只需要幾步:
- 創(chuàng)建自己的ABCI應用嗡害,可以嵌入baseapp焚碌,也可以重載baseapp。
- 定義自己的賬戶體系霸妹,可以嵌入BaseAccount十电。
- 選擇所需要的插件,注冊到消息路由抑堡。
5. IBC協議
Cosmos的區(qū)塊鏈間通信協議(IBC)將不同區(qū)塊鏈連接起來摆出,達到價值轉移的目的朗徊。
IBC協議是針對Cosmos網絡設計的首妖,依賴其及時最終性的特點,用于Hub與Zone之間消息傳遞爷恳。IBC協議中設計了兩個消息:
- IBCBlockCommitTx:發(fā)送方所在區(qū)塊鏈的最新的區(qū)塊信息有缆。
- IBCPacketTx:跨鏈交易本身的信息,及其在發(fā)送方鏈中被打包的區(qū)塊信息。
但有了消息的傳遞棚壁,接收鏈如何校驗信任消息呢杯矩?
在IBC協議設計里,兩個鏈建立連接之前需要進行彼此注冊袖外,有兩個作用:
1史隆、保存對方鏈驗證者集合以及Merkle證明的算法,這樣接收鏈才能確保消息的正確性和來源的可靠性曼验。
2泌射、為對方鏈創(chuàng)建兩個可靠隊列,一個隊列存放所以對方鏈的消息(outgoing)鬓照,一個隊列存放來自對方鏈的消息(incoming)熔酷。
我們以chain1中用戶User A轉100mycoin 給test-hub用戶User B為例看看IBC整個的工作流程如下(基于目前IBC實現代碼):
整個工作流程可以分為三個階段:
- User A向chain1提交跨鏈交易,chain1執(zhí)行該交易豺裆,并將交易存入outgoing隊列拒秘。
- relayer從chain1中對應test-hub的outgoing消息隊列取出跨鏈交易,提交到test-hub臭猜。
- test-hub執(zhí)行交易躺酒,放入incoming消息隊列。
大家可以看到获讳,整個流程比較簡單阴颖,而且涉及的消息只有IBCPacket。目前Cosmos跨鏈實現并沒有全部完成丐膝,只是完成了一個簡單的交易處理流程量愧。
6. PegZone
基于cosmos-sdk開發(fā)的區(qū)塊鏈能夠輕松滿足實時最終性,然而現存的Bitcoin和Ethereum這類使用POW共識的區(qū)塊鏈并不具備此特點帅矗,只能屬于概率最終性偎肃,無法防止區(qū)塊鏈的回滾。對于這類鏈浑此,團隊采用PegZone方案來解決累颂。
PegZone本身其實是一條代理鏈,實時跟蹤原始鏈的狀態(tài)凛俱,通過設定一個安全閥值紊馏,等待原始鏈區(qū)塊增長數達到安全閥值時就認為原始鏈的狀態(tài)達到了偽實時最終性(回滾概率小)蒲犬,這點和輕客戶端錢包驗證是相同的原理朱监,例如比特幣安全閥值通常設置為6,以太坊安全閥值可以設置為20或者100原叮。而PegZone本身具備實時最終性赫编,就可以通過IBC與Hub相連巡蘸,從而實現跨鏈。
接下來還是用例子來說明下擂送,以Ethereum為例來看蒲拉,有興趣的朋友可參考Github上的cosmos/Peggy項目求类。示意圖如下:
上圖我們可以看出PegZone可以分為5個部分:
- Smart Contract:資產托管的角色拜秧,保管以太坊中的代幣和Cosmos中的代幣萍恕。主要提供了lock、unlock蟀拷、mint身腻、burn四個方法。
- Witness:是一個以太坊全節(jié)點匹厘,監(jiān)聽以太坊合約的event嘀趟,并等待100個區(qū)塊產生后,封裝WitnessTx提交到PegZone中來證明在以太坊內狀態(tài)更改愈诚。
- PegZone:PegZone是基于Tendermint的區(qū)塊鏈她按,負責維護用戶的賬戶信息,允許用戶之間資產的轉移炕柔,并提供交易查詢酌泰。
- Signer:使用secp256k1對交易進行簽名,以便簽名能夠高效的被智能合約驗證匕累,對應于智能合約的校驗者公鑰集合陵刹。
- **Relayer: **中繼器負責交易轉發(fā)。將所有Signer簽名后的SignTx轉發(fā)到smart contract中欢嘿。
7. 參考
(1)深度解析Tendermint衰琐,快速融入Cosmos生態(tài)
https://zhuanlan.zhihu.com/p/38252058
(2)跨越當前鏈的邊界,Cosmos技術深扒
https://zhuanlan.zhihu.com/p/42693285
(3)軟硬核:徹底讀懂 Cosmos 如何一鍵發(fā)鏈與萬鏈互聯
https://www.8btc.com/article/373565
(4)查看支持COSMOS跨鏈的項目
https://cosmos.network/ecosystem
(5)Cosmos項目以及SDK介紹
https://zhuanlan.zhihu.com/p/43898294
(6)Cosmos互聯鏈通信技術規(guī)范(上)
https://juejin.im/post/5a98f6496fb9a028da7bf9d4
(7)Cosmos網絡開發(fā)進展
https://cosmos.network/roadmap
Cosmos
- Cosmos白皮書(第1-7章)
- Cosmos白皮書(第8-10章)
- Cosmos(宇宙鏈)路線圖
- Cosmos(宇宙鏈)未來計劃
- Cosmos-Ethermint 0.3 測試網教程
- Cosmos-Basecoin 0.6 跨鏈測試網
- Cosmos-Basecoin的跨鏈轉賬架構
- 一文簡單了解 Tendermint
- C語言實現的Tendermint-ABCI接口