Converter Cadence em código Go — Numio
Gera structs Go a partir das structs, resources e events de um contrato Cadence do Flow, usando o easi-gen compilado para WebAssembly. Os campos recebem tags `godence:"..."` para o encoder godence; tipos opcionais como String? viram o tipo Go simples.
Decodificar resultados de scripts ou eventos de contratos da blockchain Flow em um backend Go que usa flow-go-sdk e godence.
Cadence types
Go types
Quando usar
- Decodificar resultados de scripts ou eventos de contratos da blockchain Flow em um backend Go que usa flow-go-sdk e godence.
- Gerar um cliente Go tipado com funções de consulta para as funções públicas de um contrato, em vez de escrever scripts à mão.
Como usar
- Cole um contrato Cadence no editor Cadence types; mantenha o bloco pub contract de nível superior, já que structs fora de um contrato são rejeitadas.
- Opcionalmente, abra Output Settings e ative "Generate Interaction Code With Functions" para obter também o cabeçalho package, os imports, um tipo ContractX e um método Go por pub fun.
- Copie o painel Go types para o seu projeto e adicione o import do godence; import "math/big" é adicionado automaticamente quando um 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 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"`
}Detalhes e limitações
A geração roda inteiramente no seu navegador: a página carrega o módulo WebAssembly do easi-gen e nada é enviado a um servidor. O gerador é um bundle WebAssembly grande (cerca de 29 MB) embutido no script da página, então o primeiro carregamento pode ser lento.
Os nomes recebem um prefixo conforme o tipo: StructListing, ResourceNFT, EventSold. Os nomes de campo ficam com inicial maiúscula e o nome original em Cadence é mantido na tag godence.
Mapeamento de tipos na prática: UInt64 para uint64, Int8 para int8, Int para *big.Int, UFix64 para uint64, Fix64 para int64, Address para string, [T;2] para [2]T, {K:V} para map[K]V.
Com a configuração padrão, só são geradas declarações de tipo, sem linha package, e os corpos de pub fun são ignorados. O único import adicionado é "math/big", quando um campo Int precisa de *big.Int.
FAQ
Por que recebo "no top level contract found"?
O gerador só lê declarações dentro de um pub contract, então structs avulsas resultam nesse erro. Envolva-as em um bloco de contrato, por exemplo pub contract Example { ... }, como no exemplo padrão do editor.
Como os tipos opcionais são tratados?
O marcador de opcional é descartado: String? vira string, e uma função que retorna Listing? é mapeada para StructListing. Verifique você mesmo os valores ausentes, já que um resultado nil é decodificado como valor zero.
O que "Generate Interaction Code With Functions" adiciona?
Adiciona as linhas package e import, um tipo ContractName com um construtor que verifica o endereço do contrato e um método por função pública que monta um script Cadence, executa ExecuteScriptAtLatestBlock e decodifica o resultado com godence.
Structs aninhadas e arrays multidimensionais são suportados?
Sim. Uma struct declarada dentro de outra vira seu próprio tipo Go, [[String]] vira [][]string, e dicionários aninhados viram maps aninhados como map[string]map[string]string.