虚拟币用到的非常哇塞的技术(ERC代币标准)解读_dao erc标准
python编程示例系列
python编程示例系列二
python的Web神器Streamlit
如何应聘高薪职位
C#视觉应用开发问题系列
c#串口应用开发问题系列
microPython Python最小内核源码解析
NI-motion运动控制c语言示例代码解析
# ERC代币标准详解
用途与原理
ERC(Ethereum Request for Comments)是以太坊上的技术标准,用于定义智能合约的实现规则。其中最著名的几个代币标准包括:
ERC-20
ERC-20是最基础、应用最广泛的代币标准,用于实现同质化代币(Fungible Token)。同质化意味着每个代币单位都是完全相同且可互换的,类似于法定货币。
ERC-721
用于实现非同质化代币(Non-Fungible Token,NFT),每个代币都是独一无二的,不可互换的。
ERC-1155
多代币标准,允许在一个合约中同时管理多种代币类型(同质化和非同质化)。
下面我将详细介绍ERC-20标准,并提供完整的实现代码。
ERC-20标准实现代码示例
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/** * @title ERC20代币标准接口 * @dev 符合ERC20标准的接口定义 */interface IERC20 { /** * @dev 返回代币的总供应量 */ function totalSupply() external view returns (uint256); /** * @dev 返回账户拥有的代币数量 * @param account 要查询的账户地址 */ function balanceOf(address account) external view returns (uint256); /** * @dev 将调用者账户中的代币转移到目标账户 * @param recipient 接收代币的目标地址 * @param amount 转移的代币数量 * @return 如果转移成功返回true */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev 返回所有者允许支出者使用的代币数量 * @param owner 代币所有者地址 * @param spender 被授权的支出者地址 */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev 设置spender可以从调用者账户转出的代币数量 * @param spender 被授权的支出者地址 * @param amount 授权的代币数量 * @return 如果授权成功返回true */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev 从发送者账户转移代币到接收者账户(需要事先授权) * @param sender 发送代币的账户地址 * @param recipient 接收代币的账户地址 * @param amount 转移的代币数量 * @return 如果转移成功返回true */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev 当代币被转移时(通过transfer或transferFrom)触发的事件 * @param from 代币发送方地址 * @param to 代币接收方地址 * @param value 转移的代币数量 */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev 当approve函数被成功调用时触发的事件 * @param owner 代币所有者地址 * @param spender 被授权的支出者地址 * @param value 授权的代币数量 */ event Approval(address indexed owner, address indexed spender, uint256 value);}/** * @title 标准ERC20代币实现 * @dev 实现了IERC20接口的所有功能 */contract MyToken is IERC20 { // 代币名称 string private _name; // 代币符号 string private _symbol; // 代币小数位数 uint8 private _decimals; // 代币总供应量 uint256 private _totalSupply; // 记录每个地址拥有的代币数量 mapping(address => uint256) private _balances; // 记录每个地址对其他地址的授权额度 mapping(address => mapping(address => uint256)) private _allowances; /** * @dev 构造函数,初始化代币基本信息 * @param name_ 代币名称 * @param symbol_ 代币符号 * @param decimals_ 代币小数位数 * @param initialSupply 初始代币供应量 */ constructor(string memory name_, string memory symbol_, uint8 decimals_, uint256 initialSupply) { _name = name_; _symbol = symbol_; _decimals = decimals_; // 初始化总供应量,并将所有代币分配给合约部署者 _totalSupply = initialSupply * (10 ** uint256(decimals_)); _balances[msg.sender] = _totalSupply; // 触发转账事件(从零地址转到部署者地址) emit Transfer(address(0), msg.sender, _totalSupply); } /** * @dev 返回代币名称 */ function name() public view returns (string memory) { return _name; } /** * @dev 返回代币符号 */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev 返回代币小数位数 */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev 实现IERC20接口的totalSupply函数 */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev 实现IERC20接口的balanceOf函数 */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev 实现IERC20接口的transfer函数 */ function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev 实现IERC20接口的allowance函数 */ function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } /** * @dev 实现IERC20接口的approve函数 */ function approve(address spender, uint256 amount) public override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @dev 实现IERC20接口的transferFrom函数 */ function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); // 检查并更新授权额度 uint256 currentAllowance = _allowances[sender][msg.sender]; require(currentAllowance >= amount, \"ERC20: 转账金额超过授权额度\"); // 减少授权额度 _approve(sender, msg.sender, currentAllowance - amount); return true; } /** * @dev 增加对spender的授权额度 * @param spender 被授权的支出者地址 * @param addedValue 增加的授权金额 */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } /** * @dev 减少对spender的授权额度 * @param spender 被授权的支出者地址 * @param subtractedValue 减少的授权金额 */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { uint256 currentAllowance = _allowances[msg.sender][spender]; require(currentAllowance >= subtractedValue, \"ERC20: 减少的授权金额超过当前授权额度\"); _approve(msg.sender, spender, currentAllowance - subtractedValue); return true; } /** * @dev 内部转账函数,实现代币从一个地址转移到另一个地址 * @param sender 发送代币的地址 * @param recipient 接收代币的地址 * @param amount 转移的代币数量 */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), \"ERC20: 不能从零地址转账\"); require(recipient != address(0), \"ERC20: 不能转账到零地址\"); require(_balances[sender] >= amount, \"ERC20: 转账金额超过余额\"); // 更新余额 _balances[sender] = _balances[sender] - amount; _balances[recipient] = _balances[recipient] + amount; // 触发转账事件 emit Transfer(sender, recipient, amount); } /** * @dev 内部授权函数,设置spender可以从owner账户转出的代币数量 * @param owner 代币所有者地址 * @param spender 被授权的支出者地址 * @param amount 授权的代币数量 */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), \"ERC20: 授权者不能是零地址\"); require(spender != address(0), \"ERC20: 被授权者不能是零地址\"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 铸造新代币(这个函数通常会有访问控制,这里简化处理) * @param account 接收新代币的地址 * @param amount 铸造的代币数量 */ function mint(address account, uint256 amount) public { require(account != address(0), \"ERC20: 不能铸造代币到零地址\"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev 销毁代币(这个函数通常会有访问控制,这里简化处理) * @param account 销毁代币的地址 * @param amount 销毁的代币数量 */ function burn(address account, uint256 amount) public { require(account != address(0), \"ERC20: 不能从零地址销毁代币\"); require(_balances[account] >= amount, \"ERC20: 销毁金额超过余额\"); _balances[account] -= amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); }}
代码逻辑流程图
#mermaid-svg-aVQapOHeR4vhXN5a {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aVQapOHeR4vhXN5a .error-icon{fill:#552222;}#mermaid-svg-aVQapOHeR4vhXN5a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aVQapOHeR4vhXN5a .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-aVQapOHeR4vhXN5a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aVQapOHeR4vhXN5a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aVQapOHeR4vhXN5a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aVQapOHeR4vhXN5a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aVQapOHeR4vhXN5a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aVQapOHeR4vhXN5a .marker.cross{stroke:#333333;}#mermaid-svg-aVQapOHeR4vhXN5a svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aVQapOHeR4vhXN5a .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aVQapOHeR4vhXN5a .cluster-label text{fill:#333;}#mermaid-svg-aVQapOHeR4vhXN5a .cluster-label span{color:#333;}#mermaid-svg-aVQapOHeR4vhXN5a .label text,#mermaid-svg-aVQapOHeR4vhXN5a span{fill:#333;color:#333;}#mermaid-svg-aVQapOHeR4vhXN5a .node rect,#mermaid-svg-aVQapOHeR4vhXN5a .node circle,#mermaid-svg-aVQapOHeR4vhXN5a .node ellipse,#mermaid-svg-aVQapOHeR4vhXN5a .node polygon,#mermaid-svg-aVQapOHeR4vhXN5a .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aVQapOHeR4vhXN5a .node .label{text-align:center;}#mermaid-svg-aVQapOHeR4vhXN5a .node.clickable{cursor:pointer;}#mermaid-svg-aVQapOHeR4vhXN5a .arrowheadPath{fill:#333333;}#mermaid-svg-aVQapOHeR4vhXN5a .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aVQapOHeR4vhXN5a .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aVQapOHeR4vhXN5a .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-aVQapOHeR4vhXN5a .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-aVQapOHeR4vhXN5a .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aVQapOHeR4vhXN5a .cluster text{fill:#333;}#mermaid-svg-aVQapOHeR4vhXN5a .cluster span{color:#333;}#mermaid-svg-aVQapOHeR4vhXN5a div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aVQapOHeR4vhXN5a :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 有效 无效 有效 无效 有效 无效 有效 无效 有效 无效 部署合约 初始化代币信息 铸造初始代币给部署者 transfer函数 检查参数 更新余额 触发Transfer事件 交易失败 approve函数 检查参数 设置授权额度 触发Approval事件 交易失败 transferFrom函数 检查参数和授权 更新余额 减少授权额度 触发Transfer事件 交易失败 mint函数 检查参数 增加总供应量 增加接收者余额 触发Transfer事件 交易失败 burn函数 检查参数 减少账户余额 减少总供应量 触发Transfer事件 交易失败
ERC-20代币标准的应用场景
-
加密货币:最基本的应用,创建可交易的数字货币。
-
实用型代币:为特定平台或生态系统提供功能性代币,如支付平台费用、获取服务等。
-
治理代币:允许持有者参与去中心化组织(DAO)的决策过程,如投票表决提案。
-
稳定币:与法定货币挂钩的代币,如USDT、USDC等。
-
证券化代币:代表传统金融资产的数字代币,如债券、股票等。
-
忠诚度积分系统:将传统的积分系统转移到区块链上,提高透明度和流动性。
-
众筹和ICO:为项目融资发行代币。
-
去中心化金融(DeFi):作为DeFi生态系统中的基础组件,用于借贷、流动性挖矿等。
-
跨链桥接:不同区块链之间的资产转移。
-
游戏内经济:为区块链游戏提供经济系统和游戏内资产。
总结
ERC-20标准为以太坊上的代币创建提供了统一的接口和实现方式,使得代币之间可以无缝互操作,极大促进了区块链生态系统的发展。通过定义一系列标准函数和事件,ERC-20确保了代币合约的行为一致性,使第三方应用(如钱包、交易所)能够轻松集成和支持各种代币。
ERC-20的核心功能包括代币余额查询、转账、授权转账等,通过这些基础功能,可以构建复杂的金融应用和经济系统。虽然ERC-20有一些局限性(如无法处理非同质化资产),但它仍然是区块链领域最成功的技术标准之一,为数字经济提供了坚实的基础设施。
随着区块链技术的不断发展,ERC-20标准也在不断演进,衍生出了更多特定用途的代币标准,共同构成了丰富多样的区块链代币生态系统。
microPython的源码解析之 objclosure.c
c#视觉应用开发中如何在C#中进行图像融合?
GPT-4将使ChatGPT更智能
Python的高性能web框架库Tornado
microPython的源码解析之 scheduler.c
如何将一个Sqlite数据库Db中的所有表快速拆分到多个db文件中
linux其实比windows更适合程序开发
python读取和编写配置文件库ConfigObj和ConfigParser
允许从Python中调用C++函数、使用C++类和对象的库PyCXX
详细解读一下B树,及如何进行搜索
量化交易系统中+如何处理跨平台和跨系统的集成?
qt如何操作Excel文件
量化交易系统如何进行版本控制和代码管理
车载系统软件工程师如何处理车载系统的冷启动和热启动优化
量化交易系统中+如何处理多设备和多平台的兼容性?
python数学量子计算库toqito
量化交易系统中+如何分析订单簿数据(Level 2数据)?
量化交易系统中+如何优化系统的内存和CPU使用?
车载系统软件工程师如何处理车载系统的内存管理和优化
python如何使用Windows API 和 COM 接口
车载系统软件工程师如何实现车载系统的虚拟仪表盘
智能农业设备软件工程师如何实现智能喷灌系统
microPython的源码解析之 modio.c
C#进行串口应用开发如何合理配置串口通信的发送与接收缓冲区
智能农业设备软件工程师如何处理设备的传输延迟和数据一致性
智能农业设备软件工程师如何确保设备的数据安全和隐私保护
c#视觉应用开发中如何在C#中实现对象跟踪?
c#视觉应用开发中如何在C#中进行图像锐化?
python如何检测一篇文章是不是由chatGPT生成的
python的Cirq库如何使用
python如何实现π计算,可以指定精度
开源的AI算法可以进行物体识别,动物识别
python如何知道一个第三方库依赖哪些其它的库
microPython的源码解析之 modmath.c
python如何开发一个计算中国象棋下子优势的算法
c#视觉应用开发中如何在C#中进行图像配准?
量化交易系统中+如何确保数据的安全性和隐私保护?
RedisTimeSeries开源的时序数据数据库
C#进行串口应用开发如何编写跨平台的串口通信程序
microPython的源码解析之 builtinhelp.c
Python程序如何进行性能分析
python语言有哪些宝藏功能
Python的双下方法(dunder methods)
Deepmind开发了哪些开源的AI项目
梯度下降之外 的其他优化算法
量化交易系统中+如何与第三方数据提供商进行集成?
Python 强大的模板引擎库 Skeleton BootStrap
智能农业设备软件工程师如何实现农业设备的智能助理和AI应用
量化交易系统中如何处理不同市场的微结构差异?
microPython的源码解析之 nlrx64.c
利用qt及 c++语言如何计算KDJ技术指标,请给出示例代码
智能农业设备软件工程师如何处理设备的带宽和通信效率优化
D-Link 澳大利亚使用 Python 控制固件更新
Python实现一个具有交互模式的牛顿摆屏幕保护程序
python 如何删除文件?
microPython的源码解析之 objboundmeth.c
c#视觉应用开发中如何在C#中进行图像修复?
microPython的源码解析之 objobject.c
智能农业设备软件工程师如何处理设备的多任务处理能力
量子计算Quantum Approximate Optimization Algorithm (QAOA)算法
量子计算Deutsch-Josza算法
c#视觉应用开发中如何在C#中进行图像几何变换?
QT 的自定义宏 #define QT_ANNOTATE_CLASS(type, …)什么意思
microPython的源码解析之 emitinlinethumb.c
microPython的源码解析之 objstr.c
openAI的neuralink
ANTLR 强大的语法分析器生成器
microPython的源码解析之 objint_mpz.c
python如何判断一个文件是否已经写入完成
python如何操作pdf文档
openai 的API 从自然语言生成sql语句
microPython的源码解析之 profile.c
车载系统软件工程师如何实现车载系统的驾驶员身份识别
车载系统软件工程师如何实现车载系统的触摸屏控制和反馈
车载系统软件工程师如何实现车载系统的驾驶员辅助功能
python如何创建具有交互性和动画效果的地理空间数据可视化和科学数据可视化
量化交易系统中+如何进行策略间的相关性分析?
python的gradio库如何使用
microPython的源码解析之 objfloat.c
量化交易策略 标准差突破
c#如何使用windows的挂钩技术
LOLCODE是一个基于网络流行语的编程语言
NI-Motion实现基于速度的执行运动 的C语言代码示例
车载系统软件工程师如何处理车载系统的环境感知和响应
c#视觉应用开发中如何在C#中处理图像噪声?
python如何操作excel文件
智能农业设备软件工程师如何实现农业设备的用户体验优化
c#视觉应用开发中如何在C#中进行图像去残影?
车载系统软件工程师如何处理车载系统的存储管理和优化
Python的opencv库使用ORB算法 进行特征检测
python web应用开发神器 入门十四
二叉树如何进行快速搜索
智能农业设备软件工程师如何集成和管理农业设备的远程诊断系统
智能农业设备软件工程师如何集成和管理农业设备的设备健康监测
python在Web应用程序中安全地转义和渲染HTML的库MarkupSafe
openai和alphago什么关系
如何在 Python 中逐行读取一个文件到列表?
c#视觉应用开发中如何在C#中进行姿态估计?
车载系统软件工程师如何实现车载系统的远程诊断和修复
NI-Motion如何控制一个或多个运动控制板卡上的轴参考点的C语言示例代码