Cosmos SDK - это фреймворк, похожий на npm, который позволяет разработчикам легко создавать сложные, безопасные и независимые от приложений конечные автоматы поверх Tendermint. Приложения, созданные с помощью Cosmos SDK, по сути, представляют собой совместимые публичные цепочки с несколькими активами, основанные на BPoS (Bonded Proof-of-Stake).

Ниже приведена инфографика о том, как транзакции обрабатываются приложением, созданным с помощью Cosmos SDK, при воспроизведении из Tendermint через ABCI, или, точнее ,DeliverTx:

Анатомия приложения

Приложение Cosmos SDK обычно состоит из следующих основных компонентов:

I. Полноузловой клиент

Клиент с полным узлом - это двоичный файл (или демон), созданный и запускаемый участниками сети Cosmos для создания экземпляра своего собственного конечного автомата и подключения к другим полным узлам. Полный узел полностью проверяет транзакции и блоки цепочки блоков.

II. Основное приложение

Ядро приложения Cosmos SDK в основном состоит из функций определения типа и конструктора.

Определение типа

Определенное в app.go определение типа пользовательского приложения - это просто структура, состоящая из следующего:

  • Ссылка на baseapp: ссылка на baseapp определяет пользовательский app тип встраивания baseapp для вашего приложения. Другими словами, ссылка на baseapp позволяет настраиваемому приложению наследовать большую часть базовой логики baseapp, такой как методы ABCI и логику маршрутизации.
  • Список ключей хранилища: каждый модуль в Cosmos SDK использует мульти-хранилище для сохранения своей части состояния. Для доступа к таким хранилищам требуется список ключей, объявленных в определении типа app.
  • Список Keeper каждого модуля: keeper - это абстрактная часть в каждом модуле, предназначенная для обработки взаимодействия модуля с хранилищами, указания ссылок на keeper других модулей и реализации других основных функций модуля. Для межмодульного взаимодействия для работы всех модулей в Cosmos SDK необходимо, чтобы их keeper были объявлены в определении типа app и экспортированы как интерфейсы для других модулей, чтобы методы keeper одного модуля могли вызываться и доступны в других модулях при авторизации.
  • Ссылка на codec: по умолчанию используется значение go-amino, codec в вашем приложении Cosmos SDK можно заменить другими подходящими структурами кодирования, если они сохраняют хранилища данных в байтовых срезах и являются детерминированными.
  • Ссылка на диспетчер модулей : Не требует пояснений. Ссылка на объект, содержащий список модулей приложения, также известный как диспетчер модулей.

Пример определения типа приложения

Функция-конструктор

Как следует из названия, функция-конструктор создает экземпляр app с объявленным в нем определением типа приложения. В частности, функции-конструкторы при вызове выполняют следующие действия:

  1. Инициализировать новый экземпляр app ссылкой на codec, ссылкой на baseapp и списком ключей хранилища
  2. Инициализируйте keeper каждого модуля, как определено в определении типа, в правильном порядке (т.е. keeper модуля Jay должны быть созданы до модуля Ken, если keeper модуля Ken требуют ссылки на модуль Jay)
  3. Инициализировать диспетчер модулей app - объект, в котором
  • Передается ссылка на каждый модуль (предполагается, что модули, инициализированные здесь, будут изменены позже)
  • routes (для handler модуля) и query routes (для querier модуля) инициализируются
  • Регистрируются инварианты (т.е. переменные, оцениваемые в конце каждого блока) каждого модуля. Значение каждого инварианта должно быть равно заранее заданному значению, указанному в соответствующем модуле.
  • Устанавливается порядок выполнения между ключевыми функциями (например, InitGenesis, BeginBlocker, EndBlocker) каждого модуля.
  • Остальные параметры app установлены
  • Магазины смонтированы
  • Возвращен экземпляр app

Пример конструктора приложения

III. Модули

Благодаря тому, что многие ключевые модули, необходимые для согласованного приложения, уже встроены в Cosmos SDK, разработчики могут легко создавать сложные конечные автоматы, интегрируя настраиваемые модули с существующими. В настоящее время SDK поддерживает следующие модули:

В оставшейся части этого раздела мы кратко рассмотрим два основных строительных блока модуля - интерфейсы и типы сообщений.

Интерфейсы

По определению, модуль Cosmos SDK реализует два интерфейса: AppModuleBasic и AppModule. AppModule обычно содержит межмодульные зависимые методы модуля, в то время как независимые методы (например, codec) входят в AppModuleBasic.

Пример интерфейса модуля

Типы сообщений

Каждый модуль, реализующий интерфейс message, должен определять свои собственные типы сообщений. Такие типы сообщений также должны рассматриваться как «сообщения, которые должны быть включены в транзакции». После получения блока транзакций, ретранслированного от Tendermint через DeliverTx, приложение должно пройти четырехэтапную процедуру перед фиксацией изменений состояния:

  1. Неупорядочить каждую транзакцию из байтовых срезов или []bytes
  2. Выполните проверки работоспособности (например, сборы, подписи) и извлеките сообщение (я), содержащееся в транзакции
  3. Направьте сообщение (я) на handler соответствующего модуля
  4. Обработать сообщение (я)

IV. Интерфейсы приложений

Каждое приложение Cosmos SDK реализует интерфейс командной строки (CLI), который используется для взаимодействия с полноузловыми клиентами. Стандартный интерфейс командной строки поддерживает следующие общие команды:

Пример CLI

V. Зависимости и Makefile

Cosmos SDK дает разработчикам свободу выбора предпочтительного менеджера зависимостей и метода построения проекта. Модули Go обычно используются для первого и Makefile для второго.

Замечания

Независимо от того, новичок вы в блокчейне или нет, изучение новой кодовой базы поначалу может быть немного пугающим. Эта статья была моей попыткой дать разработчикам, желающим создать Cosmos SDK, взгляд на фреймворк и, надеюсь, помочь облегчить период взлома кода. Если вы готовы заняться созданием собственных блокчейнов для конкретных приложений, ознакомьтесь с руководством здесь. И последнее, но не менее важное: спасибо за проверку!

Ресурсы

[1] GitHub. (2019). космос / космос-SDK. [онлайн] Доступно по адресу: https://github.com/cosmos/cosmos-sdk/tree/master/docs [по состоянию на 11 ноября 2019 г.].