推荐【深入浅出区块链社区】,作者有篇文章 如何创建自己的以太坊 ERC-20 代币写的很好了,这里结合我自己实践的过程,做一些补充。

这篇文章也不错,可以参考下。

代码

  1. pragma solidity ^0.4.16;
  2. interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
  3. contract TokenERC20 {
  4. string public name;
  5. string public symbol;
  6. uint8 public decimals = 18; // 18 是建议的默认值
  7. uint256 public totalSupply;
  8. mapping (address => uint256) public balanceOf; //
  9. mapping (address => mapping (address => uint256)) public allowance;
  10. event Transfer(address indexed from, address indexed to, uint256 value);
  11. event Burn(address indexed from, uint256 value);
  12. function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
  13. totalSupply = initialSupply * 10 ** uint256(decimals);
  14. balanceOf[msg.sender] = totalSupply;
  15. name = tokenName;
  16. symbol = tokenSymbol;
  17. }
  18. function _transfer(address _from, address _to, uint _value) internal {
  19. require(_to != 0x0);
  20. require(balanceOf[_from] >= _value);
  21. require(balanceOf[_to] + _value > balanceOf[_to]);
  22. uint previousBalances = balanceOf[_from] + balanceOf[_to];
  23. balanceOf[_from] -= _value;
  24. balanceOf[_to] += _value;
  25. Transfer(_from, _to, _value);
  26. assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
  27. }
  28. function transfer(address _to, uint256 _value) public returns (bool) {
  29. _transfer(msg.sender, _to, _value);
  30. return true;
  31. }
  32. function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
  33. require(_value <= allowance[_from][msg.sender]); // Check allowance
  34. allowance[_from][msg.sender] -= _value;
  35. _transfer(_from, _to, _value);
  36. return true;
  37. }
  38. function approve(address _spender, uint256 _value) public
  39. returns (bool success) {
  40. allowance[msg.sender][_spender] = _value;
  41. return true;
  42. }
  43. function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
  44. tokenRecipient spender = tokenRecipient(_spender);
  45. if (approve(_spender, _value)) {
  46. spender.receiveApproval(msg.sender, _value, this, _extraData);
  47. return true;
  48. }
  49. }
  50. function burn(uint256 _value) public returns (bool success) {
  51. require(balanceOf[msg.sender] >= _value);
  52. balanceOf[msg.sender] -= _value;
  53. totalSupply -= _value;
  54. Burn(msg.sender, _value);
  55. return true;
  56. }
  57. function burnFrom(address _from, uint256 _value) public returns (bool success) {
  58. require(balanceOf[_from] >= _value);
  59. require(_value <= allowance[_from][msg.sender]);
  60. balanceOf[_from] -= _value;
  61. allowance[_from][msg.sender] -= _value;
  62. totalSupply -= _value;
  63. Burn(_from, _value);
  64. return true;
  65. }
  66. }

编译

IDE 使用 Remix,是在线的,但是加载可能有点慢。这里有个插件功能,可以添加你想要的功能,比如

SOLIDITY COMPILER 和 DEPLOY & RUN TRANSACTIONS。

image.png

合约代码从文章中直接复制进去就可以,然后选择编译版本 0.4.16,选择合约文件,我这里是 MyToken.sol 然后编译,这里要等一些时间。

部署

image.png

我这里的地址是自己选的,用的是 Rinkeby 网络,你可以从 Rinkeby 水龙头 获取免费的 ETH 进行测试。建议用 Twitter 发博文,该博文只要包含你的地址就行了,然后复制链接粘贴进去,就可以收到 3 个 ETH 了。

image.png

然后填写代币的数量我这里是 4000 个,代币的名称我这里是 MyToken,代币符号我这里是 MT。

image.png


生成了一个合约号:0x7012F0D454D47facec937c9f2a82a51b6DBDC0e6

MetaMask 中添加代币

添加上面生成的合约号,代币符号,小数点位数就可以在列表中看到相关币的资产了。

image.png
image.png
image.png

交易

我用的是这个网站的提供的网络,你可以选择上面一样的节点进行测试,我这里选 Rinkeby。
image.png