Ana içeriğe geç

ERC-20 token akıllı sözleşmesini anlamak

akıllı kontratlarjetonlarkatılıkerc-20
Acemi
jdourlens
EthereumDev(opens in a new tab)
5 Nisan 2020
4 dakikalık okuma minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

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;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 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öster
Kopyala

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;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
17
18
19contract ERC20Basic is IERC20 {
20
21 string public constant name = "ERC20Basic";
22 string public constant symbol = "ERC";
23 uint8 public constant decimals = 18;
24
25
26 mapping(address => uint256) balances;
27
28 mapping(address => mapping (address => uint256)) allowed;
29
30 uint256 totalSupply_ = 10 ether;
31
32
33 constructor() {
34 balances[msg.sender] = totalSupply_;
35 }
36
37 function totalSupply() public override view returns (uint256) {
38 return totalSupply_;
39 }
40
41 function balanceOf(address tokenOwner) public override view returns (uint256) {
42 return balances[tokenOwner];
43 }
44
45 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 }
52
53 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 }
58
59 function allowance(address owner, address delegate) public override view returns (uint) {
60 return allowed[owner][delegate];
61 }
62
63 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
64 require(numTokens <= balances[owner]);
65 require(numTokens <= allowed[owner][msg.sender]);
66
67 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öster
Kopyala

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

Bu rehber yararlı oldu mu?