
الغرض من تطوير البرنامج هو جعلها تعمل على النحو المطلوب.
حيث انة يجب تكرار اختبارات متعددة لتحقيق ذلك، والوقت بين هذه الإختبارات له أهمية بالغة عند محاولة إكمال المهمة المطروحة في أسرع وقت ممكن.
في Origin، نستخدم اختبارات Unit وFork من أجل التطوير. يمكن أن يكون إجراء اختبارات Fork بطيئ للغاية، لكننا تمكنا من تقليل وقت تنفيذ اختبارات Frok (في بعض الحالات). من خلال هذه المقالة سأشرح كيف يمكنك تحسين سرعة اختبارات Fork، حتى تتمكن من إجراء التعليمات البرمجية الخاصة بك على النحو المطلوب في أي وقت من الأوقات.
في العادة يعتمد ما إذا كنت تستخدم اختبار Fork أو اختبار Unit على بنية البروتوكول الذي يتم تطويره. تستخدم بعض الفرق اختبارات Unit فقط وبعض اختبارات Unit وFork. في Origin، تتفاعل عقودنا مع العديد من بروتوكولات الطرف الثالث (Curve، وUniswap، وBalancer، وConvex...) ويمكن أن تؤدي الأخطاء في التكامل إلى خسارة فادحة للأموال.
باستخدام اختبارات Unit، نسخر واجهة برمجة التطبيقات (API) لبروتوكول الطرف الثالث ونختبر مدى تكامل عقودنا برمجياً بشكل صحيح. ولكن إختبارات Fork مهمة لاختبار سلوك بروتوكول الطرف الثالث مع كل التعقيدات والحالات المختلفة (المشروعة أو المتلاعب بها) التي يمكن أن يكون البروتوكول فيها. وبالنسبة لبعض المهندسين في فريقنا، يعد التطوير القائم على الاختبار باستخدام اختبارات Fork هو وضع التطوير الأساسي. يعد تقليل وقت "تعديل الكود" إلى "تنفيذ الاختبار" أمراً ضرورياً.
في Origin، نستخدم إجراءات حازمة لـSolidity development stack الخاص بنا. من المهم أن نفهم الخطوات المختلفة التي يتكون منها إجراء اختبار Fork من أجل تقليل وقت دورة التطوير. من أجل التبسيط، سنقوم بإجراء اختبار Fork واحد فقط في كل مرة - وهو عادة ما يكون النهج عند العمل على عقد ذكي.
الطريقة الأبطأ هي إجراء اختبارات Fork باستخدام Node Fork من أحدث كتلة. بهذه الطريقة، في كل مرة يتم إجراء الاختبارات، يتم اختيار رقم كتلة مختلف، ولا تتمكن Hardhat من القيام بأي تخزين مؤقت من خلال قراءة storage slots من مزود الشبكة الرئيسية. وينعكس هذا في سرعة التنفيذ البطيئة البالغة 101 ثانية.

يرسل اختبار Fork هذه الأموال إلى إحدى إستراتيجيات تعدين السيولة لدينا والتي توظف الأصول في مجمع Balancer. يؤدي ذلك إلى قدر كبير من قراءات storage slots وهو السبب الرئيسي لجزء الاختبار البطيء من التنفيذ (الجزء البرتقالي من الشريط أعلاه).
تتمثل الفكرة البسيطة في تثبيت ارتفاع الكتلة هي تمكن Hardhat من توفير قدر كبير من الوقت من خلال استخدام ذاكرة تخزين مؤقت محلية لقراءات storage slots. لا يتأثر وقت التجميع بهذا التحسين، ولكن جميع الخطوات الأخرى تتأثر بذلك. تقليل وقت الدورة بشكل كبير إلى 27 ثانية (ينطبق هذا على جميع عمليات التشغيل غير الأولى للاختبار، حيث تكون ذاكرة التخزين المؤقت للـHardhat جاهزة بالفعل).

يعمل النهج المذكور أعلاه على تحسين الوضع بشكل كبير، لكنه لا يزال بعيداً عن سرعة اختبارات Unit ويمكن أن يبدو بطيئاً بشكل محبط في بعض الأحيان. لقد قمنا بتغيير عقد واحد فقط. لماذا نحتاج إلى إعادة تشغيل نفس عمليات النشر وما بعد النشر عندما يكون رمز البايت لعقد Solidity واحد (أو أكثر) بحاجة إلى التغيير؟ نظراً لذلك، فإننا بالطبع لا نغير تخطيط storage slots أو الحالة بين المجموعات.
ينشر Hot-deploy العقد الذي يتم تعديله ويجلب رمز البايت الخاص به. وباستخدام لقطات مجموعة اختبار Hardhat، فإنه يعثر على الإصدار السابق من هذا العقد في حالة قبل إجراء الاختبارات ويستبدل رمز البايت الخاص به بالرمز المجمع حديثًا. علاوة على ذلك، فإنه يقوم بتشغيل تركيبات الاختبار والاختبار نفسه، متخطيًا جميع خطوات النشر (ما بعد).

تم الآن تقليل وقت الدورة إلى 7 ثوانٍ فقط. لقد ساعد هذا التغيير في دورة تطوير Origin Protocol على تحسين الإنتاجية والسرعة التي يمكننا من خلالها تطوير الميزات بشكل كبير.
لسوء الحظ، لا يمكن تشغيل النشر السريع بسهولة (على الأقل حتى الآن) ويتطلب ذلك بعض التكوين. الطريقة التي طبقنا بها الحل في Origin هي كما يلي:
أحد المتطلبات المهمة هو أن تعمل عقدة Hardhat المستقلة بشكل منفصل عن بيئة اختبار Fork. قد لا يكون الأمر واضحًا على الفور، ولكن تشغيل اختبار Fork سيؤدي إلى إنشاء وقت تشغيل آخر للعقدة واستخدام العقدة الأخرى قيد التشغيل. ستقوم العقدة المستقلة بتشغيل جميع عمليات النشر (اللاحقة)، وستقوم عقدة اختبار Fork بتجميع التغييرات، وتشغيل تركيبات الاختبار لاستبدال أي كود بايت للعقد مطلوب، وأخيراً تشغيل الاختبار.
من الجيد أن تضع في اعتبارك التغييرات التي تم إجراؤها على ملفات النشر و node storage slots وإعداد حالتها. يجب أن تفكر في أن تركيبات الاختبار قيد التشغيل تتطلب إعادة تشغيل العقدة المستقلة.
في بعض الأحيان قد نميل إلى استخدام اختبارات Fork لأجزاء من النظام الأساسي التي تتكامل مع بروتوكولات الطرف الثالث فقط حتى نتمكن من التطوير بشكل أسرع... على حساب الأمان الإضافي الذي يمكن أن يوفره اختبار Fork. بالنسبة للمطورين في Origin، تعد عمليات hot deploy خطوة مهمة لسد الفجوة الزمنية للدورة. أتمنى أن يحاول الآخرون ذلك، وأتمنى أن تستفيد من هذا النهج لتقليل أوقات دورة التطوير الخاصة بك.
