ERC20标准

  今天我来认识ERC20标准。

 

  以太坊是一个分布式的智能合约平台,可以分发代币(Token)。目前以太坊上有超过2万个代币的智能合约,我们可以在以太坊区块链浏览器中查看:https://www.etherscan.io    

 

  如果这么多代币的标准不统一,对于其他人来查看代码是相当痛苦的,众筹的人也就没有办法来检查代币分发的是否合理,也没有办法做到多种钱包的兼容。

 

  所以才推出了一种以太坊代币的标准:ERC20标准。

 

ERC20标准涵盖了哪些内容?

 

  我们可以在https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md查看ERC20代币的标准API。

 

  ERC实际上就是 以太坊请求协议。后面的20相当于是个编号,类似的还有ERC721、ERC827等等协议。

 

Method

在Method目录下面我们可以看到一些方法,所有的ERC20代币都是按照下面这些方法来定义的。下面我们讲解一下每个方法的作用。

 

1.name

function name() constant returns (string name)

返回string类型的ERC20代币的名字,例如:StatusNetwork

 

2.symbol(符号)

function symbol() constant returns (string symbol)

返回string类型的ERC20代币的符号,也就是代币的简称,例如:SNT。

 

3.decimals(小数)

function decimals() constant returns (uint8 decimals)

支持几位小数点后几位。如果设置为3。也就是支持0.001表示。

 

4.totalSupply

function totalSupply() constant returns (uint256 totalSupply)

发行代币的总量,可以通过这个函数来获取。所有智能合约发行的代币总量是一定的,totalSupply必须设置初始值。如果不设置初始值,这个代币发行就说明有问题。

 

5.balanceOf

function balanceOf(address _owner) constant returns (uint256 balance)

输入地址,可以获取该地址代币的余额,注意不是以太币的余额。

 

6.transfer

function transfer(address _to, uint256 _value) returns (bool success)

转账功能,调用者调用transfer函数将自己_value数量的token转账给 _to

 

7.approve(批准)

function approve(address _spender, uint256 _value) returns (bool success)

批准_spender账户从自己的账户转移_value个token。可以分多次转移。

 

8.transferFrom

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

与approve搭配使用,approve批准之后,_spender调用transferFrom函数来转移_value个token到 _to的账户中。

9.allowance(限额)

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

查看_owner授权给_spender的剩余token数量。

(owner:主人;所有者        spender:花钱者)

 

approve、transferFrom及allowance解释:

账户A有1000个ETH,想允许B账户随意调用100个ETH。

A账户按照以下形式调用approve函数approve(B,100)。

当B账户想用这100个ETH中的10个ETH给C账户时,则调用transferFrom(A, C, 10)。

这时调用allowance(A, B)可以查看B账户还能够调用A账户多少个token。

 

Events

1.Transfer

event Transfer(address indexed _from, address indexed _to, uint256 _value)

当成功转移token时,一定要触发Transfer事件

 

2.Approval

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

当调用approval函数成功时,一定要触发Approval事件

 

简易ERC20代码示例:

pragma solidity ^0.4.17;contract simpletokenstruct{        string public name;      //定义公开 字符串类型 name    string public simple;    //定义公开 字符串类型 simple    uint8 public decimals;   //定义公开 8字节无符号整型 simple    uint256 public totalSupply; //定义公开 256字节无符号整型 totalSupply            //function balanceOf(address _owner) public view returns (uint256 balance){    //        //}        function transfer(address _to, uint256 _value) public returns (bool success){            }    //定义函数transfer  接受地址_to和 256字节无符号整型_value传参 并返回成功        function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){            }    //定义函数transferFrom  接受地址_from,地址_to和256字节无符号整型_value传参 并返回成功        function approve(address _spender, uint256 _value) public returns (bool success){            }    //定义函数approve  接受地址_spender,和256字节无符号整型_value传参 并返回成功    function allowance(address _owner, address _spender) public view returns (uint256 remaining){            }    //定义函数allowance  接受地址_owner,和地址_spender传参 并返回256字节无符号整型 remaining    event Transfer(address indexed _from, address indexed _to, uint256 _value);    //定义时间Transfer 当出现地地址_from,_to和256字节无符号整型 _value触发    event Approval(address indexed _owner, address indexed _spender, uint256 _value);    //定义时间Transfer 当出现地地址_owner,_spender和256字节无符号整型 _value触发}contract simpletoken is simpletokenstruct{//合约 simpletoken继承合约simpletokenstruct内容        constructor() public{        name='xiong';    //将'xiong'赋值给name        simple='XIO';      //将'XIO'赋值给simple        decimals=1;        //将1赋值给decimals          totalSupply=1000;  //将1000赋值给totalSupply        balanceOf[msg.sender]=totalSupply; //将totalSupply的值赋值给上个发送方     }       mapping(address=>uint256) public balanceOf;   //定义一个映射balanceOf 地址=>无符号整型    mapping(address=>mapping(address=>uint256)) internal approvemapping;   //定义一个映射approvemapping 地址=>映射(地址=>无符号整型)        function transfer(address _to, uint256 _value) public returns (bool success){         //定义函数transfer  接受地址_to和 256字节无符号整型_value传参 并返回成功        require(_to != address(0)); //判断_to是否为空地址 是结束执行 否继续执行        require(balanceOf[msg.sender]>=_value);//判断_value值是否小于等于1000        require(balanceOf[_to]+_value>=balanceOf[_to]);//判断传参地址余额+传参值是否大于等于参地址余额        //判断完成        balanceOf[msg.sender]-=_value;  //将balanceOf[msg.sender]减去传参值_value        balanceOf[_to]+=_value;   //将传参_to地址余额加上传参值_value                emit Transfer(msg.sender,_to,_value);//触发事件        success = true;             }                function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){         //定义函数transferFrom  接受地址_from,地址_to和256字节无符号整型_value传参 并返回成功        require(_to != address(0));//判断_to是否为空地址 是结束执行 否继续执行        require(balanceOf[_from]>=_value);//判断_value值是否小于等于地址_from余额        require(approvemapping[_from][msg.sender]>=_value);//判断_value值是否小于等于地址_from对应的地址msg.sender对应的值        require(balanceOf[_to]+_value>=balanceOf[_to]);//判断传参地址_to对应的余额是否小等于_value传参的值+传参地址_to对应的余额                balanceOf[_from]-=_value;//传参地址_from的余额-传参_value的值        balanceOf[_to]+=_value;//传参地址_to的余额+传参_value的值                success = true;    }        function approve(address _spender, uint256 _value) public returns (bool success){        //定义函数approve接受地址_spender和256字节无符号整型_value传参 返回success        approvemapping[msg.sender][_spender]=_value;//将传参的_value值赋值给msg.sender对应的_spender对应的地址        emit Approval(msg.sender,_spender,_value);//触发事件        success = true;    }        function allowance(address _owner, address _spender) public view returns (uint256 remaining){        //定义函数allowance接受地址 _owner和地址 _spender传参 返回256字节无符号整型remaining        return approvemapping[_owner][_spender];//返回owner对应的_spender对应的值    }        event Transfer(address indexed _from, address indexed _to, uint256 _value);//触发事件    event Approval(address indexed _owner, address indexed _spender, uint256 _value);//触发事件    }

拥有erc20代币——在测试网络上发布

 

使用metamask发布自己的代币

1.在Chrome中安装metamask插件

2.注册之后可以看到自己的以太坊主网账号了,但是我们不用这个

3.切换到Kovan测试网络

3.没钱时,点

存入->

测试水管获取ether->

 

4.在remix里选择injected web3,会自动关联metamask

可以看到账户变成了我们自己的账户

5.再部署时就会弹出metamask对话框,选择一下gas fee然后确认即可

gas fee 就是付给矿工的钱让他记录数据,太低了没人干活。但是这里是测试网络钱不是钱,所以低一点也无所谓

6.等待发布

7.之后,便可以看到我们的交易哈希等等了。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值