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;
}扫描二维码关注公众号,回复: 2947058 查看本文章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;
}
}
好了,现在你就实现了代币了高级功能了,演示一下,是不是很牛叉