废话不少,先上完整代码:
- pragma solidity ^0.4.24;
- library SafeMath { /**
- * @dev Multiplies two numbers, throws on overflow.
- */
- function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c)$ H4 ?; f) B* |' |* H) E
- { if (_a == 0) { return 0;
- }3 Q+ e, |. E5 f7 [8 w) O
- c = _a * _b;
- assert(c / _a == _b); return c;
- } /**
- * Integer division of two numbers, truncating the quotient.. }) P: n$ w3 }2 E
- */
- function div(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a / _b;
- } /**
- * Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
- */
- function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
- assert(_b = _a); return c;. u& q5 b* w. r6 c
- }
- }
- contract ERC20 {
- uint256 public totalSupply; function balanceOf(address _who)
- public view returns (uint256);
- function allowance(address _owner, address _spender) public view returns (uint256); 0 s- O+ Q5 Z6 u& f9 R- h! M' x
- function transfer(address _to, uint256 _value) public returns (bool);
- function approve(address _spender, uint256 _value) public returns (bool);
- function transferFrom(address _from, address _to, uint256 _value) public returns (bool); 0 }$ z. @$ l5 y
- event Transfer( address indexed from, address indexed to, uint256 value);
- event Approval(address indexed owner, address indexed spender, uint256 value);
- event Burn(address indexed from, uint256 value);
- }contract StandardToken is ERC20 {9 a7 }$ T8 ]: ~0 o
- using SafeMath for uint256;
- mapping(address => uint256) balances;
- mapping (address => mapping (address => uint256)) internal allowed; /**
- * Gets the balance of the specified address.
- * @param _owner The address to query the the balance of.
- * @return An uint256 representing the amount owned by the passed address.2 {" v) `$ d% z' t2 X/ R
- */, L! r# j) W4 e% q
- function balanceOf(address _owner) public view returns (uint256) 6 Z; A, ]& g/ j/ z. b- V' k
- { return balances[_owner];
- } /**' T9 H; V# d. B7 X9 G9 Q
- * Function to check the amount of tokens that an owner allowed to a spender.$ Y# m( r+ `0 A! u
- * @param _owner address The address which owns the funds.
- * @param _spender address The address which will spend the funds.& b2 _$ B/ z- I
- * @return A uint256 specifying the amount of tokens still available for the spender.
- */1 p- R& B$ Z3 H& ^
- function allowance(address _owner, address _spender) public view returns. \+ _$ V1 n3 D! T( H3 H. t
- (uint256){ return allowed[_owner][_spender];
- } /**0 t+ `6 n9 K, x9 M, v* Z
- * Transfer token for a specified address
- * @param _to The address to transfer to.! Q, L" P1 {- M! R1 Y3 B) L
- * @param _value The amount to be transferred.
- */
- function transfer(address _to, uint256 _value) public returns
- (bool) { require(_value = oldValue) {
- allowed[msg.sender][_spender] = 0;
- } else {0 S, W* Z/ [8 g3 i" l
- allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);4 F! i7 ~& K$ u/ `+ k; ?: J
- }
- emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true;
- }
- /**
- * Destroy tokens
- *3 U0 I' j. M- W4 R& Q) M D! W
- * Remove `_value` tokens from the system irreversibly% ?5 r/ i7 C# q- F
- *3 w1 z. I) b5 O$ z# ~
- * @param _value the amount of money to burn
- */! a$ j( O! P$ F4 m9 y/ f
- function burn(uint256 _value) public returns (bool success)+ m9 s0 V+ H( o8 I4 f3 F
- { require(balances[msg.sender] >= _value); * N4 ], S+ C0 ?6 Z4 g4 Q
- balances[msg.sender] = balances[msg.sender].sub(_value); 2 E' ]9 D+ K# k8 \8 s
- totalSupply = totalSupply.sub(_value);
- emit Burn(msg.sender, _value); return true;
- } /**- R7 }5 B+ V! w* ?
- * Destroy tokens from other account6 H i; q# |+ \0 t; C9 u7 z; H1 S7 K
- *
- * Remove `_value` tokens from the system irreversibly on behalf of `_from`.) ], t0 g7 E, b! V! s: K
- ** B# @+ I9 h8 e- r& f' z9 E- W0 F
- * @param _from the address of the sender! y; o! _, v& ]5 N4 H; [. b
- * @param _value the amount of money to burn
- */
- function burnFrom(address _from, uint256 _value) public returns (bool success)
- { require(balances[_from] >= _value);
- require(_value
这些代码是什么意思呢?& ?' M- n6 T& K$ ]
一、ERC20(EIP-20)说明
ERC20是一个标准的token接口规范:A standard interface for tokens
该接口的官网说明在下面的链接:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md: k& x9 K2 i1 q
我们来简单介绍下这个接口规范,规范里面定义了9个方法和2个事件$ e' @7 k% s7 ?, R# j. F
9个方法包括:$ E* n( p5 r1 F! Z7 [' w
返回token的名字
function name() view returns (string name)( I, q# [' i: s' F9 }, F- ^
返回token的代码
function symbol() view returns (string symbol)0 @" T- G2 s+ b2 [& W0 y
返回token的小数点位数- M5 @' \- D1 d
function decimals() view returns (uint8 decimals)
返回供应总量
unction totalSupply() view returns (uint256 totalSupply)
查询某个地址的余额4 s7 ~9 H3 I+ o6 J# i1 j+ _
function balanceOf(address _owner) view returns (uint256 balance)/ S5 u+ B/ \# ]3 |# z* t6 t
给某个地址转账,如果余额不足,该方法必须抛出异常而不是返回false \+ P# r& h2 E8 i
function transfer(address _to, uint256 _value) returns (bool success)5 d5 Y( L2 D, Z5 x4 s
从from地址转账到to地址,该方法用于委托给其他合约代理你转账
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)9 x% H) F; l3 L0 N( u# |. p5 B. g
允许多次从您的帐户委托到_spender地址,最高_value金额。如果再次调用此函数,则会覆盖当前允许值_value5 t \: X% t9 W: Q% T
function approve(address _spender, uint256 _value) returns (bool success)% X1 z" b' A9 ^3 u- d
返回_spender仍允许退出的金额_owner
function allowance(address _owner, address _spender) view returns (uint256 remaining)
2个事件包括:
转移令牌时必须触发,包括零值转移,注意:创建新token的合约应该触发Transfer事件,即从_from地址设置为0x0创建token的时候3 S, v# k& q5 F6 p0 P
event Transfer(address indexed _from, address indexed _to, uint256 _value)
委托转账必须触发9 L8 ?. ~5 I" V& b5 c+ c ?
event Approval(address indexed _owner, address indexed _spender, uint256 _value). R# U `" ]$ O, |1 }
% G7 S8 \% j( }. q
二、代码解释# h! D4 C/ o8 Q- T0 V
代码包括几部分:
3 F1 a" u! L1 }8 b6 M% Y) M9 d
安全的数学计算库
w+ j6 Y' p* Z. n! I7 H* G; u
contract类 ERC20,主要针对ERC20规范定义方法和事件 A9 h e8 a I0 U
& v* C/ C Z+ l
contract类StandardToken继承ERC20,定义具体的方法实现' ~, i4 `# Q( x4 \+ D
contract 类MyTokenERC20集成StandardToken,定义名词,代号,总供应量和创建token



