实现代币的管理者
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
实现代币的管理者
虽然区块链是去中心化的,但是实现对代币(合约)的管理,也在许多应用中有需求,为了对代币进行管理,首先需要给合约添加一个管理者。
我们来看看如果实现,先创建一个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 amount require(balanceOf[this] >= amount);
// checks if it has enough to sell balanceOf[msg.sender] += amount; // adds the amount to buyer’s balance balanceOf[this] -= amount; // subtracts amount from seller’s balance Transfer(this, msg.sender, amount);
// execute an event reflecting the change return amount; // ends function and returns}function sell(uint amount) returns (uint revenue){ require(balanceOf[msg.sender] >= amount); // checks if the sender has enough to sell balanceOf[this] += amount; // adds the amount to owner’s balance balanceOf[msg.sender] -= amount; // subtracts the amount from seller’s balance revenue = amount * sellPrice; msg.sender.transfer(revenue);
// sends ether to the seller: it’s important to do this last to prevent recursion attacks Transfer(msg.sender, this, amount);
// executes an event reflecting on the change return revenue; // ends function and returns}
加入了买卖功能后,要求我们在创建合约时发送足够的以太币,以便合约有能力回购市面上的代币,否则合约将破产,用户没法先合约卖代币。
实现Gas的自动补充
以太坊中的交易时需要gas。而如果用户没有以太币,只有代币的情况,就需要自动补充gas的功能。这个功能将使我们代币更加好用。自动补充的逻辑是这样了,在执行交易之前,我们判断用户的余额,如果用户的余额非常少可能影响到交易进行,合约自动售出一部分代币来补充余额,以帮助用户顺利完成交易。
先来设定余额阈值:
uint minBalanceForAccounts; functionsetMinBalance(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));}
代码部署
不同的是创建合约时需要预存余额,如图:
相关文章:

Oracle数据库基本操作(二) —— 视图、序列、索引、同义词
一、视图(Views)与 同义词 1、视图:实际上是对查询结果集的封装,视图本身不存储任何数据,所有的数据都存放在原来的表中; 在逻辑上可以把视图看作是一张表 2、作用: 封装查询语句,简化复杂的查询需求屏蔽表中的细节3、语法: create [or replace] view 视…
iOS crash日志分析
项目集成talkingdata收集到的crash日志, 看到那些日志时自己也是很崩溃, 全是内存地址, 根本搞不懂项目到底crash到了那里, 比如这样:自己在网上找了很多方法, 以下是自己最后所用到的方法(心累): 1, 首先拿到.dSYM 文件, 步骤:XCode中的Window -> Organizer -> 找到App …

Xamarin Android项目运行失败
Xamarin Android项目运行失败 错误信息:Build Failed: MonoDroid does not support running the previous version. Please ensure your solution builds before running or debugging it.这是由于由于项目生成失败,并找不到以前编译的结果。这时&#…

logging模块
import logging from conf import settingsdef logger(log_type):# 生成 logger 对象logger logging.getLogger(log_type)logger.setLevel(settings.LOG_LEVEL)# 生成handler对象,向文件输出日志信息log_file "%s/log/%s.log" % (settings.BASE_DIR, lo…

iOS 模糊效果相关
项目中一直有使用到模糊处理, 例如图片的高斯模糊, 一直使用的代码如下: // 内部方法,核心代码,封装了毛玻璃效果 参数:半径,颜色,色彩饱和度 - (UIImage *)imgBluredWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturati…

CDN的原理及对SEO的影响
http://www.williamlong.info/archives/4059.html CDN的概念最早于1995年由美国麻省理工大学提出,是一套能够实现用户就近访问的网络解决方案。具体方法是:采用智能路由和流量管理技术,将用户的访问请求指向 CDN网络中健康且响应最快的CDN节点…

JavaScript学习笔记 - 入门篇(1)- 准备
为什么学习JavaScript 一、你知道,为什么JavaScript非常值得我们学习吗? 所有主流浏览器都支持JavaScript。目前,全世界大部分网页都使用JavaScript。它可以让网页呈现各种动态效果。做为一个Web开发师,如果你想提供漂亮的网页、令…

iOS关于像素的适配
项目中很多地方会用到分割线, 一般设置为1.0, 但是在不同的机型上这个1.0显示的效果是不同的,1x的机型上正常, 2x和3x的机型上显示的就会很粗, 影响适配, 困扰很久后得到了以下解决办法, 在此记录一下: 1.0/UIScreen.mainScreen.scale

非对称加密中公钥
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 数字签名是公钥密码体系中签名验证功能的一个应用。其目的是保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。其中数字签名是个加密…

bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】
这么简单的dp我怎么没想到x2 f为从这个点出发后回到这个点最多能走过的点,g为从这个点出发后不回到这个点最多能走过的点,注意g有两种转移:g[u][k]max(g[u][k],f[u][k-j-1]g[e[i].to][j])是在e[i].to这个子树前走了一棵子树再回来,…

spring WebServiceTemplate 调用 axis1.4 发布的webservice
前言: 最近在开发中需要调用对方的 webservice服务,按照现有的技术,本应该是一件很简单的事情,只需要拿到wsdl文件,生成客户端代码即可,但是,对方的webservice服务是06年用axis1.4生成发布的&am…

iOS 获取Assets中的启动页
app启动时先进入一个广告页, 若无广告图则用启动页占位, 一直为这个占位图的适配烦恼, 最近查资料终于找到了结果, 现记录一下: - (UIImage *)getLaunchImage { CGSize viewSize [UIScreen mainScreen].bounds.size; NSString *viewOrientation "Portrait";//方向…

SunlightChain 区块链宣言
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 SunlightChain 区块链宣言 区块链技术的应用必将颠覆现在过度依赖于中心的经济模式,它与生俱来的开放、共享、去中心化等特点极大地提高…

Ajax跨域:Jsonp原理解析
推荐先看下这篇文章:JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Sam…

iOS 微信SDK1.8.6后需要UniversalLink解决方案及采坑记录
项目最初因审核原因,一直使用iOS原生分享, 最近因项目需求要求, 接入微信分享, 以为和原来的没有区别, 但是接入时才发现改动的地方还是挺多的, 主要是需要配置UniversalLink和提包时的一些问题, 在此做一下记录 UniversalLink配置步骤 1.制作apple-app-site-association文件…

GO语言编程基础-复合类型结构体
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 1 结构体类型 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独…

【BZOJ1015】【JSOI2008】星球大战 并查集
题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数。 \(q\leq n\leq 400000,m\leq 200000\) 题解 我们可以用并查集维护连通块个数,可惜并查集…

python基于Django框架编译报错“django.core.exceptions.ImproperlyConfigured”的解决办法?...
下面是我具体遇到的问题和解决方法: 错误详细信息: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_…

iOS 异形tabBar, 中间item凸起
今年的新项目中做了tabbar的相关处理, 在此记录一下 自己做了一demo, 效果如图所示 demo地址如下: https://github.com/wyon1314/TabBarDemo

以太坊系统账户
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 在以太坊系统中,状态是由被称为“账户”(每个账户由一个20字节的地址)的对象和在两个账户之间转移价值和信息的状…

Django-缓存的配置
缓存的介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.缓存是将一些常…

swift中单例的创建及销毁
最近项目重构时使用了oc和swift的混编,遇到了关于单例的创建及销毁,这里记录一下 //创建单例private static var _sharedInstance: ViewController?objc class func sharedInstance() -> ViewController {guard let instance _sharedInstance else …

区块链技术名词简介
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 零知识证明 零知识证明指证明者能在不向验证者提供任何有用的信息下,使验证者相信某个论断是正确的。零知识证明实质是一种涉及两方或更…

Linux篇---ftp服务器的搭建
一、前述 企业中linux搭建ftp服务器还是很实用的,所以本文针对centoos7和centoos6搭建服务器教程做个总结。 二、具体 1、显示如下图则表示已安装 vsftp软件。如果未显示则需要安装vsftpd软件。 如果没有则通过yarm源进行安装 yum install -y vsftpd 2、安装完成之后…

Python 的property的实现 .
描述符.就是 将某种特殊类型①的类的实例指派给另一个类的属性 ①只要实现一下三种方法的其中一个就是特殊类型. __get__(self,instance,owner) -用于访问属性,他返回属性的值. __set__(self,instance,value) -将在属性分配操作时使用,不返回任何内容. __delete__(self,instanc…

Swift中NSRange和Range的转换
最近项目再使用swift重构,遇到Range和NSRange转换的问题,这里记录下: 因为要使用NSRange,所以有了下面这段代码,将String转换为NSString后调用 range(of searchString: String) -> NSRange 这种处理方法其实就是使…

C++基础技术简介
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 容器 容器用于存储数据元素,是由长度可变的同类型的元素构建成的序列。 Vector:用于快速定位任意元素及主要在元素序列的尾…

eclipse快捷键操作
【Ct rlT】 搜索当前接口的实现类 1. 【ALT /】 此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类、方法和属性的名字时,多体验一下【ALT /】快捷键带来的好处吧。 2. 【Ct rlO】…

vue 项目配置sass
1.运行npm install node-sass --save-dev npm install sass-loader --save-dev 2.打开build文件夹下面的webpack.base.config.js module: {rules: [...(config.dev.useEslint ? [createLintingRule()] : []),{test: /\.scss$/,loaders: ["style", "css", …

获取App Store中App的ipa包
俗话说好记性不如烂笔头,每次需要看别的App中某些功能的实现方案时总去查资料太麻烦,所以这里记录下如何获取App Store中App的ipa包 主要使用的工具为Apple Configurator 2这款软件: 具体操作流程如下: 1.首先在iPhone设备上安装…