استدعاء init أثناء النشر لا يعني أنه فقد صلاحياته من الآن فصاعدًا. توضح DuskVM Reference بجلاء أن init بعد النشر يظل نقطة دخول مُصدَّرة. هذه التفاصيل تنقل الضمان الخاص بالتهيئة لمرة واحدة من المنصة إلى ضوابط الوصول الخاصة بالعقد نفسه. إذا لم يترك الكود قفلًا للحالة، فزمن النشر ليس سوى مرحلة عابرة، وليس ختمًا دائمًا.

أقسم المسؤولية إلى عمودين. المنصة مسؤولة عن إنشاء الحالة الابتدائية، وعن استدعاء pub fn init أثناء النشر وفقًا للمعاملات.@Dusk العقد نفسه مسؤول عن تسجيل ما إذا كانت التهيئة قد حدثت بالفعل، ورفض التنفيذ المتكرر لاحقًا، وكذلك التحقق من أن caller يملك الصلاحية. العمود الأول يضمن أن الدالة قد استُدعيت، بينما العمود الثاني يضمن من يمكنه استدعاؤها مرة أخرى وكم مرة يمكنه ذلك؛ ولا يجوز لأي منهما أن يوقّع نيابة عن الآخر.

الخطر ليس في اسم init، بل في ما قد يكتبه. عنوان المدير، أو خرائط الأصول، أو معلمات الرسوم، أو عناوين العقود الخارجية؛ إذا سُمِح باستبدالها مرة ثانية، فإن شروط الثقة التي تشكلت عند أول نشر ستُعاد إلى الصفر. لا يمكن استنتاج الثغرة من اسم الدالة وحده؛ فالحقيقة تقول إن إعادة التهيئة لا تصبح سطح هجوم حقيقيًا إلا عندما يفتقر الكود المحدد إلى بتّ حالة أو إلى تحقق من المستدعي.

$DUSK عند مراجعة التهيئة الأولية لعقد ما، أبحث عن ثلاث أدلة. هل توجد علامة initialized في الحالة الدائمة، وهل تفشل الاستدعاءات الثانية بوضوح، وهل يتم التحقق من caller قبل تعديل الحقول المهمة. معاملة النشر لا تستطيع إلا أن تخبرني بأنها نُفذت آنذاك، لكنها لا تجيب عن من يمكنه التنفيذ لاحقًا. وإذا اكتفت المراجعة بلقطة شاشة لإيصال النجاح الأول، فستظل مسألة الصلاحيات مفتوحة جزئيًا.

ويمنحنا هذا الجدول ذو العمودين معيارًا عمليًا للمستخدم العادي أيضًا. عندما تقول الجهة المطوِّرة إن المعلمات قد أُقفلت أثناء النشر، يمكنك أن تسأل: هل تم هذا الإقفال بواسطة الآلة الافتراضية أم بواسطة كود العقد؟ الأول لا يوافق التوثيق، أما الثاني فيجب أن يترك أثرًا يمكن العثور عليه في الشيفرة المصدرية وفي اختبار الاستدعاء المتكرر. إن init هو مدخل النشر، وهو أيضًا مدخل عام بعد النشر. والمرّة الواحدة الحقيقية لا تعتمد على ترتيب الزمن، بل على رفض الحالة وعلى تفويض المستدعي.#dusk