本文首发于深入浅出区块链社区
原文链接:实现一个可管理、增发、兑换、冻结等高级功能的代币

本文主要介绍代币高级功能的实现: 代币管理、代币增发、代币兑换、资产冻结、Gas自动补充。

写在前面

在上一篇:一步步教你创建自己的数字货币(代币)进行ICO中我们实现一个最基本功能的代币,本文将在上一遍文章的基础上,讲解如果添加更多的高级功能。

实现代币的管理者

虽然区块链是去中心化的,但是实现对代币(合约)的管理,也在许多应用中有需求,为了对代币进行管理,首先需要给合约添加一个管理者。

我们来看看如果实现,先创建一个owned合约。

    contract owned {address public owner;function owned() {owner = msg.sender;}modifier onlyOwner {require(msg.sender == owner);_;}// 实现所有权转移function transferOwnership(address newOwner) onlyOwner {owner = newOwner;}}

这个合约重要的是加入了一个函数修改器(Function Modifiers)onlyOwner,函数修改器是一个合约属性,可以被继承,还能被重写。它用于在函数执行前检查某种前置条件。
关于函数修改器可进一步阅读Solidity 教程系列10 - 完全理解函数修改器

如果熟悉Python的同学,会发现函数修改器的作用和Python的装饰器很相似。

然后让代币合约继承owned以拥有onlyOwner修改器,代码如下:

contract MyToken is owned {function MyToken(uint256 initialSupply,string tokenName,uint8 decimalUnits,string tokenSymbol,address centralMinter) {if(centralMinter != 0 ) owner = centralMinter;}
}

代币增发

实现代币增发,代币增发就如同央行印钞票一样,想必很多人都需要这样的功能。

给合约添加以下的方法:

function mintToken(address target, uint256 mintedAmount) onlyOwner {balanceOf[target] += mintedAmount;totalSupply += mintedAmount;Transfer(0, owner, mintedAmount);Transfer(owner, target, mintedAmount);}

注意onlyOwner修改器添加在函数末尾,这表示只有ower才能调用这用函数。
他的功能很简单,就是给指定的账户增加代币,同时增加总供应量。

资产冻结

有时为了监管的需要,需要实现冻结某些账户,冻结后,其资产仍在账户,但是不允许交易,之道解除冻结。
给合约添加以下的变量和方法(可以添加到合约的任何地方,但是建议把mapping加到和其他mapping一起,event也是如此):

    mapping (address => bool) public frozenAccount;event FrozenFunds(address target, bool frozen);function freezeAccount(address target, bool freeze) onlyOwner {frozenAccount[target] = freeze;FrozenFunds(target, freeze);}

单单以上的代码还无法冻结,需要把他加入到transfer函数中才能真正生效,因此修改transfer函数

function transfer(address _to, uint256 _value) {require(!frozenAccount[msg.sender]);...
}

这样在转账前,对发起交易的账号做一次检查,只有不是被冻结的账号才能转账。

代币买卖(兑换)

可以自己的货币中实现代币与其他数字货币(ether 或其他tokens)的兑换机制。有了这个功能,我们的合约就可以在一买一卖中赚利润了。

先来设置下买卖价格

    uint256 public sellPrice;uint256 public buyPrice;function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {sellPrice = newSellPrice;buyPrice = newBuyPrice;}

setPrices()添加了onlyOwner修改器,注意买卖的价格单位是wei(最小的货币单位: 1 eth = 1000000000000000000 wei)

添加来添加买卖函数:

    function buy() payable returns (uint amount){amount = msg.value / buyPrice;                    // calculates the amountrequire(balanceOf[this] >= amount);               // checks if it has enough to sellbalanceOf[msg.sender] += amount;                  // adds the amount to buyer's balancebalanceOf[this] -= amount;                        // subtracts amount from seller's balanceTransfer(this, msg.sender, amount);               // execute an event reflecting the changereturn amount;                                    // ends function and returns}function sell(uint amount) returns (uint revenue){require(balanceOf[msg.sender] >= amount);         // checks if the sender has enough to sellbalanceOf[this] += amount;                        // adds the amount to owner's balancebalanceOf[msg.sender] -= amount;                  // subtracts the amount from seller's balancerevenue = amount * sellPrice;msg.sender.transfer(revenue);                     // sends ether to the seller: it's important to do this last to prevent recursion attacksTransfer(msg.sender, this, amount);               // executes an event reflecting on the changereturn revenue;                                   // ends function and returns}

加入了买卖功能后,要求我们在创建合约时发送足够的以太币,以便合约有能力回购市面上的代币,否则合约将破产,用户没法先合约卖代币。

实现Gas的自动补充

以太坊中的交易时需要gas(支付给矿工的费用,费用以ether来支付)。而如果用户没有以太币,只有代币的情况(或者我们想向用户隐藏以太坊的细节),就需要自动补充gas的功能。这个功能将使我们代币更加好用。

自动补充的逻辑是这样了,在执行交易之前,我们判断用户的余额(用来支付矿工的费用),如果用户的余额非常少(低于某个阈值时)可能影响到交易进行,合约自动售出一部分代币来补充余额,以帮助用户顺利完成交易。

先来设定余额阈值:

uint minBalanceForAccounts;function setMinBalance(uint minimumBalanceInFinney) onlyOwner {minBalanceForAccounts = minimumBalanceInFinney * 1 finney;}

finney 是货币单位 1 finney = 0.001eth
然后交易中加入对用户的余额的判断。

    function transfer(address _to, uint256 _value) {...if(msg.sender.balance < minBalanceForAccounts)sell((minBalanceForAccounts - msg.sender.balance) / sellPrice);if(_to.balance<minBalanceForAccounts)   // 可选,让接受者也补充余额,以便接受者使用代币。_to.send(sell((minBalanceForAccounts - _to.balance) / sellPrice));}

代码部署

项目的完整的部署方法参考上一篇,不同的是创建合约时需要预存余额,如图:

专栏已经有多篇文章介绍Remix Solidity IDE的使用,这里就不一一截图演示了,请大家自己测试验证。

参考文档

  • Create your own crypto-currency with ethereum

深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

转载于:https://blog.51cto.com/13457438/2117194

实现一个可管理、增发、兑换、冻结等高级功能的代币相关推荐

  1. 实现一个可管理、增发、兑换、冻结等高级功能的代币 1

    想知道更多区块链技术,请搜索[链客区块链技术问答社区] 链客,有问必答!! 实现代币的管理者 虽然区块链是去中心化的,但是实现对代币(合约)的管理,也在许多应用中有需求,为了对代币进行管理,首先需要给 ...

  2. 创建自己的ERC20加密货币(可管理、增发、兑换、冻结等高级功能的代币)

    以太坊官方原文ERC20代币标准源码:Ethereum Developer Resources | ethereum.org (注:本文是在原文的基础上,根据个人的理解,修改部分内容并添加了一些注释) ...

  3. 给代币添加高级功能-代币管理、增发、兑换、冻结等

    最新内容会更新在主站深入浅出区块链社区 原文链接:实现一个可管理.增发.兑换.冻结等高级功能的代币 本文主要介绍代币高级功能的实现: 代币管理.代币增发.代币兑换.资产冻结.Gas自动补充. 写在前面 ...

  4. IDEA不能一个窗口管理多个项目?那是你不会用!

    你身边有没有这样的Eclipse用户吐槽IDEA:"不能一个窗口管理多个项目!太不方便了!" 对于一个窗口同时管理多个项目的需求,在我们日常开发时候是经常需要的.尤其当我们在分布式 ...

  5. C语言时间管理小程序,写了一个时间管理的微信小程序

    原标题:写了一个时间管理的微信小程序 前言 以前看过<把时间当作朋友>这本书,里面有个管理时间的观点个人觉得很有用,就是养成记录自己每天的时间消耗的一个习惯,这样有助于更有效地管理自己的时 ...

  6. 在VS中建立一个易于管理的C++工程

    文章目录 1 在VS中建立一个易于管理的C++工程 1 在VS中建立一个易于管理的C++工程 为了在VS中更加方便的管理C/C++工程,我们可以工程属性进行配置,主要是修改工程的输出文件.中间文件目录 ...

  7. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  8. python实现一个商品管理_python编写商品管理

    # 1.实现一个商品管理的程序. # #输出1,添加商品 2.删除商品 3.查看商品 # 添加商品: # 商品的名称:xxx 商品如果已经存在的话,提示商品商品已经存在 # 商品的价格:xxxx 数量 ...

  9. java二分查找宿舍管理_1、任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求: (1)采用交互工作方式...

    1.任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求: (1)采用交互工作方式 2016-08-22 0 0 0 暂无评分 其他 1 积分下载 如何获取积分? 1.任务:为宿舍管理人员编写 ...

最新文章

  1. linux 挂载ISO文件以及yum源配置
  2. 第二十四章——文件管理的代码保存
  3. Apache Solr Velocity 注入远程命令执行漏洞复现 (CVE-2019-17558)
  4. git 实践(二) push的使用
  5. leetcode 387. 字符串中的第一个唯一字符(First Unique Character in a String)
  6. bat 调用class文件_Logback 配置文件这么写,TPS 提高 10 倍!
  7. 安卓怎么把一个按钮设计成梯形_常闭触点输入信号处理的电路图及PLC梯形图
  8. SpringBoot使用thymefeal出现No mapping for GET /xxx的解决办法
  9. java高校贫困生助学贷款系统ssm框架毕业设计
  10. NCC项目搭建及版本管理规范手册
  11. 如何在Elastic cloud上选择合适的Elasticsearch service
  12. 松本行弘的程序世界。
  13. 对Python 网络设备巡检脚本的实例讲解
  14. CentOS搭建tg的MTProxy代理
  15. C. Inna and Dima
  16. JavaWeb-16 (E家园项目案例1)
  17. Linux系统开启wifi热点的方法
  18. SwiftUI 问答之更改 TabView 选项卡时如何运行函数
  19. 联想Y7000P添加内存条以及固态硬盘
  20. 错失恐惧:铸造「区块链巴别塔」的原始动力

热门文章

  1. wireshark提取流量包中的文件_从Wireshark监听的数据中提取需要的数据
  2. ios找不到信任证书_ios信任苹果企业级应用
  3. Android序列化:Serializable Parcelable
  4. Android安全加密:消息摘要Message Digest
  5. Windoes上安装(升级)虚拟化VMware Workstattion Pro软件、序列码激活软件
  6. 主成分分析法_“主成分分析法”——线上讨论会等你加入
  7. 使用Apache来构建URL缩短服务
  8. leetcode 反转字符串
  9. 打印出如下图案(菱形)
  10. 什么是Hack技术?