下是一个接口合同,声明所需的功能和事件以符合ERC20标准:
// https://github.com/ethereum/EIPs/issues/20
contract ERC20 {
function totalSupply() constant returns (uint totalSupply);
function balanceOf(address _owner) constant returns (uint balance);
function transfer(address _to, uint _value) returns (bool success);
function transferFrom(address _from, address _to, uint _value) returns (bool success);
function approve(address _spender, uint _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint remaining);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
大部分Ethereum主要标记符合ERC20标准。
一些令牌包括描述令牌合同的进一步信息:
string public constant name = "Token Name";
string public constant symbol = "SYM";
uint8 public constant decimals = 18; // 大部分都是18
如何工作?
以下是令牌合约的一个片段,用于演示令牌合约如何维护Ethereum帐户的令牌余额
contract TokenContractFragment {
// Balances 保存地址的余额
mapping(address => uint256) balances;
// 帐户的所有者批准将金额转入另一个帐户
mapping(address => mapping (address => uint256)) allowed;
// 特定帐户的余额是多少?
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner]; //从数组中取值
}
// 将余额从所有者帐户转移到另一个帐户
function transfer(address _to, uint256 _amount) returns (bool success) {
//判断条件 发送者余额>=要发送的值 发送的值>0 接收者余额+发送的值>接收者的余额
if (balances[msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[msg.sender] -= _amount; //发送者的余额减少
balances[_to] += _amount; //接收者的余额增加
return true;
} else {
return false;
}
}
// 发送 _value 数量的token从地址 _from 到 地址 _to
// transferFrom方法用于提取工作流程,允许合同以您的名义发送令牌,例如“存入”到合同地址和/或以子货币收取费用; 该命令应该失败,除非_from帐户通过某种机制故意地授权消息的发送者; 我们提出这些标准化的API来批准:
function transferFrom(
address _from,
address _to,
uint256 _amount
) returns (bool success) {
//和上面一样的校验规则
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[_from] -= _amount;
allowed[_from][msg.sender] -= _amount; //减少发送者的批准量
balances[_to] += _amount;
return true;
} else {
return false;
}
}
// 允许_spender多次退出您的帐户,直到_value金额。 如果再次调用此函数,它将以_value覆盖当前的余量。
function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount; //覆盖当前余量
return true;
}
}
http://blog.csdn.net/diandianxiyu_geek/article/details/78082551?utm_source=gold_browser_extension