---
tags: Blockchain
---
# 同質化代幣合約 -- EIP20 介紹
contributed by < [steven1lung](https://github.com/steven1lung) >
## EIP20 介紹
EIP 全名 Ethereum Improvement Proposals,這個專案是為了將 ethereum 的標準合約都集中起來說明,讓使用 ethereum 的客戶或是應用程式可以更輕鬆使用。
EIP20 就是一個標準的加密貨幣介面,可以允許一些智能合約透過 API 溝通。這個合約提供了基本貨幣功能,像是轉帳或是允許貨幣經過認證被使用在其他的鏈上的第三方程式。
## EIP20 原始碼
### 變數
#### `name`
這個變數就是加密貨幣的名稱,像是 Ethereum
#### `symbol`
這個變數就是加密貨幣的簡稱,像是 ETH
#### `decimals`
這個變數是加密貨幣的精準度,到時候設定貨幣發行數量時也要考慮到精準度。
### 函式
#### Constructor
```solidity
function EIP20(
uint256 _initialAmount,
string _tokenName,
uint8 _decimalUnits,
string _tokenSymbol
) public {
balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
totalSupply = _initialAmount; // Update total supply
name = _tokenName; // Set the name for display purposes
decimals = _decimalUnits; // Amount of decimals for display purposes
symbol = _tokenSymbol; // Set the symbol for display purposes
}
```
看到建構子將我們所給予的名稱、代號、精準度的參數就將值設定好了。
#### `transfer`
```solidity
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balances[msg.sender] >= _value);
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
```
這就是當你購買加密貨幣時,會使用這個函式將貨幣轉到你的錢包地址裡。一開始先檢查貨幣地址的剩餘數量夠不夠,再將雙方的餘額數量設定好,就可以呼叫 `Transfer()` 將貨幣轉給購買者。
#### `transferFrom`
```solidity
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
uint256 allowance = allowed[_from][msg.sender];
require(balances[_from] >= _value && allowance >= _value);
balances[_to] += _value;
balances[_from] -= _value;
if (allowance < MAX_UINT256) {
allowed[_from][msg.sender] -= _value;
}
emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
```
這個函式就是在你要跟其他人交易貨幣時所使用的,像是其他人向你購買貨幣,就可以使用這個 `transferFrom` 函式。可以看到這個函式比上面的 `transfer` 多了一個 `address _from` 參數,表示要從這個 `_from` 的位址轉移貨幣給 `_to`,其他運作都跟上面一樣。
#### `balanceOf`
```solidity
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
```
這個函式就是回傳一個位址所擁有的貨幣數量,非常直覺。
#### `approve`
```solidity
function approve(address _spender, uint256 _value) public returns (bool success) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
```
這個函式會允許某個錢包位址花費 `_value` 個貨幣,首先會設定好位址可以花費的數量,再呼叫 `Approval()`。
#### `allowance`
```solidity
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
```
這個函式會回傳剛剛再 `approve` 所設定位址允許花費的貨幣數量。