(8)ERC20详细介绍

devtools/2025/1/18 11:45:26/

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


ERC20__4">ERC20 标准的完整定义

ERC20 是以太坊上最流行的代币标准,定义了代币合约必须实现的最小接口。它确保了代币在以太坊生态系统中的互操作性。

1. 必须实现的函数

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

1.1 totalSupply
  • 功能: 返回代币的总供应量。
  • 函数签名:
    solidity">function totalSupply() external view returns (uint256);
    
1.2 balanceOf
  • 功能: 返回指定地址的代币余额。
  • 函数签名:
    solidity">function balanceOf(address account) external view returns (uint256);
    
1.3 transfer
  • 功能: 将代币从调用者地址转移到指定地址。
  • 函数签名:
    solidity">function transfer(address recipient, uint256 amount) external returns (bool);
    
1.4 transferFrom
  • 功能: 从指定地址转移代币到另一个地址。通常用于允许第三方(如智能合约)代表用户转移代币。
  • 函数签名:
    solidity">function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    
1.5 approve
  • 功能: 允许 spender 从调用者地址转移最多 amount 数量的代币。
  • 函数签名:
    solidity">function approve(address spender, uint256 amount) external returns (bool);
    
1.6 allowance
  • 功能: 返回 spender 仍然被允许从 owner 转移的代币数量。
  • 函数签名:
    solidity">function allowance(address owner, address spender) external view returns (uint256);
    

2. 必须实现的事件

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

2.1 Transfer
  • 触发条件: 当代币从一个地址转移到另一个地址时触发。
  • 事件签名:
    solidity">event Transfer(address indexed from, address indexed to, uint256 value);
    
2.2 Approval
  • 触发条件: 当 approve 函数被调用时触发,表示 owner 允许 spender 转移一定数量的代币。
  • 事件签名:
    solidity">event Approval(address indexed owner, address indexed spender, uint256 value);
    

3. 可选的功能

除了必须实现的函数和事件外,ERC20 标准还建议实现以下 可选功能

3.1 name
  • 功能: 返回代币的名称(例如 “MyToken”)。
  • 函数签名:
    solidity">function name() external view returns (string memory);
    
3.2 symbol
  • 功能: 返回代币的符号(例如 “MTK”)。
  • 函数签名:
    solidity">function symbol() external view returns (string memory);
    
3.3 decimals
  • 功能: 返回代币使用的小数位数(例如 18,表示 1 个代币 = 10^18 最小单位)。
  • 函数签名:
    solidity">function decimals() external view returns (uint8);
    

ERC20__103">4. 完整的 ERC20 实现示例

以下是完整的 ERC20 代币实现代码,包含所有必须实现的功能和可选功能:

solidity">// SPDX-License-Identifier: MIT
pragma 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);event Approval(address indexed owner, address indexed spender, uint256 value);// 构造函数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;}
}

ERC20__169">5. ERC20 的重要注意事项

  1. 零地址检查:

    • transfertransferFrom 中,必须检查目标地址是否为 address(0),以防止代币被发送到无效地址。
  2. 整数溢出和下溢:

    • 在 Solidity 0.8.0 及以上版本中,编译器会自动检查整数溢出和下溢。如果使用较低版本,需要手动检查。
  3. 授权竞争条件:

    • approve 函数中,如果用户先授权了一个较小的额度,然后又授权了一个较大的额度,可能会导致竞争条件。建议使用 increaseAllowancedecreaseAllowance 函数来避免此问题。
  4. 事件日志:

    • 所有状态变更(如转账和授权)都应触发相应的事件,以便外部应用程序可以监听这些事件。
  5. 代币销毁:

    • 如果需要销毁代币,可以将代币发送到零地址(address(0)),并触发 Transfer 事件。

6. 总结

ERC20 标准是以太坊上最广泛使用的代币标准,定义了代币合约的最小接口。通过实现 ERC20 标准,开发者可以创建与其他以太坊应用程序(如钱包、交易所和 DApps)兼容的代币。完整的 ERC20 实现不仅包括必须实现的函数和事件,还应遵循最佳实践,确保代币的安全性和可靠性。


http://www.ppmy.cn/devtools/151551.html

相关文章

STM32三导联蓝牙心电监护仪设计,C#上位机显示波形 附源码与电路和论文

资料下载地址:STM32三导联蓝牙心电监护仪设计,C#上位机显示波形 附源码与电路和论文 目录 摘要 1. 引言 2. 系统方案 3. 系统硬件设计 3.1 系统原理框图设计 3.2 系统主要元器件介绍 3.2.1 STM32F103VET6主控芯片 3.2.2 AD8232模拟前…

宇泰串口卡驱动在Ubuntu22.04编译、安装汇总

从官网下载驱动官网地址 上传到Ubuntu, 目录结构如下: 驱动源代码: 驱动代码是基于开源项目编译来的 编译路径不能有中文路径,否则可能有类似错误 源码是基于Linux2.3内核编译,我当前是6.8.0-51,数据结构有升级,需要调…

Vue3:当v-if和v-for同时使用时产生的问题和解决办法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbci…

Python Wi-Fi密码测试工具

Python Wi-Fi测试工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点…

网络协议基础--HTTP协议

一.HTTP介绍 HTTP 是基于 TCP/IP 协议栈之上的应用层协议,旨在规定客户端和服务器之间请求和响应的标准格式与交互方式,以实现超文本(包含文本、图片、音频、视频等多种格式的文档)的传输,让用户能够在浏览器中轻松访问…

【混合开发】CefSharp+Vue桌面应用程序开发

为什么选择CefSharpVue做桌面应用程序 CefSharp 基于 Chromium Embedded Framework (CEF) ,它可以将 Chromium 浏览器的功能嵌入到 .NET 应用程序中。通过 CefSharp,开发者可以在桌面应用程序中集成 Web 技术,包括 HTML、JavaScript、CSS 等…

【JVM】总结篇之GC性能优化案例

文章目录 性能优化案例1:调整堆大小提高服务的吞吐量初始配置优化配置 性能优化案例2:JVM优化之JIT优化即时编译对代码的优化逃逸分析编译器优化栈上分配同步省略标量替换 性能优化案例3:合理配置堆内存推荐配置如何计算老年代存活对象结论你…

去中心化身份验证:Web3如何确保元宇宙中的身份安全

随着元宇宙的迅速发展,数字身份的安全性问题变得尤为重要。传统互联网中的身份验证依赖于中心化平台,用户的个人信息和身份数据通常存储在大公司控制的服务器中,容易受到黑客攻击和隐私泄露的风险。而Web3的去中心化身份验证方式为用户提供了…