ERC-20 Token Standardı
Sayfanın son güncellenmesi: 26 Şubat 2026
Giriş
Token nedir?
Token'lar Ethereum'daki hemen hemen her şeyi temsil edebilir:
- çevrimiçi bir platformdaki itibar puanları
- bir oyundaki karakterin becerileri
- şirket hissesi gibi finansal varlıklar
- ABD Doları gibi itibari para birimi
- ons altın
- ve dahası...
Ethereum'un bu kadar güçlü bir özelliği güçlü bir standart tarafından idare edilmeli, değil mi? ERC-20 tam da bu noktada devreye giriyor! Bu standart, geliştiricilerin diğer ürün ve servislerle uyumlu token uygulamaları inşa etmesini sağlar. ERC-20 standardı, 'a ek işlevsellik kazandırmak için de kullanılır.
ERC-20 nedir?
ERC-20, Değiştirilebilir Jetonlar için bir standart getirmiştir: Başka bir deyişle bunlar, her bir Jetonun (tür ve değer olarak) başka bir Jeton ile tamamen aynı olmasını sağlayan bir özelliğe sahiptir. Örnek olarak, bir ERC-20 Token'ı tıpkı ETH gibi davranır, yani 1 Token her zaman tüm diğer Token'lara eşit olur.
Ön Koşullar
Gövde
Fabian Vogelsteller tarafından Kasım 2015'te önerilen ERC-20 (Ethereum Yorum Talebi 20), Akıllı Sözleşmeler içindeki token'lar için bir API sağlayan bir Token Standardıdır.
ERC-20'nin sağladığı örnek işlevler:
- token'ları bir hesaptan diğerine aktarma
- bir hesabın mevcut token bakiyesini alma
- ağda mevcut olan token'ların toplam arzını alma
- bir hesaptaki token miktarının bir üçüncü taraf hesabı tarafından harcanıp harcanamayacağını onaylama
Eğer bir Akıllı Sözleşme aşağıdaki metodları ve olayları uygularsa bir ERC-20 Token Sözleşmesi olarak çağrılabilir ve dağıtıldığı andan itibaren Ethereum'da oluşturulan token'ları takip etmekten sorumludur.
EIP-20'den (opens in a new tab):
Yöntemler
1function name() public view returns (string)2function symbol() public view returns (string)3function decimals() public view returns (uint8)4function totalSupply() public view returns (uint256)5function balanceOf(address _owner) public view returns (uint256 balance)6function transfer(address _to, uint256 _value) public returns (bool success)7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)8function approve(address _spender, uint256 _value) public returns (bool success)9function allowance(address _owner, address _spender) public view returns (uint256 remaining)Tümünü gösterOlaylar
1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value)Örnekler
Ethereum'daki herhangi bir ERC-20 Token Sözleşmesini incelememizi basitleştirmek için bir Standart'ın ne kadar önemli olduğunu görelim. Herhangi bir ERC-20 token'a 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 az sürtünmeli bir örnek olması için basitleştirilmiş bir ABI kullanacağız.
Web3.py Örneği
Öncelikle, Web3.py (opens in a new tab) Python kütüphanesini yüklediğinizden emin olun:
1pip install web31from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Sarılmış ether (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# Bu, bir ERC-20 Jeton Sözleşmesinin basitleştirilmiş bir Sözleşme Uygulama İkili Arayüzüdür (ABI).12# Sadece şu metotları kullanıma sunacaktır: balanceOf(address), decimals(), symbol() ve totalSupply()13simplified_abi = [14 {15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],16 'name': 'balanceOf',17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],18 'stateMutability': 'view', 'type': 'function', 'constant': True19 },20 {21 'inputs': [],22 'name': 'decimals',23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [],28 'name': 'symbol',29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],30 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'totalSupply',35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 }38]3940dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)41symbol = dai_contract.functions.symbol().call()42decimals = dai_contract.functions.decimals().call()43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals4546# DAI47print("===== %s =====" % symbol)48print("Toplam Arz:", totalSupply)49print("Adres Bakiyesi:", addr_balance)5051weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)52symbol = weth_contract.functions.symbol().call()53decimals = weth_contract.functions.decimals().call()54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals5657# WETH58print("===== %s =====" % symbol)59print("Toplam Arz:", totalSupply)60print("Adres Bakiyesi:", addr_balance)Tümünü gösterBilinen sorunlar
ERC-20 jeton alma sorunu
20.06.2024 itibarıyla en az 83.656.418$ değerinde ERC-20 jetonu bu sorun nedeniyle kaybedildi. Saf bir ERC-20 uygulamasının, aşağıda listelendiği gibi standardın üzerine bir dizi ek kısıtlama uygulamadığınız sürece bu soruna yatkın olduğunu unutmayın.
ERC-20 jetonları, ERC-20 jetonlarını işlemek üzere tasarlanmamış bir akıllı sözleşmeye gönderildiğinde kalıcı olarak kaybolabilir. Bunun nedeni, alıcı sözleşmesinin gelen jetonları tanıma veya yanıtlama işlevine sahip olmaması ve ERC-20 standardında alıcı sözleşmesini gelen jetonlar hakkında bilgilendirmek için bir mekanizmanın bulunmamasıdır. Bu sorunun başlıca ortaya çıkma şekilleri şunlardır:
- Jeton transfer mekanizması
- ERC-20 jetonları, transfer veya transferFrom fonksiyonları kullanılarak transfer edilir
- Bir kullanıcı bu fonksiyonları kullanarak bir sözleşme adresine jeton gönderdiğinde, alıcı sözleşmesinin bunları işlemek üzere tasarlanmış olup olmadığına bakılmaksızın jetonlar aktarılır
- Bildirim eksikliği
- Alıcı sözleşmesi, kendisine jeton gönderildiğine dair bir bildirim veya geri arama almaz
- Alıcı sözleşmesinde jetonları işlemek için bir mekanizma yoksa (örneğin, bir yedek fonksiyon veya jeton alımını yönetmek için özel bir fonksiyon), jetonlar sözleşme adresinde takılı kalır
- Yerleşik işlemenin olmaması
- ERC-20 standardının sözleşmelerin uygulanması için zorunlu bir fonksiyon barındırmaması, birçok sözleşmenin gelen jetonları düzgün bir şekilde yönetememesine yol açar
Olası Çözümler
ERC-20 ile bu sorunu tamamen önlemek mümkün olmasa da son kullanıcı için jeton kaybı olasılığını önemli ölçüde azaltacak yöntemler vardır:
- En yaygın sorun, bir kullanıcının jetonları jeton sözleşme adresinin kendisine göndermesidir (ör. USDT jeton sözleşmesinin adresine yatırılan USDT). Bu tür transfer girişimlerini geri döndürmek için
transfer(..)işlevinin kısıtlanması tavsiye edilir.transfer(..)işlevinin uygulaması içinderequire(_to != address(this));kontrolünü eklemeyi düşünün. - Genel olarak
transfer(..)işlevi, sözleşmelere jeton yatırmak için tasarlanmamıştır.approve(..)& transferFrom(..)modeli, bunun yerine sözleşmelere ERC-20 jetonları yatırmak için kullanılır. Transfer işlevini, onunla herhangi bir sözleşmeye jeton yatırılmasına izin vermeyecek şekilde kısıtlamak mümkündür, ancak bu, jetonlarıntrasnfer(..)` işleviyle sözleşmelere yatırılabileceğini varsayan sözleşmelerle (ör. Uniswap likidite havuzları) uyumluluğu bozabilir. - Sözleşmenizin hiçbir zaman jeton alması gerekmese bile, sözleşmenize ERC-20 jetonlarının 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 jetonlarını çıkarmanıza olanak tanıyacak bir işlev uygulamanız tavsiye edilir.
- Alternatif jeton standartlarını kullanmayı düşünün.
ERC-223 veya ERC-1363 gibi bazı alternatif standartlar bu sorundan ortaya çıkmıştır.
Daha fazla kaynak
- EIP-20: ERC-20 Jeton Standardı (opens in a new tab)
- OpenZeppelin - Jetonlar (opens in a new tab)
- OpenZeppelin - ERC-20 Uygulaması (opens in a new tab)
- Alchemy - Solidity ERC20 Jetonları Rehberi (opens in a new tab)