ERC20学习

news/2024/7/7 14:31:35 标签: 学习, 区块链

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.niftyadmin.cn/n/5417594.html

相关文章

总结工作中vue2和vue3的知识点区别

vue2和vue3的区别 前言 vue2升级vue3之后变得更快,更轻,协作更方便。无论对于我们开发者的体验或者用户使用方面都是升级优化,但是本质区别是什么,下面分为几个部分进行讲解。vue2和vue3 对比vue2vue3脚手架命令式可视化创建脚…

Linux文本处理三剑客:awk(内置函数详解笔记)

Linux系统中,AWK 是一个非常强大的文本处理工具,它的内置函数使得对文本数据进行处理更加高效和便捷。 本文将介绍 AWK 内置函数的几种主要类型: 算数函数字符串函数时间函数位操作函数其他常用函数 我们将使用一个示例文本文件来演示这些函…

arcgis 栅格数据处理2——栅格转地级市(栅格转矢量图)

1. 获取空间分析权限(解决无法执行所选工具问题) 选中“自定义”中的“扩展模块” 在弹出的模块中选中能选的模块,此处需要选择“spatial analysis”以进行下一步分析 3. 将栅格数据转为整数型(解决无法矢量化) 选…

Adobe Acrobat for mac 缺少字体文件Microsoft Ya Hei

使用Adobe Acrobat for mac编辑PDF时,显示缺少字体文件Microsoft Ya Hei 解决方法: 1. 下载字体文件: https://github.com/nikolajohn/test 2. 打开访达,选择 前往 - 文件夹 在地址栏中,输入: ~/Librar…

「蓝桥·算法双周赛」第七场分级赛——小白入门赛

题目列表 说明 好久没打蓝桥杯的比赛&#xff0c;回来试试水&#xff0c;就开了第1、2、3一共三个题&#xff0c;第4题可惜了。1.thanks,mom【算法赛】 思路&#xff1a; 没什么好说的&#xff0c;但是当时比赛刚开始服务器有问题&#xff0c;基本提交的全WA了。#include <…

MATLAB读取.nc(数据集)文件

MATLAB读取.nc(数据集)文件 以中国1km逐月潜在蒸散发数据集&#xff08;1901-2022&#xff09;为例 首先用FileZilla下载特定年份的数据集 用matlab进行处理&#xff0c;代码如下&#xff1a; clear;clc;ncdisp("pet_2022.nc") %读数据集的具体信息和变量eva ncr…

macOS上实现「灵动岛」效果

自从Apple iPhone推出了「灵动岛」功能后&#xff0c;用户们就被其优雅的设计和强大的功能所吸引。然而&#xff0c;作为macOS用户&#xff0c;我们一直在等待这一功能能够在我们的设备上实现。现在&#xff0c;随着新的应用程序的推出&#xff0c;我们终于可以在我们的Mac上体…

Qt 键盘事件

文章目录 1. 键盘按下、释放事件的基本使用2. 键盘事件移动标签2.1 界面上添加标签2.2 移动标签 QEvent::KeyPress 键盘按下时&#xff0c;触发该事件&#xff0c;它对应的子类是QKeyEvent QEvent::KeyRelease 键盘抬起时&#xff0c;触发该事件&#xff0c;它对应的子类是QKey…