当前位置: 首页 > news >正文

以太坊代币标准ERC20、ERC721

两个概念

  • ERC(Ethereum Request for Comment) 以太坊意见征集稿
  • EIP(Ethereum Improvement Proposals)以太坊改进提案

ERC和EIP用于使得以太坊更加完善;在ERC中提出了很多标准,用的最多的标准就是它的Token标准;
有哪些标准详细见https://eips.ethereum.org/erc

常见ERC标准

ERC-20Token Standard
ERC-721Non-Fungible Token Standard
ERC-165Standard Interface Detection
ERC-777Token Standard
ERC-1155Multi Token Standard

ERC-20

主要是指同质化代币标准(不同人持有的一个代币是等值的)。
ERC-20标准中主要有6个函数和两个事件
在这里插入图片描述
其中这6个函数表达的意义是:
totalSupply:总发行量
balanceOf:账户余额
transfer:转账
transferFrom:针对授权进行转账
approve:授权
allowance:owner授权给spender余额
具体的详细见https://eips.ethereum.org/EIPS/eip-20

实现ERC20标准代币

想要发现ERC20标准的代币,就需要实现ERC20标准接口中的函数

先写ERC20标准接口

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;interface IERC20 {function name() external  view returns (string memory);function symbol() external view returns (string memory);function decimals() external view returns (uint8);function totalSupply() external view returns (uint256);function balanceOf(address _owner) external view returns (uint256 balance);function transfer(address _to, uint256 _value) external returns (bool success);function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);function approve(address _spender, uint256 _value) external returns (bool success);function allowance(address _owner, address _spender) external view returns (uint256 remaining);//_from和_to两个参数有indexed关键字修饰,表示这些参数可以作为过滤条件来搜索事件。event Transfer(address indexed _from, address indexed _to, uint256 _value);event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

再实现ERC20标准代币

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "./IERC20.sol";contract ERC20 is IERC20{string ercName;string ercSymbol;uint8 ercDecimals;uint256 ercTotalSupply;mapping(address=>uint256) ercBalances;//一个人可以有多个委托人:授权者=>被授权者=>授权金额mapping (address=>mapping (address=>uint256)) ercAllowance;//合约部署者address public owner;constructor(string memory _name, string memory _symbol,uint8 _decimals){ercName=_name;ercSymbol=_symbol;ercDecimals=_decimals;owner=msg.sender;}//token名称function name() override  external  view returns (string memory){return ercName;}//token符号function symbol() override external view returns (string memory){return ercSymbol;}//token可以拆分到的精度function decimals() override external view returns (uint8){return ercDecimals;}//token发行总量function totalSupply() override external view returns (uint256){return ercTotalSupply;}//账户余额function balanceOf(address _owner) override external view returns (uint256 balance){return ercBalances[_owner];}//给某人转账function transfer(address _to, uint256 _value) override external returns (bool success){require(_value>0,"_value must >0");require(_to!=address(0),"_to is null");require(ercBalances[msg.sender]>=_value,"user's balance not enough");ercBalances[msg.sender]-=_value;ercBalances[_to]+=_value;emit Transfer(msg.sender, _to, _value);return true;}//被授权用户用我的token转账;_from: 授权者,_to:转给谁function transferFrom(address _from, address _to, uint256 _value) override external returns (bool success){require(ercBalances[_from] >= _value,"user's balance not enough");require(ercAllowance[_from][msg.sender]>=_value,"approve's balance not enough");require(_value>0,"_value must > 0");require(_to!=address(0),"_to is null");ercBalances[_from]-=_value;ercBalances[_to]+=_value;ercAllowance[_from][msg.sender]-=_value;emit Transfer(_from, _to, _value);return true;}//授权其他用户可以花费我多少tokenfunction approve(address _spender, uint256 _value) override external returns (bool success){// require(_value>0,"value must >0");//让_value可以等于0,当其为0时表示收回授权require(_spender!=address(0),"_spender can not be null");require(ercBalances[msg.sender]>=_value,"user's balance not enough");ercAllowance[msg.sender][_spender]=_value; emit Approval(msg.sender, _spender, _value);return true;}//获取授花费的余额tokenfunction allowance(address _owner, address _spender) override external view returns (uint256 remaining){return ercAllowance[_owner][_spender];}//代币发行机制function mint(address _to,uint256 _value) public{require(msg.sender==owner,"only owner can mint");require(_value>0,"_value must > 0");require(_to!=address(0),"_to is invalid"); ercBalances[_to]+=_value;ercTotalSupply+=_value;emit Transfer(address(0), _to, _value);}
}

ERC-721

主要是指非同质化代币标准(不同人持有的一个代币的价值不一样,如,艺术品)

http://www.lryc.cn/news/172861.html

相关文章:

  • 编写基于冒泡排序算法的qsort函数
  • 有什么推荐使用的企业上网行为管理软件?
  • 机器学习第五课--广告点击率预测项目以及特征选择的介绍
  • 细说tcpdump的妙用
  • 【深度学习实验】前馈神经网络(七):批量加载数据(直接加载数据→定义类封装数据)
  • 气体放电模拟装置中1Pa~101kPa范围内的真空度控制技术
  • 华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)
  • sql on条件判断是要注意null值
  • 9.22(一):数组扁平化
  • 【vue2第十九章】手动修改ESlint错误 和 配置自动化修改ESlint错误
  • 计算机网络常见面试题
  • springboot整合MeiliSearch轻量级搜索引擎
  • 禁用鼠标的侧边按键
  • 【C语言】数组和指针刷题练习
  • 2023年中国研究生数学建模竞赛D题解题思路
  • 在编译源码的环境下,搭建起Discuz!社区论坛和WordPress博客的LNMP架构
  • 腾讯面试题:无网络环境,如何部署Docker镜像?
  • 医学影像信息(PACS)系统软件源码
  • 【01】FISCOBCOS的系统环境安装
  • flutter 权限和图片权限之前的冲突
  • OpenCV(四十八):读取视频和保存视频
  • 如何在react/next.js app中的同级组件间传递数据
  • 软件需求文档、设计文档、开发文档、运维文档大全
  • 排序算法-----归并排序
  • docker 配置 gpu版pytorch环境--部署缺陷检测--Anomalib
  • 为什么定时发朋友圈会更有效呢?
  • 【跟小嘉学 PHP 程序设计】一、PHP 开发环境搭建
  • 【zookeeper】zk选举、使用与三种节点简介,以及基于redis分布式锁的缺点的讨论
  • Unity截图生成图片 图片生成器 一键生成图片
  • Matlab图像处理-区域特征