Aller au contenu

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

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

Spécifications et références