以太坊--token增加、冻结、销毁以及增加所有者

版权声明:转载请注明出处 https://blog.csdn.net/Booboochen/article/details/82187745

github首页:区块链学习有用链接和25本区块链书籍可免费阅读

  • 地址:https://github.com/cancerts/study-blockchain-referrence 点击这

第二节 我们实现了标准和ERC20合约,而且部署在我们实际的以太坊测试网络中了,但是我们只实现最简单的功能,这一小节我们来实现一些比较高级的功能,增加代币的所有者,增发总量,减少总量,以及冻结和销毁某个账号

第一步:增加token的所有者

首先,我们新建一个owner.sol文件,保存我们的owner信息

pragma solidity ^0.4.20;

contract owner{
    
    address public owner ;
    
    constructor() public{
        owner=msg.sender;
    }
    
    modifier onlyOwner{
        require(msg.sender==owner );
        _;
    }
    
    function transferOwnership(address newOwner) public onlyOwner{
        owner =newOwner;
    }
}

第二步:增加代币发行总量

一般来说我们的总量发行是固定的,但是有些时候我们的预期太小了,我们任然需要增发我们的代币

contract addSupply is erc20,owner {
    
    event ChangeSupply(uint mount);
   
    constructor(string _name) erc20(_name) public {
        
    }
    
    function min(address target ,uint mount )public onlyOwner {
        totalSupply+=mount;
        balanceOf[target]+=mount;
        
        emit ChangeSupply(mount);
        emit Transfer(0,target,mount);
        
    }
    
}

第三步:冻结某个账户

我们冻结了某个账户,并不是销毁了账户的钱,只是限制了该账户不可以在继续进行转账操作了

contract addSupply is erc20,owner {
   
    event IsFrozenAccount(address target,bool isFrozen);
    mapping(address=>bool)public frozenAccount;
    
    constructor(string _name) erc20(_name) public {
        
    }

//冻结账户
    function frozenAccount(address target,bool isFrozen)public onlyOwner{
        frozenAccount[target]=isFrozen;
        emit IsFrozenAccount(target,isFrozen);
    }
    //冻结账户的交易
    function transfer(address _to, uint256 _value)public returns (bool success){
        require(_to !=address(0));
        require(!frozenAccount[msg.sender]);
        require(balanceOf[msg.sender]>=_value);
        require(balanceOf[_to]+_value>=balanceOf[_to]);
        
        balanceOf[msg.sender]-=_value;
        balanceOf[_to]+=_value;
        
        emit Transfer(msg.sender,_to,_value);
        return true;
        
    }

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

}

 第四步:销毁某个账户的代币

一般来说,是不允许的,不可以随便更改,没有这个权限,注意一下奥

function burn(uint256 _value) public returns(bool success){
        require(balanceOf[msg.sender]>=_value);
        totalSupply-=_value;
        balanceOf[msg.sender]-=_value;
        
        emit Burn(msg.sender,_value);
        return true;
    }
    
    function burnFrom(address _from,uint256 _value)public returns(bool success){
        require(balanceOf[_from]>=_value);
        require(allowed[_from][msg.sender]>=_value);
        totalSupply-=_value;
        balanceOf[msg.sender]-=_value;
        allowed[_from][msg.sender]-=_value;
        
        emit Burn(msg.sender,_value);
        return true;
    }

第五步:部署合约

检查相应的功能,我就不演示了,看过之前的应该都会把,我就把完整代码给大家吧

pragma solidity ^0.4.20;

import './erc20.sol';
import './owner.sol';

contract addSupply is erc20,owner {
    
    event ChangeSupply(uint mount);
    event IsFrozenAccount(address target,bool isFrozen);
    event Burn(address target,uint amount);
    mapping(address=>bool)public frozenAccount;
    
    constructor(string _name) erc20(_name) public {
        
    }
    
    function min(address target ,uint mount )public onlyOwner {
        totalSupply+=mount;
        balanceOf[target]+=mount;
        
        emit ChangeSupply(mount);
        emit Transfer(0,target,mount);
        
    }
    
    function frozenAccount(address target,bool isFrozen)public onlyOwner{
        frozenAccount[target]=isFrozen;
        emit IsFrozenAccount(target,isFrozen);
    }
    
    function transfer(address _to, uint256 _value)public returns (bool success){
        require(_to !=address(0));
        require(!frozenAccount[msg.sender]);
        require(balanceOf[msg.sender]>=_value);
        require(balanceOf[_to]+_value>=balanceOf[_to]);
        
        balanceOf[msg.sender]-=_value;
        balanceOf[_to]+=_value;
        
        emit Transfer(msg.sender,_to,_value);
        return true;
        
    }

    function transferFrom(address _from, address _to, uint256 _value)public returns (bool success){
        require(_to!=address(0));
        require(!frozenAccount[_from]);
        require(allowed[_from][msg.sender]>=_value);
        require(balanceOf[msg.sender]>=_value);
        require(balanceOf[_to]+_value>=balanceOf[_to]);
        
        allowed[msg.sender][_from]-=_value;
        balanceOf[msg.sender]-=_value;
        balanceOf[_to]+=_value;
        return true;
    }
    
    function burn(uint256 _value) public returns(bool success){
        require(balanceOf[msg.sender]>=_value);
        totalSupply-=_value;
        balanceOf[msg.sender]-=_value;
        
        emit Burn(msg.sender,_value);
        return true;
    }
    
    function burnFrom(address _from,uint256 _value)public returns(bool success){
        require(balanceOf[_from]>=_value);
        require(allowed[_from][msg.sender]>=_value);
        totalSupply-=_value;
        balanceOf[msg.sender]-=_value;
        allowed[_from][msg.sender]-=_value;
        
        emit Burn(msg.sender,_value);
        return true;
    }
}

 好了,现在你就实现了代币了高级功能了,演示一下,是不是很牛叉

猜你喜欢

转载自blog.csdn.net/Booboochen/article/details/82187745