cosmos-sdk/docs/cn/intro/sdk-design.md

6.9 KiB
Raw Blame History

Cosmos SDK的主要组件

Cosmos SDK 是一个框架可以促进基于Tendermint的安全状态机的开发。SDK的核心是一个基于Golang的ABCI样板实现。它带有一个用于存储数据的multistore和一个用于处理Transaction的router

下面的简化视图展示了当通过DeliverTx从Tendermint 转移transactions时基于Cosmos SDK构建的应用程序如何处理这些transactions。

  • 解码从Tendermint共识引擎中接收到的transactionsTendermint只能处理 []bytes 类型的数据)

  • transactions中提取messages并进行基本的健全性检查。

  • 将每个Message路由到对应的模块中以进行相应处理。

  • 提交状态更改。

BaseApp

baseapp 是 Cosmos SDK 应用程序的样本实现它拥有能够处理和底层共识引擎的连接的ABCI实现。通常Cosmos SDK 应用程序通过嵌入app.go来实现拓展。查看示例请参考SDK应用教程

type nameServiceApp struct {
	*bam.BaseApp
	cdc *codec.Codec

	// keys to access the substores
	keys  map[string]*sdk.KVStoreKey
	tkeys map[string]*sdk.TransientStoreKey

	// Keepers
	accountKeeper  auth.AccountKeeper
	bankKeeper     bank.Keeper
	stakingKeeper  staking.Keeper
	slashingKeeper slashing.Keeper
	distrKeeper    distr.Keeper
	supplyKeeper   supply.Keeper
	paramsKeeper   params.Keeper
	nsKeeper       nameservice.Keeper

	// Module Manager
	mm *module.Manager
}

baseapp 的目标是在存储和可拓展状态机之间提供安全的接口同时尽可能少地定义状态机对ABCI保持不变

更多关于baseapp的信息,请点击这里

Multistore

Cosmos SDK 为状态持久化提供了multistore。Multistore允许开发者声明任意数量的KVStores。这些KVStores只接受[]byte类型的值,因此任何自定义的结构都需要在存储之前使用codec进行编码。

Multistore抽象用于区分不同模块的状态每个都由其自己的模块管理。更多关于multistore的信息请点击这里

Modules

Cosmos SDK的强大之处在于其模块化开发的理念。SDK应用程序是通过组合一系列可互操作的模块而构建的。每个模块定义了状态子集并包含其Messages与Transactions的处理器同时SDK负责将每个Message路由到对应的模块中。

以下的简化视图展示了应用链中的每个全节点如何处理有效区块中的Transaction。

                                      +
                                      |
                                      |  Transaction relayed from the full-node's Tendermint engine
                                      |  to the node's application via DeliverTx
                                      |
                                      |
                                      |
                +---------------------v--------------------------+
                |                 APPLICATION                    |
                |                                                |
                |     Using baseapp's methods: Decode the Tx,    |
                |     extract and route the message(s)           |
                |                                                |
                +---------------------+--------------------------+
                                      |
                                      |
                                      |
                                      +---------------------------+
                                                                  |
                                                                  |
                                                                  |
                                                                  |  Message routed to the correct
                                                                  |  module to be processed
                                                                  |
                                                                  |
+----------------+  +---------------+  +----------------+  +------v----------+
|                |  |               |  |                |  |                 |
|  AUTH MODULE   |  |  BANK MODULE  |  | STAKING MODULE |  |   GOV MODULE    |
|                |  |               |  |                |  |                 |
|                |  |               |  |                |  | Handles message,|
|                |  |               |  |                |  | Updates state   |
|                |  |               |  |                |  |                 |
+----------------+  +---------------+  +----------------+  +------+----------+
                                                                  |
                                                                  |
                                                                  |
                                                                  |
                                       +--------------------------+
                                       |
                                       | Return result to Tendermint
                                       | (0=Ok, 1=Err)
                                       v

每个模块都可以看成是一个小的状态机。开发者需要定义由模块处理的状态子集同时自定义改变状态的Message类型注意messages是通过baseapptransactions中提取的)。通常,每个模块会在multistore中声明自己的KVStore以存储自定义的状态子集。大部分开发者在构建自己的模块时需要访问其它第三方模块。由于Cosmos SDK是一个开放的框架其中的一些模块可能是恶意的这意味着需要一套安全原则去考虑模块间的交互。这些原则都基于object-capabilities。事实上,这也意味着,并不是要让每个模块都保留其他模块的访问控制列表,而是每个模块都实现了被称为keepers的特殊对象,它们可以被传递给其他模块,以授予一组预定义的功能。

SDK模块被定义在SDK的 x/文件夹中,一些核心的模块包括:

  • x/auth:用于管理账户和签名。

  • x/bank:用于启动 tokens 和 token 转账。

  • x/staking + s/slashing用于构建POS区块链。

除了x/文件夹中已经存在的任何人都可以使用的模块SDK还允许您构建自己自定义的模块您可以在教程中查看示例