پیاده سازی توکن ERC20 در قرارداد هوشمند Solidity
توکن ERC20 در یک قرارداد هوشمند Solidity به شما امکان می دهد توکن خود را در بلاک چین اتریوم ایجاد کنید. قرارداد ERC-20 استانداردی را برای توکن های قابل تعویض معرفی می کند، به عبارت دیگر، توکن های موجود در این قرارداد دقیقاً (از نظر نوع و ارزش) با توکن های دیگر در همان قرارداد یکسان هستند.
پیشنهاد بهبود اتریوم (EIP) برای توصیف استاندارد توکن ERC20 وجود دارد. سند EIP، خلاصه، روش ها و رویدادهای مورد نیاز برای قرارداد را شرح می دهد.
قراردادهای ERC20 می توانند مقدار یک آیتم را در یک حساب کاربری در بلاک چین ردیابی کنند. میتوان مقدار سهام، اوراق قرضه، پول، کارتهای بیسبال، کلکسیونها، پوستههای بازی، مایلهای خطوط هوایی و غیره را ردیابی کرد. به همین دلیل است که قرارداد هوشمند Solidity توکن ERC20 بسیار جالب است.
کامنت های موجود در کد را بخوانید تا متوجه شوید که قرارداد چه می کند. قرارداد زیر را آزمایش کنید و اصول یک قرارداد ساده ERC20 را بیاموزید. می توان نام توکن، مقدار، نماد و غیره را تغییر داد تا توکن خود را ایجاد کند. قرارداد زیر را با استفاده از Remix در شبکه آزمایشی اتریوم دپلوی کنید.
pragma solidity ^0.6.7;
interface ERC20 {
function totalSupply() external view returns (uint _totalSupply);
function balanceOf(address _owner) external view returns (uint balance);
function transfer(address _to, uint _value) external returns (bool success);
function transferFrom(address _from, address _to, uint _value) external returns (bool success);
function approve(address _spender, uint _value) external returns (bool success);
function allowance(address _owner, address _spender) external view returns (uint remaining);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
// this is the basics of creating an ERC20 token
//change the name loeker to what ever you would like
contract Loeker is ERC20 {
string public constant symbol = "LKR";
string public constant name = "Loeker";
uint8 public constant decimals = 18;
//1,000,000+18 zeros
uint private constant __totalSupply = 1000000000000000000000000;
//this mapping iw where we store the balances of an address
mapping (address => uint) private __balanceOf;
//This is a mapping of a mapping. This is for the approval function to determine how much an address can spend
mapping (address => mapping (address => uint)) private __allowances;
//the creator of the contract has the total supply and no one can create tokens
constructor() public {
__balanceOf[msg.sender] = __totalSupply;
}
//constant value that does not change/ returns the amount of initial tokens to display
function totalSupply() public view override returns (uint _totalSupply) {
_totalSupply = __totalSupply;
}
//returns the balance of a specific address
function balanceOf(address _addr) public view override returns (uint balance) {
return __balanceOf[_addr];
}
//transfer an amount of tokens to another address. The transfer needs to be >0
//does the msg.sender have enough tokens to forfill the transfer
//decrease the balance of the sender and increase the balance of the to address
function transfer(address _to, uint _value) public override returns (bool success) {
if (_value > 0 && _value <= balanceOf(msg.sender)) {
__balanceOf[msg.sender] -= _value;
__balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
return false;
}
//this allows someone else (a 3rd party) to transfer from my wallet to someone elses wallet
//If the 3rd party has an allowance of >0
//and the value to transfer is >0
//and the allowance is >= the value of the transfer
//and it is not a contract
//perform the transfer by increasing the to account and decreasing the from accounts
function transferFrom(address _from, address _to, uint _value) public override returns (bool success) {
if (__allowances[_from][msg.sender] > 0 &&
_value >0 &&
__allowances[_from][msg.sender] >= _value
// the to address is not a contract
&& !isContract(_to)) {
__balanceOf[_from] -= _value;
__balanceOf[_to] += _value;
emit Transfer(_from, _to, _value);
return true;
}
return false;
}
//This check is to determine if we are sending to a contract?
//Is there code at this address? If the code size is greater then 0 then it is a contract.
function isContract(address _addr) public view returns (bool) {
uint codeSize;
//in line assembly code
assembly {
codeSize := extcodesize(_addr)
}
// i=s code size > 0 then true
return codeSize > 0;
}
//allows a spender address to spend a specific amount of value
function approve(address _spender, uint _value) external override returns (bool success) {
__allowances[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
//shows how much a spender has the approval to spend to a specific address
function allowance(address _owner, address _spender) external override view returns (uint remaining) {
return __allowances[_owner][_spender];
}
}
در صورتی که تجربه خاصی در خصوص برنامهنویسی ندارید میتوانید از دورههای رایگان سایت ما “فرازمان“، استفاده کنید. همچنین اگر به دورههای پیشرفتهتری در این خصوص نیاز داشته باشید، ما با آموزش های حرفه ای که در سایتمان قرار دادیم می توانید به سطح دلخواهتان با تلاش و پشتکار برسید.
نقشه راه
راهنما آکادمی فرازمان
برای یادگیری برنامه نویسی بلاکچین…
در این باره بیشتر بخوانید
دیدگاهتان را بنویسید