استدعاء عقد ذكي من JavaScript
في هذا البرنامج التعليمي، سنرى كيفية استدعاء دالة عقد ذكي من JavaScript. أولاً قراءة حالة العقد الذكي (على سبيل المثال، رصيد حامل ERC-20)، ثم سنقوم بتعديل حالة سلسلة الكتل عن طريق إجراء تحويل رمز مميز. يجب أن تكون على دراية مسبقاً بـ إعداد بيئة JS للتفاعل مع سلسلة الكتل.
في هذا المثال، سنتعامل مع الرمز المميز DAI، ولأغراض الاختبار سنقوم بعمل تفرع لسلسلة الكتل باستخدام ganache-cli وإلغاء قفل عنوان يحتوي بالفعل على الكثير من DAI:
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81
للتفاعل مع عقد ذكي، سنحتاج إلى عنوانه و ABI الخاص به:
const ERC20TransferABI = [
{
constant: false,
inputs: [
{
name: "_to",
type: "address",
},
{
name: "_value",
type: "uint256",
},
],
name: "transfer",
outputs: [
{
name: "",
type: "bool",
},
],
payable: false,
stateMutability: "nonpayable",
type: "function",
},
{
constant: true,
inputs: [
{
name: "_owner",
type: "address",
},
],
name: "balanceOf",
outputs: [
{
name: "balance",
type: "uint256",
},
],
payable: false,
stateMutability: "view",
type: "function",
},
]
const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
في هذا المشروع، قمنا بتجريد ABI الكامل لـ ERC-20 للاحتفاظ فقط بدالتي balanceOf و transfer ولكن يمكنك العثور على ABI الكامل لـ ERC-20 هنا (opens in a new tab).
نحتاج بعد ذلك إلى إنشاء نسخة من العقد الذكي الخاص بنا:
const web3 = new Web3("http://localhost:8545")
const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)
سنقوم أيضاً بإعداد عنوانين:
- العنوان الذي سيتلقى التحويل و
- العنوان الذي قمنا بإلغاء قفله بالفعل والذي سيقوم بإرساله:
const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
في الجزء التالي، سنستدعي الدالة balanceOf لاسترداد الكمية الحالية من الرموز المميزة التي يمتلكها كلا العنوانين.
استدعاء: قراءة قيمة من عقد ذكي
سيستدعي المثال الأول طريقة "ثابتة" وينفذ طريقة العقد الذكي الخاصة بها في EVM دون إرسال أي معاملة. لهذا سنقرأ رصيد ERC-20 لعنوان ما. اقرأ مقالنا حول الرموز المميزة ERC-20.
يمكنك الوصول إلى طرق العقد الذكي المستنسخ التي قدمت ABI الخاص بها على النحو التالي: yourContract.methods.methodname. باستخدام الدالة call ستتلقى نتيجة تنفيذ الدالة.
daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
if (err) {
console.log("An error occurred", err)
return
}
console.log("The balance is: ", res)
})
تذكر أن DAI ERC-20 يحتوي على 18 منزلة عشرية مما يعني أنك بحاجة إلى إزالة 18 صفراً للحصول على الكمية الصحيحة. يتم إرجاع uint256 كسلاسل نصية لأن JavaScript لا تتعامل مع القيم الرقمية الكبيرة. إذا لم تكن متأكداً من كيفية التعامل مع الأرقام الكبيرة في JS، فتحقق من برنامجنا التعليمي حول bignumber.js (opens in a new tab).
إرسال: إرسال معاملة إلى دالة عقد ذكي
في المثال الثاني، سنستدعي دالة التحويل للعقد الذكي لـ DAI لإرسال 10 DAI إلى عنواننا الثاني. تقبل دالة التحويل معاملين: عنوان المستلم وكمية الرمز المميز المراد تحويلها:
daiToken.methods
.transfer(receiverAddress, "100000000000000000000")
.send({ from: senderAddress }, function (err, res) {
if (err) {
console.log("An error occurred", err)
return
}
console.log("Hash of the transaction: " + res)
})
تُرجع دالة الاستدعاء تجزئة المعاملة التي سيتم تعدينها في سلسلة الكتل. على إيثيريوم، يمكن التنبؤ بتجزئات المعاملات - هكذا يمكننا الحصول على تجزئة المعاملة قبل تنفيذها (تعرف على كيفية حساب التجزئات هنا (opens in a new tab)).
نظراً لأن الدالة ترسل المعاملة فقط إلى سلسلة الكتل، لا يمكننا رؤية النتيجة حتى نعرف متى يتم تعدينها وتضمينها في سلسلة الكتل. في البرنامج التعليمي التالي، سنتعلم كيفية انتظار تنفيذ معاملة على سلسلة الكتل من خلال معرفة التجزئة الخاصة بها (opens in a new tab).
آخر تحديث للصفحة: 3 مارس 2026