推荐【深入浅出区块链社区】,作者有篇文章 如何创建自己的以太坊 ERC-20 代币写的很好了,这里结合我自己实践的过程,做一些补充。
这篇文章也不错,可以参考下。
代码
pragma solidity ^0.4.16;
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
contract TokenERC20 {
string public name;
string public symbol;
uint8 public decimals = 18; // 18 是建议的默认值
uint256 public totalSupply;
mapping (address => uint256) public balanceOf; //
mapping (address => mapping (address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 value);
event Burn(address indexed from, uint256 value);
function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
totalSupply = initialSupply * 10 ** uint256(decimals);
balanceOf[msg.sender] = totalSupply;
name = tokenName;
symbol = tokenSymbol;
}
function _transfer(address _from, address _to, uint _value) internal {
require(_to != 0x0);
require(balanceOf[_from] >= _value);
require(balanceOf[_to] + _value > balanceOf[_to]);
uint previousBalances = balanceOf[_from] + balanceOf[_to];
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
Transfer(_from, _to, _value);
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}
function transfer(address _to, uint256 _value) public returns (bool) {
_transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= allowance[_from][msg.sender]); // Check allowance
allowance[_from][msg.sender] -= _value;
_transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public
returns (bool success) {
allowance[msg.sender][_spender] = _value;
return true;
}
function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
function burn(uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value);
balanceOf[msg.sender] -= _value;
totalSupply -= _value;
Burn(msg.sender, _value);
return true;
}
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value);
require(_value <= allowance[_from][msg.sender]);
balanceOf[_from] -= _value;
allowance[_from][msg.sender] -= _value;
totalSupply -= _value;
Burn(_from, _value);
return true;
}
}
编译
IDE 使用 Remix,是在线的,但是加载可能有点慢。这里有个插件功能,可以添加你想要的功能,比如
SOLIDITY COMPILER 和 DEPLOY & RUN TRANSACTIONS。
合约代码从文章中直接复制进去就可以,然后选择编译版本 0.4.16,选择合约文件,我这里是 MyToken.sol
然后编译,这里要等一些时间。
部署
我这里的地址是自己选的,用的是 Rinkeby 网络,你可以从 Rinkeby 水龙头 获取免费的 ETH 进行测试。建议用 Twitter 发博文,该博文只要包含你的地址就行了,然后复制链接粘贴进去,就可以收到 3 个 ETH 了。
然后填写代币的数量我这里是 4000 个,代币的名称我这里是 MyToken,代币符号我这里是 MT。
生成了一个合约号:0x7012F0D454D47facec937c9f2a82a51b6DBDC0e6
MetaMask 中添加代币
添加上面生成的合约号,代币符号,小数点位数就可以在列表中看到相关币的资产了。
交易
我用的是这个网站的提供的网络,你可以选择上面一样的节点进行测试,我这里选 Rinkeby。