دروس صلابة

Solidity هي لغة عالية المستوى موجهة للكائنات لتطوير dApps (التطبيقات اللامركزية) ، على Ethereum blockchain.

blockchain هي شبكة من أجهزة كمبيوتر نظير إلى نظير ، تسمى العقد ، والتي تشارك جميع البيانات والرمز في الشبكة.

لذلك ، إذا كنت جهازًا متصلًا بـ blockchain ، فأنت عقدة في الشبكة ، وتتحدث إلى جميع عقد الكمبيوتر الأخرى في الشبكة (سنتحدث عن كيفية إعداد عقدة Ethereum على جهازك المحلي في البرامج التعليمية اللاحقة).

لديك الآن نسخة من جميع البيانات والرمز على blockchain. ليست هناك حاجة للخوادم المركزية بعد الآن.

ما هو Ethereum?

في أبسط صورها ، Ethereum عبارة عن منصة برمجية مفتوحة تعتمد على تقنية blockchain التي تمكن المطورين من بناء ونشر التطبيقات اللامركزية.

بينما يتم استخدام blockchain Bitcoin لتتبع ملكية العملة الرقمية (bitcoins) ، يركز Ethereum blockchain على تشغيل كود التطبيقات اللامركزية.

في سلسلة Ethereum blockchain ، بدلاً من التنقيب عن عملة البيتكوين ، يعمل المعدنون لكسب Ether ، وهو نوع من الرموز المشفرة التي تغذي الشبكة. بالإضافة إلى العملة المشفرة القابلة للتداول ، يستخدم مطورو التطبيقات إيثر أيضًا لدفع رسوم المعاملات والخدمات على شبكة إيثريوم.

هناك نوع ثان من الرموز التي يتم استخدامها لدفع رسوم عمال المناجم لتضمين المعاملات في الكتلة الخاصة بهم ، ويسمى الغاز ، ويتطلب كل تنفيذ ذكي للعقد إرسال كمية معينة من الغاز معه لإغراء المعدنين بوضعه فيه blockchain.

بدءا من الأساسيات

يتم تغليف رمز Solidity في العقود.

يسمح لنا blockchain Ethereum بتنفيذ التعليمات البرمجية باستخدام Ethereum Virtual Machine (EVM) على blockchain بشيء يسمى العقد الذكي.

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

تتم كتابة جهات الاتصال الذكية بلغة برمجة تسمى Solidity ، والتي تبدو كمزيج من Javascript و C..

ريمكس IDE

Remix هي أداة عبر الإنترنت تتيح لك كتابة عقود Solidity الذكية ، ثم نشرها وتشغيلها.

فقط اذهب إلى https://remix.ethereum.org من المستعرض الخاص بك ويمكننا بدء الترميز.

كما ترى ، يمكنك الاختيار بين Solidity و Vyper. كلاهما لغتان لكتابة العقود الذكية ، و Vyper تشبه لغة Python و Solidity تشبه جافا سكريبت.

يمكن لكليهما التحويل البرمجي إلى الرمز الثانوي EVM ، مثل Javascript و Typescript. نحن نختار Solidity.

يوجد على الجانب الأيسر مستكشف الملفات. بشكل افتراضي ، يوجد ملفان .sol ، فقط لتوضيح البنية الأساسية (يعتبر ballot.sol عقدًا ذكيًا ، و ballot_test.sol هو برنامج نصي لاختبار ذلك العقد الذكي).

تحتاج فقط إلى النقر فوق زر الإضافة هذا ويمكننا البدء في كتابة أول عقد ذكي خاص بنا.

يجب أن تبدأ جميع الكود المصدرية الصلبة بـ “نسخة براغما” – إعلان عن إصدار مترجم Solidity الذي يجب أن يستخدمه هذا الكود. هذا لمنع حدوث مشاكل مع إصدارات المترجم المستقبلية التي من المحتمل أن تؤدي إلى تغييرات قد تؤدي إلى كسر التعليمات البرمجية الخاصة بك.

تبدو هكذا:

صلابة براغما ^ 0.4.25 ؛

(لإصدار Solidity أعلى من 0.4.25)

أو

صلابة براغما >= 0.5.0 < 0.6.0 ؛

(لإصدار Solidity بين 0.5.0 و 0.6.0)

ثم تقوم بإنشاء عقدك عن طريق كتابة كلمة محجوزة اتفافية واسم ملف .sol الخاص بك (من المهم أن يتطابق اسم العقد مع اسم الملف ، وسنناقش السبب لاحقًا). في حالتنا هذه,

عقد MyFirstContract {

}

دعونا نجمعها. تحتاج فقط إلى الانتقال إلى علامة تبويب الترجمة على اليسار والنقر على زر الترجمة الكبير. إذا كان هناك خطأ ما في الكود ، فسترى أخطاء وتحذيرات هنا (كن متعاطفًا مع Solidity ، فهي لا تزال “لغة شابة”).

مع عقدنا الحالي ، كل شيء على ما يرام لأننا في الحقيقة لم نفعل أي شيء.

الآن سوف أقوم بإنشاء خطأ عن قصد فقط لأظهر لك شيئًا ما. يمكنك تحديد المترجم يدويًا من تلك القائمة المنسدلة.

دعنا نختار على سبيل المثال الإصدار 0.4.26. الآن ، قم بتجميعها مرة أخرى. الآن سترى خطأ “لم يتم تحميل المترجم بعد”.

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

حسنًا ، لنبدأ الآن!

سنبدأ برمز “Hello world” البسيط ونحصل على الوظائف ونضبطها ، فقط للتعرف بشكل أكبر على البنية.

العقد بمعنى Solidity عبارة عن مجموعة من التعليمات البرمجية (وظائفها) والبيانات (حالتها) الموجودة في عنوان محدد على Ethereum blockchain.

أولاً ، دعنا نحدد متغير الحالة المسمى message على سبيل المثال وسيكون نوعه عبارة عن سلسلة.

ستعيد وظيفة get الخاصة بنا قيمة رسالتنا المتغيرة ، وستقوم وظيفة set بتعيين قيمة جديدة لرسالتنا المتغيرة.

كيفية كتابة الوظائف?

أولا ، كلمة محفوظة وظيفة ثم اسم الوظيفة والمعلمات الخاصة وبعد ذلك .

دالة myFunction () تُرجع (bool) {

العودة صحيح

}

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

فيما يلي قائمة بجميع محددات رؤية الوظيفة:

  • عامة: مرئي خارجيًا وداخليًا (ينشئ دالة getter لمتغيرات التخزين / الحالة)
  • نشر: ظاهر فقط في العقد الحالي
  • خارجي: مرئي خارجيًا فقط (للوظائف فقط) – أي يمكن تسمية الرسالة فقط (عبر this.func)
  • داخلي: مرئي داخليًا فقط

يمكن أن تكون الوظائف نقي, رأي, أو مستحق الدفع. إذا كانت الوظيفة لا تكتب أي بيانات على blockchain ، فمن المستحسن جدًا عرضها ، لأن وظائف العرض لا تكلف أي غاز.

فيما يلي قائمة بجميع مُعدِّلات الوظائف (توجد أيضًا مُعدِّلات لمتغيرات الحالة ، وسيطات الأحداث والأحداث ، ولكنها ستتحدث عنها لاحقًا):

  • نقي: لا يسمح بتعديل أو وصول الدولة.
  • رأي: لا يسمح بتعديل الحالة.
  • مستحق الدفع: يتيح لهم تلقي الأثير مع مكالمة.

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

إذا لم تُرجع الدالة أي قيمة ، فلا داعي لها عائدات بيان.

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

وبسبب ذلك ، فإن الممارسة الشائعة هي كتابة وسيطات دالة مع بناء جملة تسطير أسفل السطر (_رسالة). جاء هذا الاصطلاح من Javascript ، حيث تبدأ المتغيرات والمتغيرات الخاصة بـ _.

للتوضيح ، ستعمل شفرتك بشكل جيد وبدون شُرط سفلية ، لكنها أكثر وضوحًا معها.

ستلاحظ كلمة محجوزة ذاكرة في كودنا. إذا قمت بكتابة الكود الخاص بنا بدون ذاكرة ، وقمت بتعيين pragma على بعض الإصدارات تحت 0.5. * ستعمل بشكل جيد ، ولكن عندما تقوم بتغيير المترجم الخاص بك إلى أعلى من 0.5..

لماذا يحدث هذا?

حسنًا ، يحتوي جهاز Ethereum Virtual Machine على ثلاثة مجالات حيث يمكنه تخزين العناصر.

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

بالنسبة لجميع الأنواع تقريبًا ، لا يمكنك تحديد مكان تخزينها ، لأنه يتم نسخها في كل مرة يتم استخدامها فيها.

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

لذلك ، يبدو الكود الخاص بنا الآن كما يلي:

صلابة براغما ^ 0.5.0 ؛

عقد MyFirstContract {

رسالة سلسلة

وظيفة get () إرجاع العرض العام (ذاكرة سلسلة) {

عودة الرسالة

}

تعيين وظيفة (سلسلة الذاكرة _ الرسالة) العامة {

message = _message ؛

}

}

يرجى ملاحظة أن بعض مطوري Solidity يقسمون محددات الرؤية هذه إلى سطور منفصلة لجعل الكود أكثر وضوحًا. لذلك يمكن كتابة دالة get على النحو التالي:

وظيفة الحصول ()

عامة

رأي

عوائد (سلسلة)

{

عودة الرسالة

}

الأمر متروك لك حقًا في كيفية اختيار كتابة وظائفك.

دعنا نجمع عقدنا الآن ونختبره.

لتجميعها فقط كرر الخطوات من الأسفل (تجميع .sol زر أو cmd / السيطرة + S. من لوحة المفاتيح وسيتم إعادة تجميعها تلقائيًا)

لمعرفة كيفية عملها (إذا لم ينتج عن التجميع أخطاء) ، تحتاج إلى نشر عقدك.

للقيام بذلك ، انتقل إلى علامة تبويب النشر من اليسار ، بالنسبة للبيئة ، حدد JavaScriptVM واضغط على زر النشر.

بعد النشر ، يمكننا الآن رؤية طرق من عقدنا. دعنا نركز فقط على هذا الجزء من الشاشة الآن.

يمكنك أن ترى أن هناك زرين (get & set) لوظائفنا العامة. إذا كان أي من هؤلاء خاصًا ، فلن نراه هنا.

إذا نقرنا على زر الحصول ، فسيقوم EVM بتنفيذ وظيفة get الخاصة بنا.

دعونا نرى كيف سارت الأمور.

لدينا سلسلة فارغة. ليس رائعًا ، ليس سيئًا. لكن لماذا؟ حسنًا ، لأننا لم نقم بتهيئة متغير رسالتنا في المقام الأول.

مجرد وقفة واحدة سريعة. أريدك أن أقدم لكم محطة ريمكس. إنه تحت محرر الكود ويمكنك هنا تتبع جميع معاملاتك ، لمعرفة ما إذا تم تنفيذها بنجاح أم لا ، وتصحيحها ، والاطلاع على التفاصيل (تجزئة المعاملة وما إلى ذلك) والمزيد.

في الوقت الحالي ، لدينا عمليتان ناجحتان. الأول هو نشر العقد وهو يكلفنا الأثير (ولكن لا تقلق ، فنحن في محرر الآن كل شيء افتراضي) والثاني هو Call of our رأي وظيفة.

حسنًا ، لنعد الآن. ماذا سيحدث إذا أطلقنا على وظيفة المجموعة الآن?

نحتاج إلى تمرير وسيطة _message (على سبيل المثال “Hello World”) والضغط على زر المعاملات لتنفيذ الوظيفة. يمكنك تتبع نجاح المعاملة في Terminal.

الآن دعونا استدعاء وظيفة مرة أخرى. الآن ترجع رسالتنا.

دعونا نجري بعض التحسينات على الكود الخاص بنا. لم نبدأ رسالتنا المتغيرة. هيا بنا نقوم بذلك.

عقد MyFirstContract {

رسالة سلسلة = "مرحبا بالعالم!"؛

دالة get () إرجاع العرض العام (ذاكرة سلسلة) {

عودة الرسالة

}

تعيين وظيفة (سلسلة الذاكرة _ الرسالة) العامة {

message = _message ؛

}

}

لاحظ أن الرسالة أصبحت الآن “Hello world!” ، وعندما نستدعي وظيفة get لأول مرة ، لن تُرجع سلسلة فارغة.

لاختبار ذلك ، نحتاج إلى تجميع عقدنا (cmd / ctrl + S).

ثم لنشره مرة أخرى. نحتاج إلى إنشاء نسخة جديدة من العقد (بسبب التغييرات التي أجريناها) ونشرها على blockchain.

ما عليك سوى حذف الإصدار السابق من المحرر (ليس من blockchain الافتراضي الخاص بنا بالطبع) واضغط على زر النشر مرة أخرى. دعونا ندعو وظيفة الحصول لدينا الآن.

لطيف! دعونا وظيفة تعيين المكالمة الآن.

وحصل مرة أخرى.

رائع.

دعونا الآن نجعل رسالتنا أ ثابت.

رمزنا الآن:

صلابة براغما ^ 0.5.0 ؛

عقد MyFirstContract {

رسالة ثابتة السلسلة = "مرحبا بالعالم!"؛

وظيفة get () إرجاع العرض العام (ذاكرة سلسلة) {

عودة الرسالة

}

تعيين وظيفة (سلسلة الذاكرة _ الرسالة) العامة {

message = _message ؛

}

}

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

سوف نتخلص من هذا الثابت الآن.

إن تهيئة متغيرات كهذه ليس خطأً ، لكن من الأفضل بكثير أن نفعل ذلك في المُنشئ. يمكنك كتابة المُنشئ في Solidity باستخدام:

منشئ () عام {

// قم بعمل ما…

}

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

صلابة براغما ^ 0.5.0 ؛

عقد MyFirstContract {

رسالة سلسلة

منشئ () عام {

رسالة = "مرحبا بالعالم!"؛

}

وظيفة get () إرجاع العرض العام (ذاكرة سلسلة) {

عودة الرسالة

}

تعيين وظيفة (سلسلة الذاكرة _ الرسالة) العامة {

message = _message ؛

}

}

يمكنك تجميعها مرة أخرى واختبارها إذا كنت تريد ذلك.

أخيرًا ، يمكن للمرء تغيير رؤية متغيرات الحالة. إذا قمت بعمل متغيرات دولتك عامة هذا يعني أنه يمكن للمرء أن يطالب بقيمه من خارج العقد.

ستجعل Solidity لكل متغير حالة عامة طريقة بنفس الاسم يمكن تسميتها كدالة عادية (مثل دالة getter).

هذا يعني أنه يمكننا التخلص من وظيفة get ، فقط نعلن أن الرسالة المتغيرة هي عامة, وسيعمل الكود الخاص بنا بنفس الطريقة ، وسيكون أكثر نظافة وسيكلفنا أقل لنشره يومًا ما على الشبكة الرئيسية.

كلما زاد حجم الكود ، زادت الحاجة إلى مزيد من الغاز لتنفيذه وتزداد تكلفة تشغيل dApp.

عندما نطور العقود الذكية ، نحتاج إلى أن نكون:

  • فعالة – يجب أن يكون معدل استهلاك الغاز منخفضًا
  • دقيق – بمجرد نشر العقد الذكي ، لا يمكن تغييره ويكون متاحًا للجميع على مدار الساعة طوال أيام الأسبوع ، كل سطر من التعليمات البرمجية (تخيل مخترقًا يجد خطأ ويمكنه استغلال dApp الخاص بك)

يبدو رمزنا النهائي لهذا اليوم كما يلي:

صلابة براغما ^ 0.5.0 ؛

عقد MyFirstContract {

سلسلة الرسائل العامة ؛

منشئ () عام {

رسالة = "مرحبا بالعالم!"؛

}

تعيين وظيفة (سلسلة الذاكرة _ الرسالة) العامة {

message = _message ؛

}

}

دعونا ننشره ونختبره.

يمكنك رؤية زر الرسالة هذا. يتم إنشاؤه لأن رسالتنا المتغيرة لدولتنا علنية.

إذا استدعينا ذلك ، يجب أن يعيد لنا قيمة يتم تهيئتها من خلال المُنشئ (وهي “Hello world!”).

لطيف. دعونا نختبر وظيفة الآن.

كيف تتعلم الصلابة?

Solidity نفسها هي لغة بسيطة جدًا ، ولكن لكي تكون مطورًا جيدًا لـ Solidity ، يحتاج المرء إلى فهم كيفية عمل كل شيء على Ethereum.

  • Solidity هي لغة برمجة عالية المستوى مع بناء جملة مشابه لـ ECMAScript (جافا سكريبت).
  • يتم تجميعه إلى الرمز الثانوي EVM ، وهو شيء لا يمكن فهمه إلا من خلال EVM.
  • المترجم يسمى Solc.

لنأخذ هذا العقد البسيط كمثال:

صلابة براغما ^ 0.5.0 ؛

مثال عقد {

uint أ = 10 + 5 ؛

}

سهل هكذا. الآن دعونا نجمعها. إذا انتقلنا إلى تفاصيل العقد في المحطة ، يمكننا رؤية الكثير من المعلومات.

في هذه الحالة ، الكود المترجم هو:

0x6080604052600f600055348015601457600080fd5b5060358060226000396000f3fe6080604052600080fdfea165627a7a72305820bf75c57b7d8745a79baee513ead21a9eb8b075896f8e4c591c17c

هذه القيم الطويلة هي تمثيل سداسي عشري للعقد النهائي ، والمعروف أيضًا باسم الرمز الثانوي. لا يفهم EVM سوى الرمز الثانوي.

ولكن ، إذا حدث خطأ ما ، فإننا نتعثر مع بعض الأخطاء على سبيل المثال ، لا يمكن للمرء تصحيح رمز بايت.

أكواد التشغيل

اللغة الموجودة أعلاه هي كود التشغيل. Opcode هي لغة برمجة منخفضة المستوى. Solidity و Opcode مثل C ولغة التجميع على سبيل المثال.

لذلك عندما نحتاج إلى تصحيح بعض المعاملات الفاشلة ، نقوم بتصحيح شفرة التشغيل.

شيء واحد يجب أن تعرفه عن Solidity وتصحيح الأخطاء – إنه صعب جدًا. ولكن ليس مستحيلاً ، فلنتعمق في الأمر.

هذا هو كود التشغيل لعقد المثال الخاص بنا:

0 دفعة 1 60

02 دفع 1 40

04 متجر

05 دفع 1 0f

07 PUSH1 00

09 متجر

10 CALLVALUE

11 DUP1

12 ايسيرو

13 دفع 1 14

15 جامبي

16 PUSH1 00

18 DUP1

19 رجوع

20 القفز

21 POP

22 PUSH135

24 DUP1

25 دفعة 1 22

27 PUSH1 00

29 كود كوب

30 دفعة 1 00

32 العودة

33 غير صالح

34 بوش 1 80

36 الدفع 140

38 متجر

39 PUSH1 00

41 DUP1

42 عكس

43 غير صالح

44 LOG1

45 PUSH6 627a7a723058

52 SHA3

53 غير صالح

54 PUSH22 c57b7d8745a79baee513ead21a9eb8b075896f8e4c59

77 غير صالح

78 DUP10

79 و

80 جامبي

81 غير صالح

82 التوازن

83 بوش 29 750029

أكواد التشغيل هي تعليمات البرنامج منخفضة المستوى التي يمكن قراءتها من قبل الإنسان. جميع أكواد التشغيل لها نظائرها السداسية العشرية ، على سبيل المثال MSTORE يكون 0x52.

EVM هي آلة تكديس. يعتمد على هيكل LIFO (Last In First Out). للتبسيط ، تخيل تكديس شرائح الخبز في الميكروويف ، فإن آخر شريحة قمت بإدخالها هي الشريحة الأولى التي تأخذها.

في الحساب العادي ، نكتب معادلتنا بهذه الطريقة:

10 + 2 * 2

والجواب هو 14 لأننا نقوم بالضرب قبل الجمع.

في آلة المكدس ، تعمل وفقًا لمبدأ LIFO:

2 2 * 10 +

هذا يعني وضع 2 في المكدس أولاً ، متبوعًا بـ 2 ، ثم إجراء الضرب. والنتيجة هي 4 الجلوس فوق المكدس. أضف الآن رقم 10 أعلى 4 وأخيرًا أضف الرقمين معًا. تصبح القيمة النهائية للمكدس 14.

يُطلق على عملية وضع البيانات في المكدس تعليمات PUSH ويسمى فعل إزالة البيانات من المكدس تعليمات POP. من الواضح أن كود التشغيل الأكثر شيوعًا الذي نراه في المثال أعلاه هو PUSH1 مما يعني وضع 1 بايت من البيانات في المكدس.

إذن ، هذه التعليمات:

PUSH1 0x60

يعني وضع قيمة 1 بايت من “0x60” في المكدس. من قبيل الصدفة ، أن القيمة السداسية العشرية لـ PUSH1 هي “0x60” أيضًا. بإزالة “0x” غير الإلزامي ، يمكننا كتابة هذا المنطق في الرمز الثانوي كـ “6060”.

دعونا نذهب أبعد قليلا.

PUSH1 0x60 PUSH1 0x40 MSTORE

يأخذ MSTORE (0x52) مدخلين ولا ينتج أي مخرجات. رموز التشغيل أعلاه تعني:

PUSH1 (0x60): ضع 0x60 في المكدس.

PUSH1 (0x40): ضع 0x40 في المكدس.

MSTORE (0x52): تخصيص 0x60 من مساحة الذاكرة والانتقال إلى الموضع 0x40.

الناتج الثانوي هو:

6060604052

في الواقع ، نرى دائمًا هذا الرقم السحري “6060604052” في بداية أي رمز ثانوي للصلابة لأنه كيف يتم تشغيل العقد الذكي.

لزيادة تعقيد الأمر ، لا يمكن تفسير 0x40 أو 0x60 على أنهما الرقم الحقيقي 40 أو 60. نظرًا لأنهما سداسي عشري ، فإن 40 يساوي في الواقع 64 (16 × 4) و 60 يساوي 96 (16 × 6) في النظام العشري.

باختصار ، ما تفعله “PUSH1 0x60 PUSH1 0x40 MSTORE” هو تخصيص 96 بايت من الذاكرة وتحريك المؤشر إلى بداية البايت 64. لدينا الآن 64 بايت لمساحة التسويد و 32 بايت للتخزين المؤقت للذاكرة.

في EVM ، هناك 3 أماكن لتخزين البيانات. أولا ، في المكدس. لقد استخدمنا للتو رمز التشغيل PUSH لتخزين البيانات هناك وفقًا للمثال أعلاه.

ثانيًا في الذاكرة (RAM) حيث نستخدم كود التشغيل MSTORE وأخيرًا في تخزين القرص حيث نستخدم SSTORE لتخزين البيانات. الغاز المطلوب لتخزين البيانات في التخزين هو الأغلى ثمناً وتخزين البيانات للتكديس هو الأرخص.

حان الوقت الآن للعودة إلى كود Solidity الخاص بنا من هذا البرنامج التعليمي ولإيجاز ما تعلمناه عن الكلمة المحجوزة ذاكرة وكيف يجبرنا المترجم على تحديد كيفية تخزين السلاسل ، على سبيل المثال.

لقد قمنا فقط بتغطية أساسيات الرمز الثانوي وعدد قليل من أكواد التشغيل.

لا نحتاج إلى معرفة أكواد التشغيل لبدء كتابة عقد ذكي!

من ناحية أخرى ، لا تزال معالجة أخطاء EVM بدائية للغاية ومن السهل النظر إلى أكواد التشغيل عندما تسوء الأمور.

خاتمة

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

حتى ذلك الوقت &# 128075 ؛

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me