Перейти к содержимому

Конвертер Cadence в код Go — Numio

Генерирует Go-структуры из структур, ресурсов и событий контракта Flow Cadence с помощью easi-gen, скомпилированного в WebAssembly. Поля получают теги `godence:"..."` для кодировщика godence; опциональные типы вроде String? становятся обычным типом Go.

Декодирование результатов скриптов или событий контрактов блокчейна Flow в Go-бэкенде на flow-go-sdk и godence.

Cadence types

Go types

Когда пригодится

  • Декодирование результатов скриптов или событий контрактов блокчейна Flow в Go-бэкенде на flow-go-sdk и godence.
  • Генерация типизированного Go-клиента с функциями запросов для публичных функций контракта вместо ручного написания скриптов.

Как пользоваться

  1. Вставьте контракт Cadence в редактор Cadence types; сохраните блок pub contract верхнего уровня, так как структуры вне контракта отклоняются.
  2. При необходимости откройте Output Settings и включите "Generate Interaction Code With Functions", чтобы дополнительно получить заголовок package, импорты, тип ContractX и по одному Go-методу на каждую pub fun.
  3. Скопируйте панель Go types в проект и добавьте импорт godence; import "math/big" добавляется автоматически, если поле использует *big.Int.

Контракт Cadence

pub contract Marketplace {
  pub struct Listing {
    pub let id: UInt64
    pub let seller: Address
    pub var price: UFix64
    pub var tags: [String]
    pub var meta: {String: String}
    pub var note: String?

    init() { self.id = 0; self.seller = 0x01; self.price = 0.0; self.tags = []; self.meta = {}; self.note = nil }
  }

  pub event Sold(id: UInt64, buyer: Address)
}

Go-структуры

type StructListing struct {
	Id     uint64            `godence:"id"`
	Seller string            `godence:"seller"`
	Price  uint64            `godence:"price"`
	Tags   []string          `godence:"tags"`
	Meta   map[string]string `godence:"meta"`
	Note   string            `godence:"note"`
}

type EventSold struct {
	Id    uint64 `godence:"id"`
	Buyer string `godence:"buyer"`
}

Подробности и ограничения

Генерация полностью выполняется в вашем браузере: страница загружает WebAssembly-модуль easi-gen, и ничего не отправляется на сервер. Генератор — большой WebAssembly-бандл (около 29 МБ), встроенный в скрипт страницы, поэтому первая загрузка может быть медленной.

К именам добавляется префикс по виду: StructListing, ResourceNFT, EventSold. Имена полей пишутся с заглавной буквы, а исходное имя из Cadence сохраняется в теге godence.

Соответствие типов на практике: UInt64 в uint64, Int8 в int8, Int в *big.Int, UFix64 в uint64, Fix64 в int64, Address в string, [T;2] в [2]T, {K:V} в map[K]V.

С настройкой по умолчанию генерируются только объявления типов без строки package, а тела pub fun игнорируются. Единственный добавляемый импорт — "math/big", когда полю Int нужен *big.Int.

FAQ

Почему появляется "no top level contract found"?

Генератор читает только объявления внутри pub contract, поэтому для отдельных структур выводится эта ошибка. Оберните их в блок контракта, например pub contract Example { ... }, как в примере по умолчанию в редакторе.

Как обрабатываются опциональные типы?

Признак опциональности отбрасывается: String? становится string, а функция, возвращающая Listing?, отображается на StructListing. Проверяйте отсутствие значений сами, так как результат nil декодируется в нулевое значение.

Что добавляет "Generate Interaction Code With Functions"?

Добавляются строки package и import, тип ContractName с конструктором, проверяющим адрес контракта, и по методу на каждую публичную функцию, который собирает скрипт Cadence, выполняет ExecuteScriptAtLatestBlock и декодирует результат через godence.

Поддерживаются ли вложенные структуры и многомерные массивы?

Да. Структура, объявленная внутри другой, становится отдельным типом Go, [[String]] становится [][]string, а вложенные словари — вложенными map, например map[string]map[string]string.

Спецификации и справка