ERC-20 jeton akıllı sözleşmesini anlamak
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;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österBurada 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;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österERC-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