Standar Token ERC-20
Terakhir diedit: @yeremiaryangunadi(opens in a new tab), 11 Juni 2024
Pendahuluan
Apa itu Token?
Token bisa melambangkan hampir semua hal di Ethereum:
- poin reputasi dalam sebuah platform online
- kemampuan suatu karakter dalam game
- tiket lotre
- aset keuangan seperti saham dalam sebuah perusahaan
- mata uang fiat seperti USD
- satu ons emas
- dan banyak lagi...
Fitur yang begitu kuat dari Ethereum ini harus ditangani oleh standar yang juga kuat, bukan? Di situlah tepatnya ERC-20 memainkan perannya! Standar ini memungkinkan pengembang menyusun aplikasi token yang dapat bertukar informasi dengan produk dan layanan lainnya.
Apa itu ERC-20?
ERC-20 memperkenalkan sebuah standar untuk Token Fungible, dengan kata lain, mereka memiliki properti yang membuat tiap Token sama persis (dalam tipe dan nilai) dengan Token lainnya. Sebagai contoh, satu Token ERC-20 bertindak sama seperti ETH, berarti 1 Token adalah dan akan selalu sama dengan semua Token lainnya.
Prasyarat
Tubuh
ERC-20 (Ethereum Request for Comments 20), yang diusulkan oleh Fabian Vogelsteller pada November 2015, adalah Standar Token yang menerapkan API untuk token dalam Kontrak Pintar.
ERC-20 fungsionalitas percontohan menyediakan:
- transfer token dati satu akun ke akun lainnya
- mendapatkan saldo token saat ini dari suatu akun
- mendapatkan total persediaan token yang tersedia di jaringan
- menyetujui apakah jumlah token dari suatu akun dapat dipakai oleh akun pihak ketiga
Jika Kontrak Pintar menerapkan metode dan aksi berikut ini, kontrak tersebut dapat disebut sebagai Kontrak Token ERC-20 dan, setelah digunakan, kontrak ini akan bertanggungjawab untuk melacak token yang dibuat di Ethereum.
Dari EIP-20(opens in a new tab):
Metode
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)Tampilkan semuaSalin
Aksi
1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value)Salin
Contoh
Mari kita lihat bagaimana sebuah Standar begitu penting untuk mempermudah pemeriksaan Kontrak Token ERC-20 di Ethereum. Kita hanya memerlukan Application Binary Interface (ABI) Kontrak untuk membuat antarmuka untuk Token ERC-20 mana pun. Seperti yang dapat Anda lihat di bawah, kita akan menggunakan satu ABI yang disederhanakan, untuk membuatnya menjadi contoh bergesekan rendah.
Contoh Web3.py
Pertama-tama, pastikan Anda telah menginstal pustaka Python Web3.py(opens in a new tab):
1pip install web3
1from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# Ini adalah sebuah Application Binary Interface (ABI) Kontrak yang disederhanakan dari sebuah Kontrak Token ERC-20.12# Kontrak hanya akan menampilkan metode: balanceOf(address), decimals(), symbol() and 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.toChecksumAddress(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("Total Supply:", totalSupply)49print("Addr Balance:", addr_balance)5051weth_contract = w3.eth.contract(address=w3.toChecksumAddress(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("Total Supply:", totalSupply)60print("Addr Balance:", addr_balance)Tampilkan semuaSalin