Convertir Cadence a código Go — Numio
Genera structs de Go a partir de los structs, resources y events de un contrato Cadence de Flow, usando easi-gen compilado a WebAssembly. Los campos reciben etiquetas `godence:"..."` para el codificador godence; los tipos opcionales como String? pasan a su tipo Go simple.
Decodificar resultados de scripts o eventos de contratos de la blockchain Flow en un backend Go que usa flow-go-sdk y godence.
Cadence types
Go types
Cuándo usarla
- Decodificar resultados de scripts o eventos de contratos de la blockchain Flow en un backend Go que usa flow-go-sdk y godence.
- Generar un cliente Go tipado con funciones de consulta para las funciones públicas de un contrato en lugar de escribir los scripts a mano.
Cómo usarla
- Pega un contrato Cadence en el editor Cadence types; mantén el bloque pub contract de nivel superior, ya que los structs fuera de un contrato se rechazan.
- Opcionalmente, abre Output Settings y activa "Generate Interaction Code With Functions" para obtener también la cabecera package, los imports, un tipo ContractX y un método Go por cada pub fun.
- Copia el panel Go types en tu proyecto y añade el import de godence; import "math/big" se añade automáticamente cuando un campo usa *big.Int.
Contrato 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)
}Structs de 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"`
}Detalles y limitaciones
La generación se ejecuta por completo en tu navegador: la página carga el módulo WebAssembly de easi-gen y no se envía nada a ningún servidor. El generador es un paquete WebAssembly grande (unos 29 MB) incrustado en el script de la página, así que la primera carga puede ser lenta.
Los nombres llevan un prefijo según su tipo: StructListing, ResourceNFT, EventSold. Los nombres de campo se escriben con mayúscula inicial y el nombre original de Cadence se conserva en la etiqueta godence.
Correspondencia de tipos en la práctica: UInt64 a uint64, Int8 a int8, Int a *big.Int, UFix64 a uint64, Fix64 a int64, Address a string, [T;2] a [2]T, {K:V} a map[K]V.
Con la configuración predeterminada solo se generan declaraciones de tipo, sin línea package, y se ignoran los cuerpos de pub fun. El único import que se añade es "math/big", cuando un campo Int necesita *big.Int.
FAQ
¿Por qué aparece "no top level contract found"?
El generador solo lee declaraciones dentro de un pub contract, así que los structs independientes producen este error. Envuélvelos en un bloque de contrato, por ejemplo pub contract Example { ... }, como en el ejemplo predeterminado del editor.
¿Cómo se manejan los tipos opcionales?
El marcador de opcional se descarta: String? pasa a string, y una función que devuelve Listing? se asigna a StructListing. Comprueba tú mismo los valores ausentes, ya que un resultado nil se decodifica como valor cero.
¿Qué añade "Generate Interaction Code With Functions"?
Añade las líneas package e import, un tipo ContractName con un constructor que comprueba la dirección del contrato y un método por cada función pública que construye un script Cadence, ejecuta ExecuteScriptAtLatestBlock y decodifica el resultado con godence.
¿Se admiten structs anidados y arrays multidimensionales?
Sí. Un struct declarado dentro de otro pasa a ser su propio tipo Go, [[String]] pasa a [][]string, y los diccionarios anidados pasan a mapas anidados como map[string]map[string]string.