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

相关文章

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3