Convertir Cadence en code Go — Numio
Génère des structs Go à partir des structs, resources et events d’un contrat Cadence Flow, avec easi-gen compilé en WebAssembly. Les champs reçoivent des tags `godence:"..."` pour l’encodeur godence ; les types optionnels comme String? deviennent leur type Go simple.
Décoder des résultats de scripts ou des événements de contrats de la blockchain Flow dans un backend Go qui utilise flow-go-sdk et godence.
Cadence types
Go types
Quand l’utiliser
- Décoder des résultats de scripts ou des événements de contrats de la blockchain Flow dans un backend Go qui utilise flow-go-sdk et godence.
- Générer un client Go typé avec des fonctions de requête pour les fonctions publiques d’un contrat, au lieu d’écrire les scripts à la main.
Mode d’emploi
- Collez un contrat Cadence dans l’éditeur Cadence types ; gardez le bloc pub contract de premier niveau, car les structs en dehors d’un contrat sont refusées.
- Si besoin, ouvrez Output Settings et activez "Generate Interaction Code With Functions" pour obtenir aussi l’en-tête package, les imports, un type ContractX et une méthode Go par pub fun.
- Copiez le panneau Go types dans votre projet et ajoutez l’import godence ; import "math/big" est ajouté automatiquement quand un champ utilise *big.Int.
Contrat 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"`
}Détails et limites
La génération s’exécute entièrement dans votre navigateur : la page charge le module WebAssembly easi-gen et rien n’est envoyé à un serveur. Le générateur est un gros bundle WebAssembly (environ 29 Mo) intégré au script de la page, donc le premier chargement peut être lent.
Les noms sont préfixés selon leur genre : StructListing, ResourceNFT, EventSold. Les noms de champs prennent une majuscule initiale et le nom Cadence d’origine est conservé dans le tag godence.
Correspondance des types en pratique : UInt64 vers uint64, Int8 vers int8, Int vers *big.Int, UFix64 vers uint64, Fix64 vers int64, Address vers string, [T;2] vers [2]T, {K:V} vers map[K]V.
Avec le réglage par défaut, seules les déclarations de types sont produites, sans ligne package, et les corps des pub fun sont ignorés. Le seul import ajouté est "math/big", lorsqu’un champ Int nécessite *big.Int.
FAQ
Pourquoi ai-je l’erreur "no top level contract found" ?
Le générateur ne lit que les déclarations situées dans un pub contract ; des structs isolées produisent donc cette erreur. Enveloppez-les dans un bloc de contrat, par exemple pub contract Example { ... }, comme dans l’exemple par défaut de l’éditeur.
Comment les types optionnels sont-ils gérés ?
Le marqueur d’optionnel est supprimé : String? devient string, et une fonction qui renvoie Listing? est associée à StructListing. Vérifiez vous-même les valeurs manquantes, car un résultat nil est décodé en valeur zéro.
Qu’ajoute "Generate Interaction Code With Functions" ?
Il ajoute les lignes package et import, un type ContractName avec un constructeur qui vérifie l’adresse du contrat, et une méthode par fonction publique qui construit un script Cadence, exécute ExecuteScriptAtLatestBlock et décode le résultat avec godence.
Les structs imbriquées et les tableaux multidimensionnels sont-ils pris en charge ?
Oui. Une struct déclarée dans une autre devient son propre type Go, [[String]] devient [][]string, et les dictionnaires imbriqués deviennent des maps imbriquées comme map[string]map[string]string.