智能合約教學(3) ERC20代幣合約

0 11
Avatar for vcckvv
Written by
2 years ago

依照預告,這次要來實作ERC20代幣

在解釋實作程式碼之前先來介紹什麼是ERC20,所謂的ERC20就是一種智能合約的標準協議,只要合約內的函數介面滿足其規定所需要的條件,那麼就可以被視為一種有代幣功能的智能合約,而具體的條件就是需要含有totalSupply、balanceOf、allowance、transfer、approve、transferFrom這些函數,除此之外一般還需要設定合約的狀態變數name、symbol、decimals

在實作上我們可以直接複製其他人寫好的範例,不用自己重新寫出全部內容,這裡使用的範例來源是:

https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v2.0.0/contracts/token/ERC20

首先複製這三個檔案到我們的Remix編譯器上,全都放到同一個資料夾之下就好:

ERC20.sol - https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/ERC20.sol

IERC20.sol - https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/IERC20.sol

SafeMath.sol - https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/SafeMath.sol

之後創造我們的代幣合約TestToken.sol:

https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/TestToken.sol

-----------------------------------

pragma solidity ^0.4.19;
import "./ERC20.sol";

contract TestToken is ERC20 {
	string public name = "TestToken";
	string public symbol = "TEST";
	uint8 public decimals = 2;
	uint256 public INITIAL_SUPPLY = 88888;

	constructor() public {
		_mint(msg.sender, INITIAL_SUPPLY);
	}
	
	function mint() public {
		_mint(msg.sender, 800);
	}
}

--------------------------------

解說:

import "./ERC20.sol";

這一行用來引用同一資料夾下其他的sol程式碼檔案,因為會使用到ERC20這個contract

------------------------------------

contract TestToken is ERC20 {

這一行就像是C++中的繼承,也就是說TestToken會繼承ERC20的變數和函數,這樣做的話大部份的函數都不用重寫

------------------------------------

string public name = "TestToken";
string public symbol = "TEST";
uint8 public decimals = 2;
uint256 public INITIAL_SUPPLY = 88888;

name就是代幣的完整名字,而symbol就代幣的縮寫代碼,INITIAL_SUPPLY代表一開始鑄造的代幣數量

decimals則是指代幣數量的小數點位置,比如這裡設定為2,擁有數量88888則實際上會顯示888.88;如果設定為3,擁有數量88888則實際上會顯示88.888

在變數後面加上public修飾詞,代表會自動生成相應的合約的讀取函數:name()、symbol()、decimals()、INITIAL_SUPPLY(),這樣的話我們就不用再另外寫變數的讀取函數

------------------------------------

constructor() public {
  _mint(msg.sender, INITIAL_SUPPLY);
}

constructor()只在創造合約時呼叫,而msg.sender代表呼叫這個函數的帳戶位址,所以此時的msg.sender就是創造者的帳戶位址

_mint會進行代幣的鑄造,會把一開始的代幣全部移到msg.sender的帳戶之中

------------------------------------

function mint() public {
  _mint(msg.sender, 800);
}

這個函數是用來製作水龍頭功能的鑄造代幣函數,每次鑄造固定給予8.00個代幣

由於_mint()是無法公開呼叫的internal函數,TestToken繼承這種函數後無法讓它公開呼叫,所以我們要再弄一個public函數來進行鑄造,此時的msg.sender就是呼叫這個函數的使用者帳戶位址

------------------------------------

接著把這個合約發布到goerli測試鏈上:https://goerli.etherscan.io/address/0x63e1ddeb828ed1634b3165f56e2f31950b4d0b93#code

然後在MetaMask的goerli測試鏈的Assets頁面的下面中點選Import tokens連結

Token Contract Address輸入合約位址0x63e1ddeb828ed1634b3165f56e2f31950b4d0b93

接著Token Symbol和Token Decimal應該會自動填上,之後按Add Custom Token按鈕

再按下Import Tokens按鈕就可以看到一開始鑄造的888.88 TEST代幣了:

鑄造自己的ERC20代幣就講解到這裡,下一篇來講解怎麼利用這個代幣合約來寫一個水龍頭網站

1
$ 0.00
Avatar for vcckvv
Written by
2 years ago

Comments