主页 > token.im > 以太坊标准代币系列的同质代币ERC20

以太坊标准代币系列的同质代币ERC20

token.im 2023-09-12 05:07:33

0x00写在前面

众所周知,现阶段以太坊最大的应用就是代币发行,而以太坊中的代币种类很多,最著名的就是ERC20,但是对于其他几种代币,可能有些朋友不了解t我知道,所以我最近策划了一个系列,就是以太坊标准代币系列。

目前市面上所有基于以太坊的代币都是在交易所上线交易的ERC20代币,所以今天我们就来说说ERC20代币的标准方案。

0x01 ERC20标准制定动机

在基于以太坊发行代币时,如果每个代币发行者都使用自己的标准来发行代币,对于钱包开发者和交易所对接来说,成本会非常高,因为他们需要识别每一种代币。 独立对接,为降低钱包开发者和交易所的对接成本,以太坊社区制定了代币发行标准。

该标准主要包括代币的转移、地址余额的获取等方式。

0x02 ERC20标准规范

一个代币合约一般需要代币的发行,每个地址的余额,代币的转账等ERC20以太坊网络链项目官方,而ERC20标准就是将这些最常用和必不可少的方式标准化,方便开发,也方便钱包开发者和交易所对接成本被最小化。

其中,定义了三个类别,方法、属性和事件。

这些标准方法如下所述:

A.方法一、totalSupply:代币总量函数原型

function totalSupply() constant returns (uint256 totalSupply)

Method 该方法用于获取代币发行总量

2. balanceOf:获取余额函数原型

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

Method 该方法用于获取address_owner的token余额

3. transfer:传递函数原型

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

方法 该方法用于将调用代币合约的地址中的_value代币转入_to地址

4.transferFrom:传递函数原型

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

方法 此方法用于将 _value 令牌从 _from 地址发送到 _to 地址。

当你希望能够使用其他智能合约来控制你的token转账时,可以使用transferFrom方法,使用transferFrom方法有一个前提条件,即调用者需要在调用之前得到_from地址的授权token可以转账操作。 而如何授权,我们接下来会介绍。

5.approve:授权函数原型

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

方法允许 _spender 地址将 _value 代币从您的帐户转移到任何地方。

当您设置一个_value 时,_spender 地址可以传输任意次数的代币,直到_value 为 0。

6.allowance:获取授权代币余额函数原型

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

该方法获取 _owner 地址授权转移到 _spender 地址的代币余额。

B. 事件

Event是EVM内置的日志功能,在DAPP中,我们可以通过JS监听事件回调。 在 ERC-20 代币中,定义了以下事件:

1.转账:转账token事件定义

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

当代币转移时,需要触发并调用该事件。 它记录了token sender_from、token recipient_to和token发送amount_value。

2.批准:授权事件事件定义

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

当进行授权时,需要触发并调用该事件,其中记录了authorizer_owner、authorizer_spender、authorized token amount_value

0x03 ERC20代币接口

通过以上标准,我们可以了解一个符合ERC20代币标准的代币合约需要实现的方法。 下面是通过规范实现的一个ERC20代币的接口。

ERC20以太坊网络链项目官方_以太坊区块链链易查询_以太坊私有链搭建

contract EIP20Interface {
    
    ///////////////////////////// 方法 ///////////////////////////////////
    
      // 获取令牌发行量
    // 注意:constant的修饰符是提示该方法中不能进行变量的修改。
    //      但编译器不会强制校验。
    // @return uint256 totalSupply 总发行量
    function totalSupply() constant returns (uint256 totalSupply)
       // 获取指定地址
    // @param address _owner 想要获取的地址
    // @return uint256 balance 令牌余额
    function balanceOf(address _owner) public view returns (uint256 balance);
    // 从`msg.sender`中发送`_value`个令牌给`_to` 
    // @param address _to 接收令牌的地址
    // @param uint256 _value 发送的令牌数量
    // @return bool success 发送令牌成功状态
    function transfer(address _to, uint256 _value) public returns (bool success);
    // 从`_from`地址发送`_value`令牌到`_to`地址
    // 需要满足条件,需要被`_from`地址授权给`msg.sender`
    // @param address _from 发送者地址
    // @param address _to 接收者地址
    // @param uint256 _value 发送的令牌数量
    // @return bool success 发送令牌成功状态
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    // `msg.sender`授权`_spender`地址可以任意转移`_value`数量的令牌
    // @param address _spender 被授权发送令牌的地址
    // @param uint256 _value 授权发送令牌的数量
    // @return bool success 授权成功状态
    function approve(address _spender, uint256 _value) public returns (bool success);
    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent

ERC20以太坊网络链项目官方_以太坊区块链链易查询_以太坊私有链搭建

// 获取被授权限额 // @param address _owner 令牌所有者的账户 // @param address _spender 令牌被授权者账户 // @return uint256 remaining 剩余可发送的令牌数量 function allowance(address _owner, address _spender) public view returns (uint256 remaining); ///////////////////////////// 事件 /////////////////////////////////// // 令牌转移事件 当发生令牌的转移时,需要调用该事件 event Transfer(address indexed _from, address indexed _to, uint256 _value); // 授权转移事件 当进行授权时,需要触发该事件 event Approval(address indexed _owner, address indexed _spender, uint256 _value); }

0x04 ERC20代码示例

在标准的基础上,实现代码的方式有很多种,比如有的在代码中实现空投,有的实现锁定,有的实现挖矿等,但是最常规的实现方式已经有了官方的实现代码,也有很多组织已经实施了一些例子。 如果没有定制,这些代码可以直接用于创建ERC20代币。

示例代码:

pragma solidity ^0.4.18;
contract ERC20 {
    // 定义一个mapping 存储各个地址的令牌
    mapping (address => uint256) public balances;
    // 定义一个mapping 存储授权详情
    mapping (address => mapping (address => uint256)) public allowed;
    
    // 以下参数非必须,但是尽量添加,大多数钱包会通过此获取相关信息
    // 令牌发行总量
    uint256 public totalSupply;
    // 令牌名称,如 OmiseGO
    string public name;      
    // 支持的小数位数
    // 因为在EVM中对浮点数的支持很差,在令牌的创建中直接采用整数
    // 然后通过该字段进行小数的处理
    uint8 public decimals;                
    // 令牌简称,如 OMG
    string public symbol;              

ERC20以太坊网络链项目官方_以太坊私有链搭建_以太坊区块链链易查询

// 令牌合约的构造函数 // 在solidity中,和合约名称一致的方法为构造函数,在第一次创建合约时,仅执行一次。 function ERC20( uint256 _totalSupply, // 令牌创建总量 string _name, // 令牌名称 uint8 _decimals, // 支持小数位数 string _symbol // 令牌简称 ) public { // 给创建者账户初始化令牌 balances[msg.sender] = _totalSupply; // 设置令牌发行量 totalSupply = _totalSupply; // 设置令牌名称 name = _name; // 设置令牌支持小数位数 decimals = _decimals; // 设置令牌简称 symbol = _symbol; } /** * 获取令牌总发行量 * @return uint256 totalSupply 发行总量 */ function totalSupply() constant returns (uint256 totalSupply) { return totalSupply; } /** * 转移令牌 * @param address _to 令牌接收者地址 * @param uint256 _value 发送令牌数量 * @return bool success 发送成功状态 */ function transfer(address _to, uint256 _value) public returns (bool success) { // 判断发送者余额是否充足 require(balances[msg.sender] >= _value); // 从发送者余额中减去`_value`数量的令牌

以太坊区块链链易查询_以太坊私有链搭建_ERC20以太坊网络链项目官方

balances[msg.sender] -= _value; // 给接收者账户中添加`_value`数量的令牌 balances[_to] += _value; // 记录令牌转移的事件 Transfer(msg.sender, _to, _value); return true; } /** * 转移令牌(授权) * @param address _from 令牌发送者地址 * @param address _to 令牌接收者地址 * @param uint256 _value 令牌发送数量 * @return bool success 方法执行状态 */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { // 其中`msg.sender`是合约方法调用者的地址 // 获取`_from`地址授权给`msg.sender`地址的可转移令牌余额 uint256 allowance = allowed[_from][msg.sender]; // 判断`_from`地址余额是否充足以及授权转移令牌是否充足 require(balances[_from] >= _value && allowance >= _value); // 从`_from`地址减去`_value`数量的令牌 balances[_from] -= _value; // 从授权余额中减去`_value`数量的令牌 allowed[_from][msg.sender] -= _value; // 给`_to`地址添加`_value`数量的令牌 balances[_to] += _value; // 记录转移令牌的事件 Transfer(_from, _to, _value); return true; }

ERC20以太坊网络链项目官方_以太坊私有链搭建_以太坊区块链链易查询

/** * 获取`_owner`地址的令牌余额 * @param address _owner 要获取余额的地址 * @return uint256 balance 返回`_owner`地址的余额 */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } /** * 授权令牌转移方法 * @param address _spender 被授权地址 * @param uint256 _value 授权可转移的数量 * @return bool success 方法执行状态 */ function approve(address _spender, uint256 _value) public returns (bool success) { // `msg.sender`授权`_spender`地址转移`_value`数量的令牌 allowed[msg.sender][_spender] = _value; // 记录授权事件 Approval(msg.sender, _spender, _value); return true; } /** * 获取被授权的令牌余额 * @param address _owner 授权地址 * @param address _spender 被授权地址 * @return uint256 remaining 可转移的令牌余额 */ function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } }

0x05写在后面

大多数在交易所交易的代币的合约代码就是这么简单。 其实每个方法分开都是最简单的编程代码,核心处理都被EVM封装了。 它确实极大地解放了人类,几十行代码就可以发行一个token。 ERC20代币也叫同质代币,即每个代币都是一致的,不可区分的,市场上有很多以太猫和以太狗的游戏,这些也是使用以太坊的代币来实现的ERC20以太坊网络链项目官方,但是他们选择的是不是 ERC20 令牌,而是称为 ERC721 令牌的非同质令牌。

下一期我们来聊聊非同质代币ERC721。

喜欢不说,扫我~

qrcode_for_gh_0f12fe5ef5fd_258.jpg