ERC-20 token akıllı sözleşmesini anlamak
Ethereum'daki en önemli akıllı sözleşme standartlarından ERC-20 olarak bilinir: Bu standart, Ethereum blok zincirinde tüm değiştirilebilir token uygulamalarının akıllı sözleşmeleri için kullanılan teknik standart olarak öne çıkmıştır.
ERC-20 tüm değiştirilebilir Ethereum token'larının uyması gereken ortak bir kural listesi belirler. Bundan dolayı bu token standardı, her türden geliştiriciyi yeni token'ların daha büyük Ethereum sisteminde nasıl çalışacağını isabetli bir şekilde tahmin edebilmeleri için destekler. Bu, token kurallara uyduğu sürece yeni bir token yayınlandığında her yeni projenin yeniden yapılmasına gerek duyulmayacağını bilerek işlerine devam edebilecekleri için geliştiricilerin görevlerini kolaylaştırır ve basitleştirir.
Burada bir ERC-20'nin uygulaması gereken fonksiyonlar bir arayüz şeklinde sunulmaktadır. Bir arayüzün ne olduğundan emin değilseniz: Solidity'de OOP programlama(opens in a new tab) hakkındaki makalemize bakabilirsiniz.
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);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}Tümünü gösterKopyala
Burada her bir fonksiyonun ne işe yaradığının satır satır açıklaması mevcuttur. Bundan sonra bir ERC-20 token'ının basit bir uygulamasını göstereceğiz.
Getters
1function totalSupply() external view returns (uint256);Kopyala
Var olan token miktarını döndürür. Bu fonksiyon bir alıcıdır (getter) ve sözleşmenin durumunu değiştirmez. Solidity'de kesirli sayıların bulunmadığını unutmayın. Bu yüzden birçok token 18 ondalığı benimser, toplam arzı ve diğer sonuçları örnek verecek olursak 1 token için 1000000000000000000 şeklinde döndürür. Her token 18 ondalık kullanmaz ve bu, token'larla uğraşırken dikkate almanız gereken şeylerden biridir.
1function balanceOf(address account) external view returns (uint256);Kopyala
Bir adresin sahip olduğu token miktarını döndürür (account
). Bu fonksiyon bir alıcıdır (getter) ve sözleşmenin durumunu değiştirmez.
1function allowance(address owner, address spender) external view returns (uint256);Kopyala
ERC-20 standartı, bir adresin başka bir adresten token alabilmesi için ödenek vermesine izin verir. Bu alıcı, spender
adresinin owner
adresinin adına harcayabileceği kalan token'ların sayısını döndürür. Bu fonksiyon bir alıcıdır, sözleşmenin durumunu değiştirmez ve varsayılan olarak 0 döndürür.
İşlevler
1function transfer(address recipient, uint256 amount) external returns (bool);Kopyala
amount
miktarında tokeni fonksiyon çağıran adresten (msg.sender
) alıcı adrese aktarır. Bu fonksiyon sonradan belirtilecek olan Transfer
olayını tetikler. Transfer mümkün olmuşsa "true" döndürür.
1function approve(address spender, uint256 amount) external returns (bool);Kopyala
spender
hesabının fonksiyonu çağıran hesabın (msg.sender
) bakiyesinden transfer edebileceği allowance
miktarını belirler. Bu fonksiyon Approval olayını tetikler. Bu fonksiyon, ödeneğin (allowance) başarılı şekilde belirlenip belirlenemediğini döndürür.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);Kopyala
Ödenek mekanizmasını kullanarak amount
miktarında tokeni sender
adresinden recipient
adresine aktarır. miktar bunun sonrasında çağıranın ödeneğinden azaltılır. Bu fonksiyon Transfer
olayını tetikler.
Olaylar
1event Transfer(address indexed from, address indexed to, uint256 value);Kopyala
Bu olay, token miktarı (value) from
adresinden to
adresine gönderilince tetiklenir.
Yeni tokenlerin basılması durumunda transfer normalde from
0x00..0000 şeklinde; buna karşın yakma durumunda ise transfer to
0x00..0000 şeklindedir.
1event Approval(address indexed owner, address indexed spender, uint256 value);Kopyala
Bu olay, token miktarının (value
) spender
tarafından kullanılması için owner
tarafından izin verildiğinde tetiklenir.
Basit bir ERC-20 token uygulaması
Bu, ERC-20 token'ınızı temellendirmek için en basit koddur:
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);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 function transfer(address receiver, uint256 numTokens) public override returns (bool) {46 require(numTokens <= balances[msg.sender]);47 balances[msg.sender] = balances[msg.sender]-numTokens;48 balances[receiver] = balances[receiver]+numTokens;49 emit Transfer(msg.sender, receiver, numTokens);50 return true;51 }5253 function approve(address delegate, uint256 numTokens) public override returns (bool) {54 allowed[msg.sender][delegate] = numTokens;55 emit Approval(msg.sender, delegate, numTokens);56 return true;57 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 balances[owner] = balances[owner]-numTokens;68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;69 balances[buyer] = balances[buyer]+numTokens;70 emit Transfer(owner, buyer, numTokens);71 return true;72 }73}Tümünü gösterKopyala
OpenZeppelin ERC-20 uygulaması(opens in a new tab), ERC-20 token standardının bir diğer mükemmel uygulamasıdır.
Son düzenleme: @nhsz(opens in a new tab), 15 Ağustos 2023