区块链大学区块链研习社区块链学习笔记

4.2 合约实战-实现标准代币接口

2018-09-26  本文已影响1人  9c0ddf06559c

4.2 合约实战-实现标准代币接口

这一节我们来看一下以太坊设置的标准的代币接口ERC-20:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

有了标准之后,例如钱包,交易所,就可以有一个统一的接口来支持所有的代币。

pragma solidity ^0.4.20;

contract ERC20Interface{
string public name; // 代币的名字
string public symbol; // 代币的一个简写
uint8 public decimals; // 返回代币的小数点位。最基本单位。
uint public totalSupply; // 总供应量

function balanceOf(address _owner) view returns (uint256 balance); // 查看余额,必须实现
function transfer(address _to, uint256 _value) returns (bool success); // 转账,必须实现
function transferFrom(address _from, address _to, uint256 _value) returns (bool success); // 从一个地址,转移到另一个地址
function approve(address _spender, uint256 _value) returns (bool success); // 授权某一个地址可操作指定数量的代币
function allowance(address _owner, address _spender) view returns (uint256 remaining); // 查看一个地址,可操纵另一个的地址的剩余金额

event Transfer(address indexed _from, address indexed _to, uint256 _value); // 转账操作触发的事件
event Approval(address indexed _owner, address indexed _spender, uint256 _value); // 授权操作触发的事件
}

下面我们来基于这个接口开发一个标准的代币

pragma solidity ^0.4.20;
contract ERC20Interface{
string public name;
string public symbol;
uint8 public decimals;
uint public totalSupply;
function transfer(address _to, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function allowance(address _owner, address _spender) view returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}


contract ERC20 is ERC20Interface{
mapping (address => uint256) public balanceOf;
// 这个映射用来保存一个账户被其他账号授权可操作的代币余额
mapping (address => mapping (address => uint256)) internal allowed;

constructor() public{
name = "GWF FIRST TOKEN";
symbol = "XIANGSHI";
decimals = 0;
totalSupply = 10000;
balanceOf[msg.sender] = totalSupply;
}


function transfer(address _to, uint256 _value) returns (bool success){
require(_to != address(0));
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);

balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;

emit Transfer(msg.sender, _to, _value);
}

function transferFrom(address _from, address _to, uint256 _value) returns (bool success){
require(_to != address(0));
require(balanceOf[_from] >= _value);
require(allowed[_from][msg.sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);

balanceOf[_from] -= _value;
balanceOf[_to] += _value;

emit Transfer(msg.sender, _to, _value);

success = true;
}

function approve(address _spender, uint256 _value) returns (bool success){
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
success = true;
}
function allowance(address _owner, address _spender) view returns (uint256 remaining){
return allowed[_owner][_spender];
}

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

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



上一篇 下一篇

猜你喜欢

热点阅读