Zum Inhalt springen

Cadence in Go-Code umwandeln — Numio

Erzeugt Go-Structs aus den Structs, Resources und Events eines Flow-Cadence-Contracts mit easi-gen, kompiliert zu WebAssembly. Felder erhalten `godence:"..."`-Tags für den godence-Encoder; optionale Typen wie String? werden zu ihrem einfachen Go-Typ.

Skript-Ergebnisse oder Contract-Events der Flow-Blockchain in einem Go-Backend dekodieren, das flow-go-sdk und godence verwendet.

Cadence types

Go types

Wann sie hilft

  • Skript-Ergebnisse oder Contract-Events der Flow-Blockchain in einem Go-Backend dekodieren, das flow-go-sdk und godence verwendet.
  • Einen typisierten Go-Client mit Abfragefunktionen für die öffentlichen Funktionen eines Contracts erzeugen, statt Skripte von Hand zu schreiben.

Anwendung

  1. Füge einen Cadence-Contract in den Editor Cadence types ein; behalte den pub contract-Block auf oberster Ebene, da Structs außerhalb eines Contracts abgelehnt werden.
  2. Öffne optional Output Settings und aktiviere "Generate Interaction Code With Functions", um zusätzlich Package-Kopf, Imports, einen ContractX-Typ und eine Go-Methode pro pub fun zu erhalten.
  3. Kopiere den Bereich Go types in dein Projekt und ergänze den godence-Import; import "math/big" wird automatisch hinzugefügt, wenn ein Feld *big.Int verwendet.

Cadence-Contract

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

Go-Structs

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

Details und Einschränkungen

Die Erzeugung läuft vollständig in deinem Browser: Die Seite lädt das easi-gen-WebAssembly-Modul, und nichts wird an einen Server gesendet. Der Generator ist ein großes WebAssembly-Bundle (etwa 29 MB), das im Seitenskript eingebettet ist, daher kann das erste Laden langsam sein.

Namen erhalten ein Präfix nach Art: StructListing, ResourceNFT, EventSold. Feldnamen werden großgeschrieben, und der ursprüngliche Cadence-Name bleibt im godence-Tag erhalten.

Typzuordnung in der Praxis: UInt64 zu uint64, Int8 zu int8, Int zu *big.Int, UFix64 zu uint64, Fix64 zu int64, Address zu string, [T;2] zu [2]T, {K:V} zu map[K]V.

Mit der Standardeinstellung werden nur Typdeklarationen ohne package-Zeile erzeugt, und Rümpfe von pub fun werden ignoriert. Der einzige hinzugefügte Import ist "math/big", wenn ein Int-Feld *big.Int braucht.

FAQ

Warum erhalte ich "no top level contract found"?

Der Generator liest nur Deklarationen innerhalb eines pub contract, daher führen eigenständige Structs zu diesem Fehler. Umschließe sie mit einem Contract-Block, zum Beispiel pub contract Example { ... }, wie im Standardbeispiel des Editors.

Wie werden optionale Typen behandelt?

Die Optional-Markierung entfällt: String? wird zu string, und eine Funktion, die Listing? zurückgibt, wird auf StructListing abgebildet. Prüfe fehlende Werte selbst, da ein nil-Ergebnis zu einem Nullwert dekodiert wird.

Was fügt "Generate Interaction Code With Functions" hinzu?

Es ergänzt package- und import-Zeilen, einen ContractName-Typ mit einem Konstruktor, der die Contract-Adresse prüft, und pro öffentlicher Funktion eine Methode, die ein Cadence-Skript baut, ExecuteScriptAtLatestBlock ausführt und das Ergebnis mit godence dekodiert.

Werden verschachtelte Structs und mehrdimensionale Arrays unterstützt?

Ja. Ein in einem anderen deklariertes Struct wird zu einem eigenen Go-Typ, [[String]] wird zu [][]string, und verschachtelte Dictionaries werden zu verschachtelten Maps wie map[string]map[string]string.

Spezifikationen und Referenzen