一、理解四个Apps的作用和关系
最显眼的App
众所周知,cosmos-sdk是一个基于tendermint基础上允许用户定制功能的blockchain平台。
普通用户现在可以通过Ignite cli工具能快速,高效的搭建起一个blockchain功能,任何人首先肯定会接触到app/app.go定义了一个App(后面统一称为app.App),“减重”后的代码为:
type App struct {
*baseapp.BaseApp
// ....
}
func New( logger log.Logger, db dbm.DB, traceStore io.Writer,
// ...,
) *App {
appCodec := encodingConfig.Marshaler
cdc := encodingConfig.Amino
interfaceRegistry := encodingConfig.InterfaceRegistry
bApp := baseapp.NewBaseApp(
Name,
logger,
// ...
)
app := &App{
BaseApp: bApp,
// ...
}
app.ParamsKeeper = initParamsKeeper(
appCodec,
// ...
)
// ...
return app
}
其它的Apps
除了上面提到的app.App外,它里面继承的baseapp.BaseApp也通常会吸引笔者再进入去窥探一番,这是第二个也是最重量级的app(称之为baseapp.BaseApp)。
type App struct {
*baseapp.BaseApp
// ....
}
第三个app也很容易猜到,就是tendermint的abci接口规范。
第四个app与应用程序执行有关系,它完美的包装了前面abci接口并在此基础提供启动程序的服务定义,代码为:
type Application interface {
abci.Application
RegisterAPIRoutes(*api.Server, config.APIConfig)
RegisterGRPCServer(grpc.Server)
RegisterTxService(client.Context)
RegisterTendermintService(client.Context)
CommitMultiStore() sdk.CommitMultiStore
}
四个Apps作用是什么
从上面图可以看出四个Apps作用:
- abci.Application就是tendermint眼中的应用程序需要实现的接口,标准ABCI程序。
- types.Application是在abci.Application上增强了注册各种服务和返回存储的功用。
- baseapp.BaseApp是功能最全的ABIC应用程序,绝大多数神秘功能都在它那里发起。
- app.App主要实现部分注册服务,以及管理module及串联各个keeper作用。