Конвертер 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-клиента с функциями запросов для публичных функций контракта вместо ручного написания скриптов.
Как пользоваться
- Вставьте контракт Cadence в редактор Cadence types; сохраните блок pub contract верхнего уровня, так как структуры вне контракта отклоняются.
- При необходимости откройте Output Settings и включите "Generate Interaction Code With Functions", чтобы дополнительно получить заголовок package, импорты, тип ContractX и по одному Go-методу на каждую pub fun.
- Скопируйте панель 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.