qidao123.com ToB IT社区-企服评测·应用市场

 找回密码
 立即注册

(8)ERC20具体先容

[复制链接]
发表于 2025-9-27 10:20:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
ERC20 是以太坊上的一种代币标准(同质化代币),由 Fabian Vogelsteller 在 2015 年提出。它界说了一组通用的接口和规则,使得开辟者可以创建可互操纵的代币。ERC20 代币在以太坊生态体系中非常盛行,广泛应用于各种去中央化应用(DApps)和智能合约中。

ERC20 标准的完备界说

ERC20 是以太坊上最盛行的代币标准,界说了代币合约必须实现的最小接口。它确保了代币在以太坊生态体系中的互操纵性。
1. 必须实现的函数

ERC20 标准规定了以下 6 个必须实现的函数
1.1 totalSupply


  • 功能: 返回代币的总供应量。
  • 函数署名:
    1. function totalSupply() external view returns (uint256);
    复制代码
1.2 balanceOf


  • 功能: 返回指定地点的代币余额。
  • 函数署名:
    1. function balanceOf(address account) external view returns (uint256);
    复制代码
1.3 transfer


  • 功能: 将代币从调用者地点转移到指定地点。
  • 函数署名:
    1. function transfer(address recipient, uint256 amount) external returns (bool);
    复制代码
1.4 transferFrom


  • 功能: 从指定地点转移代币到另一个地点。通常用于答应第三方(如智能合约)代表用户转移代币。
  • 函数署名:
    1. function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    复制代码
1.5 approve


  • 功能: 答应 spender 从调用者地点转移最多 amount 数目标代币。
  • 函数署名:
    1. function approve(address spender, uint256 amount) external returns (bool);
    复制代码
1.6 allowance


  • 功能: 返回 spender 仍旧被答应从 owner 转移的代币数目。
  • 函数署名:
    1. function allowance(address owner, address spender) external view returns (uint256);
    复制代码

2. 必须实现的事故

ERC20 标准规定了以下 2 个必须实现的事故
2.1 Transfer


  • 触发条件: 今世币从一个地点转移到另一个地点时触发。
  • 事故署名:
    1. event Transfer(address indexed from, address indexed to, uint256 value);
    复制代码
2.2 Approval


  • 触发条件: 当 approve 函数被调用时触发,表现 owner 答应 spender 转移肯定命目标代币。
  • 事故署名:
    1. event Approval(address indexed owner, address indexed spender, uint256 value);
    复制代码

3. 可选的功能

除了必须实现的函数和事故外,ERC20 标准还发起实现以下 可选功能
3.1 name


  • 功能: 返回代币的名称(比方 “MyToken”)。
  • 函数署名:
    1. function name() external view returns (string memory);
    复制代码
3.2 symbol


  • 功能: 返回代币的符号(比方 “MTK”)。
  • 函数署名:
    1. function symbol() external view returns (string memory);
    复制代码
3.3 decimals


  • 功能: 返回代币利用的小数位数(比方 18,表现 1 个代币 = 10^18 最小单元)。
  • 函数署名:
    1. function decimals() external view returns (uint8);
    复制代码

4. 完备的 ERC20 实现示例

以下是完备的 ERC20 代币实今世码,包罗全部必须实现的功能和可选功能:
  1. // SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract MyToken {    // 代币信息    string public name = "MyToken";    string public symbol = "MTK";    uint8 public decimals = 18;    uint256 public totalSupply;    // 余额映射    mapping(address => uint256) public balanceOf;    // 授权映射    mapping(address => mapping(address => uint256)) public allowance;    // 事故    event Transfer(address indexed from, address indexed to, uint256 value);
  2.     event Approval(address indexed owner, address indexed spender, uint256 value);
  3.     // 构造函数    constructor(uint256 _initialSupply) {        totalSupply = _initialSupply * 10 ** uint256(decimals);        balanceOf[msg.sender] = totalSupply;        emit Transfer(address(0), msg.sender, totalSupply);    }    // 转账函数    function transfer(address _to, uint256 _value) public returns (bool success) {        require(_to != address(0), "Invalid address"); // 防止转移到零地点        require(balanceOf[msg.sender] >= _value, "Insufficient balance"); // 查抄余额        balanceOf[msg.sender] -= _value;        balanceOf[_to] += _value;        emit Transfer(msg.sender, _to, _value);        return true;    }    // 授权函数    function approve(address _spender, uint256 _value) public returns (bool success) {        require(_spender != address(0), "Invalid address"); // 防止授权给零地点        allowance[msg.sender][_spender] = _value;        emit Approval(msg.sender, _spender, _value);        return true;    }    // 授权转账函数    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {        require(_to != address(0), "Invalid address"); // 防止转移到零地点        require(balanceOf[_from] >= _value, "Insufficient balance"); // 查抄余额        require(allowance[_from][msg.sender] >= _value, "Allowance exceeded"); // 查抄授权额度        balanceOf[_from] -= _value;        balanceOf[_to] += _value;        allowance[_from][msg.sender] -= _value;        emit Transfer(_from, _to, _value);        return true;    }}
复制代码

5. ERC20 的告急留意事项


  • 零地点查抄:

    • 在 transfer 和 transferFrom 中,必须查抄目标地点是否为 address(0),以防止代币被发送到无效地点。

  • 整数溢出和下溢:

    • 在 Solidity 0.8.0 及以上版本中,编译器会自动查抄整数溢出和下溢。如果利用较低版本,须要手动查抄。

  • 授权竞争条件:

    • 在 approve 函数中,如果用户先授权了一个较小的额度,然后又授权了一个较大的额度,大概会导致竞争条件。发起利用 increaseAllowance 和 decreaseAllowance 函数来制止此题目。

  • 事故日记:

    • 全部状态变更(如转账和授权)都应触发相应的事故,以便外部应用步调可以监听这些事故。

  • 代币烧毁:

    • 如果须要烧毁代币,可以将代币发送到零地点(address(0)),并触发 Transfer 事故。


6. 总结

ERC20 标准是以太坊上最广泛利用的代币标准,界说了代币合约的最小接口。通过实现 ERC20 标准,开辟者可以创建与其他以太坊应用步调(如钱包、生意业务所和 DApps)兼容的代币。完备的 ERC20 实现不但包罗必须实现的函数和事故,还应依照最佳实践,确保代币的安全性和可靠性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-4-17 08:35 , Processed in 0.205134 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表