根據(jù)ERC-20標(biāo)準(zhǔn)定義接口
pragma solidity ^0.4.0;
contract ERC20Interface {
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
function name() public view returns (string name);
function symbol() public view returns (string symbol);
function decimals() public view returns (uint8 decimals);
function totalSupply() public view returns (uint256 totalSupply);
function balanceOf(address _owner) public view returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public view returns (uint256 remaining);
}
代碼實現(xiàn)一個ERC-20代幣合約
pragma solidity ^0.4.0;
import "./ERC20Interface.sol";
contract ERC20 is ERC20Interface{
string private _name = "MyToken";
string private _symbol = "MYT";
uint8 private _decimals = 3;
uint256 private _totalSupply = 10 * (10 ** uint256(_decimals));
mapping(address=>uint256) private _balances;
mapping(address=>mapping(address=>uint256)) private _allowances;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
function ERC20(){
_balances[msg.sender] = _totalSupply;
}
function name() public view returns (string name){
name = _name;
}
function symbol() public view returns (string symbol){
symbol = _symbol;
}
function decimals() public view returns (uint8 decimals){
decimals = _decimals;
}
function totalSupply() public view returns (uint256 totalSupply){
totalSupply = _totalSupply;
}
function balanceOf(address _owner) public view returns (uint256 balance){
balance = _balances[_owner];
}
function transfer(address _to, uint256 _value) public returns (bool success){
require(_balances[msg.sender] >= _value);
_balances[msg.sender] -= _value;
_balances[_to] += _value;
Transfer(msg.sender, _to, _value);
success = true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){
require(_balances[_from] >= _value);
require(_allowances[_from][msg.sender] >= _value);
_balances[_from] -= _value;
_allowances[_from][msg.sender] -= _value;
_balances[_to] += _value;
Transfer(_from, _to, _value);
success = true;
}
function approve(address _spender, uint256 _value) public returns (bool success){
_allowances[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
success = true;
}
function allowance(address _owner, address _spender) public view returns (uint256 remaining){
remaining = _allowances[_owner][_spender];
}
}
代碼說明
- 代幣名稱為 “MyToken”
- 代幣標(biāo)識符為 “MYT”
- 小數(shù)位數(shù)為3
- 代幣初始總供給為 10 * 1000 = 10000
- 賬戶余額映射
- 賬戶配額映射榴啸,這里是兩層映射,例如賬戶A授信給賬戶B額度為value的配額
- 代幣轉(zhuǎn)移事件倦蚪,事件內(nèi)容為:將賬戶
_from
的代幣轉(zhuǎn)移到賬戶_to
中弟头,金額為_value
彻坛。indexed
關(guān)鍵字是對事件的字段做索引珍逸,具體用途后面會說僧免。 - 配額許可事件俭缓,事件內(nèi)容為:擁有者
_owner
許可給_spender
配額克伊,額度為_value
- 構(gòu)造方法,將代幣的初始總供給都分配給合約的部署賬戶华坦。合約的構(gòu)造方法只在合約部署時執(zhí)行一次愿吹。
- 公共方法(合約外部可訪問),返回合約名稱惜姐。
view
關(guān)鍵子表示函數(shù)只查詢狀態(tài)變量犁跪,而不寫入。函數(shù)的view
關(guān)鍵字與constant
等價歹袁。 - 公共方法坷衍,返回合約標(biāo)識符。
- 公共方法条舔,返回合約小數(shù)位枫耳。
- 公共方法,返回合約總供給額孟抗。
- 公共方法迁杨,查詢賬戶
_owner
的賬戶余額钻心。 - 公共方法,將合約調(diào)用者的代幣轉(zhuǎn)移到賬戶
_to
中铅协,金額為_value
捷沸,轉(zhuǎn)移成功返回true。 - 驗證合約調(diào)用者(msg.sender)賬戶余額是否大于等于
_value
- 合約調(diào)用者賬戶余額減去
_value
- 接收賬戶
_to
賬戶余額額加上_value
- 發(fā)送Transfer()事件
- 返回轉(zhuǎn)移成功(true)
- 公共方法狐史,將賬戶
_from
的代幣轉(zhuǎn)移到賬戶_to
中痒给,金額為_value
,轉(zhuǎn)移成功返回true - 驗證賬戶
_from
的代幣余額是否大于等于_value
- 驗證賬戶
_from
給合約調(diào)用者msg.sender
的配額是否大于等于_value
- 賬戶
_from
的賬戶余額減去_value
- 賬戶
_from
給合約調(diào)用者(msg.sender)的配額減去_value
- 接收賬戶
_to
賬戶余額額加上_value
- 發(fā)送Transfer()事件
- 返回轉(zhuǎn)移成功
true
- 公共方法预皇,合約調(diào)用者批準(zhǔn)給賬戶
_spender
配額侈玄,額度為_value
,批準(zhǔn)成功返回true - 合約調(diào)用者
msg.sender
對賬戶_spender
的配額等于_value
- 發(fā)送Approval()事件
- 返回批準(zhǔn)成功
true
- 公共方法吟温,查詢賬戶
_owner
批準(zhǔn)給賬戶_spender
的配額 - 返回賬戶
_owner
批準(zhǔn)給賬戶_spender
的配額
參考文檔
https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20Interface.sol
https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol