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.hqwc.cn/news/525370.html

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

相关文章

把握机遇:2024年游戏行业春招提前批全攻略

当前,国内游戏行业正处于高速发展期,各大游戏公司对应届毕业生的人才需求十分旺盛。这一趋势不仅为即将步入职场的学生们提供了广阔的就业前景,也为游戏产业的创新和多元化发展注入了新鲜血液。 在这样的大环境下,2024年春季提前批…

数据库 04-01 数据库的设计 E-R图 实体类的属性

设计数据的步骤 01.设计的第一步,记录用户的信息 02.第二步概念转换成数据库概念 概念设计是什么: 着重点: 03.第三步完成增删改查的功能设计 04.最后的在数据库上实现 将实体图转化为关系数据库模型 将关系数据库模型应用在数据库中 概…

java-ssm-jsp-基于ssm的宝文理学生社团管理系统

java-ssm-jsp-基于ssm的宝文理学生社团管理系统 获取源码——》公主号:计算机专业毕设大全

力扣刷题Days14第二题--80删除数组中重复元素||(js)

目录 1,题目-中等 2,代码 双指针 3,学习与总结 思路学习与整理 1,题目-中等 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组…

2024年3月ZZUACM 招新赛题解

2024年3月ZZUACM 招新赛 题号题目A区间次大值B上课签到C魔法森林(一)D魔法森林(二)ELOPF跳格子G猜数字H抽卡记录I安达的二维矩阵J安达的数字手术K跳楼梯L前缀和 A 区间次大值—循环/签到题 题目描述 给定一个 n n n的全排列 a i…

基于Redis自增实现全局ID生成器(详解)

本博客为个人学习笔记,学习网站与详细见:黑马程序员Redis入门到实战 P48 - P49 目录 全局ID生成器介绍 基于Redis自增实现全局ID 实现代码 全局ID生成器介绍 背景介绍 当用户在抢购商品时,就会生成订单并保存到数据库的某一张表中&#…

支付宝开放平台,证书验签出错,请确认charset参数放在了URL查询字符串中且各参数值使用charset参数指示的字符集编码

#小李子9479# 支付宝证书接入方式的时候出现如下错误 验签出错,请确认charset参数放在了URL查询字符串中且各参数值使用charset参数指示的字符集编码 产生的原因分析: 1。验证签名里面有中文 2。在json_encode的时候使用了JSON_UNESCAPED_UNICODE参数…

求和(第二斯特林数+ntt)

题目&#xff1a; https://www.luogu.com.cn/problem/P4091 思路&#xff1a; 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<alg…

Web渗透测试流程

什么是渗透测试 渗透测试 (penetration test),是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析&#xff0c;这个分析是从一个攻击者可能存在的位置来进行的&#xff0c;并且从这个…

Linux(Centos7)安装Docker 教程

目录 1&#xff0c;卸载旧版本2&#xff0c;安装docker软件包3,设置镜像仓库地址4,安装最新版Docker Engine容器5&#xff0c;启动Docker 要安装Docker Engine&#xff0c;您需要CentOS 7或8的维护版本。不支持或未测试存档版本。 1&#xff0c;卸载旧版本 sudo yum remove do…

二,几何相交---4,BO算法---(1)接近性和可分离性

提了三个观点 1&#xff0c;如果一条直线&#xff08;比如竖直&#xff09;可以分开两个线段&#xff0c;则这两个线段不相交 2&#xff0c;只需要观察与隔离线相交的几个线段 3&#xff0c;从左向右扫描线只需要观察每个线段的两个端点和一些可能的相交点。

【漏洞复现】TeamCity身份验证绕过漏洞CVE-2024-27198

漏洞描述 JetBrains TeamCity是一款由JetBrains开发的持续集成和持续交付(CI/CD)服务器。它提供了一个功能强大的平台,用于自动化构建、测试和部署软件项目。TeamCity旨在简化团队协作和软件交付流程,提高开发团队的效率和产品质量。 JetBrains TeamCity在2023.11.4版本之前…