Creating ERC-20 Standard Token

Apa itu ERC-20 standard token?

ERC adalah singkatan kepada Ethereum Request for Comments. Ia adalah sebuah standard token di dalam Ethereum Improvement Proposals (EIPs). EIP-20 adalah proposal untuk guideline standard token ni. Basically ia adalah sebuah dokumen untuk penambah-baikkan ecosystem Ethereum, di mana kalau kau ada idea untuk improvements, kau kena submit draft EIP dan bincangkan bersama brader Vitalik Buterin. Ia juga salah satu jenis smart contract dalam Ethereum blockchain.

ERC-20 token ni sinonim dengan Initial Coin Offerings (ICO) yang selalu kita dengar bila ada orang nak mulakan bisnes ke apa. Jadi dalam post ni aku nak sembang sikit pasal cemana diorang ni buat coin dalam Ethereum blockchain.

Tutorial overview

Aku akan guna open sourced StandardToken dari OpenZeppelin, pasal aku malas nak start dari scratch. Basically, kita cuma inherit abstract function dia dan customize ikut sukahati. StandardToken ni sudah di audit smart contract nya oleh Zeppelin Solutions, jadi kita tak perlu risau pasal security flaws dalam ERC-20 ni nanti.

Note: Setiap benda dekat dunia ni ada vulnerabilities dia tersendiri, even hati awek kau vulnerable kalau dia jatuh dekat orang lain (cucked). Jadi seeloknya faham kan concept contract-driven development ni secara ringkas dahulu sebelum melompat ke custom smart contract bandwagon. Sebab bila custom dan written from scratch, kau ada lebih control dan pemahaman terhadap contract yang kau akan jaga ni. Plus, SOLID principle boleh di apply menjadikan code kau cantik dan kemas.

Development environment

Make sure npm sudah di install dalam komputer kau. Lepas tu baru boleh mula step step bawah ni.

1. Install truffle

Truffle ni adalah sebuah framework untuk membina aplikasi Ethereum. Dia macam Laravel tapi untuk Ethereum development lol.

$ npm install -g truffle

2. Create a new dir

$ mkdir fuckthisshitcoin
$ cd fuckthisshitcoin

(Sorry, takde idea nak nama kan apa)

3. Initialize truffle

Command ni akan initialize basic project structure untuk development.

$ truffle init

Lepas dah init tu, akan dapat directory structure macam ni:

├───contracts/
|   └───Migrations.sol
├───migrations/
|   └───1_initial_migration.js
└───test/
truffle-config.js
truffle.js

4. Create a package.json file

$ npm init -y

5. Install OpenZeppelin module

Command ni akan install latest version of OpenZeppelin module di dalam project ni.

$ npm install -E zeppelin-solidity

6. Creating our token smart contract

Navigate ke dalam contracts/ folder, dan create satu file nama dia FuckThisShitCoin.sol.

Smart contract ni ditulis dalam bahasa Solidity. Seakan sama macam Javascript. Extension file ni adalah .sol.

pragma solidity ^0.4.17;
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract FuckThisShitCoin is StandardToken {
  string public name = "FuckThisShitCoin"; 
  string public symbol = "FTSC";
  uint public decimals = 18;
  uint public INITIAL_SUPPLY = 340000 * (10 ** decimals);

  function FuckThisShitCoin() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}

Explanation:

  • import StandardToken.sol dari module Zeppelin untuk kita inherit function ke dalam smart contract kita
  • is adalah keyword untuk extend contract ni dengan StandardToken contract
  • Token yang aku buat ni bukan mineable, so dia ada fixed supply. Aku letak INITIAL_SUPPLY sebanyak 340,000 dan nama coin aku ni ialah FuckThisShitCoin dengan simbol FTSC (berguna kalau nak letak dalam exchange).
  • Di dalam constructor, pass totalSupply_ dan balances kepada StandardToken tadi.
  • msg.sender adalah sebuah type address di dalam Solidity, di mana ini adalah ETH address yang buat contract ni (read docs).

7. Compile contract code

Masa untuk compile! Ya, itu sahaja code untuk buat basic token ni :)

$ truffle compile

Compiling .\contracts\FuckThisShitCoin.sol...
Compiling .\contracts\Migrations.sol...
Compiling .\node_modules\zeppelin-solidity\contracts\math\SafeMath.sol...
Compiling .\node_modules\zeppelin-solidity\contracts\token\ERC20\BasicToken.sol...
Compiling .\node_modules\zeppelin-solidity\contracts\token\ERC20\ERC20.sol...
Compiling .\node_modules\zeppelin-solidity\contracts\token\ERC20\ERC20Basic.sol...
Compiling .\node_modules\zeppelin-solidity\contracts\token\ERC20\StandardToken.sol...

Writing artifacts to .\build\contracts

build/contracts/ folder akan wujud dalam project structure. Ia menyimpan contract artifacts yang akan digunakan masa nak deploy ke network nanti. Artifacts ni dalam bentuk .json file.

├───build\
│   └───contracts\
|       └───*.json   <-- artifact files
├───contracts\
|   └───FuckThisShitCoin.sol   <-- token contract code
|   └───Migrations.sol
├───migrations\
|   └───1_initial_migration.js
|   └───2_deploy_fuckthisshitcoin.js   <-- migration file
└───test\
package.json
truffle-config.js
truffle.js

8. Create migration file

Create file baru dalam migrations/ folder bernama 2_deploy_fuckthisshitcoin.js dan letak code di bawah.

var FuckThisShitCoin = artifacts.require("./FuckThisShitCoin.sol");

module.exports = function(deployer) {
  deployer.deploy(FuckThisShitCoin);
};

9. Install dotenv module

Bila nak deploy ke Ethereum network, kita perlu ada private key wallet kita. Tapi kita tak boleh hardcode terus dalam code. .env adalah satu file untuk simpan variable yang sensitif kepada sistem kita. Do note that jangan sesekali commit file ni. Letak siap siap dalam .gitignore.

Selain tu, install juga truffle-wallet-provider dan ethereumjs-wallet.

$ npm install --save-dev dotenv truffle-wallet-provider ethereumjs-wallet

Lepas dah settle install dependency tu, edit truffle.js macam dekat bawah ni:

require('dotenv').config();
const Web3 = require("web3");
const web3 = new Web3();
const WalletProvider = require("truffle-wallet-provider");
const Wallet = require('ethereumjs-wallet');

var mainNetPrivateKey = new Buffer(process.env["MAINNET_PRIVATE_KEY"], "hex")
var mainNetWallet = Wallet.fromPrivateKey(mainNetPrivateKey);
var mainNetProvider = new WalletProvider(mainNetWallet, "https://mainnet.infura.io/");

var ropstenPrivateKey = new Buffer(process.env["ROPSTEN_PRIVATE_KEY"], "hex")
var ropstenWallet = Wallet.fromPrivateKey(ropstenPrivateKey);
var ropstenProvider = new WalletProvider(ropstenWallet, "https://ropsten.infura.io/");


module.exports = {
  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*" // Match any network id
    },
    ropsten: {
      provider: ropstenProvider,
      gas: 4600000,
      gasPrice: web3.toWei("20", "gwei"),
      network_id: "3",
    },
    mainnet: {
      provider: mainNetProvider,
      gas: 4600000,
      gasPrice: web3.toWei("20", "gwei"),
      network_id: "1",
    }
  }
};

Basically, truffle.js ni adalah config file untuk smart contract. Ia menyimpan configuration macam wallet mana kita nak pakai (owner of contract), network mana nak pakai, etc. See, takde pun aku hardcode private key aku dalam config ni. Step lepas ni akan menerangkan cara nak generate address baru dan macam mana nak pakai .env file ni.

Apa itu infura.io? Kenapa kita point kan network kita ke situ? Infura ni adalah salah satu company yang run Ethereum full node. Maksudnya kita boleh connect dengan node ni, buat transaction dan pakai segala jenis API yang Ethereum blockchain provide. Unless kau ada run full node sendiri, it's better to use it atas sebab privacy dan security. Selain Infura, banyak lagi full node lain seperti MyEtherApi.

10. Install Metamask browser add-on

Install Metamask dalam browser dan create account baru.

Make sure select Ropsten Test Network lepas dah create tu.

Choose Ropsten network

Lepas tu ambil private key wallet tersebut. Ada dekat Export Private Key settings:

Metamask private key

11. Create .env file

Buat file baru nama dia .env dan paste private key tadi untuk Ropsten dan Mainnet variable. !!! Jangan lupa .gitignore file ni sebelum commit !!!

ROPSTEN_PRIVATE_KEY="PrivateKeyDiSini"
MAINNET_PRIVATE_KEY="PrivateKeyDiSini"

12. Dapatkan test ether

Sebelum deploy, kita perlu ada balance ether dalam wallet kita untuk bayar gas (fee). Ya, nak deploy kena pakai duit jugak. Remember dalam Ethereum, reads are free, writes are not. Memandangkan kita dalam test network, kita hanya perlu ada test ether, bukan real ether yang ada value tu.

  1. Make sure Metamask dah connected to Ropsten network dan wallet sudah di sync.
  2. Pergi ke website https://faucet.metamask.io/
  3. Tekan button "request 1 ether from faucet"
  4. ???
  5. Profit!

13. Deploy to Ropsten test network

Bila dah ada balance test ether dalam wallet (boleh lihat dekat Metamask), kita dah boleh deploy smart contract ni ke blockchain. Masa untuk immutability!

$ truffle deploy --network ropsten

Using network 'ropsten'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x74a69635e40931db8ad77b4a1774099a609f24ed54e97a989fc82fe76419c0a8
  Migrations: 0x74009b3a6ab0c53cdcdcc0fd7ec58358a9b60d31
Saving successful migration to network...
  ... 0x2c75c62cea9479db076a067ebf6b44fca4be2e50a27cdb010191d5ebb1a2bf83
Saving artifacts...
Running migration: 2_deploy_fuckthisshitcoin.js
  Deploying FuckThisShitCoin...
  ... 0x975b05fcd9f46a170e0ac1d2fb607ca103dd9e30fa2fb6f5768cf83a8689e7bf
  FuckThisShitCoin: 0x58be0ccb14f8e1fac76e890683d8a3714a6d80c0
Saving successful migration to network...
  ... 0xd12e610eeef5428691d84daa9356805009a5b3f2d24f9b24eb0fd5ecf8066d47
Saving artifacts...

Untuk memastikan smart contract kita telah di deploy, pergi ke http://ropsten.etherscan.io and paste contract address yang tertera pada console tadi. Dalam kes ni:-

FuckThisShitCoin: 0x58be0ccb14f8e1fac76e890683d8a3714a6d80c0

Sebarkan, viralkan, airdrop to random wallets for the lulz!

Guna MyEtherWallet (MEW) atau apa apa jenis wallet yang support ERC-20 token untuk send/receive token baru ni. Contract ni punya owner adalah pemegang private key wallet yang deploy dia tadi. Jadi, guna private key tadi untuk buat transaction atau apa apa yang kau suka. Make sure send dekat wallet di dalam Ropsten network je. Mainnet takkan terima pasal contract ni bukan di deploy dekat mainnet, atau kata lain, tak wujud pun dalam main network.

ethereum-life

Untuk nak deploy ke main network (The World Computer), kau kena ada real ether yang dibeli dari exchange atau dicuri dari rakan satu ofis. Proses mendeploy sama macam tadi, cuma argument dekat command deploy tu kena tukar sikit:-

$ truffle deploy --network mainnet

Glhf

Reference

  1. http://www.masonforest.com/blockchain/ethereum/2017/11/13/how-to-deploy-an-erc20-token-in-20-minutes.html
  2. http://truffleframework.com/tutorials/robust-smart-contracts-with-openzeppelin
  3. https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
  4. https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol
  5. http://solidity.readthedocs.io/en/develop/units-and-global-variables.html#block-and-transaction-properties
  6. http://truffleframework.com/docs/getting_started/migrations
  7. https://www.cryptoninjas.net/2018/01/29/infura-relayed-7-million-eth-2017/
Show Comments

Get the latest posts delivered right to your inbox.