solidity实现ERC20代币标准

2023-12-08 19:45

本文主要是介绍solidity实现ERC20代币标准,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1、以太坊 - 维基百科
  • 2、IERC20
  • 3、ERC20
  • 4、Remix 编译部署

1、以太坊 - 维基百科

以太坊(Ethereum)是一个去中心化的开源的有智能合约功能的公共区块链平台。以太币(ETH 或 Ξ)是以太坊的原生加密货币。截至2021年12月,以太币是市值第二高的加密货币,仅次于比特币。以太坊是使用最多的区块链,主要的代币标准有 ERC-20、ERC-721、ERC-1155、ERC-223、ERC-677 等等,其中 ERC-20 是最常用的代币标准。

2、IERC20

IERC20 是 ERC20 标准的接口规范,它定义和规范了一个标准 ERC20 代币合约应该实现的功能。这里让 ERC20 合约直接继承自 IERC20 接口。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;interface IERC20 { // 当 `value` 单位的货币从账户 (`from`) 转账到另一账户 (`to`)时 触发event Transfer(address indexed from, address indexed to, uint256 value);// 当 `value` 单位的货币从账户 (`owner`) 授权给另一账户 (`spender`)时触发 event Approval(address indexed owner, address indexed spender, uint256 value);// 返回代币总供给.function totalSupply() external view returns (uint256);// 返回账户`account`所持有的代币数.function balanceOf(address account) external view returns (uint256);// 转账 `amount` 单位代币,从调用者账户到另一账户 `to`.function transfer(address to, uint256 amount) external returns (bool);// 返回`owner`账户授权给`spender`账户的额度,默认为0。function allowances(address owner, address spender) external view returns (uint256);// 调用者账户给`spender`账户授权 `amount`数量代币。    function approve(address spender, uint256 amount) external returns (bool);// 通过授权机制,从`from`账户向`to`账户转账`amount`数量代币。转账的部分会从调用者的`allowances`中扣除。function transferFrom( address from, address to, uint256 amount ) external returns (bool);
}

3、ERC20

ERC20 是以太坊上最常用的代币标准,用于发行同质化代币。它定义了一套规则和接口,使得不同的代币可以在同一个平台上互相交换和使用。ERC-20 定义的代币实现了基本功能如转账、查询余额、授权、总供给量等。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;import "./IERC20.sol"; contract MyToken is IERC20 {mapping(address => uint256) public override balanceOf;mapping(address => mapping(address => uint256)) public override allowances;uint256 public 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, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount);return true;}// 授权转账 function transferFrom(address sender, address recipient, uint amount) external override returns (bool){_transfer(sender, recipient, amount); uint256 currentAllowance = allowances[sender][msg.sender]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowances");           // 是否超过授权额度 _approve(sender, msg.sender, currentAllowance - amount);return true;}   function _transfer(address sender, address recipient, uint256 amount) internal {require(sender != address(0), "ERC20: transfer from the zero address");require(recipient != address(0), "ERC20: transfer to the zero address");uint256 senderBalance = balanceOf[sender];require(senderBalance >= amount,  "ERC20: transfer amount exceeds balance");balanceOf[sender] = senderBalance - amount;balanceOf[recipient] += amount;emit Transfer(sender, recipient, amount);}// 授权 function approve(address spender, uint amount) external override returns (bool){_approve(msg.sender, spender, amount); return true;}function _approve(address owner, address spender, uint256 amount) internal {require(owner != address(0), "ERC20: approve from the zero address");   // 授权无效地址 require(spender != address(0), "ERC20: approve to the zero address");allowances[owner][spender] = amount;emit Approval(owner, spender, amount);}// 锻造代币function mint(address account, uint amount) external {require(account != address(0), "ERC20: mint to the zero address");balanceOf[account] += amount; totalSupply += amount;emit Transfer(address(0), msg.sender, amount);}// 销毁代币 function burn(address account, uint amount) external {require(account != address(0), "ERC20: burn from the zero address");uint256 accountBalance = balanceOf[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance");balanceOf[account] = accountBalance - amount;totalSupply -= amount; emit Transfer(account, address(0), amount); }
}

4、Remix 编译部署

1、可以直接在 Remix IDE 上编译部署。
在这里插入图片描述
2、 点击 mint 函数输入 account 和 amount 两个参数锻造代币。
在这里插入图片描述

这篇关于solidity实现ERC20代币标准的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471117

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买