Ethereum Solidity: Memory vs Storage & كيفية تهيئة صفيف داخل بنية

في Leg Network's Telegram (التي تضم حوالي 8000 عضو!) ، يسأل الأشخاص أسئلة حول مواضيع مختلفة مثل خارطة الطريق الخاصة بـ Loom والأسئلة النظرية للكتل و Ethereum واستكشاف أخطاء Solidity.

كان هناك سؤال محدد تم طرحه ، والذي تضمن تهيئة صفيف داخل بنية. بعد ذلك قدم الشخص الذي طلبها الكود الخاص به ، متسائلاً لماذا لا يعمل. لم أستطع التفكير في إجابة من أعلى رأسي لذلك قررت التحدث عن هذا الموضوع لفترة وجيزة في منشور.

يمكن العثور على الكود غير العامل أدناه. أشجعك على محاولة إيجاد حل لوحدك (كنت تمارس على CryptoZombies طوال هذا الوقت ، أليس كذلك؟).

تابع القراءة للعثور على الجواب.

تجدر الإشارة إلى أنه في الكمان أعلاه ، هناك حاجة إلى ذاكرة الكلمة الأساسية عند إعلان غرفة المتغير. إذا تم التصريح كغرفة غرفة ، فسوف يقوم المحول البرمجي بإرجاع الخطأ التالي:

TypeError: Type struct StructArrayInitWrong.Room الذاكرة غير قابلة للتحويل ضمنيًا إلى type type struct StructArrayInitWrong.Room تخزين مؤشر.

بعض النظرية

متغيرات تخزين العقد هي المتغيرات التي تحدد حالة العقد الخاص بك ويتم تغييرها فقط من خلال مكالمات sendTransaction [1].

متغيرات الذاكرة هي متغيرات مؤقتة موجودة فقط داخل وظيفة الاستدعاء (لا يمكن التصريح عنها خارج واحد). يتم مسحها بعد خروج الوظيفة وهي أرخص استخدامًا بشكل عام من متغيرات التخزين - مزيد من التفاصيل حول تكاليف الغاز هنا.

دعنا نذهب إلى مثال لنفهم كيف يمكن استخدام متغير التخزين في وظيفة من أجل التأثير على حالة العقد.

في الكمان أدناه ، يتم تمرير نسخة من x في g () ، وبالتالي سيبقى متغير الحالة x غير معدل بعد التنفيذ (وهذا هو السبب في أننا نستخدم الكلمة الأساسية الخالصة.

من ناحية أخرى ، يتم الإعلان عن y في h () على أنها تخزين ، مما يعني أن x يتم تمريرها بالرجوع إليها. نتيجة لذلك ، يتم تعديل متغير الحالة x بعد استدعاء h ().

يمكنك اختبار النتيجة عن طريق استدعاء f () ثم فحص قيمة y [2]. على الرغم من أن g () تسمى بعد h () ، إلا أنها لا تعدل قيمة متغير الحالة.

ما يكفي من النظريات ، هيا بنا إلى الإجابة على السؤال الأولي.

نظرًا لأننا غير قادرين على تهيئة مجموعة اللاعبين عند تهيئة الهيكل ، فنحن مضطرون للقيام بذلك في خطوات:

  1. قم بتهيئة هيكل الغرفة للقيم الافتراضية من خلال مجموعة اللاعبين الفارغة - كما هو موضح هنا وفي هذا الكمان.
  2. ادفع الغرفة إلى مجموعة الغرف.
  3. ادفع msg.sender إلى صفيف اللاعبين في الغرفة الأخيرة (يشير room.length-1 دائمًا إلى العنصر الأخير في الصفيف).

رمز العمل كمان أدناه:

الخدعة هنا هي أن العنوان الجديد [] (0) يخصص ذاكرة لمجموعة فارغة من العناوين. بعد التهيئة ، تتم إضافة الغرفة إلى الغرف وهي الآن جزء من متغير التخزين. هذا يتيح لنا العمل على مجموعة اللاعبين ودفع القيم إليها.

ملاحظة: إذا قمنا بعمل جديد [] (8) فسنحصل على مجموعة من 8 أصفار. يمكنك اختباره في هذا الكمان.

هذا كل شيء لهذا اليوم ، نأمل أن نزيل بعض سوء الفهم فيما يتعلق بالتخزين / الذاكرة وكيفية استخدامها في وظائفك. اسمحوا لنا أن نعرف عن أسئلتك على قناة Telegram لدينا ، وإذا كان لا يمكن الإجابة عليها في عدد قليل من الرسائل سنكرس وظيفة على ذلك (أو ربما درس CryptoZombies!)

Loom Network هي منصة blockchain المفضلة لمطوري dapp الخطرين - Universal Layer 2 التي توفر للمطورين الأدوات التي يحتاجونها لإنشاء مخططات dapps وظيفية تواجه المستخدم اليوم.

جديد على المنوال؟ أبدأ هنا.

هل ترغب في مشاركة رموز LOOM الخاصة بك والمساعدة في تأمين شبكة Loom؟ اكتشف كيف.

وإذا كنت قد استمتعت بهذا المقال وترغب في البقاء في الحلقة ، تابع التسجيل في قائمتنا البريدية الخاصة.