Ana içeriğe geç

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

akıllı kontratlar
token'lar
solidity
erc-20
Acemi
jdourlens
5 Nisan 2020
4 dakikalık okuma

Ethereum'daki en önemli akıllı sözleşme standartlarından biri olan ERC-20, Ethereum blokzincirindeki misli jeton uygulamaları için kullanılan teknik standart olarak ortaya çıkmıştır.

ERC-20, tüm misli Ethereum jetonlarının uyması gereken ortak bir kural listesi tanımlar. Sonuç olarak bu jeton standardı, her türden geliştiricinin yeni jetonların daha büyük Ethereum sisteminde nasıl işlev göreceğini doğru bir şekilde tahmin etmesine olanak tanır. Bu durum, geliştiricilerin görevlerini basitleştirir ve kolaylaştırır, çünkü jeton kurallara uyduğu sürece, yeni bir jeton piyasaya sürüldüğünde her yeni projenin yeniden yapılması gerekmeyeceğini bilerek işlerine devam edebilirler.

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 Nesne Yönelimli Programlama (opens in a new tab) hakkındaki makalemize göz atın.

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

Burada her bir fonksiyonun ne işe yaradığının satır satır açıklaması mevcuttur. Bunun ardından ERC-20 jetonunun basit bir uygulamasını sunacağız.

Alıcılar

1function totalSupply() external view returns (uint256);

Mevcut jeton miktarını döndürür. Bu fonksiyon bir alıcıdır (getter) ve sözleşmenin durumunu değiştirmez. Solidity'de ondalıklı sayıların (float) olmadığını unutmayın. Bu nedenle çoğu jeton 18 ondalık basamağı benimser ve toplam arzı ve diğer sonuçları 1 jeton için 1000000000000000000 olarak döndürür. Her jeton 18 ondalık basamağa sahip değildir ve bu, jetonlarla işlem yaparken gerçekten dikkat etmeniz gereken bir şeydir.

1function balanceOf(address account) external view returns (uint256);

Bir adresin (account) sahip olduğu jeton miktarını döndürür. 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);

ERC-20 standardı, bir adresin başka bir adresten jeton alabilmesi için o adrese bir harcama izni (ödenek) vermesine olanak tanır. Bu alıcı, spender'ın owner adına harcamasına izin verilecek kalan jeton 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ürmelidir.

Fonksiyonlar

1function transfer(address recipient, uint256 amount) external returns (bool);

amount miktarda jetonu, fonksiyonu çağıran adresten (msg.sender) alıcı adrese aktarır. Bu fonksiyon, daha sonra tanımlanan Transfer olayını tetikler. Transfer mümkün olduysa true değerini döndürür.

1function approve(address spender, uint256 amount) external returns (bool);

spender'ın, fonksiyonu çağıranın (msg.sender) bakiyesinden transfer etmesine izin verilen harcama izni (allowance) miktarını belirler. Bu fonksiyon Approval olayını tetikler. Fonksiyon, harcama izninin başarıyla ayarlanıp ayarlanmadığını döndürür.

1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

Harcama izni mekanizmasını kullanarak amount miktarındaki jetonu sender adresinden recipient adresine aktarır. amount daha sonra arayanın harcama izninden düşülür. Bu fonksiyon Transfer olayını tetikler.

Olaylar

1event Transfer(address indexed from, address indexed to, uint256 value);

Bu olay, value değerindeki jeton miktarı from adresinden to adresine gönderildiğinde tetiklenir.

Yeni jetonları basma (minting) durumunda, transfer genellikle from 0x00..0000 adresinden yapılırken, jetonları yakma (burning) durumunda transfer to 0x00..0000 adresine yapılır.

1event Approval(address indexed owner, address indexed spender, uint256 value);

Bu olay, value miktarındaki jetonun spender tarafından kullanılması için owner tarafından onaylandığında tetiklenir.

ERC-20 jetonlarının temel bir uygulaması

Aşağıda, ERC-20 jetonunuzu temel alabileceğiniz en basit kod yer almaktadır:

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

ERC-20 jeton standardının bir başka mükemmel uygulaması da OpenZeppelin ERC-20 uygulamasıdır (opens in a new tab).

Sayfanın son güncellenmesi: 21 Ağustos 2025

Bu rehber yararlı oldu mu?