继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

区块链智能合约编程三:可发行的代币实现

炎炎设计
关注TA
已关注
手记 302
粉丝 74
获赞 371

在前一章环境中,我为大家介绍了如何用solidity语言编写简单的代币。今天我为大家介绍用solidity语言去实现一种可发行的代币。

在此之前首先得了解想要发行代币,首先得遵循一个标准得协议,叫ERC20协议。

ERC20协议:可以简单地理解为一种代码规范。在以太坊官网 https://eips.ethereum.org/EIPS/eip-20 是这样介绍的:

Abstract(摘要)

The following standard allows for the implementation of a standard API for tokens within smart contracts. This standard provides basic functionality to transfer tokens, as well as allow tokens to be approved so they can be spent by another on-chain third party.

以下标准允许在智能合约中实施代币的标准API。 该标准提供了基本的功能去交易代币,并使代币被(公众)认可,以便它们可以由另一个链上第三方使用。

这个标准,也就是代码规范规定一个将要发行的代币要有以下内容

name代币的名称。如比特币的名称bitcoin
symbol代币的符号,通常用三个英文字母表示。如比特币的符号是BTC
decimals小数点,也就是可交易的最小单位。如比特币是8位小数点0.00000001,意味着最小交易单位是0.00000001
totalSupply总发行量。比特币的总发行量是2000万,当然我们发行的时候可以自定义代币发行量

balanceOf

这里表示的是对应账号的余额。

transfer()

转给其它账户的函数,最开始发行代币都是掌握在代币管理者账户手中的,在众筹的时候转给投资者。这个函数还被要求触发转账事件。
transferFrom()授权转账函数转账函数,代币持有者授权给一个指定账户后,这个账户可以花费授权额度的代币。

approve()

授权函数,这个函数授权一个账户去花费此账户的余额。再次调用会覆盖当前值。

allowance()

配合approve()使用,返回被授权的余额。
event transfer交易函数事件。执行transfer()时需要触发该事件。

event approval

授权事件,执行approve()函数时需要触发该事件。

下面我为大家用solidity演示如何来实现ERC20标准代币:

首先我写一个标准的ERC20接口,等待具体的智能合约来实现。打开remix编辑器,新建一个ERC20.sol文件。

pragma solidity ^0.4.24;/** * @title ERC20标准接口 *  */contract ERC20 {//转账函数function transfer(address _to, uint256 _value) public returns (bool);//授权转账函数(A授权给B,B就可以花费A的代币)function transferFrom(address _from, address _to, uint256 _value)public returns (bool);//授权函数(A授权B,使其可以花费A的代币)function approve(address _spender, uint256 _value)public returns (bool);//返回授权余额  function allowance(address _owner, address _spender)public view returns (uint256);//转账事件event Transfer(address indexed from,address indexed to,uint256 value);//授权事件event Approval(address indexed owner,address indexed spender,uint256 value);}

 https://img1.mukewang.com/5b8c077b0001c82814330717.jpg

 

下一步是写一个智能合约去实现这个接口,新建一个StandardToken.sol文件。

步骤如下:

一:声明solidity版本 pragma solidity ^0.4.24;

二:导入ERC20接口文件 import './ERC20'

三:让StandardToken继承ERC20并把ERC20定义的接口拷贝到StandardToken.sol,准备实现方法体

 

四:声明变量:

    string name;//代币名称
    string symbol;//代币符号
    uint256 totalSupply;//总发行量
    uint8 decimals;//代币小数点。
    mapping(address=>uint256) balanceOf;//账户余额
    mapping(address=>mapping(address=>uint256)) allowed;//这个是记录代币管理者授权指定账户的余额,双层map

五:实现ERC20函数体,代码如下

pragma solidity ^0.4.24;import './ERC20.sol';contract StandardToken is ERC20{string name;//代币名称string symbol;//代币符号uint256 totalSupply;//总发行量uint8 decimals;//小数点位数mapping(address => uint256) public balanceOf;//账户余额//allowed 作为记录A给B授权的余额,双层mapmapping(address => mapping(address => uint256)) public allowed;//这个是StandardToken合约构造函数,目的就是给前面变量赋值constructor(string _name) public{name=_name;symbol="HTC";totalSupply=1000000;decimals=0;//这里为简便计算,不设小数点balanceOf[msg.sender]=totalSupply;//msg.sender就是部署代码到以太坊网络的账户地址}//授权函数function approve(address _spender, uint256 _value)public returns (bool success){allowed[msg.sender][_spender]=_value;//记录授权额度emit Approval(msg.sender,_spender,_value);//触发事件return true;}//授权转账函数(_from被授权人的地址,_to目标账户)function transferFrom(address _from, address _to, uint256 _value)public returns (bool success){//判断被授权人的余额、被授权的额度是否足够require(balanceOf[_from]>=_value&&allowed[_from][msg.sender]>=_value);//整数溢出判断require(balanceOf[_to]<=balanceOf[_to]+_value);balanceOf[_from]-=_value;balanceOf[_to]+=_value;allowed[_from][msg.sender]-=_value;//花费余额后需要减去所授权的额度return true;}//返回授权余额  function allowance(address _owner, address _spender)public view returns (uint256){return allowed[_owner][_spender];}//代币管理者转账函数 function transfer(address _to, uint256 _value) public returns (bool success){require(balanceOf[msg.sender]>=_value);//判断代币持有者余额要大于转账余额require(balanceOf[_to]<=balanceOf[_to]+_value);//溢出判断。balanceOf[msg.sender]-=_value;//对代币持有者余额做减法balanceOf[_to]+=_value;//目标地址做加法emit Transfer(msg.sender,_to,_value);//触发事件return true;}//代币管理者转账事件event Transfer(address indexed from,address indexed to,uint256 value);//授权事件event Approval(address indexed owner,address indexed spender,uint256 value);}

 

这里有必要介绍下msg.sender,在以太坊中外部账户如钱包账户,发送交易(也可以是部署合约)到以太坊网络中,这个msg.sender就为账户地址!

下面是部署JavaScript VM 部署细节:

https://img4.mukewang.com/5b8c0783000124a814190704.jpg

 

ERC20代币就介绍到这里,下一章为大家介绍如何部署到以太坊测试网络中进行测试。

原文出处:https://blog.csdn.net/qq_42247900/article/details/81951296


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP