Lanjut ke konten utama
Change page

Standar Token ERC-20

Terakhir diedit: @yeremiaryangunadi(opens in a new tab), 19 November 2023

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

  • Akun
  • Kontrak Pintar
  • Standar token

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 semua
Salin

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 Web3
2
3
4w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
5
6dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)
8
9acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
10
11# 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': True
19 },
20 {
21 'inputs': [],
22 'name': 'decimals',
23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [],
28 'name': 'symbol',
29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
30 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'totalSupply',
35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 }
38]
39
40dai_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**decimals
44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
45
46# DAI
47print("===== %s =====" % symbol)
48print("Total Supply:", totalSupply)
49print("Addr Balance:", addr_balance)
50
51weth_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**decimals
55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
56
57# WETH
58print("===== %s =====" % symbol)
59print("Total Supply:", totalSupply)
60print("Addr Balance:", addr_balance)
Tampilkan semua
Salin

Bacaan lebih lanjut

Apakah artikel ini membantu?