ERC-20 Token Standardı
Giriş
Token Nedir?
Token'lar Ethereum'da neredeyse her şeyi temsil edebilir:
- çevrimiçi bir platformdaki itibar puanlarını
- bir oyundaki karakterin yeteneklerini
- bir şirketteki hisse gibi finansal varlıkları
- USD gibi bir itibari para birimini
- bir ons altını
- ve daha fazlasını...
Ethereum'un böylesine güçlü bir özelliği sağlam bir standart tarafından ele alınmalıdır, değil mi? İşte tam bu noktada ERC-20 devreye giriyor! Bu standart, geliştiricilerin diğer ürün ve hizmetlerle birlikte çalışabilir Token uygulamaları oluşturmasına olanak tanır. ERC-20 standardı ayrıca 'e ek işlevsellik sağlamak için de kullanılır.
ERC-20 Nedir?
ERC-20, Misli Token'lar (Fungible Tokens) için bir standart sunar; başka bir deyişle, her bir Token'ın (tür ve değer olarak) diğer bir Token ile tamamen aynı olmasını sağlayan bir özelliğe sahiptirler. Örneğin, bir ERC-20 Token'ı tıpkı ETH gibi davranır, yani 1 Token her zaman diğer tüm Token'lara eşit olur ve öyle kalacaktır.
Ön Koşullar
Gövde
Kasım 2015'te Fabian Vogelsteller tarafından önerilen ERC-20 (Ethereum Request for Comments 20), Akıllı Sözleşmeler içindeki Token'lar için bir API uygulayan bir Token Standardıdır.
ERC-20'nin sağladığı örnek işlevler:
- bir hesaptan diğerine Token transfer etmek
- bir hesabın mevcut Token bakiyesini almak
- ağ üzerinde mevcut olan Token'ın toplam arzını almak
- bir hesaptaki belirli bir miktar Token'ın üçüncü taraf bir hesap tarafından harcanıp harcanamayacağını onaylamak
Bir Akıllı Sözleşme aşağıdaki yöntemleri ve olayları uygularsa, bir ERC-20 Token Sözleşmesi olarak adlandırılabilir ve dağıtıldıktan sonra Ethereum üzerinde oluşturulan Token'ları takip etmekten sorumlu olacaktır.
EIP-20 (opens in a new tab)'den:
Yöntemler
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
Olaylar
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
Örnekler
Ethereum üzerindeki herhangi bir ERC-20 Token Sözleşmesini incelememizi kolaylaştırmak için bir Standardın ne kadar önemli olduğunu görelim. Herhangi bir ERC-20 Token'ına bir arayüz oluşturmak için sadece Sözleşme Uygulama İkili Arayüzüne (ABI) ihtiyacımız var. Aşağıda görebileceğiniz gibi, bunu düşük sürtünmeli (basit) bir örnek haline getirmek için basitleştirilmiş bir ABI kullanacağız.
Web3.py Örneği
İlk olarak, Web3.py (opens in a new tab) Python Kütüphanesini yüklediğinizden emin olun:
pip install web3
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Sarılmış Ether (WETH)
acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
# Bu, bir ERC-20 Token Sözleşmesinin basitleştirilmiş bir Sözleşme Uygulama İkili Arayüzüdür (ABI).
# Sadece şu metotları kullanıma sunacaktır: balanceOf(address), decimals(), symbol() ve totalSupply()
simplified_abi = [
{
'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
'name': 'balanceOf',
'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
},
{
'inputs': [],
'name': 'decimals',
'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
},
{
'inputs': [],
'name': 'symbol',
'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
},
{
'inputs': [],
'name': 'totalSupply',
'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
}
]
dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
symbol = dai_contract.functions.symbol().call()
decimals = dai_contract.functions.decimals().call()
totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
# DAI
print("===== %s =====" % symbol)
print("Total Supply:", totalSupply)
print("Addr Balance:", addr_balance)
weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
symbol = weth_contract.functions.symbol().call()
decimals = weth_contract.functions.decimals().call()
totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
# WETH
print("===== %s =====" % symbol)
print("Total Supply:", totalSupply)
print("Addr Balance:", addr_balance)
Bilinen sorunlar
ERC-20 Token alım sorunu
20.06.2024 itibarıyla bu sorun nedeniyle en az 83.656.418 $ değerinde ERC-20 Token'ı kaybedilmiştir. Aşağıda listelendiği gibi standardın üzerine bir dizi ek kısıtlama uygulamadığınız sürece saf bir ERC-20 uygulamasının bu soruna eğilimli olduğunu unutmayın.
ERC-20 Token'ları, ERC-20 Token'larını işlemek üzere tasarlanmamış bir akıllı sözleşmeye gönderildiğinde, bu Token'lar kalıcı olarak kaybolabilir. Bu durum, alıcı sözleşmenin gelen Token'ları tanıma veya bunlara yanıt verme işlevine sahip olmaması ve ERC-20 standardında alıcı sözleşmeyi gelen Token'lar hakkında bilgilendirecek bir mekanizma bulunmaması nedeniyle gerçekleşir. Bu sorunun ortaya çıkmasının ana yolları şunlardır:
- Token transfer mekanizması
- ERC-20 Token'ları transfer veya transferFrom fonksiyonları kullanılarak transfer edilir
- Bir kullanıcı bu fonksiyonları kullanarak bir sözleşme adresine Token gönderdiğinde, alıcı sözleşmenin bunları işlemek üzere tasarlanıp tasarlanmadığına bakılmaksızın Token'lar transfer edilir
- Bildirim eksikliği
- Alıcı sözleşme, kendisine Token gönderildiğine dair bir bildirim veya geri arama (callback) almaz
- Alıcı sözleşme Token'ları işleyecek bir mekanizmadan (örneğin, bir geri dönüş fonksiyonu veya Token alımını yönetecek özel bir fonksiyon) yoksunsa, Token'lar fiilen sözleşmenin adresinde sıkışıp kalır
- Yerleşik işleme olmaması
- ERC-20 standardı, alıcı sözleşmelerin uygulaması gereken zorunlu bir fonksiyon içermez; bu da birçok sözleşmenin gelen Token'ları düzgün bir şekilde yönetememesine yol açar
Olası Çözümler
Bu sorunu ERC-20 ile tamamen önlemek mümkün olmasa da, son kullanıcı için Token kaybı olasılığını önemli ölçüde azaltmaya olanak tanıyan yöntemler vardır:
- En yaygın sorun, bir kullanıcının Token'ları doğrudan Token sözleşmesi adresine göndermesidir (örneğin, USDT Token sözleşmesinin adresine yatırılan USDT). Bu tür transfer girişimlerini geri almak için
transfer(..)fonksiyonunun kısıtlanması önerilir.transfer(..)fonksiyonunun uygulaması içinerequire(_to != address(this));kontrolü eklemeyi düşünün. transfer(..)fonksiyonu genel olarak sözleşmelere Token yatırmak için tasarlanmamıştır. Bunun yerine ERC-20 Token'larını sözleşmelere yatırmak içinapprove(..) & transferFrom(..)modeli kullanılır. Transfer fonksiyonunu, herhangi bir sözleşmeye Token yatırılmasına izin vermeyecek şekilde kısıtlamak mümkündür, ancak bu, Token'larıntransfer(..)fonksiyonu ile sözleşmelere yatırılabileceğini varsayan sözleşmelerle (örneğin, Uniswap Likidite havuzları) uyumluluğu bozabilir.- Sözleşmenizin hiçbir zaman Token almaması gerekse bile, ERC-20 Token'larının sözleşmenize gelebileceğini her zaman varsayın. Alıcı tarafında yanlışlıkla yapılan yatırmaları önlemenin veya reddetmenin bir yolu yoktur. Yanlışlıkla yatırılan ERC-20 Token'larının çıkarılmasına olanak tanıyan bir fonksiyon uygulanması önerilir.
- Alternatif Token standartlarını kullanmayı düşünün.
Bu sorundan dolayı ERC-223 veya ERC-1363 gibi bazı alternatif standartlar ortaya çıkmıştır.
Daha fazla bilgi
- EIP-20: ERC-20 Token Standardı (opens in a new tab)
- OpenZeppelin - Token'lar (opens in a new tab)
- OpenZeppelin - ERC-20 Uygulaması (opens in a new tab)
- Alchemy - Solidity ERC20 Token'ları Rehberi (opens in a new tab)
Diğer misli token standartları
Eğitimler: Ethereum üzerinde ERC-20 ile Geliştirme
- ERC-20 Sözleşmesi İncelemesi – OpenZeppelin ERC-20 sözleşme uygulamasının satır satır açıklamalı bir incelemesi.
- Güvenlik Korkulukları ile ERC-20 – Kullanıcıların yaygın hatalardan kaçınmasına yardımcı olmak için ERC-20 Token'larına nasıl korumalar ekleneceği.
- Ethers.js Kullanarak Token Gönderme – Ethers.js kullanarak ERC-20 Token'larını transfer etmeye yönelik başlangıç dostu bir rehber.
- Dolandırıcı Token'lar tarafından kullanılan bazı hileler ve bunların nasıl tespit edileceği – Dolandırıcı ERC-20 Token modellerine ve bunların nasıl belirleneceğine dair detaylı bir inceleme.
Sayfanın son güncellenme tarihi: 24 Nisan 2026