前言
我们对erc20代币相关的内容做一些讲解与总结
功能
代币的元数据
string public name;
string public symbol;
uint8 public decimals = 18;
uint256 public totalSupply;
name:代币名称(例如 “Manual Token”)。
symbol:代币符号(例如 “MTK”)。
decimals:小数位,默认 18,符合主流 ERC20 代币习惯。
totalSupply:代币总供应量。
余额与授权机制
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
balanceOf[address]:查询某个地址的代币余额。
allowance[owner][spender]:记录某个地址(owner)允许另一个地址(spender)代扣的额度。
事件
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);
Transfer:记录转账。
Approval:记录授权。
Burn:记录代币销毁。
构造函数
constructor(uint256 initialSupply, string memory tokenName, string memory tokenSymbol) {
totalSupply = initialSupply * 10 ** uint256(decimals);
balanceOf[msg.sender] = totalSupply;
name = tokenName;
symbol = tokenSymbol;
}
部署时传入初始供应量、代币名称、符号。
代币总量自动分配给部署者地址。
内部转账函数 _transfer
function _transfer(address _from, address _to, uint256 _value) internal {
require(_to != address(0x0));
require(balanceOf[_from] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
uint256 previousBalances = balanceOf[_from] + balanceOf[_to];
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
emit Transfer(_from, _to, _value);
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}
防止转账到 0x0(除非销毁)。
检查余额是否足够。
防止溢出。
转账前后总和不变,保证会计一致性。
转账授权功能
transfer:从自己账户转账,最后调用_transfer函数。
function transfer(
address _to,
uint256 _value
ERC20代币发行核心逻辑解析

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



