استدعاء عقد ذكي من جافا سكريبت
في هذا البرنامج التعليمي، سنرى كيفية استدعاء دالة عقد ذكي من جافا سكريبت. أولاً، قراءة حالة العقد الذكي (على سبيل المثال، رصيد حامل ERC20)، ثم سنقوم بتعديل حالة البلوكتشين عن طريق إجراء تحويل للرمز المميز. يجب أن تكون على دراية مسبقًا بـ إعداد بيئة JS للتفاعل مع البلوكتشين.
في هذا المثال سنتعامل مع رمز DAI، بغرض الاختبار، سنقوم بعمل انقسام للبلوكتشين باستخدام ganache-cli وسنفتح عنوانًا يحتوي بالفعل على الكثير من DAI:
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81للتفاعل مع عقد ذكي، سنحتاج إلى عنوانه وواجهة التطبيق الثنائية (ABI):
1const ERC20TransferABI = [2 {3 constant: false,4 inputs: [5 {6 name: "_to",7 type: "address",8 },9 {10 name: "_value",11 type: "uint256",12 },13 ],14 name: "transfer",15 outputs: [16 {17 name: "",18 type: "bool",19 },20 ],21 payable: false,22 stateMutability: "nonpayable",23 type: "function",24 },25 {26 constant: true,27 inputs: [28 {29 name: "_owner",30 type: "address",31 },32 ],33 name: "balanceOf",34 outputs: [35 {36 name: "balance",37 type: "uint256",38 },39 ],40 payable: false,41 stateMutability: "view",42 type: "function",43 },44]45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"لهذا المشروع، قمنا بتجريد واجهة التطبيق الثنائية (ABI) الكاملة لـ ERC20 للإبقاء فقط على دالتي balanceOf وtransfer، ولكن يمكنك العثور على واجهة التطبيق الثنائية (ABI) الكاملة لـ ERC20 هنا (opens in a new tab).
بعد ذلك، نحتاج إلى إنشاء مثيل لعقدنا الذكي:
1const web3 = new Web3("http://localhost:8545")2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)سنقوم أيضًا بإعداد عنوانين:
- العنوان الذي سيتلقى التحويل و
- والعنوان الذي فتحناه مسبقًا الذي سيرسلها:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"في الجزء التالي، سنستدعي دالة balanceOf لاسترداد الكمية الحالية من الرموز التي يحتفظ بها كلا العنوانين.
الاستدعاء: قراءة قيمة من عقد ذكي
سيستدعي المثال الأول طريقة "ثابتة" وينفذ طريقة العقد الذكي الخاصة به في آلة إيثريوم الافتراضية (EVM) دون إرسال أي معاملة. لهذا، سنقرأ رصيد ERC20 الخاص بأحد العناوين. اقرأ مقالنا حول رموز ERC20.
يمكنك الوصول إلى طرق العقد الذكي الذي تم إنشاء مثيل له والذي قدمت له واجهة التطبيق الثنائية (ABI) على النحو التالي: yourContract.methods.methodname. باستخدام دالة call، ستتلقى نتيجة تنفيذ الدالة.
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("حدث خطأ", err)4 return5 }6 console.log("الرصيد هو: ", res)7})تذكر أن DAI ERC20 له 18 منزلة عشرية، مما يعني أنك بحاجة إلى إزالة 18 صفرًا للحصول على المبلغ الصحيح. يتم إرجاع uint256 كسلاسل نصية لأن جافا سكريبت لا يتعامل مع القيم الرقمية الكبيرة. إذا لم تكن متأكدًا من كيفية التعامل مع الأعداد الكبيرة في JS، فاطلع على برنامجنا التعليمي حول bignumber.js (opens in a new tab).
الإرسال: إرسال معاملة إلى دالة عقد ذكي
في المثال الثاني، سنستدعي دالة التحويل الخاصة بعقد DAI الذكي لإرسال 10 DAI إلى عنواننا الثاني. تقبل دالة التحويل معاملين: عنوان المستلم وكمية الرموز المراد تحويلها:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("حدث خطأ", err)6 return7 }8 console.log("تجزئة (هاش) المعاملة: " + res)9 })يُرجع هذا الاستدعاء التجزئة (الهاش) للمعاملة التي سيتم تعدينها في البلوكتشين. في إيثريوم، يمكن التنبؤ بتجزئات (هاشات) المعاملات - وهكذا يمكننا الحصول على التجزئة (الهاش) للمعاملة قبل تنفيذها (تعرف على كيفية حساب التجزئات هنا (opens in a new tab)).
بما أن الدالة تقوم فقط بإرسال المعاملة إلى البلوكتشين، لا يمكننا رؤية النتيجة حتى نعرف متى يتم تعدينها وتضمينها في البلوكتشين. في البرنامج التعليمي التالي، سنتعلم كيفية انتظار تنفيذ معاملة على البلوكتشين من خلال معرفة التجزئة (الهاش) الخاصة بها (opens in a new tab).
آخر تحديث للصفحة: 3 مارس 2026