(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 的重要注意事项
-
零地址检查:
- 在
transfer和transferFrom中,必须检查目标地址是否为address(0),以防止代币被发送到无效地址。
- 在
-
整数溢出和下溢:
- 在 Solidity 0.8.0 及以上版本中,编译器会自动检查整数溢出和下溢。如果使用较低版本,需要手动检查。
-
授权竞争条件:
- 在
approve函数中,如果用户先授权了一个较小的额度,然后又授权了一个较大的额度,可能会导致竞争条件。建议使用increaseAllowance和decreaseAllowance函数来避免此问题。
- 在
-
事件日志:
- 所有状态变更(如转账和授权)都应触发相应的事件,以便外部应用程序可以监听这些事件。
-
代币销毁:
- 如果需要销毁代币,可以将代币发送到零地址(
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居中设置论文页码:插入…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
