انتقل إلى المحتوى

تحويل Cadence إلى شيفرة Go — Numio

يولّد هياكل Go (structs) من الهياكل والموارد والأحداث في عقد Flow Cadence، باستخدام easi-gen المترجم إلى WebAssembly. تحصل الحقول على وسوم `godence:"..."` لمُرمِّز godence؛ وتصبح الأنواع الاختيارية مثل String? نوع Go العادي المقابل.

فك ترميز نتائج السكربتات أو أحداث العقود من سلسلة كتل Flow في واجهة Go خلفية تستخدم flow-go-sdk وgodence.

Cadence types

Go types

متى تستخدمها

  • فك ترميز نتائج السكربتات أو أحداث العقود من سلسلة كتل Flow في واجهة Go خلفية تستخدم flow-go-sdk وgodence.
  • توليد عميل Go محدد الأنواع مع دوال استعلام للدوال العامة في العقد بدلًا من كتابة السكربتات يدويًا.

طريقة الاستخدام

  1. الصق عقد Cadence في محرر Cadence types؛ أبقِ كتلة pub contract في المستوى الأعلى، لأن الهياكل خارج العقد تُرفض.
  2. اختياريًا، افتح Output Settings وفعّل "Generate Interaction Code With Functions" للحصول أيضًا على ترويسة package والاستيرادات ونوع ContractX ودالة Go لكل pub fun.
  3. انسخ لوحة Go types إلى مشروعك وأضف استيراد godence؛ ويُضاف import "math/big" تلقائيًا عندما يستخدم حقل *big.Int.

عقد 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)
}

هياكل 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"`
}

التفاصيل والقيود

يجري التوليد بالكامل في متصفحك: تحمّل الصفحة وحدة easi-gen بصيغة WebAssembly ولا يُرسَل أي شيء إلى خادم. المولّد حزمة WebAssembly كبيرة (نحو 29 MB) مضمّنة في سكربت الصفحة، لذا قد يكون التحميل الأول بطيئًا.

تُسبق الأسماء ببادئة حسب النوع: StructListing وResourceNFT وEventSold. تُكتب أسماء الحقول بحرف أول كبير، ويُحفظ اسم Cadence الأصلي في وسم godence.

تعيين الأنواع عمليًا: UInt64 إلى uint64، وInt8 إلى int8، وInt إلى *big.Int، وUFix64 إلى uint64، وFix64 إلى int64، وAddress إلى string، و[T;2] إلى [2]T، و{K:V} إلى map[K]V.

مع الإعداد الافتراضي لا تُنتَج إلا تصريحات الأنواع دون سطر package، وتُتجاهل أجسام pub fun. والاستيراد الوحيد المضاف هو "math/big" عندما يحتاج حقل Int إلى *big.Int.

FAQ

لماذا يظهر لي "no top level contract found"؟

يقرأ المولّد التصريحات الموجودة داخل pub contract فقط، لذا تظهر هذه الرسالة للهياكل المستقلة. ضعها داخل كتلة عقد، مثل pub contract Example { ... }، كما في المثال الافتراضي في المحرر.

كيف تُعالَج الأنواع الاختيارية؟

تُحذف علامة الاختيارية: يصبح String? هو string، وتُعيَّن الدالة التي تُرجع Listing? إلى StructListing. تحقق من القيم المفقودة بنفسك، لأن النتيجة nil تُفك إلى قيمة صفرية.

ماذا يضيف "Generate Interaction Code With Functions"؟

يضيف سطري package وimport، ونوع ContractName مع مُنشئ يتحقق من عنوان العقد، ودالة لكل دالة عامة تبني سكربت Cadence وتشغّل ExecuteScriptAtLatestBlock وتفك ترميز النتيجة باستخدام godence.

هل الهياكل المتداخلة والمصفوفات متعددة الأبعاد مدعومة؟

نعم. يصبح الهيكل المُعرَّف داخل هيكل آخر نوع Go مستقلًا، ويصبح [[String]] هو [][]string، وتصبح القواميس المتداخلة خرائط متداخلة مثل map[string]map[string]string.

المواصفات والمراجع