لقد قمت مؤخرا بإعادة تعلم الصلابة ، ودمج التفاصيل ، وكتابة “Solidity Minimalist Primer” للمبتدئين لاستخدامها (يمكن لرجال البرمجة العثور على برنامج تعليمي آخر) ، يتم تحديثه 1-3 مرات في الأسبوع.
جميع التعليمات البرمجية والبرامج التعليمية مفتوحة المصدر في github: github.com / AmazingAng / WTFSolidity
يكتب المطورون عقودا ذكية لاستدعاء عقود أخرى ، مما يسمح بإعادة استخدام البرامج الموجودة على شبكة Ethereum ، وبالتالي بناء نظام بيئي مزدهر. تعتمد العديد من مشاريع web3 على استدعاء عقود أخرى ، مثل زراعة الغلة. في هذا الحديث ، سنوضح لك كيفية استدعاء وظيفة العقد المستهدف عندما يكون رمز العقد (أو الواجهة) والعنوان معروفين.
لنبدأ بكتابة عقد بسيط ، OtherContract ، لتسميته.
يحتوي هذا العقد على متغير حالة x وسجل أحداث يتم تشغيله عند تلقي ETH وثلاث وظائف:
getBalance(): إرجاع رصيد ETH للعقد.
setX (): وظيفة خارجية مستحقة الدفع ، والتي يمكنها تعيين قيمة x وإرسال ETH إلى العقد.
getX (): يقرأ قيمة x.
يمكننا إنشاء مرجع للعقد باستخدام عنوان العقد ورمز العقد (أو الواجهة): _Name(_Address) ، حيث _Name هو اسم العقد و _Address هو عنوان العقد. ثم قم باستدعاء وظيفتها بالإشارة إلى العقد: _Name(_Address).f() ، حيث f () هي الوظيفة التي سيتم استدعاؤها.
فيما يلي 4 أمثلة على استدعاء العقود:
يمكننا تمرير عنوان العقد الهدف إلى الوظيفة ، وإنشاء مرجع إلى العقد الهدف ، ثم استدعاء الوظيفة الهدف. على سبيل المثال ، نكتب دالة callSetX في العقد الجديد ، ونمرر عنوان عقد OtherContract المنشور _Address ومعلمة setX x:
يمكننا تمرير مرجع العقد مباشرة في الوظيفة ، ونحتاج فقط إلى تغيير نوع عنوان المعلمة أعلاه إلى اسم العقد الهدف ، وهو أفضل من OtherContract. ينفذ المثال التالي الدالة getX() التي تستدعي العقد الهدف.
يمكننا إنشاء متغير عقد ثم استخدامه لاستدعاء دالة الهدف. في المثال التالي، نقوم بتخزين مرجع إلى عقد OtherContract للمتغير oc:
إذا كانت وظيفة العقد المستهدف مستحقة الدفع ، فيمكننا تحويل الأموال إلى العقد عن طريق الاتصال به: _Name(_Address).f {value: _Value}() ، حيث _Name هو اسم العقد ، _Address هو عنوان العقد ، f هو اسم وظيفة الهدف ، و _Value هو مبلغ ETH المراد نقله (في wei).
وظيفة setX لعقد OtherContract مستحقة الدفع ، وفي المثال التالي ، نقوم بتحويل الأموال من وإلى العقد المستهدف عن طريق استدعاء setX.
بعد النقل ، يمكننا ملاحظة تغيير رصيد ETH للعقد المستهدف من خلال حدث السجل ووظيفة getBalance().
في هذا الحديث ، سنوضح لك كيفية إنشاء مرجع للعقد من خلال رمز العقد المستهدف (أو الواجهة) والعنوان ، وذلك لاستدعاء وظائف العقد المستهدف.