Cara Membuat Token ERC20 dengan Cara Sederhana
Diterbitkan: 2022-03-11Tujuan artikel ini adalah untuk mendemonstrasikan cara membuat token ERC20 dalam waktu sesingkat mungkin.
Mari kita mulai dengan dasar-dasarnya: Apa itu token ERC20?
Dalam beberapa tahun terakhir, spesifikasi token ERC20 telah menjadi standar defacto untuk token Ethereum. Dengan kata lain, sebagian besar kontrak Ethereum di luar sana saat ini sesuai dengan ERC20. Artikel ini akan merinci bagaimana Anda dapat membuat token Ethereum Anda sendiri, tetapi sebelum kita mulai, mari kita lihat lebih dekat standar ERC20.
Apa yang membuat token ERC20 begitu menarik dan sukses? Ada beberapa faktor yang berperan:
- Token ERC20 sederhana dan mudah digunakan, seperti yang akan Anda lihat di tutorial ini.
- Standar ERC20 memecahkan masalah yang signifikan, karena pasar berbasis blockchain dan dompet kripto memerlukan satu set perintah standar untuk berkomunikasi dengan berbagai token yang mereka kelola. Ini termasuk aturan interaksi antara token yang berbeda, serta aturan pembelian token.
- Itu adalah spesifikasi populer pertama yang menawarkan standarisasi token Ethereum. Itu bukan yang pertama , tetapi berkat popularitasnya, dengan cepat menjadi standar industri.
Sama seperti token Ethereum lainnya, token ERC20 diimplementasikan sebagai kontrak pintar dan dieksekusi di Ethereum Virtual Machine (EVM) dengan cara yang terdesentralisasi.
Soliditas: Bahasa Pemrograman Kontrak Cerdas
Kontrak pintar Ethereum ditulis dalam Solidity. Meskipun ada bahasa alternatif, hampir tidak ada yang menggunakannya untuk tujuan ini. Solidity mirip dengan JavaScript, jadi jika Anda memiliki pengetahuan tentang JavaScript, atau bahkan Java dan bahasa mirip C lainnya, Anda tidak akan kesulitan mengetahui bahwa sepotong kode di Solidity melakukannya, bahkan sebelum Anda benar-benar menguasai Solidity cukup untuk digunakan dia.
Di sinilah kesenangan dimulai, karena Anda seharusnya dapat mulai membuat kontrak ERC20 sederhana dalam waktu singkat. Ini adalah tugas yang mudah, cukup sederhana sehingga artikel ini akan menunjukkan bagaimana Anda dapat menulis dan menggunakan token ERC20 dalam waktu kurang dari satu jam.
Token yang akan kami buat dalam demonstrasi ini akan menjadi implementasi ERC20 yang sederhana, tanpa terlalu banyak bel dan peluit. Namun, saya telah melihat banyak token sederhana yang serupa di dunia nyata, dan mereka cenderung melakukannya dengan cukup baik.
Ikhtisar Standar Token ERC20
Apa itu ERC20?
Sederhananya, standar ERC20 mendefinisikan serangkaian fungsi yang akan diterapkan oleh semua token ERC20 sehingga memungkinkan integrasi dengan kontrak, dompet, atau pasar lain. Kumpulan fungsi ini agak pendek dan mendasar.
function totalSupply() public view returns (uint256); function balanceOf(address tokenOwner) public view returns (uint); function allowance(address tokenOwner, address spender) public view returns (uint); function transfer(address to, uint tokens) public returns (bool); function approve(address spender, uint tokens) public returns (bool); function transferFrom(address from, address to, uint tokens) public returns (bool);
Fungsi ERC20 memungkinkan pengguna eksternal, katakanlah aplikasi dompet kripto, untuk mengetahui saldo pengguna dan mentransfer dana dari satu pengguna ke pengguna lain dengan otorisasi yang tepat.
Kontrak pintar mendefinisikan dua peristiwa yang ditentukan secara khusus:
event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);
Peristiwa ini akan dipanggil atau dipancarkan ketika pengguna diberikan hak untuk menarik token dari akun, dan setelah token benar-benar ditransfer.
Selain fungsi ERC20 standar, banyak token ERC20 juga menampilkan bidang tambahan dan beberapa telah menjadi bagian de-facto dari standar ERC20, jika tidak tertulis maka dalam praktik. Berikut adalah beberapa contoh bidang tersebut.
string public constant name; string public constant symbol; uint8 public constant decimals;
Berikut adalah beberapa poin mengenai tata nama ERC20 dan Soliditas:
- Fungsi
public
dapat diakses di luar kontrak itu sendiri -
view
pada dasarnya berarti konstan, yaitu keadaan internal kontrak tidak akan diubah oleh fungsi - Sebuah
event
adalah cara Solidity untuk mengizinkan klien, misalnya frontend aplikasi Anda untuk diberi tahu tentang kejadian tertentu dalam kontrak
Sebagian besar konstruksi bahasa Soliditas harus jelas jika Anda sudah memiliki keterampilan Java/JavaScript yang penting.
Menulis Token ERC20 dalam Soliditas
Sekarang kami telah menguraikan dasar-dasarnya dan menjelaskan apa yang diperlukan untuk membuat token ERC20, sekarang saatnya untuk mulai menulis beberapa logika.
Pertama, kita perlu mendefinisikan dua objek pemetaan. Ini adalah gagasan Soliditas untuk array asosiatif atau kunci/nilai:
mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;
mapping(address => uint256)
mendefinisikan array asosiatif yang kuncinya bertipe address
— angka yang digunakan untuk menunjukkan alamat akun, dan yang nilainya bertipe uint256
— integer 256-bit yang biasanya digunakan untuk menyimpan saldo token.
Objek pemetaan pertama, balances
, akan menyimpan saldo token dari setiap akun pemilik.
Objek pemetaan kedua, allowed
, akan mencakup semua akun yang disetujui untuk ditarik dari akun tertentu bersama dengan jumlah penarikan yang diizinkan untuk masing-masing akun.
Seperti yang Anda lihat, bidang nilai dari pemetaan yang diizinkan dengan sendirinya merupakan pemetaan yang memplot alamat akun ke jumlah penarikan yang disetujui.
Pemetaan ini bersama dengan semua bidang kontrak lainnya akan disimpan di blockchain dan akan ditambang sehingga perubahan akan disebarkan ke semua node pengguna jaringan.
Penyimpanan Blockchain mahal dan pengguna kontrak Anda harus membayar, dengan satu atau lain cara. Oleh karena itu, Anda harus selalu berusaha meminimalkan ukuran penyimpanan dan menulis ke dalam blockchain.
Sekarang setelah kita memiliki struktur data yang diperlukan, kita dapat mulai menulis logika ERC20 ke dalam fungsi yang sesuai.
Mengatur Jumlah Token ICO
Bagaimana cara mengatur jumlah token ICO? Nah, ada beberapa cara untuk mengatur jumlah token ICO maksimal dan hal ini mungkin layak untuk didiskusikan dengan panjang lebar.
Untuk kebutuhan tutorial ECR20 kami, kami akan menggunakan pendekatan paling sederhana: Tetapkan jumlah total token pada waktu pembuatan kontrak dan pertama-tama tetapkan semuanya ke "pemilik kontrak" yaitu akun yang menerapkan kontrak pintar:
uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }
Konstruktor adalah fungsi khusus yang secara otomatis dipanggil oleh Ethereum tepat setelah kontrak diterapkan. Ini biasanya digunakan untuk menginisialisasi status token menggunakan parameter yang diteruskan oleh akun penerapan kontrak.
msg
adalah variabel global yang dideklarasikan dan diisi oleh Ethereum itu sendiri. Ini berisi data penting untuk melakukan kontrak. Bidang yang kami gunakan di sini: msg.sender
berisi akun Ethereum yang menjalankan fungsi kontrak saat ini.
Hanya akun penerapan yang dapat memasuki konstruktor kontrak. Saat kontrak dimulai, fungsi ini mengalokasikan token yang tersedia ke akun 'pemilik kontrak'.
Dapatkan Total Pasokan Token
function totalSupply() public view returns (uint256) { return totalSupply_; }
Fungsi ini akan mengembalikan jumlah semua token yang dialokasikan oleh kontrak ini terlepas dari pemiliknya.
Dapatkan Saldo Token Pemilik
function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }
balanceOf
akan mengembalikan saldo token akun saat ini, yang diidentifikasi oleh alamat pemiliknya.
Transfer Token ke Akun Lain
function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender] — numTokens; balances[receiver] = balances[receiver] + numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; }
Seperti namanya, fungsi transfer
digunakan untuk memindahkan jumlah token numTokens
dari saldo pemilik ke saldo pengguna lain, atau receiver
. Pemilik yang mentransfer adalah msg.sender
yaitu yang menjalankan fungsi, yang menyiratkan bahwa hanya pemilik token yang dapat mentransfernya ke orang lain.

Cara Solidity untuk menegaskan predikat adalah require
. Dalam hal ini rekening transfer memiliki saldo yang cukup untuk melakukan transfer. Jika pernyataan yang require
gagal, transaksi segera dibatalkan tanpa perubahan yang ditulis ke dalam blockchain.
Tepat sebelum keluar, fungsi mengaktifkan Transfer
acara ERC20 yang memungkinkan pendengar terdaftar untuk bereaksi terhadap penyelesaiannya.
Setujui Delegasi untuk Menarik Token
Fungsi ini paling sering digunakan dalam skenario pasar token.
function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }
Apa yang approve
adalah mengizinkan pemilik yaitu msg.sender
untuk menyetujui akun delegasi — mungkin pasar itu sendiri — untuk menarik token dari akunnya dan mentransfernya ke akun lain.
Seperti yang Anda lihat, fungsi ini digunakan untuk skenario di mana pemilik menawarkan token di pasar. Ini memungkinkan pasar untuk menyelesaikan transaksi tanpa menunggu persetujuan sebelumnya.
Di akhir eksekusinya, fungsi ini memicu event Approval
.
Dapatkan Jumlah Token yang Disetujui untuk Penarikan
function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; }
Fungsi ini mengembalikan jumlah token yang disetujui saat ini oleh pemilik ke delegasi tertentu, sebagaimana diatur dalam fungsi approve
.
Transfer Token oleh Delegasi
Fungsi transferFrom
adalah rekan dari fungsi approve
, yang telah kita bahas sebelumnya. Ini memungkinkan delegasi yang disetujui untuk penarikan untuk mentransfer dana pemilik ke akun pihak ketiga.
function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner] — numTokens; allowed[owner][msg.sender] = allowed[from][msg.sender] — numTokens; balances[buyer] = balances[buyer] + numTokens; Transfer(owner, buyer, numTokens); return true; }
Dua pernyataan yang require
pada saat fungsi dimulai adalah untuk memverifikasi bahwa transaksi tersebut sah, yaitu bahwa pemilik memiliki cukup token untuk ditransfer dan bahwa delegasi memiliki persetujuan untuk (setidaknya) numTokens
untuk ditarik.
Selain mentransfer jumlah numTokens
dari pemilik ke pembeli, fungsi ini juga mengurangi numTokens
dari tunjangan delegasi. Ini pada dasarnya memungkinkan delegasi dengan tunjangan yang diberikan untuk memecahnya menjadi beberapa penarikan terpisah, yang merupakan perilaku pasar yang khas.
Kita bisa berhenti di sini dan memiliki implementasi ERC20 yang valid. Namun, kami ingin melangkah lebih jauh, karena kami menginginkan token kekuatan industri. Ini mengharuskan kami untuk membuat kode kami sedikit lebih aman, meskipun kami masih dapat menjaga token relatif sederhana, jika tidak mendasar.
Perpustakaan Soliditas SafeMath
SafeMath adalah perpustakaan Soliditas yang ditujukan untuk menangani satu cara peretas diketahui melanggar kontrak: serangan integer overflow. Dalam serangan seperti itu, peretas memaksa kontrak untuk menggunakan nilai numerik yang salah dengan melewatkan parameter yang akan mengambil bilangan bulat yang relevan melewati nilai maksimalnya.
SafeMath melindungi dari hal ini dengan menguji overflow sebelum melakukan tindakan aritmatika, sehingga menghilangkan bahaya serangan overflow. Perpustakaan sangat kecil sehingga dampak pada ukuran kontrak minimal, tidak menimbulkan kinerja dan sedikit denda biaya penyimpanan.
Mari tambahkan SafeMath ke kode kita:
library SafeMath { // Only relevant functions function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a — b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }
SafeMath menggunakan pernyataan assert
untuk memverifikasi kebenaran parameter yang diteruskan. Jika assert
gagal, eksekusi fungsi akan segera dihentikan dan semua perubahan blockchain akan dibatalkan.
Selanjutnya, mari kita tambahkan pernyataan berikut yang memperkenalkan library ke compiler Solidity:
using SafeMath for uint256;
Kemudian, kami mengganti aritmatika naif yang kami gunakan di awal dengan fungsi SafeMath:
balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); balances[buyer] = balances[buyer].add(numTokens); balances[owner] = balances[owner].sub(numTokens);
Mengepak semuanya bersama-sama
Di Solidity, fungsi dan peristiwa kontrak cerdas dibungkus ke dalam entitas yang disebut kontrak yang dapat Anda terjemahkan secara diam-diam ke "kelas blockchain." Di bawah ini adalah kontrak yang kompatibel dengan ERC20 yang kami buat, termasuk Inti dari kode kami. Bidang nama dan simbol dapat diubah sesuka hati. Sebagian besar token mempertahankan nilai desimal pada 18, jadi kami akan melakukan hal yang sama.
Penerapan Kontrak Ethereum
Waktunya telah tiba untuk menyebarkan kontrak kami ke blockchain. Setelah penerapan, kontrak kami akan ditransfer ke semua node yang berpartisipasi dalam jaringan. Setiap dan semua perubahan yang dibuat pada kontrak akan disebarkan ke semua node yang berpartisipasi.
Pengembang Ethereum biasanya menggunakan alat penyebaran seperti Truffle. Bahkan Truffle berlebihan untuk kebutuhan artikel ini yang terbatas, dan alat online sederhana yang disebut Remix sudah cukup.
Untuk menggunakannya, Anda perlu menginstal plugin MetaMask di browser Anda dan akun Rinkeby (jaringan uji Ethereum) dengan setidaknya beberapa Rinkeby Ether di dalamnya. Ini adalah langkah-langkah yang relatif sederhana, jadi kami tidak akan membahasnya secara mendetail.
Jika Anda tidak memiliki keduanya, buka MetaMask dan Rinkeby untuk tautan unduhan dan untuk mendapatkan petunjuk pemasangan dan penggunaan yang jelas.
Sekarang setelah kita memiliki semua blok bangunan, kita akan menuju ke Remix dan menempelkan kode di atas, termasuk baris pragma dan perpustakaan SafeMath, ke dalam editor online.
Kemudian, kita akan melompat ke tab kedua di sebelah kanan yang disebut “ Run ” dan klik “ Deploy .” Sebuah popup MetaMask akan muncul meminta kami untuk mengkonfirmasi transaksi. Tentu saja, kami akan menyetujuinya.
- Kotak hijau: Pastikan Anda berada di Rinkeby
- Kotak biru: Atur total persediaan token Anda
- Kotak merah: Terapkan!
Inti : https://Gist.github.com/giladHaimov/8e81dbde10c9aeff69a1d683ed6870be#file-basicerc20-sol
Selamat! Anda baru saja menggunakan token ERC20 pertama Anda, seperti seorang profesional Ethereum sejati. Seperti yang dijanjikan, tokennya sederhana dan ringan, namun berfungsi penuh, sesuai standar ERC20, dan diamankan dengan MathSafe. Itu siap untuk dibeli, dibayar dengan, dan ditransfer ke seluruh Blockchain.
Apakah hanya itu yang ada untuk kontrak pintar?
Tidak, bahkan tidak dekat, karena demonstrasi singkat kami hampir tidak menyentuh permukaan dan hanya membahas satu aspek pengembangan kontrak pintar.
Kontrak pintar bisa jauh lebih kompleks tergantung pada logika bisnis Anda, pemodelan interaksi pengguna Anda, apakah Anda mengizinkan pencetakan dan pembakaran token atau tidak, perubahan siklus hidup yang Anda masukkan ke dalam kontrak, kebutuhan akan kemampuan tingkat admin yang biasanya disertai dengan set fungsi yang diotorisasi oleh admin, dan seterusnya. Anda mendapatkan gambarnya.
Namun, jika Anda dapat meniru apa yang kami lakukan di sini, itu adalah dasar yang kuat untuk memperluas pengetahuan Anda dan beralih ke kontrak yang lebih kompleks bila diperlukan.