Saltar al contenido

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

  1. 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.
  2. 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.
  3. 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.

Especificaciones y referencias