cosmosSDK代码架构

App

一条基于cosmosSDK的链,就是一个App,App是最顶层单元,负责实现ABCI接口。App以module方式管理。

Tendermint通过ABCI和App通讯,核心的接口如下:

  • CheckTx。验证tx,成功则加入交易池。
  • BeginBlock。执行Block之前调用。
  • DeliverTx。执行Block时调用,对每个tx遍历调用。
  • EndBlock。执行Block结束后调用。
  • Commit。存储落盘。

二者具体关系如图:

-------App-------- 

     a b c i

----Tendermint-----

也就是说,Tendermint调用App,App实现ABCI对应的接口,ABCI接口的执行流程,形成了App的核心逻辑。

其中CosmosSDK提供了一个baseApp,编写了基础的核心逻辑,用户的自定义App往往继承自baseApp。

App以module方式管理,包括以下核心组件:

  • codec。编码。
  • store。存储。
  • keeper。各个模块的具体的功能。
  • anteHandler。验证交易的有效性,被CheckTx和DeliverTx调用。
  • router。各个交易执行的具体路由。
  • module manager。模块管理者。

Module

App中,通过module来管理各个功能模块,比如evm是一个module,ibc是另一个module。代码一般存放在x目录下。

一个module的组成有以下核心组件:

  • keeper。keeper操作store,对外提供模块的具体功能。
  • store。本模块相关的k,v数据库。
  • handler。提供msg(tx)的执行入口。
  • module。提供module级别的对外接口,如module名字,beginBlock, endBlock等函数,module级别的借口往往会调用具体的keeper接口。

需要注意的时,module中可能会使用到别的module的keeper。cosmos采用的方式是在app中创建和管理所有keeper,然后在创建module时,把对应的keeper分配出去。

因此module和keeper并不是严格的上下层级关系,而是一种引用关系,即module中包含keeper,但该keeper是由app创建,而不是module内部创建的。

Module manager

所有module会注册在App的moduleManager中。module manager是一个module的集合。作用是统一调用module级别的接口,如beginBlock, endBlock等函数。

app在执行业务流程,比如执行beginBlock的时候,会调用app的beginBlocker。

app.beginBlocker会调用module manager中的BeginBlock函数,然后遍历所有的module,调用对应的BeginBlock函数,如下所示:

// BeginBlock performs begin block functionality for all modules. It creates a
// child context with an event manager to aggregate events emitted from all
// modules.
func (m *Manager) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
    ctx = ctx.WithEventManager(sdk.NewEventManager())

    for _, moduleName := range m.OrderBeginBlockers {
       module, ok := m.Modules[moduleName].(BeginBlockAppModule)
       if ok {
          module.BeginBlock(ctx, req)
       }
    }

    return abci.ResponseBeginBlock{
       Events: ctx.EventManager().ABCIEvents(),
    }
}

Keeper

keeper是module的下属结构。但由于module中可能会使用到别的module的keeper。cosmos采用的方式是在app中创建和管理所有keeper,然后在创建module时,把对应的keeper分配出去。

因此module和keeper并不是严格的上下层级关系,而是一种引用关系,即module中包含keeper,但该keeper是由app创建,而不是module内部创建的。

anteHandler

anterhandler并不是由module管理的,代码一般不在x目录下,而是单独的ante目录。负责在交易被执行之前,验证交易的有效性,被CheckTx和DeliverTx调用。

anteHandler虽然不是module管理,个人认为是历史原因。一开始的设计认为anteHandle是公共功能,不需要按照module管理。但随着cosmosSDK的发展,anteHandler其实也一定程度按照module划分。

比如在NewAnteHandler代码中,会区分EVMAnteHandler, CosmosAnteHandler。

switch typeURL := opts[0].GetTypeUrl(); typeURL {
case "/ethermint.evm.v1.ExtensionOptionsEthereumTx":
    // handle as *evmtypes.MsgEthereumTx    
    anteHandler = newEVMAnteHandler(options)
case "/ethermint.types.v1.ExtensionOptionsWeb3Tx":
    // handle as normal Cosmos SDK tx, except signature is checked for EIP712 representation    
    anteHandler = newLegacyCosmosAnteHandlerEip712(options)
case "/ethermint.types.v1.ExtensionOptionDynamicFeeTx":
    // cosmos-sdk tx with dynamic fee extension    
    anteHandler = newCosmosAnteHandler(options)
default:
    return ctx, errorsmod.Wrapf(
       errortypes.ErrUnknownExtensionOptions,
       "rejecting tx with unsupported extension option: %s", typeURL,
    )
}

router和handler

交易的具体执行在各个module中,在module中,会有一个handler文件,提供一个NewHandler接口,用于处理具体的tx(msg),如下:

// NewHandler returns a handler for Ethermint type messages.func NewHandler(server types.MsgServer) sdk.Handler {
    return func(ctx sdk.Context, msg sdk.Msg) (result *sdk.Result, err error) {
       ctx = ctx.WithEventManager(sdk.NewEventManager())

       switch msg := msg.(type) {
       case *types.MsgEthereumTx:
          res, err := server.EthereumTx(sdk.WrapSDKContext(ctx), msg)
          return sdk.WrapServiceResult(ctx, res, err)
       case *types.MsgUpdateParams:
          res, err := server.UpdateParams(sdk.WrapSDKContext(ctx), msg)
          return sdk.WrapServiceResult(ctx, res, err)
       default:
          err := errorsmod.Wrapf(errortypes.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg)
          return nil, err       }
    }
}

这些handler会通过moduleManager注册在App的router中,在baseApp执行交易时(runMsgs)时,会取出具体的handler,处理交易,如下:

for i, msg := range msgs {
    // match message route    msgRoute := msg.Route()
    handler := app.router.Route(msgRoute)
    if handler == nil {
       return sdk.ErrUnknownRequest("unrecognized message type: " + msgRoute).Result()
    }

    var msgResult sdk.Result    
    ...
 }

在cosmos把编码从amino升级到proto的时候,router的处理原理一样,但是注册方式发生了变化,通过module的函数注册:

func (am AppModule) RegisterServices(cfg module.Configurator) {
    types.RegisterMsgServer(cfg.MsgServer(), am.keeper)
    ...
}

module的入口也不是handler文件,而是msg_server文件,通过在tx.proto中定义handler和消息类型,最终会在router中保存到msg_server的route。

Store

App中的store采用一种父子关系,有一个总的store,可以理解为数据库,然后基于该store可以创建子store,可以立即为一个个的表,keeper操作具体的子store,并且在最后abci commit的时候,提交总store。

在baseApp初始化时,会创建一个总store,这是store的总入口:

func NewCommitMultiStore(db dbm.DB) types.CommitMultiStore {
    return rootmulti.NewStore(db, log.NewNopLogger())
}

根据总入口,可以创建一个个的子store,每个store对应一个key,在app中会有一个key的列表,根据key列表初始化子store:

keys := sdk.NewKVStoreKeys(
    // SDK keys    authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey,
    distrtypes.StoreKey, slashingtypes.StoreKey,
    govtypes.StoreKey, paramstypes.StoreKey, upgradetypes.StoreKey,
    evidencetypes.StoreKey, capabilitytypes.StoreKey, consensusparamtypes.StoreKey,
    feegrant.StoreKey, authzkeeper.StoreKey, crisistypes.StoreKey,
    // ibc keys    ibcexported.StoreKey, ibctransfertypes.StoreKey,
    // ica keys    icahosttypes.StoreKey,
    // ethermint keys    evmtypes.StoreKey, feemarkettypes.StoreKey,
    // evmos keys    inflationtypes.StoreKey, erc20types.StoreKey, incentivestypes.StoreKey,
    epochstypes.StoreKey, claimstypes.StoreKey, vestingtypes.StoreKey,
    revenuetypes.StoreKey, recoverytypes.StoreKey,
)

// initialize stores
app.MountKVStores(keys)
app.MountTransientStores(tkeys)
app.MountMemoryStores(memKeys)

然后在keeper中,根据对应的key,就可以使用子store:

store := prefix.NewStore(ctx.TransientStore(k.transientKey), types.KeyPrefixTransientBloom)
heightBz := sdk.Uint64ToBigEndian(uint64(ctx.BlockHeight()))
store.Set(heightBz, bloom.Bytes())

最后在abci的commit接口中,保存所有的store:

func (app *BaseApp) Commit() abci.ResponseCommit {
    ....
    // Write the DeliverTx state into branched storage and commit the MultiStore.    // The write to the DeliverTx state writes all 
    state transitions to the root    // MultiStore (app.cms) so when Commit() is called is persists those values.    
    app.deliverState.ms.Write()
    commitID := app.cms.Commit()
 }

Codec

codec负责结构体的编解码。

目前有两种codec, amino和protobuf,amino是比较旧的方式,protobuf是比较新的方式,这里讨论amino。

codec保存结构体的反射信息:

type Codec struct {
    mtx              sync.RWMutex    
    sealed           bool    
    typeInfos        map[reflect.Type]*TypeInfo    
    interfaceInfos   []*TypeInfo    
    concreteInfos    []*TypeInfo    
    disfixToTypeInfo map[DisfixBytes]*TypeInfo    
    nameToTypeInfo   map[string]*TypeInfo
}

在app创建时,会新建一个codec实例:

cdc := amino.NewLegacyAmino()

然后通过module manager,便利所有module,注册codec:

func (bm BasicManager) RegisterCodec(cdc *codec.Codec) {
    for _, b := range bm {
       b.RegisterCodec(cdc)
    }
}

一般会在module的codec.go文件中,实现具体的注册:

init() {    
// Register all Amino interfaces and concrete types 
//on the authz and gov Amino codec so that this can later be    
// used to properly serialize MsgGrant, MsgExec and MsgSubmitProposal instances    
 RegisterLegacyAminoCodec(authzcodec.Amino)   
 RegisterLegacyAminoCodec(govcodec.Amino)    
 RegisterLegacyAminoCodec(groupcodec.Amino)
}


《 “cosmosSDK代码架构” 》 有 86 条评论

  1. Ensure your family’s safety with thorough AC duct cleaning in Dubai using eco-friendly methods: cleaning ac ducts cost

  2. Портал о строительстве https://buildportal.kyiv.ua и ремонте: лучшие решения для дома, дачи и бизнеса. Инструменты, сметы, калькуляторы, обучающие статьи и база подрядчиков.

  3. Защитные кейсы plastcase.ru/ в Санкт-Петербурге — надежная защита оборудования от влаги, пыли и ударов. Большой выбор размеров и форматов, ударопрочные материалы, индивидуальный подбор.

  4. Защитные кейсы https://plastcase.ru в Санкт-Петербурге — надежная защита оборудования от влаги, пыли и ударов. Большой выбор размеров и форматов, ударопрочные материалы, индивидуальный подбор.

  5. Журнал для женщин и о женщинах. Все, что интересно нам, женщинам https://secrets-of-women.ru/

  6. Мобильный шиномонтаж колеса shinomontazh-vyezdnoj.ru/

  7. Трудовой юрист Екатеринбург https://yuristy-ekaterinburga.ru

  8. Мы занимаемся профессиональным сносом частных домов любых типов. Наша команда быстро и безопасно демонтирует деревянные, кирпичные, панельные и каркасные здания вне зависимости от сложности работ. Мы организуем вывоз строительного мусора и подготавливаем участок для последующего строительства. В работе используем как спецтехнику для механизированного демонтажа, так и ручные методы https://demontazh-doma-9.ru/

  9. Новости, обзоры, тест-драйвы, ремонт и эксплуатация автомобилей https://5go.ru/

  10. Бесплатная юридическая консультация онлайн и по телефону. Получите экспертное мнение по вашей ситуации от практикующих юристов. Быстро, профессионально и без обязательств – онлайн консультация юриста бесплатно по телефону

  11. Если вам нужно срочно сделать прописку в Москве, можно оформить временную регистрацию через надежных специалистов: сделать временную регистрацию в москве цена

  12. Журнал о психологии и отношениях, чувствах и эмоциях, здоровье и отдыхе. О том, что с нами происходит в жизни. Для тех, кто хочет понять себя и других https://inormal.ru/

  13. ultimate createporn generator. Create hentai art, porn comics, and NSFW with the best AI porn maker online. Start generating AI porn now!

  14. Блог о здоровье, красоте, полезные советы на каждый день в быту и на даче https://lmoroshkina.ru/

  15. Ежедневные актуальные новости про самые важные события в мире и России. Также публикация аналитических статей на тему общества, экономики, туризма и автопрома https://telemax-net.ru/

  16. Дача и огород, фермерство и земледелие, растения и цветы. Все о доме, даче и загородной жизне. Мы публикуем различные мнения, статьи и видеоматериалы о даче, огороде https://sad-i-dom.com/

  17. Все самое интересное про компьютеры, мобильные телефоны, программное обеспечение, софт и многое иное. Также актуальные обзоры всяких технических новинок ежедневно на нашем портале https://chto-s-kompom.ru/

  18. Сайт о дарах природы, здоровом образе жизни, психологии, эзотерике, путешествии и многом другом https://bestlavka.ru/

  19. Ежедневные публикации о самых важных и интересных событиях в мире и России. Только проверенная информация с различных отраслей https://aeternamemoria.ru/

  20. Ежедневный обзор событий в мире. Последние новости в сфере медицины, общества и автопрома. Также интересные события с мира звезд шоу бизнеса https://borisoglebsk.net/

  21. Профессиональное косметологическое оборудование москва для салонов красоты, клиник и частных мастеров. Аппараты для чистки, омоложения, лазерной эпиляции, лифтинга и ухода за кожей.

  22. ultimate createporn generator. Create hentai art, porn comics, and NSFW with the best AI porn maker online. Start generating AI porn now!

  23. ultimate createporn AI generator. Create hentai art, porn comics, and NSFW with the best AI porn maker online. Start generating AI porn now!

  24. Balloons Dubai https://balloons-dubai1.com stunning balloon decorations for birthdays, weddings, baby showers, and corporate events. Custom designs, same-day delivery, premium quality.

  25. Need transportation? car transport services car transportation company services — from one car to large lots. Delivery to new owners, between cities. Safety, accuracy, licenses and experience over 10 years.

  26. Нужна камера? установка монтаж камеры видеонаблюдение для дома, офиса и улицы. Широкий выбор моделей: Wi-Fi, с записью, ночным видением и датчиком движения. Гарантия, быстрая доставка, помощь в подборе и установке.

  27. Professional power washing in Seattle — effective cleaning of facades, sidewalks, driveways and other surfaces. Modern equipment, affordable prices, travel throughout Seattle. Cleanliness that is visible at first glance.

  28. Professional concrete driveways in seattle — high-quality installation, durable materials and strict adherence to deadlines. We work under a contract, provide a guarantee, and visit the site. Your reliable choice in Seattle.

  29. sitio web tavoq.es es tu aliado en el crecimiento profesional. Ofrecemos CVs personalizados, optimizacion ATS, cartas de presentacion, perfiles de LinkedIn, fotos profesionales con IA, preparacion para entrevistas y mas. Impulsa tu carrera con soluciones adaptadas a ti.

  30. Каждый клиент получает индивидуальный подход и точную диагностику.

  31. Webseite cvzen.de ist Ihr Partner fur professionelle Karriereunterstutzung – mit ma?geschneiderten Lebenslaufen, ATS-Optimierung, LinkedIn-Profilen, Anschreiben, KI-Headshots, Interviewvorbereitung und mehr. Starten Sie Ihre Karriere neu – gezielt, individuell und erfolgreich.

  32. sitio web tavoq.es es tu aliado en el crecimiento profesional. Ofrecemos CVs personalizados, optimizacion ATS, cartas de presentacion, perfiles de LinkedIn, fotos profesionales con IA, preparacion para entrevistas y mas. Impulsa tu carrera con soluciones adaptadas a ti.

  33. Ремонт квартир https://remont-kvartir-novo.ru под ключ в новостройках — от черновой отделки до полной готовности. Дизайн, материалы, инженерия, меблировка.

  34. СРО УН «КИТ» https://sro-kit.ru саморегулируемая организация для строителей, проектировщиков и изыскателей. Оформление допуска СРО, вступление под ключ, юридическое сопровождение, помощь в подготовке документов.

  35. Квартиры посуточно https://kvartiry-posutochno19.ru в Абакане — от эконом до комфорт-класса. Уютное жильё в центре и районах города. Чистота, удобства, всё для комфортного проживания.

  36. Агентство недвижимости https://metropolis-estate.ru покупка, продажа и аренда квартир, домов, коммерческих объектов. Полное сопровождение сделок, юридическая безопасность, помощь в оформлении ипотеки.

  37. No more phone needed! https://sdasteam.com lets you use Steam Guard right on your computer. Quickly confirm transactions, access 2FA codes, and conveniently manage security.

  38. PC application скачать steam desktop authenticator replacing the mobile Steam Guard. Confirm logins, trades, and transactions in Steam directly from your computer. Support for multiple accounts, security, and backup.

  39. Сайт знакомств https://rutiti.ru для серьёзных отношений, дружбы и общения. Реальные анкеты, удобный поиск, быстрый старт. Встречайте новых людей, находите свою любовь и начинайте общение уже сегодня.

  40. Дом из контейнера https://russiahelp.com под ключ — мобильное, экологичное и бюджетное жильё. Индивидуальные проекты, внутренняя отделка, электрика, сантехника и монтаж

  41. Юрист Онлайн https://juristonline.com квалифицированная юридическая помощь и консультации 24/7. Решение правовых вопросов любой сложности: семейные, жилищные, трудовые, гражданские дела. Бесплатная первичная консультация.

  42. Try https://llmbrowser.io – an innovative agentic browser that redefines AI agent tasks. This cutting-edge tool features advanced antidetect capabilities, making it an ideal antidetect for agents. Achieve superior results with intelligent automation now.

  43. Готовьте вкусно https://eqa.ru у нас — рецепты на любой вкус: мясные, вегетарианские, диетические, сладкие и острые. Пошаговые фото, время приготовления и секреты идеального блюда.

  44. Научно-популярный сайт https://phenoma.ru — малоизвестные факты, редкие феномены, тайны природы и сознания. Гипотезы, наблюдения и исследования — всё, что будоражит воображение и вдохновляет на поиски ответов.

  45. халявные аккаунты стим free steam accounts

  46. халявные аккаунты стим https://t.me/s/Burger_Game

  47. Читайте о необычном http://phenoma.ru научно-популярные статьи о феноменах, которые до сих пор не имеют однозначных объяснений. Психология, физика, биология, космос — самые интересные загадки в одном разделе.

  48. Мир полон тайн https://phenoma.ru читайте статьи о малоизученных феноменах, которые ставят науку в тупик. Аномальные явления, редкие болезни, загадки космоса и сознания. Доступно, интересно, с научным подходом.

  49. Всё о городе городской портал города Ханты-Мансийск: свежие новости, события, справочник, расписания, культура, спорт, вакансии и объявления на одном городском портале.

  50. Услуги массажа Ивантеевка — здоровье, отдых и красота. Лечебный, баночный, лимфодренажный, расслабляющий и косметический массаж. Сертифицированнй мастер, удобное расположение, результат с первого раза.

  51. Профессиональный массаж Ивантеевка: классический, лечебный, расслабляющий, антицеллюлитный. Квалифицированные массажисты, индивидуальный подход, комфортная обстановка. Запишитесь на сеанс уже сегодня!

  52. Займы под залог https://srochnyye-zaymy.ru недвижимости — быстрые деньги на любые цели. Оформление от 1 дня, без справок и поручителей. Одобрение до 90%, выгодные условия, честные проценты. Квартира или дом остаются в вашей собственности.

  53. Ваш финансовый гид https://kreditandbanks.ru — подбираем лучшие предложения по кредитам, займам и банковским продуктам. Рейтинг МФО, советы по улучшению КИ, юридическая информация и онлайн-сервисы.

  54. КПК «Доверие» https://bankingsmp.ru надежный кредитно-потребительский кооператив. Выгодные сбережения и доступные займы для пайщиков. Прозрачные условия, высокая доходность, финансовая стабильность и юридическая безопасность.

  55. Сделай сам как проводится капитальный ремонт дома Ремонт квартиры и дома своими руками: стены, пол, потолок, сантехника, электрика и отделка. Всё, что нужно — в одном месте: от выбора материалов до финального штриха. Экономьте с умом!

  56. Быстрые микрозаймы https://clover-finance.ru без отказа — деньги онлайн за 5 минут. Минимум документов, максимум удобства. Получите займ с любой кредитной историей.

  57. Хочешь больше денег https://mfokapital.ru Изучай инвестиции, учись зарабатывать, управляй финансами, торгуй на Форекс и используй магию денег. Рабочие схемы, ритуалы, лайфхаки и инструкции — путь к финансовой независимости начинается здесь!

  58. Микрозаймы онлайн https://kskredit.ru на карту — быстрое оформление, без справок и поручителей. Получите деньги за 5 минут, круглосуточно и без отказа. Доступны займы с любой кредитной историей.

  59. Свежие актуальные Мировые новости спорта со всего мира. Результаты матчей, интервью, аналитика, расписание игр и обзоры соревнований. Будьте в курсе главных событий каждый день!

  60. круглосуточная доставка цветов цветы спб купить рядом

  61. Just here to join conversations, share experiences, and gain fresh perspectives throughout the journey.
    I’m interested in learning from different perspectives and sharing my input when it’s helpful. Interested in hearing different experiences and building connections.
    There is my web-site:https://automisto24.com.ua/

  62. It’s best to participate in a contest for one of the best blogs on the web. I will recommend this web site!

  63. augmentin and pregnancy Identifying the bacteria in a sample taken from blood or from infected tissue confirms the diagnosis

  64. WELLBUTRIN XL bupropion hydrochloride, an antidepressant of the aminoketone class, is chemically unrelated to tricyclic, tetracyclic, selective serotonin reuptake inhibitor, or other known antidepressant agents how can i get cheap cytotec online This is not an easy conversation to have

  65. JNCI 104 6 60 452 can you buy cheap cytotec for sale Treatment of congenital heart disease in adults depends on the severity of the heart condition

  66. Pregnancy has a profound effect on the circulatory system dapoxetina comprar online But as with the aromatase enzyme, DHT has a higher affinity for these proteins than testosterone does, so when administered simultaneously the mesterolone will attach to the SHBG and albumin, leaving larger amounts of free testosterone to mediate anabolic activities such as protein synthesis

  67. priligy amazon So I asked him, Do you want to shoot the other one

回复 TerrellGew 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About Me

一位程序员,会弹吉他,喜欢读诗。
有一颗感恩的心,一位美丽的妻子,两个可爱的女儿
mail: geraldlee0825@gmail.com
github: https://github.com/lisuxiaoqi
medium: https://medium.com/@geraldlee0825