国际比特币大盘软件:以太坊开发学习-第一个生产级别ERC20合约

  今天,我们来讲讲如何编写一个实际可用,并且没有安全漏洞的生产级别的ERC20代币合约,当然很多人通过百度可以搜索到一堆发币的合约代码,但是大部分都是有安全漏洞的,达不到生产级别。

  

  废话不少,先上完整代码:

  pragma solidity ^0.4.24;

  library SafeMath {

  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c)

  { if (_a==0) { return 0;

  }

  c=_a * _b;

  assert(c / _a==_b); return c;

  }

  function div(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a / _b;

  }

  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {

  assert(_b <=_a); return _a - _b;

  }

  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {

  c=_a + _b;

  assert(c >=_a); return c;

  }

  }

  contract ERC20 {

  uint256 public totalSupply; function balanceOf(address _who)

  public view returns (uint256);

  function allowance(address _owner, address _spender) public view returns (uint256);

  function transfer(address _to, uint256 _value) public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);

  function transferFrom(address _from, address _to, uint256 _value) public returns (bool);

  event Transfer( address indexed from, address indexed to, uint256 value);

  event Approval(address indexed owner, address indexed spender, uint256 value);

  event Burn(address indexed from, uint256 value);

  }contract StandardToken is ERC20 {

  using SafeMath for uint256;

  mapping(address=> uint256) balances;

  mapping (address=> mapping (address=> uint256)) internal allowed;

  function balanceOf(address _owner) public view returns (uint256)

  { return balances[_owner];

  }

  function allowance(address _owner, address _spender) public view returns

  (uint256){ return allowed[_owner][_spender];

  }

  function transfer(address _to, uint256 _value) public returns

  (bool) { require(_value <=balances[msg.sender]); require(_to !=address(0));

  balances[msg.sender]=balances[msg.sender].sub(_value);

  balances[_to]=balances[_to].add(_value);

  emit Transfer(msg.sender, _to, _value); return true;

  } function approve(address _spender, uint256 _value) public returns (bool) {

  allowed[msg.sender][_spender]=_value;

  emit Approval(msg.sender, _spender, _value); return true;

  }

  function transferFrom(address _from, address _to, uint256 _value)

  public returns (bool){ require(_value <=balances[_from]);

  require(_value <=allowed[_from][msg.sender]); require(_to !=address(0));

  balances[_from]=balances[_from].sub(_value);

  balances[_to]=balances[_to].add(_value);

  allowed[_from][msg.sender]=allowed[_from][msg.sender].sub(_value);

  emit Transfer(_from, _to, _value); return true;

  }

  function increaseApproval(address _spender, uint256 _addedValue) public returns (bool) {

  allowed[msg.sender][_spender]=(

  allowed[msg.sender][_spender].add(_addedValue));

  emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true;

  }

  function decreaseApproval(address _spender, uint256 _subtractedValue) public returns (bool) {

  uint256 oldValue=allowed[msg.sender][_spender]; if (_subtractedValue >=oldValue) {

  allowed[msg.sender][_spender]=0;

  } else {

  allowed[msg.sender][_spender]=oldValue.sub(_subtractedValue);

  }

  emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true;

  }

  function burn(uint256 _value) public returns (bool success)

  { require(balances[msg.sender] >=_value);

  balances[msg.sender]=balances[msg.sender].sub(_value);

  totalSupply=totalSupply.sub(_value);

  emit Burn(msg.sender, _value); return true;

  }

  function burnFrom(address _from, uint256 _value) public returns (bool success)

  { require(balances[_from] >=_value);

  require(_value <=allowed[_from][msg.sender]);

  balances[_from]=balances[_from].sub(_value);

  allowed[_from][msg.sender]=allowed[_from][msg.sender].sub(_value);

  totalSupply=totalSupply.sub(_value);

  emit Burn(_from, _value); return true;

  }

  }

  contract MyTokenERC20 is StandardToken { // Public variables of the token

  string public name="My First ERC20 Token";

  string public symbol="MFET";

  uint8 constant public decimals=18;

  uint256 constant public initialSupply=21000000; constructor() public {

  totalSupply=initialSupply * 10 ** uint256(decimals);

  balances[msg.sender]=totalSupply;

  emit Transfer(address(0), msg.sender, totalSupply);

  }

  }

  这些代码是什么意思呢?

  一、ERC20(EIP-20)说明

  ERC20是一个标准的token接口规范:A standard interface for tokens

  我们来简单介绍下这个接口规范,规范里面定义了9个方法和2个事件

  9个方法包括:

  返回token的名字

  function name() view returns (string name)

  返回token的代码

  function symbol() view returns (string symbol)

  返回token的小数点位数

  function decimals() view returns (uint8 decimals)

  返回供应总量

  unction totalSupply() view returns (uint256 totalSupply)

  查询某个地址的余额

  function balanceOf(address _owner) view returns (uint256 balance)

  给某个地址转账,如果余额不足,该方法必须抛出异常而不是返回false

  function transfer(address _to, uint256 _value) returns (bool success)

  从from地址转账到to地址,该方法用于委托给其他合约代理你转账

  function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

  允许多次从您的帐户委托到_spender地址,最高_value金额。如果再次调用此函数,则会覆盖当前允许值_value

  function approve(address _spender, uint256 _value) returns (bool success)

  返回_spender仍允许退出的金额_owner

  function allowance(address _owner, address _spender) view returns (uint256 remaining)

  2个事件包括:

  转移令牌时必须触发,包括零值转移,注意:创建新token的合约应该触发Transfer事件,即从_from地址设置为0x0创建token的时候

  event Transfer(address indexed _from, address indexed _to, uint256 _value)

  委托转账必须触发

  event Approval(address indexed _owner, address indexed _spender, uint256 _value)

  二、代码解释

  代码包括几部分:

  安全的数学计算库

  contract类 ERC20,主要针对ERC20规范定义方法和事件

  contract类StandardToken继承ERC20,定义具体的方法实现

  contract 类MyTokenERC20集成StandardToken,定义名词,代号,总供应量和创建token

  更多专栏文章:http://www.qukuaiwang.com.cn/zhuanlan

  声明:本文由入驻区块网专栏作者撰写,观点仅代表作者本人,绝不代表区块网赞同其观点或证实其描述。

文章内容系本站作者个人观点,不代表本站对其观点赞同或支持,文章的版权归该作者所有。如需转载,请注明文章来源。本文地址:http://www.cis.net.cn/kejikuaixun/43880.html
留言与评论(共有 条评论)
验证码:

最新文章

以太坊开发学习-第一个生产级别ERC20合约

科技快讯
今天,我们来讲讲如何编写一个实际可用,并且没有安全漏洞的生产级别的ERC20代币合约,当然很多人通过百度可以搜索到一堆发币的合约代码,但是大部分都是有安全漏洞的,达不到生产级别。废话不少,先上完整代码:pragmasolidity^0.4.24;librarySafeMath{functionmul(uint256_a,uint256_b)internalpureretu

央行数字货币研究所正式挂牌

科技快讯
综合多家国内媒体消息,央行数字货币研究所已于北京德胜门附近某国际大厦内正式挂牌。据了解,该大厦主要以中钞公司旗下众多子公司为主。央行数字货币研究所位于大厦9楼,与中钞鉴定中心同层。根据此前央行公布的信息,数字货币研究所是央行旗下专门从事数字货币的技术和应用可能的研究机构。人民银行科技司原副司长姚前出任数字货

区块链应用新爆发点——平台经济

科技快讯
平台经济是指一种虚拟或真实的交易场所,平台本身不生产产品,但可以促成双方或多方供求之间的交易,收取恰当的费用或赚取差价来获得收益的一种商业模式。通俗的理解,平台经济就是开一个大市场,让大家来市场里面交易,市场收取摊位费

区块链简介-什么是共公链

科技快讯
公共链对外公开,用户不用注册就能匿名参与,无需授权即可访问网络和区块链。节点可选择自由出入网络。公共链上的区块可以被任何人查看,任何人也可以在公共链上发送交易,还可以随时参与网络上形成共识的过程,即决定哪个区块可以加入区块链并记录当前的网络

ERC1400、ERC1404及ERC1410三大标准简介

科技快讯
随着监管部门加强对区块链及密码货币生态的监管,关于ICO的狂野时代已经成为了过去时,这意味着区块链通证的发行行为很可能属于证券法的监管范围。在这一背景下,为了让区块链创业公司向投资者提供符合监管的金融产品,而不违反证券法,证券通证发行(STO)解决方案应运而生。与功能型通证不同的是,证券通证代表的是一种资产的部分或完全所

生态系统的功能主要是(生态系统的三大功能)

科技快讯
最近,市江干区诞生了一个以为主题的孵化器――链+孵化器。这是一家专注于区块链基础设施建设、人才培养、技术服务的孵化器。链+孵化器该孵化器当前使用面积达1500平方米,可以同时容纳18家公司进行日常办公。目前,该孵化器拥有一个配备大型液晶屏的放映室,一

区块链的大崩溃

科技快讯
前言:对区块链未来走向的不同判断,会直接影响不同人的投资决策。有人认为是大熊,还没到底,会持续很长时间,需要非常谨慎。有人则认为现在已经调整差不多,小幅崩溃属于正常,应该持续在场内。大家可以分享自己的看法。对于区块链市场,往

Superbloom正准备为2018年的加密货币交易设定标准

科技快讯
由于利用了最新的金融规划技术,并获得了广泛的数字货币产品,包括它自己的创新代币,在建立一流的公共区块链基础上,Superbloom正准备为2018年的加密货币交易设定标准。Superbloom为进行加密的和没进行加密的成员提供了一种安全的方式来访问经过审查的ICO,并探索了在目前占据市场主

联动全球市场暴跌,BTC终究是不是避险角色

科技快讯
行情速览今日晚间行情整理:比特币BTC24小时下跌4.32%,暂报6278.65美元。以太坊ETH24小时下跌11.73%,暂报199.53美元。瑞波币XRP24小时下跌13.35%,暂报0.406181美元。比特现金BCH24小时下跌12.17%,暂报449.06美元。柚子EOS24小时下跌9.74%,暂报5.3美元。国际美国

Zcoin实现抗ASIC的Merkle树证明算法挖矿

科技快讯
Zcoin正在实现一种新的挖矿算法,它阻碍了FPGA、ASIC和僵尸网络的挖矿。Merkle树证明(MTP)具有将加密货币直接从大型农场转移到加密货币爱好者手中的潜力,这将再次分散挖矿。“Merkle树证明”是一种解决小型采矿者面临