项目作者: mengjingbo

项目描述 :
数字货币
高级语言:
项目地址: git://github.com/mengjingbo/CustomCoin.git
创建时间: 2018-01-25T05:35:31Z
项目社区:https://github.com/mengjingbo/CustomCoin

开源协议:

下载


创建遵守REC20协议的数字货币并实现转账及合约验证

MetaMask钱包

MetaMask钱包是一个浏览器插件钱包,MetaMask比以太坊提供的客户端钱包要好用很多,更加的方便和快捷,使用时不需要在去同步庞大的区块数据。

点击查看MateMask钱包安装教程
点击进入MetaMask官网

准备就绪后如果账户中没有可用的测试币可按照一下步骤去获取。

MetaMask钱包

点击 ROPSTEN TEST FAUCET 按钮跳转到获取页面,向上面的账户 0x81b7… 请求测试币,点击 request 1 ether from faucet 按钮发起请求。

MetaMask钱包

得到测试币后进入到MetaMask钱包的账户页面,如下:

MetaMask钱包

说明:Rpsten Test Net 为测试网络环境,账户 Account1 的地址为:0x7A9B… ,3.000ETH 为账户余额。

编写智能合约

推荐使用 Atom 工具进行编写,也可以在 Remix 编辑器中进行编写

点击进入Remix编辑器

代币合约如下:

  1. pragma solidity ^0.4.16;
  2. contract Token {
  3. /// 总发行量
  4. uint256 public totalSupply;
  5. /// @param _owner 通过_owner参数从地址中获余额
  6. /// @return 返回余额
  7. function balanceOf(address _owner) constant public returns (uint256 balance);
  8. /// @notice 从msg.sender中发送_value到指定地址
  9. /// @param _to 收币人地址
  10. /// @param _value 要转让的总量
  11. function transfer(address _to, uint256 _value) public returns (bool success);
  12. /// @notice 在_from同意的条件下,发送_value到指定地址
  13. /// @param _from 发币人地址
  14. /// @param _to 收币人地址
  15. /// @param _value 要发送的量
  16. function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
  17. /// @param _spender 可以转账代币的账户地址
  18. /// @param _value 被批准转账的代币数量
  19. function approve(address _spender, uint256 _value) public returns (bool success);
  20. /// @param _owner 拥有代币的账户地址
  21. /// @param _spender 可以转账的账户地址
  22. /// @return 返回剩余的代币数量
  23. function allowance(address _owner, address _spender) constant public returns (uint256 remaining);
  24. event Transfer(address indexed _from, address indexed _to, uint256 _value);
  25. event Approval(address indexed _owner, address indexed _spender, uint256 _value);
  26. }
  27. contract StandardToken is Token {
  28. mapping (address => uint256) balances;
  29. mapping (address => mapping (address => uint256)) allowed;
  30. /// 转账
  31. function transfer(address _to, uint256 _value) public returns (bool success) {
  32. require(_to != address(0));
  33. require(_value <= balances[msg.sender]);
  34. require(balances[_to] + _value > balances[_to]);
  35. balances[msg.sender] -= _value;
  36. balances[_to] += _value;
  37. Transfer(msg.sender, _to, _value);
  38. return true;
  39. }
  40. function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
  41. require(_to != address(0));
  42. require(_value <= balances[_from]);
  43. require(_value <= allowed[_from][msg.sender]);
  44. require(balances[_to] + _value > balances[_to]);
  45. balances[_to] += _value;
  46. balances[_from] -= _value;
  47. allowed[_from][msg.sender] -= _value;
  48. Transfer(_from, _to, _value);
  49. return true;
  50. }
  51. function balanceOf(address _owner) constant public returns (uint256 balance) {
  52. return balances[_owner];
  53. }
  54. function approve(address _spender, uint256 _value) public returns (bool success) {
  55. allowed[msg.sender][_spender] = _value;
  56. Approval(msg.sender, _spender, _value);
  57. return true;
  58. }
  59. function allowance(address _owner, address _spender) constant public returns (uint256 remaining) {
  60. return allowed[_owner][_spender];
  61. }
  62. }
  63. contract CustomCoin is StandardToken {
  64. function () public {
  65. /// 如果ETH被发送到该地址,则返回给他
  66. revert();
  67. }
  68. /// 代币名字
  69. string public name = "Custom Coin";
  70. /// 代币精度
  71. uint8 public decimals = 18;
  72. uint256 private supplyDecimals = 1 * 10 ** uint256(decimals);
  73. /// 代币标识
  74. string public symbol = "CC";
  75. /// 代币版本
  76. string public version = 'v0.1';
  77. /// 创始人地址
  78. address public founder;
  79. /// @param supply 首次发行量
  80. function CustomCoin(uint256 supply) public {
  81. founder = msg.sender;
  82. totalSupply = supply * supplyDecimals;
  83. balances[founder] = totalSupply;
  84. }
  85. function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
  86. allowed[msg.sender][_spender] = _value;
  87. Approval(msg.sender, _spender, _value);
  88. if(!_spender.call(bytes4(bytes32(keccak256("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData)) { revert(); }
  89. return true;
  90. }
  91. function approveAndCallcode(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
  92. allowed[msg.sender][_spender] = _value;
  93. Approval(msg.sender, _spender, _value);
  94. if(!_spender.call(_extraData)) { revert(); }
  95. return true;
  96. }
  97. /// 增加总发行量接口
  98. function addTotalSupplyAmount(uint256 supply) payable public {
  99. totalSupply += supply * supplyDecimals;
  100. balances[founder] += supply * supplyDecimals;
  101. }
  102. }

将编写好的合约代码Copy到编辑器中同时刷新一下浏览器确保合约是最新,如图:

编写好的合约代码Copy到编辑器中

点击 Run 按钮,切换到 Run 视图,如下:

Run试图

描述:
  • Environment:选择要编译的环境
  • Account:代币创建者的地址
  • Gas limit:矿工费限额

开始创建代币并提交支付需要消耗的费用

点击 Create 开始创建代币合约,在 At Address 栏中,默认选择当前创建地址为

点击 SUBMT 进行提交。

查看区块记录

在MetaMask钱包中查看

在Etherscan上查看正在确认的区块记录

区块确认成功后如下:

在编辑器输入台查看确认成功后区块数据


添加创建成功后的代币

可以看到代币创建成功后由之前的3ETH减少到现在的2.996ETH,其中0.003301598ETH作为矿工费消耗掉了。

接下来添加代币,切换到 TOKENS 页,点击 ADD TOKEN , 将CC币的地址Copy到如图所示:

点击 Add 进行添加,添加成功后可看到当前账户有10000CC币

从编辑器视图查看区块状态

使用MyEtherWallet

转账

转账查询

转账成功后在Account2中添加代币,即可看到1000CC币

此时Account1中剩余9000CC币

在Etherscan上代币查询

点击进入Etherscan网站

在Etherscan上输入代币符号进行搜索,如下:

进入代币详情页进行查看

描述:
  • Total Supply:代币发行总量
  • Value per Token:代币单价(需要向Etherscan发送邮件进行添加)
  • Token Holders:代币持有人数量
  • ERC20 Contract:代币地址
  • Token Decimals:代币小数位数
  • Official Links:官方链接(需要向Etherscan发送邮件进行修改)

代币合约验证

代币验证只是为了能让其他用户更加方便的阅读合约,代币验证时填入基本信息以及Copy代币合约,具体填写如下:

Etherscan

填完后点击开始验证,验证成功如下所示:

Etherscan

查看验证后的代币资源:代币合约代码/ABI/十六进制码

Etherscan

Etherscan

代币创建,转账和到验证到此结束。