当前位置: 首页 > news >正文

(8)ERC20详细介绍

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


ERC20 标准的完整定义

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

1. 必须实现的函数

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

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

2. 必须实现的事件

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

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

3. 可选的功能

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

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

4. 完整的 ERC20 实现示例

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

// 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;}
}

5. ERC20 的重要注意事项

  1. 零地址检查:

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

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

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

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

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

6. 总结

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

相关文章:

(8)ERC20详细介绍

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

opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数

opencv projectPoints函数 cv::projectPoints 是 OpenCV 中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置,考虑了相机的内参和外参。 函数原型 void cv::projectPoints(InputArray objectPoints,InputArray …...

springboot集成websocket实现实时大量数据,效率性能高

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&…...

游戏引擎学习第80天

Blackboard:增强碰撞循环,循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改,以便实现一些新的功能。具体来说,是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏,目标是构建一些更丰富…...

Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步

在 Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步(Master-Slave Replication) 的过程略有不同,因为两者的 MySQL 版本和环境存在差异。以下是详细步骤,帮助你完成跨平台的主从…...

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

: 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中,博主将带大家去学习所谓的…...

Sentinel配置流控规则详解

前言 在微服务架构中,流量控制(Flow Control)是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库,以其丰富的应用场景和完善的监控能力,在微服务保护中扮演了重要角色。本文将详细介绍…...

解锁动态规划的奥秘:从零到精通的创新思维解析(6)

解锁动态规划的奥秘:从零到精通的创新思维解析(6) 前言: 在动态规划的众多问题中,多状态DP问题是一个非常重要的类别。它的难点在于如何设计合适的状态表示和转移方程,从而高效地解决问题。 多状态DP的核…...

Qwen2.5 3B、7B、14B在文本按照规范进行标准化改写任务上的表现

任务介绍:军事杂志方向资料标准化改写任务 1. 任务目标 本任务的目标是对军事杂志领域的非标准化资料进行改写,确保其符合军事文献的写作规范和标准格式。通过改写,保留原文的核心内容和信息,同时提升语言的准确性、简洁性和专业…...

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后,rac数据库备机无法启动数据库,报错如下 解决方法: 找到如下路径文件 执行: cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…...

免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL),收不到通知请将我点击星标!“ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…...

Titans 架构中的记忆整合:Memory as a Context;Gated Memory;Memory as a Layer

Titans 架构中的记忆整合 Titans 架构中的记忆整合 Memory as a Context(MAC)变体:在处理长序列数据时,将序列分段,对于当前段 S ( t ) S^{(t)}...

无缝过渡:将 Ansys 子结构模型转换为 Nastran

了解如何将 Ansys 子结构模型无缝转换为 Nastran,以满足有效载荷动态模型要求 Ansys 子结构模型的优势 Ansys 子结构模型为从事大型装配体结构分析和仿真的工程师和分析师提供了多项优势。 这些模型通过将复杂结构划分为更小、更易于管理的子结构,可以…...

小哆啦的跳跃挑战:能否突破迷宫的极限?

小哆啦开始力扣每日一题的第六天 https://leetcode.cn/problems/jump-game/description/ 小哆啦的跳跃挑战:能否突破迷宫的极限? 第一阶段:小哆啦的初次尝试 —— 盲目跳跃 小哆啦刚进入跳跃之城,他决定采用一种非常直接的方法来…...

KubeSphere部署安装,接入KubeKey安装的k8s集群

KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…...

Object常用的方法及开发中的使用场景

在前端开发中,Object 对象提供了许多常用的方法,这些方法帮助我们操作对象的属性和结构。以下是常用的 Object 方法及其功能简要说明: 对象常用的方法 1. 创建对象 Object.create(proto[, propertiesObject]) 创建一个具有指定原型对象和属性…...

SQL2000在win10上安装的方法

安装前最好先关闭防火墙和一些杀毒软件,因为这些软件在安装过程中可能会碰到注册表等一下杀毒软件比较敏感的地带,如果违反杀毒软件的规则会被当做病毒强行终止删除 首相找到C盘下window文件中的sysWOW64文件 鼠标右键,点击属性、安全、高级 …...

Windows图形界面(GUI)-QT-C/C++ - QT 对话窗口

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 模态对话框 非模态对话框 文件对话框 基本概念 静态函数 常见属性 颜色对话框 基本概念 静态函数 常见属性 字体对话框 基本概念 静态函数 常见属性 输入对话框 基本概念 …...

Java语言的数据结构

Java语言中的数据结构 引言 在计算机科学中,数据结构是指一种特定的方式来组织和存储数据,以便能够高效地进行访问和修改。Java作为一种广泛使用的编程语言,其内置的数据结构和集合框架为程序员提供了便利的工具来管理数据。本文将深入探讨…...

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张:A4→页边距:上下左右边距→文档网格:只指定行网格→版式:页眉和页脚:页脚距边界:1.4cm居中设置论文页码:插入…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...

未授权访问事件频发,我们应当如何应对?

在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...

AWS vs 阿里云:功能、服务与性能对比指南

在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL(Software OpenGL)‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...