فهم العقد الذكي لرمز ERC-20
أحد أهم معايير العقود الذكية على إيثريوم يُعرف باسم ERC-20، والذي برز كمعيار فني يُستخدم لجميع العقود الذكية على بلوكتشين إيثريوم لتنفيذ الرموز القابلة للاستبدال.
يحدد ERC-20 قائمة مشتركة من القواعد التي يجب أن تلتزم بها جميع رموز إيثريوم القابلة للاستبدال. وبالتالي، فإن معيار الرمز هذا يمكّن المطورين من جميع الأنواع من التنبؤ بدقة بكيفية عمل الرموز الجديدة داخل نظام إيثريوم الأكبر. هذا يبسط ويسهل مهام المطورين، لأنهم يستطيعون المضي قدمًا في عملهم، مع العلم أن كل مشروع جديد لن يحتاج إلى إعادة عمل في كل مرة يتم فيها إصدار رمز جديد، طالما أن الرمز يتبع القواعد.
إليك الوظائف التي يجب أن ينفذها ERC-20، مقدمة كواجهة. إذا لم تكن متأكدًا من ماهية الواجهة: تحقق من مقالتنا حول البرمجة كائنية التوجه في سوليديتي (opens in a new tab).
1pragma solidity ^0.6.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);1213 event Transfer(address indexed from, address indexed to, uint256 value);14 event Approval(address indexed owner, address indexed spender, uint256 value);15}إظهار الكلإليك شرح سطر بسطر لوظيفة كل دالة. بعد هذا، سنقدم تنفيذًا بسيطًا لرمز ERC-20.
دوال الجلب (Getters)
1function totalSupply() external view returns (uint256);تُرجع كمية الرموز الموجودة. هذه الدالة هي دالة جلب (getter) ولا تعدل حالة العقد. ضع في اعتبارك أنه لا توجد أرقام عشرية (floats) في لغة سوليديتي. لذلك، تعتمد معظم الرموز 18 خانة عشرية وستُرجع إجمالي العرض والنتائج الأخرى على النحو التالي: 1000000000000000000 لرمز واحد. لا يحتوي كل رمز على 18 خانة عشرية، وهذا شيء يجب أن تنتبه إليه حقًا عند التعامل مع الرموز.
1function balanceOf(address account) external view returns (uint256);تُرجع كمية الرموز المملوكة لعنوان (account). هذه الدالة هي دالة جلب (getter) ولا تعدل حالة العقد.
1function allowance(address owner, address spender) external view returns (uint256);يسمح معيار ERC-20 للعنوان بإعطاء سماحية (allowance) لعنوان آخر ليتمكن من سحب الرموز منه. تُرجع دالة الجلب هذه العدد المتبقي من الرموز التي سيُسمح لـ spender بإنفاقها نيابةً عن owner. هذه الدالة هي دالة جلب ولا تعدل حالة العقد ويجب أن تُرجع 0 بشكل افتراضي.
الدوال
1function transfer(address recipient, uint256 amount) external returns (bool);تنقل amount من الرموز من عنوان مستدعي الدالة (msg.sender) إلى عنوان المستلم. تُصدر هذه الدالة حدث Transfer المُعرّف لاحقًا. تُرجع القيمة true إذا كان التحويل ممكنًا.
1function approve(address spender, uint256 amount) external returns (bool);تحدد مبلغ allowance (السماحية) الذي يُسمح لـ spender بتحويله من رصيد مستدعي الدالة (msg.sender). تُصدر هذه الدالة حدث الموافقة (Approval). تُرجع الدالة ما إذا كان قد تم تعيين السماحية بنجاح.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);تنقل amount من الرموز من sender إلى recipient باستخدام آلية السماحية. يتم بعد ذلك خصم المبلغ من سماحية المستدعي. تُصدر هذه الدالة حدث Transfer.
الأحداث
1event Transfer(address indexed from, address indexed to, uint256 value);يُصدر هذا الحدث عندما يتم إرسال كمية الرموز (value) من العنوان from إلى العنوان to.
في حالة سك رموز جديدة، يكون التحويل عادةً from (من) العنوان 0x00..0000، بينما في حالة حرق الرموز يكون التحويل to (إلى) 0x00..0000.
1event Approval(address indexed owner, address indexed spender, uint256 value);يُصدر هذا الحدث عندما تتم الموافقة على كمية الرموز (value) من قبل owner ليستخدمها spender.
تنفيذ أساسي لرموز ERC-20
إليك أبسط كود يمكنك أن تبني عليه رمز ERC-20 الخاص بك:
1pragma solidity ^0.8.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);1213 event Transfer(address indexed from, address indexed to, uint256 value);14 event Approval(address indexed owner, address indexed spender, uint256 value);15}1617contract ERC20Basic is IERC20 {1819 string public constant name = "ERC20Basic";20 string public constant symbol = "ERC";21 uint8 public constant decimals = 18;2223 mapping(address => uint256) balances;2425 mapping(address => mapping (address => uint256)) allowed;2627 uint256 totalSupply_ = 10 ether;2829 constructor() {30 balances[msg.sender] = totalSupply_;31 }3233 function totalSupply() public override view returns (uint256) {34 return totalSupply_;35 }3637 function balanceOf(address tokenOwner) public override view returns (uint256) {38 return balances[tokenOwner];39 }4041 function transfer(address receiver, uint256 numTokens) public override returns (bool) {42 require(numTokens <= balances[msg.sender]);43 balances[msg.sender] = balances[msg.sender]-numTokens;44 balances[receiver] = balances[receiver]+numTokens;45 emit Transfer(msg.sender, receiver, numTokens);46 return true;47 }4849 function approve(address delegate, uint256 numTokens) public override returns (bool) {50 allowed[msg.sender][delegate] = numTokens;51 emit Approval(msg.sender, delegate, numTokens);52 return true;53 }5455 function allowance(address owner, address delegate) public override view returns (uint) {56 return allowed[owner][delegate];57 }5859 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {60 require(numTokens <= balances[owner]);61 require(numTokens <= allowed[owner][msg.sender]);6263 balances[owner] = balances[owner]-numTokens;64 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;65 balances[buyer] = balances[buyer]+numTokens;66 emit Transfer(owner, buyer, numTokens);67 return true;68 }69}إظهار الكلتنفيذ ممتاز آخر لمعيار الرمز ERC-20 هو تنفيذ ERC-20 من أوبن زبلين (opens in a new tab).
آخر تحديث للصفحة: 21 أغسطس 2025