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个,销毁了俩

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——线性表顺序表示详解

目录 1.线性表的类型定义 2.基本操作 3.线性表的存储结构 4.补充 1.元素类型说明 2.数组定义​编辑 3.c语言的内存动态分配 4.c的动态存储分配 5.c中的参数传递 引用类型作参数 6.顺序表基本操作的实现 1.线性表的初始化 代码示例: 2.销毁线性表&…

11. 搭建较通用的GoWeb开发脚手架

文章目录 导言一、加载配置二、初始化日志三、初始化MySQL连接四、初始化Redis连接五、初始化gin框架内置的校验器使用的翻译器六、注册路由七、 启动服务八、测试运行九:注意事项 代码地址:https://gitee.com/lymgoforIT/bluebell 导言 有了前述知识的…

【LV15 DAY8 多路复用及信号驱动】

一、多路复用 描述符: 文件描述符:设备文件、管道文件 socket描述符1.1 应用层:三套接口select、poll、epoll select:位运算实现 监控的描述符数量有限(32位机1024,64位机2048) 效率差 poll&#xff1a…

MySQL基础-----约束

目录 前言 一、概述 二、约束演示 三、外键约束 1.介绍 2.语法 四、删除/更新行为 1.CASCADE 2.SET NULL 前言 本期我们开始MySQL约束的学习,约束一般是只数据键对本条数据的约束,通过约束我们可以保证数据库中数据的正确、有效性和完整性。 下面…

如何打sap NOTE

文章目录 1 Introduction2 Method2.1 search note2.2 download note2.3 upload note 3 Summarry 1 Introduction SAP Notes is a set of instructions to remove known errors from the SAP systems. Using the Note Assistant tool, SAP Notes can be applied to the system.…

分类算法入门:以鸢尾花数据集为例

近两年人工智能技术蓬勃发展,OpenAI连续放出ChatGPT、Sora等“王炸”产品,大模型、AIGC等技术带来了革命性的提升,很多人认为人工智能将引领第四次工业革命。国内各大互联网公司也是重点投资布局,从个人角度来说要尽快跟上时代的潮…

记录汇川:IO隔离编程

IO隔离:方便程序修改 无论是输入点坏了还是输出点坏了,或者人为接错线,或者对调点,我们只需要更改IO隔离得输入输出就可以了。方便。 停止按钮外接常闭,里面也使用常闭,为了断线检测功能(安全)&#xff…

基于java ssm springboot女士电商平台系统

基于java ssm springboot女士电商平台系统源码文档设计 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末…

基础刷题50之四(有效的字母异位词)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解1、排序2、哈希表 三、文心一言解释1、排序2、哈希表 总结 前言 刚上研一,有人劝我好好学C,当时用的不多就没…

c#触发事件

Demo1 触发事件 <Window x:Class"WPFExample.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"WPF Example" Height"600" Wi…

CSS中的常见选择器

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

【网络原理】使用Java基于UDP实现简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;DatagramSocket&#x1f338;DatagramPacket&#x1f338;InetSocketAddress &#x1f333;回显客户端与服务器&#x1f338;建立回显服务器&#x1f338;回显客户端 ⭕总结 我们用Java实现UDP数据报套接字编程&#xff0c;需要借用以下…

大数据平台 hive 部署

大数据平台 hive 部署 平台部署知识 文章讲解了 hive 的安装与部署 需要 Hadoop 以及 MySQL。 目录 文章目录 大数据平台 hive 部署目录前期准备解压 hive 包配置 hive 的环境变量解决 jar 冲突 内嵌模式部署修改 hive-env.sh 文件初始化元数据库 使用 derby启动 HDFS 和 hiv…

每日一题leetcode第2834:找出美丽数组的最小和

目录 一.题目描述 二.思路及优化 三.C代码 一.题目描述 二.思路及优化 首先我们看到这个题&#xff0c;就是根据给出的数组元素个数N&#xff0c;从[1&#xff0c;N]找出N个元素&#xff0c;使得N个元素的和最小&#xff0c;其中随便抽两个数出来&#xff0c;两个数之和不能为…

贝叶斯优化CNN-LSTM回归预测(matlab代码)

贝叶斯优化CNN-LSTM回归预测matlab代码 贝叶斯优化方法则采用贝叶斯思想&#xff0c;通过不断探索各种参数组合的结果&#xff0c;根据已有信息计算期望值&#xff0c;并选择期望值最大的组合作为最佳策略&#xff0c;从而在尽可能少的实验次数下达到最优解。 数据为Excel股票…

【MySQL】MySQL 的 SSL 连接以及连接信息查看

MySQL 的 SSL 连接以及连接信息查看 在上篇文章中&#xff0c;我们学习过 MySQL 的两种连接方式&#xff0c;回忆一下&#xff0c;使用 -h 会走 TCP 连接&#xff0c;不使用 -h 可以使用另两种方式来走 UnixSocket 连接。我们就接着这个话题再聊点别的&#xff0c;首先要纠正一…

计算机服务器中了locked勒索病毒怎么解密,locked勒索病毒解密流程

科技的发展带动了企业生产&#xff0c;越来越多的企业开始利用计算机服务器办公&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但随之而来的网络安全威胁也引起了众多企业的关注。近日&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0c;企业的计算机服务器…

图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)

目录 效果展示 游玩链接&#xff08;无需安装图形库及VS&#xff09; 开发环境及准备 1.VS2022版本 2.图形库 游戏初始化 1.头文件 2.创建窗口 3.主函数框架 开始界面函数 1.初始化 1-1.设置背景颜色及字体 1-2.处理背景音乐及图片素材 1-3.处理背景图位置 2.选…

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II 24.两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成…

【UE5】创建蓝图

创建GamePlay需要的相关蓝图 在内容游览器文件夹中创建文件夹&#xff0c;命名为Blueprints&#xff0c;用来放这个项目的所有蓝图(Blueprint) 在Blueprints文件夹下新建文件夹GamePlay,用存放GamePlay相关蓝图 在Blueprints文件夹下创建文件夹Character,存放角色相关蓝图 在Ga…