版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/q282176713/article/details/83344587
货币的分类:
1,法币 (法定货币)
2,电子货币 (将法定货币数字化)
3,数字货币 (法定货币的替代货币,也就是代币)
任何人任何组织都可以发行任何数量的货币。
智能合约的非侵入式接口
ERC20 Token 接口 :以太坊代币合约接口
什么是侵入式接口: 类必须实现接口才能使用这个接口
什么是非侵入式接口 : 只要类包含了接口的中的成员,就认为类实现了该接口
ERC20 TOken接口详解
需要实现的接口如下
contract ERP20Interface {
//代币名称
string name public;
//function name() view returns (string name)
//货币符号
string symbol public ;
//function symbol() view returns (string symbol)
//代币的小数位数 也可以看做代币的最小单位,相当与以太坊的wei
uint8 decimals public;
//function decimals() view returns (uint8 decimals)
//发行的数量
function totalSupply() view returns (uint256 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);
//成功调用approve函数触发的事件
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
实现例子
contract JackyCoin {
//代币名称
string public name ;
//function name() view returns (string name)
//货币符号
string public symbol ;
//function symbol() view returns (string symbol)
//代币的小数位数 也可以看做代币的最小单位,相当与以太坊的wei
uint8 public decimals = 18;
//function decimals() view returns (uint8 decimals)
//代币发行的总量
uint256 internal _totalSupply;
//存储所用户的余额
mapping(address => uint256) public balanceOf;
//存储某个用户对另一个用户允许最多的转账多少代币
mapping(address => mapping(address => uint256)) internal _allowance;
//发行的数量
//function totalSupply() view returns (uint256 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);
//成功调用approve函数触发的事件
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
//指定代币总量,token的名字,token的符号
function JackyCoin(uint256 initSupply,string tokenName,string tokenSymbol){
//初始化为最小的单位
_totalSupply = initSupply * 10 ** uint256(decimals);
balanceOf[msg.sender] = _totalSupply;
name = tokenName;
symbol = tokenSymbol;
}
//通用的转账函数
function _transfer(address _from , address _to, uint _value) internal {
//校验参数 转入账户不能为0
require(_to != 0x0);
//余额是否足够
require(balanceOf[_from] >= _value);
//转账金额必须大于0
require(balanceOf[_to] + _value > balanceOf[_to]);
//转账前后池内总数不变
uint previousBalances = balanceOf[_from] + balanceOf[_to];
//开始转账
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
//触发事件
emit Transfer(_from,_to,_value);
}
//获取代币发行总量
function totalSupply() view returns (uint256) {
return _totalSupply;
}
//当前账户给指定账户转账
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender,_to,_value);
}
//从一个账户向另一个账户转账
function transferFrom(address _from , address _to , uint256 _value) payable returns (bool success){
//判断转账金额是够超出了范围,也就是判断额度是够满足
require(_value <= allowance(_from,_to));
_transfer(_from, _to , _value);
//消费额度
_allowance[_from][_to] -= _value;
return true;
}
//获取_owner指定的账户向_spender指定的账户允许的最大转账金额
function allowance(address _owner , address _spender ) view returns (uint256 remaining){
remaining = _allowance[_owner][_spender];
}
//设置当前账户向_spender指定的账户允许的最大转账金额
function approve(address _spender, uint256 _value) public returns(bool){
_allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender,_spender,_value);
return true;
}
}
利用js来监听合约中的事件
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
var abi = JSON.parse(fs.readFileSync('JackyCoin_sol_JackyCoin.abi').toString());
var contract = web3.eth.contract(abi);
var instance = contract.at(contractAddress);
//获取事件
var eventTransfer = instance.Transfer();
var eventApproval = instance.Approval();
eventTransfer.watch(function(e,result){
if(!e){
console.log("from: " + result.args._from);
console.log("to: " + result.args._to);
console.log("value: " + result.args._value);
}
});
eventApproval.watch(function(e,result){
if(!e){
console.log("owner: " + result.args._owner);
console.log("spender: " + result.args._spender);
console.log("value: " + result.args._value);
}
});
代币部署
部署网络:测试网络
点击部署
等待挖矿后就可以看到部署的合约了
部署成功后,可以在metaMask钱包token上输入合约的地址,就可以看到我们代币了
访问:
https://ropsten.etherscan.io/token/合约地址
就可以看到我们代币的详细信息了
也可以使用metamask
或者是myetherwallet
在线钱包转账,此处略。。。。。