ERC20学习

ERC20简介

ERC20是一种代币标准,用于创建可替代的代币。
ERC20是在以太坊网络上实现的代币标准,它为数字资产或代币定义了一套规则和接口。这些符合ERC20标准的代币在性质上是完全相同的。即每一个代币都可以被另一个同类型的代币替代,这种属性确保了代币的互可操作性和统一性,使得它们可以在不同的平台和钱包之间自由转移和交换。

IERC20

IERC20是ERC20代币标准的接口合约,规定了ERC20需要实现的函数和事件。

  • 接口(IERC20):
    • 接口只包含函数和事件的定义,而不包含它们的实现
    • 接口用于描述一个合约应该遵循的规则,而不涉及具体的实现细节
    • 使用接口可以确保合约遵守特定的标准或规范,同时允许开发者自由的实现这些功能。
  • 合约(ERC20):
    • 合约包含函数的实现代码
    • ERC20是一个具体的代币合约标准,它提供了一组规则和指导,告诉开发者如何编写代币合约的代码。
  • 使用IERC20的好处:
    • 灵活性:通过使用接口,开发者可以自由的实现接口中的函数,而不收特定实现的限制,这允许不同的代币项目根据其特定需求进行定制。
    • 可升级性:如果将来ERC20标准需要更新,使用接口的合约更容易的进行升级,因为它们依赖于抽象的接口定义,而不是具体的实现。
    • 兼容性:IERC20接口确保了所有遵循该接口的代币合约都具有相同的功能和行为,这使得它们可以被广泛接受和使用。
    • 安全性:接口可以帮助开发者进行更安全的变成,因为它们只能调用已定义的函数和事件,而不能访问合约的内部状态。

代码

ERC20
pragma solidity ^0.8.4;
//导入IERC20
import "./IERC20.sol";//继承IERC20合约
contract ERC20 is IERC20 {//名为ballanceOf的公共映射,它降低至映射到无符号整数,用于存储每个地址的代币余额mapping(address => uint256) public override balanceOf;//名为allowance的映射,将地址映射到另一个映射,内部映射降低至映射到无符号整数,该映射用于存储每个地址对其它地址的授权额度mapping(address => mapping(address => uint256)) public override allowance;uint256 public override totalSupply;   // 代币总供给string public name;   // 名称string public symbol;  // 代号uint8 public decimals = 18; // 小数位数//初始化代币的名称和符号constructor(string memory name_, string memory symbol_){name = name_;symbol = symbol_;}//代币转账逻辑function transfer(address recipient, uint amount) external override returns (bool) {balanceOf[msg.sender] -= amount;balanceOf[recipient] += amount;emit Transfer(msg.sender, recipient, amount);return true;}//授权逻辑function approve(address spender, uint amount) external override returns (bool) {allowance[msg.sender][spender] = amount;emit Approval(msg.sender, spender, amount);return true;}//授权转账逻辑function transferFrom(address sender, address recipient, uint amount) external override returns (bool) {allowance[sender][msg.sender] -= amount;balanceOf[sender] -= amount;balanceOf[recipient] += amount;emit Transfer(sender, recipient, amount);return true;}//代币铸造,铸造amount数量代币,将调用者余额增加amount,总供应量totalSupply也增加amount//最后,触发一个Transfer事件,表示从地址0(通常代表合约创建者或者系统)向msg.sender转账了amount数量的代币。function mint(uint amount) external {balanceOf[msg.sender] += amount;totalSupply += amount;emit Transfer(address(0), msg.sender, amount);}//代币销毁,销毁amount数量代币,调用者余额减少amount数量,总供应量减少amount//最后,触发一个Transfer事件,表示从msg.sender向地址0(通常代表销毁或者回收)转账了amount数量的代币。function burn(uint amount) external {balanceOf[msg.sender] -= amount;totalSupply -= amount;emit Transfer(msg.sender, address(0), amount);}
}
IERC20
pragma solidity ^0.8.4;interface IERC20 {//转账时被释放event Transfer(address indexed from, address indexed to, uint256 value);//授权时被释放event Approval(address indexed owner, address indexed spender, uint256 value);//返回代币总供给function totalSupply() external view returns (uint256);//返回账户所持有余额function balanceOf(address account) external view returns (uint256);//从调用该合约的账户转账给to账户amount单位代币,转账成功返回true并释放Transfer事件function transfer(address to, uint256 amount) external returns (bool);//返回owner账户授权给spender账户的额度,默认为0,当approve或者transferFrom被调用时,allowance会改变function allowance(address owner, address spender) external view returns (uint256);//调用合约的账户给spender账户授权amount单位代币,如果成功返回true并释放Approval事件function approve(address spender, uint256 amount) external returns (bool);//通过授权机制从from账户向to账户转账amunt数量代币,转账的部分会从调用者的allowance中扣除//注意,A授权B可以用自己amount代币,但代币还是在A手中,该函数就相当于B要给C转账,但是这里调用合约的是B,from是A,to是C,注意不要混淆from和调用合约的地址function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

发行代币

  • 编译好合约后,在部署栏中输入构造函数的参数,然后点击transact键进行部署
    在这里插入图片描述

  • 这样我们就创建了代币,运行mint函数来给自己铸造一些代币,这里我铸造了100个代币,右边有显示详细信息,事件Transfer,铸币地址0x0000000000000000000000000000000000000000,接收地址0x5B38Da6a701c568545dCfcB03FcB875f56beddC4等
    在这里插入图片描述

  • 然后我们使用balanceOf函数来查询该地址余额
    在这里插入图片描述

  • 然后我们使用transfer函数给该地址转账,在查询该地址余额,注意哈,这里调用该合约的地址是发起转账的地址,而不是接收转账的地址
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 然后我们可以用approve函数使A地址给B地址授权一些代币,我们这里的A地址就用我们最开始铸币100个那个地址,B地址就用刚刚转了2个代币的地址,具体用啥看自己,前提是代币要够才能授权
    在这里插入图片描述

  • 然后我们用allowance查看授权信息

  • 这会B地址已经被授权了50个代币,自己还有俩,总共可以使用52个,现在我们调用transferFrom给C地址转账,C地址自己随便找一个吧,记得调用合约的是B地址,切换地址就在图四中所示地方点击切换,该函数内写的是拥有代币的 A地址以及要接收转账的c地址和转账数量,然后查询C地址余额
    在这里插入图片描述
    在这里插入图片描述

  • 销毁代币,调用burn函数

  • 查询总供给,直接点击totalSupply,现在应该是98个,因为总共铸币100个,销毁了俩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构30 - 质量属性

质量属性 概念开发期质量属性运行期质量属性 面向架构评估的质量属性质量属性场景描述 软件系统属性包括功能属性和质量属性,软件架构重点关注的是质量属性。架构的基本需求是在满足功能属性的前提下,关注软件系统质量属性。为了精确、定量地表达系统的质…

代码随想录算法训练营day54| 392. 判断子序列、115. 不同的子序列

392、判断子序列: class Solution(object):def isSubsequence(self, s, t):""":type s: str:type t: str:rtype: bool"""dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in range(1, len(s)1):for j in range(1, len(t)1):if …

社区店选址评估的关键指标:确保商业成功的重要因素

对于想开实体店或创业的人来说,选址是决定商业成功的关键因素之一。作为一名开鲜奶吧5年的创业者,我在网上持续分享开店的干货和见解。 在这篇文章中,我将详细介绍社区店选址评估的关键指标,帮助你确保商业成功。 1、人流量&…

js之版本号排序

版本号排序 给定一个由版本号组成的数组,按照版本号由小到大排序 假如版本号如下 : ["0.1.1", "2.3.3", "0.302.1", "4.2", "4.3.5", "4.3.4.5"];原理很简单,通过自定义sort排…

2.DOM-事件基础(注册事件、tab栏切换)(案例:注册、轮播图)

案例 注册事件 <!-- //disabled默认情况用户不能点击 --><input type"button" value"我已阅读用户协议(5)" disabled><script>// 分析&#xff1a;// 1.修改标签中的文字内容// 2.定时器// 3.修改标签的disabled属性// 4.清除定时器// …

如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

设计模式(十):抽象工厂模式(创建型模式)

Abstract Factory&#xff0c;抽象工厂&#xff1a;提供一个创建一系列相关或相互依赖对 象的接口&#xff0c;而无须指定它们的具体类。 之前写过简单工厂和工厂方法模式(创建型模式)&#xff0c;这两种模式比较简单。 简单工厂模式其实不符合开闭原则&#xff0c;即对修改关闭…

[MYSQL]当数据库被攻破如何重新恢复

前情提要&#xff1a;mysql数据库默认密码、默认端口没有改&#xff0c;也没做安全防护&#xff0c;导致被攻破被索要比特币。 那我们自然是不能给他们的&#xff0c;下面罗列我的补救方法。 密码修改相关 第一步大家自然都会想到先去修改密码&#xff1a; mysqladmin -u roo…

光谱下的养殖业:数据可视化的现代变革

在数字化时代&#xff0c;数据可视化在养殖业中崭露头角&#xff0c;为这一传统行业注入了新的活力。无论是家禽养殖还是水产养殖&#xff0c;数据可视化都以其直观、高效的特点&#xff0c;为养殖业带来了全新的发展机遇。下面我就以可视化从业者的角度&#xff0c;简单聊聊这…

腾讯云轻量 2核2G4M新用户首购活动,99续费同价来了!!

阿里云199一年续费同价&#xff0c;腾讯云99一年续费同价&#xff0c;平台卷起来&#xff0c;对用户的角度来说&#xff0c;真的是香麻了~ 腾讯云新春采购节&#xff0c;2核2G4兆的基础配置&#xff0c;新官方直接放大招&#xff0c;99一年&#xff0c;活动期间内&#xff0c;…

OpenAI (ChatGPT)中国免费试用地址

GitHub - click33/chatgpt---mirror-station-summary: 汇总所有 chatgpt 镜像站&#xff0c;免费、付费、多模态、国内外大模型汇总等等 持续更新中…… 个人能力有限&#xff0c;搜集到的不多&#xff0c;求大家多多贡献啊&#xff01;众人拾柴火焰高&#xff01;汇总所有 cha…

202104 CSP认证 | DHCP服务器

3. DHCP服务器 我天呢经历了带配额的文件系统我真的极其挫败&#xff0c;然后开始写的时候觉得这个题感觉怎么有点简单…然后就觉得肯定是自己有很多东西没有想到&#xff0c;而且写的时候破罐子破摔觉得肯定会超时… 结果一写&#xff01;哦买噶居然满分了&#xff01; 脑子不…

【探索Linux】—— 强大的命令行工具 P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )

阅读导航 引言一、socket 常见API表二、函数详细介绍01. socket()02. bind()03. listen()04. accept()05. connect()06. send()07. recv()08. close()09. select()10. getaddrinfo()11. sendto()12. recvfrom()13. setsockopt()14. getsockopt()15. shutdown()16. inet_pton()1…

【SpringBoot】多环境切换的灵活配置

文章目录 profile 的使用激活 profile 的方式命令行启动idea 中配置配置文件中激活 开发中最灵活的多环境配置创建四个配置主配置文件其他几个环境配置使用方式 配置文件拆分总结 在日常的开发中&#xff0c;一般都会分好几种环境&#xff0c;比如通常的 开发环境&#xff1a;一…

EXSI create datastore

文章目录 1. 简介2. 清空磁盘3. 删除表4. 创建database 1. 简介 在 ESXi 环境中创建数据存储(Datastore)的步骤如下: 登录 vSphere Web Client 打开 Web 浏览器,输入 ESXi 主机或 vCenter Server 的 IP 地址,使用有权限的账户登录。 在 ESXi 环境中创建数据存储(Datastore)…

每天一个数据分析题(一百九十六)

在多元线性回归模型的自变量选择方法中&#xff0c;关于向后回归法和逐步回归法的描述&#xff0c;以下哪些是正确的&#xff1f; A. 向后回归法开始时包含所有自变量&#xff0c;并逐步剔除每个不显著的变量。 B. 逐步回归法结合了向前回归法和向后回归法&#xff0c;可以在…

Linux 关于NTP同步硬件时钟的可靠性验证

Linux关于NTP同步硬件时钟的可靠性验证 1. 常见的时钟类型1.1 系统时钟1.2 硬件时钟 2. 常见时钟同步方式2.1 ntpd服务2.1.1 推荐配置/etc/ntp.conf2.1.2 推荐配置/etc/sysconfig/ntpd 2.2 定时任务ntpdate2.3 ntp命令同步状态相关命令解读2.3.1 ntpq -pn解读2.3.2 ntpdate -u解…

SpringCloud Ribbon 负载均衡服务调用

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第三篇&#xff0c;即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon…

OpenCV学习笔记(三)——对于图片的基本操作

目录 读取图片和显示图片 显示图片的大小 将图像设置为灰度图 将图片重新写回指定的地址 显示图片的尺寸 获取图片的类型 读取图片和显示图片 在OpenCV使用cv2.imread()来读取图片&#xff0c;例如&#xff0c;在D盘的Photo的文件夹中有一张图片名称为1的jpeg的图片&am…

MySQL-MVCC:概述、工作原理、readView实现快照读、数据库解决问题、MVCC无法防止超卖

MySQL-MVCC&#xff1a;概述、工作原理、readView实现快照读、数据库解决问题、MVCC无法防止超卖 一、概述二、MVCC工作原理三、readView实现快照读四、MVCC 可以为数据库解决什么问题五、MVCC无法防止超卖 一、概述 多版本并发控制&#xff08;Multi-Version Concurrency Con…