Cosmos SDK的典型目录结构如下所示:
x/{module}
├── client
│ ├── cli
│ │ ├── query.go
│ │ └── tx.go
│ └── rest
│ ├── query.go
│ └── tx.go
├── exported
│ └── exported.go
├── keeper
│ ├── invariants.go
│ ├── genesis.go
│ ├── keeper.go
│ ├── ...
│ └── querier.go
│ └── grpc_query.go
├── types
│ ├── codec.go
│ ├── errors.go
│ ├── events.go
│ ├── expected_keepers.go
│ ├── genesis.go
│ ├── keys.go
│ ├── msgs.go
│ ├── params.go
│ ├── types.proto
│ ├── ...
│ └── querier.go
│ └── {module_name}.pb.go
│ └── query.pb.go
│ └── genesis.pb.go
├── simulation
│ ├── decoder.go
│ ├── genesis.go
│ ├── operations.go
│ ├── params.go
│ └── proposals.go
├── abci.go
├── handler.go
├── ...
└── module.go
abci.go
:模块的BeginBlocker和EndBlocker实现(如果有)。
client/
:模块的CLI和REST客户端功能的实现和测试。
exported/
:模块的导出类型-通常是类型接口。如果一个模块依赖于其他模块维护者,则它希望通过Expected_keepers.go(在下面进行详细介绍)设计作为接口协定来接收它们,以避免直接依赖于实现模块。但是,这些合同可以定义对合同的实现模块特定的操作和/或返回类型的方法,这是导出/起作用的地方。此处定义的类型允许其他模块中的Expected_keepers.go定义使用单个规范类型的合同。这种模式可以使代码保持DRY状态,还可以减轻导入周期的混乱。
handler.go
:模块的消息处理程序。
keeper/
:模块的keeper实现以及查询器和不变式之类的任何辅助实现。
types/
:模块的类型定义,例如消息,KVStore密钥,参数类型,协议缓冲区定义和Expected_keepers.go合同。
module.go
:AppModule和AppModuleBasic接口的模块实现。
什么是模块
在Cosmos SDK中,模块是区块链逻辑的基础。每个模块都有特定的用途和功能。Cosmos SDK提供了各种本地模块来使区块链工作。这些模块处理用户的身份验证,令牌传输,管理功能,令牌抵押,令牌供应等等。
如果您想更改模块的默认功能或仅更改某些硬编码参数,则可以派生一个模块并对其进行更改,因此拥有自己的区块链逻辑。在分叉和编辑模块时应谨慎进行,但这种方法将Cosmos SDK标记为功能特别强大,因为您可以按照标准实现的建议尝试不同的参数。
模块不必由特定的公司或个人创建。它们可以由任何人创建,并提供给公众使用。尽管确实存在一些在将模块集成到其区块链之前需要研究的标准。建议模块具有易于理解的规范,处理好一件事情并经过良好测试-在实时区块链上经过最佳测试。当变得越来越复杂时,有时有两个模块而不是试图“解决所有问题”的模块会更有意义,这种考虑可以使其他项目在其区块链项目中使用模块更具吸引力。
在使用starport创建区块链或使用Cosmos SDK手动创建区块链时,应使用一组模块,以便首先具有一组定义区块链的规则。这些模块是
该auth
模块负责区块链上的账户以及账户可以使用的基本交易类型。
它引入了Gas and Fees作为概念,以防止区块链因无法识别的账户而膨胀,因为在公共区块链上,您没有关于账户的更多信息(作为公共密钥或账户余额或以前的交易历史记录)。
帐户的界面定义为
// BaseAccount defines a base account type. It contains all the necessary fields
// for basic account functionality. Any custom account type should extend this
// type for additional functionality (e.g. vesting).
message BaseAccount {
option (gogoproto.goproto_getters) = false;
option (gogoproto.goproto_stringer) = false;
option (gogoproto.equal) = false;
option (cosmos_proto.implements_interface) = "AccountI";
string address = 1;
google.protobuf.Any pub_key = 2
[(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""];
uint64 account_number = 3 [(gogoproto.moretags) = "yaml:\"account_number\""];
uint64 sequence = 4;
}
该auth
模块向帐户管理员公开可以存储或更改帐户的位置。此外,它还公开了标准交易,费用,签名或防止重放的类型。它还允许归属帐户,因为可以在一段时间内使实体访问某些硬币。归属逻辑主要用于放样的绑定,但也可以用于其他目的。
该bank
模块之所以有其名称,是因为它充当允许令牌传输并检查每次传输有效性的模块。此外,它还负责检查整个链的供应,所有帐户余额的总和。
如ICS 5所述,要完全实施IBC规范,就需要具有在运行时(即在事务执行期间)创建和验证对象密钥的能力,如ICS 5中所述。在IBC规范中,将为每个新初始化的端口和通道创建能力密钥,并且用于验证端口或通道的将来使用。由于可以在事务执行期间初始化通道和潜在的端口,因此状态机此时必须能够创建对象功能密钥。
该staking
模块允许使用高级权益证明系统,可以在其中创建验证器并将令牌委派给验证器。
铸币机制的设计允许灵活的通货膨胀率,该通货膨胀率取决于针对特定债券/权益比的市场需求,从而在市场流动性和抵押供应之间取得平衡。
可以通过以下方式将其分解:
如果通货膨胀率低于目标粘合率,则通货膨胀率将增加直至达到最大值。如果维持目标粘合率(Cosmos-Hub中为67%),则通货膨胀率将保持恒定。高于目标%的目标,通胀率将降低,直到达到最小值
该distribution
模块负责分配代币的通货膨胀。当创建新令牌时,它们将分发给验证者及其各自的委托人,并由验证者承担潜在的佣金。每个验证者可以在创建验证者时选择这些令牌的佣金,该佣金是可编辑的。
该params
模块允许在您的区块链应用程序中存储全局参数。它旨在保留链参数,以便可以在运行时通过管理对其进行更改。它允许通过government
模块升级区块链参数,并在大多数股东决定进行更改时在约定的时间生效。
阅读规格
这些模块通常在使用starport时默认安装。Cosmos SDK还包含许多模块,此外,其他一些公共模块已经达到了使用和接受的主要水平。在下一章中,我们将介绍更高级的模块。
该模块使基于Cosmos-SDK的区块链能够支持链上治理系统。在此系统中,链的本地权益令牌的持有者可以以1令牌1票的基础对提案进行投票(从那里可以对其进行参数化)。接下来是模块当前支持的功能列表:
危机管理模块在区块链不变式被破坏的情况下暂停区块链。可以在应用程序初始化过程中向应用程序注册不变式。
鞭打模块使基于Cosmos SDK的区块链可以通过惩罚协议参与者来惩罚那些具有协议价值的行为者,以减轻他们的可归因行为(“严厉的”)。
罚款可能包括但不限于:
销毁他们的部分股权取消他们在一段时间内对未来区块进行投票的能力。Cosmos Hub(Cosmos生态系统中的第一个中心)将使用此模块。
IBC允许在链之间中继数据包,并且可以与两个链之间的任何兼容模块一起使用。该IBC
模块称为“区块链间通信”,例如可以在区块链之间发送本机令牌。它除以规格子集。
x/upgrade
是Cosmos SDK模块的实现,可以方便地将实时Cosmos链平稳地升级到新的(中断的)软件版本。它通过提供BeginBlocker挂钩来实现此目的,该挂钩可防止一旦达到预定义的升级块时间或高度,区块链状态机便无法继续运行。
x/evidence
是根据ADR 009进行的Cosmos SDK模块的实现,该模块允许提交和处理行为不当的任意证据,例如模棱两可和反事实签名。
证据模块不同于标准的证据处理,标准的证据处理通常期望潜在的共识引擎(例如Tendermint)在发现证据时通过允许客户和外国链直接提交更复杂的证据来自动提交证据。
使用starport时,可以使用命令添加模块starport module create modulename
。将模块手动添加到区块链应用程序时,需要使用相应的条目编辑app/app.go
和myappcli/main.go
。Starport为您方便地管理代码编辑和添加。
starport module import <modulename>
让您将模块导入到区块链应用程序中。通过Starport,您可以直接跳至创建自己的模块。使用前面描述的type
功能,您可以向您的应用程序添加新的交易类型。在后台,starport为您创建一个处理程序,类型和消息。
如果不使用starport,则需要自己操作这些功能。当您添加星标时,这是starport的工作type
。了解starport的作用可能有助于添加更复杂的结构或进行调试,以防某些情况无法正常工作。
使用type命令时,会在proto
目录中为您创建Protobuffer定义。
它包含有关您创建的事务类型的完整CRUD(创建,读取,更新,删除)操作的消息。
创建了starport区块链应用程序后,您将拥有自己的模块yourapp/x/yourmodule
,该模块预定义了几个文件和文件夹,用于定义模块的类型,功能和消息。
该types
文件夹定义您的golang区块链应用程序的结构。在这里,您可以定义基本或更高级的类型,这些类型以后将成为可在区块链上使用的数据和功能。
消息类型在filetypes/messages_type
或您计划使用的其他函数中定义。
有一个rest
文件夹负责您的模块公开的其余API。
cli
具有内容的文件夹负责用户将可用的命令行界面命令。
当前,starport提供了一个基本的Vue用户界面,您可以从中获得启发或在其上建立基础。源代码位于该vue
文件夹中。用JavaScript编写,您可以直接跳入编写应用程序的前端。
yourapp/x/
或目录中的文件来更改模块proto
。参考资料