pragma solidity ^0.4.16;
contract Token{
uint256 public totalSupply;
function balanceOf(address _owner) public constant returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract TokenDemo is Token {
string public name; //名称,例如"My test token"
uint8 public decimals; //返回token使用的小数点后几位。比如如果设置为3,就是支持0.001表示.
string public symbol; //token简称,like MTT
constructor () public {
totalSupply = 100000; // 设置初始总量
balances[msg.sender] = totalSupply; // 初始token数量给予消息发送者,因为是构造函数,所以这里也是合约的创建者
name = "DQB";
decimals = 8;
symbol = "DQB";
}
function transfer(address _to, uint256 _value) public returns (bool success) {
//默认totalSupply 不会超过最大值 (2^256 - 1).
//如果随着时间的推移将会有新的token生成,则可以用下面这句避免溢出的异常
require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
require(_to != 0x0);
balances[msg.sender] -= _value;//从消息发送者账户中减去token数量_value
balances[_to] += _value;//往接收账户增加token数量_value
emit Transfer(msg.sender, _to, _value);//触发转币交易事件
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns
(bool success) {
require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);
balances[_to] += _value;//接收账户增加token数量_value
balances[_from] -= _value; //支出账户_from减去token数量_value
allowed[_from][msg.sender] -= _value;//消息发送者可以从账户_from中转出的数量减少_value
emit Transfer(_from, _to, _value);//触发转币交易事件
return true;
}
function balanceOf(address _owner) public constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) public returns (bool success)
{
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
return allowed[_owner][_spender];//允许_spender从_owner中转出的token数
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
}
还是用这个合约账户部署智能合约,支付所需的花费
合约账户,代币所有者,MetaMask钱包:
0x8e0d8466ef0cc4b0a1301aa7da1a030063efa3e2
https://ropsten.etherscan.io/address/0x8e0d8466ef0cc4b0a1301aa7da1a030063efa3e2
部署合约的hash值和合约地址
TxHash: 0x52816faa48bec0d57f6c612701e48266fbf8d9969302db4a5b2fb2070d8ba200
From: 0x8e0d8466ef0cc4b0a1301aa7da1a030063efa3e2 MetaMask钱包地址
To: [Contract 0x430f90a6e47679bd5a5c41be871338af4026cba5 Created] 合约地址
合约初步部署后,应该再Code 页面下去Verify And Publish去验证合约,参考Ropsten 智能合约部署3.1去验证合约。经过验证,这次部署是失败的。最初部署时,没有留心去关注编译器,为验证和发布失败埋下了伏笔。
https://ropsten.etherscan.io/address/0x430f90a6e47679bd5a5c41be871338af4026cba5 ,为什么合约地址页面上没有代币的名称和符号呢?要在MetaMask钱包页面Add Token,将发行的Token加入到钱包中。
代币已经部署,那么如何进行代币的转账操作呢?
以太币的转账操作
输入目的地址和数量后,点击生成交易会出现原始交易和签署交易框,
有问题呢,MetaMask钱包中明明有ETH,为什么会是余额0,是因为钱包里不是真实的ETH吗?
确认交易后,MetaMask会弹出submit
点击Verify Transaction后出现,
说明这次交易还没有被挖矿。
以太币的转账没有被挖矿,或者说会失败的,那么我发行的代币呢,在这里点击Add Custom Token
Add Token也失败了 。
参考链接: