التفاعل مع العقود الذكية
لا تحتاج دائمًا إلى كتابة ونشر عقدك الذكي الخاص. في معظم الأحيان كمطور، ستحتاج إلى التفاعل مع العقود الذكية التي نشرها آخرون بالفعل على شبكة إيثيريوم.
تغطي هذه الصفحة الطريقتين الأساسيتين للتفاعل مع العقد الذكي — قراءة البيانات وكتابة البيانات — والأدوات التي تحتاجها للقيام بكليهما.
المتطلبات الأساسية
يجب أن تفهم:
طريقتان للتفاعل مع العقد الذكي
ينقسم التفاعل مع العقد الذكي إلى فئتين:
القراءة من العقد
القراءة هي عملية مجانية لا تنشئ معاملة ولا تغير أي حالة على سلسلة الكتل.
عندما تقرأ من عقد، فأنت ببساطة تستعلم عن بيانات موجودة بالفعل. على سبيل المثال:
- التحقق من رصيد رمز مميز من نوع ERC-20
- قراءة السعر الحالي من منصة تداول لامركزية
- الحصول على مالك رمز غير قابل للاستبدال (NFT)
نظرًا لأن عمليات القراءة لا تعدل الحالة، فإنها لا تكلف غاز ويمكن لأي شخص إجراؤها دون الحاجة إلى ETH.
الكتابة إلى العقد
الكتابة هي عملية تغيير للحالة تتطلب معاملة وتكلف غاز.
عندما تكتب إلى عقد، فأنت تقوم بتشغيل دالة تعدل حالة سلسلة الكتل. على سبيل المثال:
- تحويل الرموز المميزة
- مبادلة الرموز المميزة على منصة تداول لامركزية
- عملية سك رمز غير قابل للاستبدال (NFT)
تتطلب الكتابة دائمًا:
- حساب مملوك خارجيًا (EOA) يحتوي على ما يكفي من ETH للغاز
- معاملة موقعة بواسطة مفتاح خاص للحساب
- أن يتم تعدين المعاملة وتضمينها في كتلة
مع تجريد الحساب، يمكن لحساب العقد الذكي أيضًا بدء عمليات الكتابة، ويمكن لمدير الدفع تغطية الغاز نيابة عن المستخدم — لذلك لا يُشترط بالضرورة وجود حساب مملوك خارجيًا (EOA) يحتفظ بـ ETH.
فهم واجهات التطبيق الثنائية (ABIs) للعقود
للتفاعل مع عقد ذكي، يحتاج تطبيقك إلى معرفة ما يمكن للعقد القيام به. وهنا يأتي دور واجهة التطبيق الثنائية (ABI).
واجهة التطبيق الثنائية (ABI) هي مستند JSON يصف:
- كل دالة يعرضها العقد (الاسم، المدخلات، المخرجات)
- كل حدث يمكن للعقد إصداره
- كيفية تشفير وفك تشفير البيانات عند التحدث إلى العقد
فكر في واجهة التطبيق الثنائية (ABI) كدليل تعليمات العقد — بدونها، لا يعرف تطبيقك الدوال الموجودة أو المعلمات التي تتوقعها.
أين تجد واجهة التطبيق الثنائية (ABI) للعقد
- العقود الموثقة على Etherscan - يعرض Etherscan (يفتح في علامة تبويب جديدة) تلقائيًا واجهة التطبيق الثنائية (ABI) للكود المصدري الموثق
- من المطور - تنشر العديد من المشاريع واجهات التطبيق الثنائية (ABIs) الخاصة بها في وثائقها أو حزم npm
- الإنشاء من المصدر - إذا كان لديك الكود المصدري بلغة Solidity، فيمكنك تصريفه لإنتاج واجهة التطبيق الثنائية (ABI)
أدوات ومكتبات للتفاعل مع العقود
يستخدم المطورون عادةً مكتبة JavaScript/TypeScript للتفاعل مع العقود من تطبيق ويب أو واجهة خلفية أو برنامج نصي.
مكتبات العميل (JavaScript/TypeScript)
- Viem (يفتح في علامة تبويب جديدة) - واجهة TypeScript حديثة وخفيفة الوزن لإيثيريوم مع أمان كتابة من الدرجة الأولى
- ethers.js (يفتح في علامة تبويب جديدة) - مكتبة مجربة ومختبرة للتفاعل مع سلسلة الكتل لإيثيريوم
- web3.js (يفتح في علامة تبويب جديدة) - واجهة برمجة تطبيقات (API) الأصلية لإيثيريوم بلغة JavaScript
مكتبات الواجهة الخلفية
- ethers.js (يفتح في علامة تبويب جديدة) - تعمل أيضًا في Node.js للبرامج النصية والروبوتات من جانب الخادم
- web3.py (يفتح في علامة تبويب جديدة) - مكتبة Python للتفاعل مع إيثيريوم
- go-ethereum (يفتح في علامة تبويب جديدة) - مكتبة Go الرسمية من فريق جو إيثريوم (geth)
مثال: قراءة رصيد رمز مميز باستخدام Viem
import { createPublicClient, http, formatUnits } from 'viem'
import { mainnet } from 'viem/chains'
// عنوان عقد USDC و ABI (جزئي، من أجل balanceOf)
const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
const abi = [{
name: 'balanceOf',
type: 'function',
stateMutability: 'view',
inputs: [{ name: 'account', type: 'address' }],
outputs: [{ name: '', type: 'uint256' }],
}] as const
const client = createPublicClient({ chain: mainnet, transport: http() })
const balance = await client.readContract({
address: USDC,
abi,
functionName: 'balanceOf',
args: ['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'], // vitalik.eth
})
console.log(formatUnits(balance, 6)) // يحتوي USDC على 6 منازل عشرية
مثال: إرسال معاملة باستخدام Ethers.js
const { ethers } = require('ethers')
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL)
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider)
// ABI لتحويل ERC-20
const abi = ['function transfer(address to, uint256 amount) returns (bool)']
const contract = new ethers.Contract(tokenAddress, abi, wallet)
const tx = await contract.transfer(recipient, ethers.parseUnits('10', 18))
await tx.wait() // انتظر حتى يتم تعدين المعاملة
console.log(`Transferred! TX: ${tx.hash}`)
الأحداث والسجلات
يمكن للعقود الذكية إصدار أحداث للإشارة إلى حدوث شيء ما. يمكن لتطبيقك الاستماع إلى هذه الأحداث للتفاعل في الوقت الفعلي.
import { createPublicClient, http, parseAbiItem } from 'viem'
import { mainnet } from 'viem/chains'
const client = createPublicClient({ chain: mainnet, transport: http() })
// مراقبة أحداث تحويل USDC
const unwatch = client.watchEvent({
event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'),
onLogs: (logs) => console.log(logs),
})
محاكاة المعاملات
قبل إرسال معاملة، يمكنك محاكاتها للتحقق مما إذا كانت ستنجح — ولرؤية القيمة المرجعة الخاصة بها — دون إنفاق غاز. هذا مفيد لاكتشاف الأخطاء مبكرًا ولمعاينة النتائج.
تدعم معظم مكتبات العميل ذلك من خلال eth_call:
// باستخدام Viem
const result = await client.simulateContract({
address: contractAddress,
abi,
functionName: 'swap',
args: [amountIn],
account: userAddress,
})
المحافظ والتوقيع
في تطبيق لامركزي (dapp)، تتولى محفظة المستخدم (مثل ميتاماسك أو Rainbow أو WalletConnect) عملية التوقيع. أنت لا تدير مفاتيح خاصة بشكل مباشر.
تقوم مكتبات المحافظ وأدوات الاتصال بتجريد ذلك حتى تتمكن من التركيز على بناء منطق تطبيقك.
برامج تعليمية ذات صلة
- استدعاء عقد ذكي من JavaScript
- إرسال المعاملات باستخدام Web3.js وAlchemy
- كيفية عرض الرمز غير القابل للاستبدال (NFT) الخاص بك في محفظتك
قراءة إضافية
- وثائق Viem: القراءة والكتابة إلى العقود (يفتح في علامة تبويب جديدة)
- وثائق Ethers.js: العقود (يفتح في علامة تبويب جديدة)
- مواصفات واجهة التطبيق الثنائية (ABI) للغة Solidity (يفتح في علامة تبويب جديدة)
- ما هي واجهة التطبيق الثنائية (ABI)؟ - Alchemy (يفتح في علامة تبويب جديدة)