数字货币的发行

版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/q282176713/article/details/83344587

货币的分类:

1,法币 (法定货币)
2,电子货币 (将法定货币数字化)
3,数字货币 (法定货币的替代货币,也就是代币)

任何人任何组织都可以发行任何数量的货币。

智能合约的非侵入式接口

ERC20 Token 接口 :以太坊代币合约接口

什么是侵入式接口: 类必须实现接口才能使用这个接口

什么是非侵入式接口 : 只要类包含了接口的中的成员,就认为类实现了该接口

ERC20 TOken接口详解

github地址

需要实现的接口如下

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在线钱包转账,此处略。。。。。

myetherwallet地址

猜你喜欢

转载自blog.csdn.net/q282176713/article/details/83344587