Vai al contenuto

Convertitore di codice Cadence to Go — Numio

Genera struct Go da struct, risorse ed eventi di un contratto Flow Cadence, usando easi-gen compilato in WebAssembly. I campi ricevono tag `godence:"..."` per il codificatore godence; tipi facoltativi come String? diventano il corrispondente tipo Go semplice.

Decodifica dei risultati dello script o degli eventi del contratto dalla blockchain di Flow in un backend Go che utilizza flow-go-sdk e godence.

Cadence types

Go types

Quando usarlo

  • Decodifica dei risultati dello script o degli eventi del contratto dalla blockchain di Flow in un backend Go che utilizza flow-go-sdk e godence.
  • Generazione di un client Go digitato con funzioni di query per le funzioni pubbliche di un contratto invece di scrivere script manualmente.

Come si usa

  1. Incolla un contratto Cadence nell'editor dei tipi Cadence; mantenere il blocco del contratto pub di livello superiore, poiché le strutture esterne a un contratto vengono rifiutate.
  2. Se vuoi, apri le impostazioni di output e attiva "Generate Interaction Code With Functions" per ottenere anche un’intestazione package, gli import, un tipo ContractX e un metodo Go per ciascuna pub fun.
  3. Copia il pannello dei tipi Go nel tuo progetto e aggiungi l'importazione della godenza; import "math/big" viene aggiunto automaticamente quando un campo utilizza *big.Int.

Contratto di cadenza

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)
}

Vai alle strutture

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"`
}

Dettagli e limiti

La generazione avviene interamente nel browser: la pagina carica il modulo WebAssembly easi-gen e non invia l’input a un server. Al primo utilizzo il download del modulo può richiedere tempo.

I nomi hanno il prefisso per tipo: StructListing, ResourceNFT, EventSold. I nomi dei campi sono in maiuscolo e il nome Cadence originale viene mantenuto nel tag Godence.

La mappatura dei tipi in pratica: UInt64 in uint64, Int8 in int8, Int in *big.Int, UFix64 in uint64, Fix64 in int64, Indirizzo in string, [T;2] in [2]T, {K:V} in map[K]V.

Con l'impostazione predefinita vengono prodotte solo le dichiarazioni di tipo, senza una riga di pacchetto, e i corpi dei pub fun vengono ignorati. L'unica importazione aggiunta è "math/big", quando un campo Int necessita di *big.Int.

FAQ

Perché ricevo "no top level contract found"?

Il generatore legge solo le dichiarazioni all'interno di un contratto pub, quindi le strutture autonome vengono visualizzate come questo errore. Avvolgili in un blocco di contratto, ad esempio pub contract Esempio { ... }, come nell'esempio predefinito dell'editor.

Come vengono gestiti i tipi facoltativi?

Il marcatore opzionale viene eliminato: String? diventa stringa e una funzione che restituisce Listing? è mappato su StructListing. Controlla tu stesso la presenza di valori mancanti, poiché un risultato pari a zero viene decodificato in un valore zero.

Cosa aggiunge "Generate Interaction Code With Functions"?

Aggiunge linee di pacchetto e importazione, un tipo ContractName con un costruttore che controlla l'indirizzo del contratto e un metodo per funzione pubblica che crea uno script Cadence, esegue ExecuteScriptAtLatestBlock e decodifica il risultato con godence.

Sono supportate le strutture nidificate e gli array multidimensionali?

SÌ. Una struttura dichiarata all'interno di un'altra diventa il proprio tipo Go, [[String]] diventa [][]string e i dizionari nidificati diventano mappe nidificate come map[string]map[string]string.

Specifiche e riferimenti