#dusk $DUSK @Dusk كنت أعتقد سابقًا أن بإمكان عقدٍ ما، بعد نشره على البلوكشين، أن يصبح كل ما تبقى هو مجرد استدعاء الدوال عبر التطبيق، لكنني عند متابعة دليل <a>دوسك DuskVM Quickstart</a> الخاص بـ @Dusk اكتشفت تفصيلًا يمكن أن يُنسى بسهولة: نفس مصدر Rust يُنتج ملفّي WASM، أحدهما هو عقدٌ حقيقي يُنفَّذ على السلسلة، والآخر هو محرّك بيانات (Data Driver) يُستخدم من جانب التطبيق للترميز وفك الترميز. هذا ليس مجرد تجميع الملف مرتين؛ فنسخة السلسلة هي التي تحدد كيف تتغير الحالة، ونسخة ما قبل السلسلة هي التي تحدد كيف يحول الواجهة الأمامية عبارة مثل “تغيير الكمية إلى 42” إلى معاملات/معلمات يفهمها البروتوكول، كما أنها هي التي تحدد أيضًا ما إذا كان بإمكان إرجاع النتيجة أن يُعاد تحويله إلى بيانات يمكن للإنسان قراءتها. @Dusk كما أنه يضع المخرجات في مسارات مختلفة ويوفر فحوص verify للتأكد من أن كليهما متطابقان من حيث التحقق مع تجزئة (hash) العقد. والمقصود الحقيقي الذي يحتاجه المطور هو الحفاظ على زوج من الواجهات التي يجب أن تبقى متزامنة. أكثر الحالات إزعاجًا هي عندما تكون العقود قد نُشرت بالفعل وأن المعاملات يمكن تنفيذها، لكن التطبيق يرسل طلبات وهو يحمل محرّك بيانات قديمًا؛ عندها قد يرى المستخدم فشلًا في ترميز المعلمات، أو قد ينجح الاستدعاء لكن تكون الصفحة قد فسّرت النتيجة بشكل خاطئ. وعندما لا يظهر خطأ واضح على السلسلة، يُضطر المطور لإعادة فحص كود المصدر وإصدارات البناء وسجلات النشر من جديد. والوقت الذي تم توفيره في البداية سيتحول لاحقًا إلى تكلفة تحديد المشكلة على عاتق مزود التكامل والمستخدمين معًا. لذلك، عندما أنظر إلى تجربة تطوير DUSK، لن أكتفي بسؤال: “هل يمكن تشغيل عقد Rust؟”. تصميم DuskVM ثنائي المخرجات يجعل الحدود بين تنفيذ السلسلة وفهم التطبيق أكثر وضوحًا، وفي الوقت نفسه يذكّر الفريق بأن “نجاح النشر” لا يعني بالضرورة “اكتمال التكامل”. لاحقًا سأنظر ما إذا كان المشروع يترك معًا سجلات قابلة للتحقق تشمل إصدار محرّك البيانات وتجزيء العقد وخطوات النشر؛ وهذه هي الخطوة الحاسمة كي ينتقل Dusk من حالة “يعمل” إلى حالة “يمكن صيانته”.


