草庐IT

ERC20介绍

触不可及 2023-03-28 原文

ERC 20

这套接口、合约和应用程序都与 ERC20 代币标准相关。

有一些核心合约实现了 EIP 中指定的功能和定义:

  • IERC20:包含所有ERC20应该实现的接口
  • IERC20Metadata:对ERC20接口的扩展,包括Token名称,符号,和精度。
  • ERC20:对ERC20接口的实现,将名称,符号和精度这些可选的标准扩展引入到基本接口中。

另外还有一些自定义的扩展可以使用,包括以下内容:

  • ERC20Burnable:销毁持有的token
  • ERC20Capped:发行Token时对总供应量指定上限
  • ERC20Pausable:能够暂停Token的交易
  • ERC20Snapshot:有效存储过去的Token余额,以便以后随时查询
  • ERC20Permit:token的委托无需Gas(同ERC2612的标准)
  • ERC20FlashMint:通过临时代币的铸造和销毁对闪电贷的代币级支持(同ERC3156标准)
  • ERC20Votes:支持投票和投票委托
  • ERC20VotesComp:支持投票和投票委托(兼容Compound的Token,有uint96的限制)
  • ERC20Wrapper:用于创建由另一个 ERC20 支持的 ERC20 的包装器,具有存储Token和撤回Token的方法,通常用于ERC20Votes的裁决

最后,还有一些工具可以以多种方式与ERC20 合约交互:

  • SafeERC20:接口的包装器,无需对布尔类型的返回值进行处理。
  • TokenTimelock:冻结交易的Token一定时间,直到到达一个指定的时间后才可以持有Token
  • ERC20Permit

核心接口

IERC20

ERC20的核心接口大多同IERC20合约继承过来的,IERC20中包含以下接口:
函数

//返回存在的Token的总数
totalSupply()
//返回账户持有的Token的总数
balanceOf(account)
//将指定数量的Token交易到其他账户
//如果交易结果返回一个布尔值
//同时触发Transfer事件
transfer(to, amount)
//返回owner持有的,且spender具有消费权限的Token数量,默认为0
allowance(owner, spender)
//配置一定数量的允许spender消费的Token数量
approve(spender, amount)
//从from账户地址交易一定数量的Token到其他地址,该Token通过approve函数赋予消费权限
transferFrom(from, to, amount)

事件

Transfer(from,to,value)
APproval(owner,spender,value)

IERC20Metadata

ERC20标准中可选的元数据函数接口:

//返回Token的名称
name()
//返回Token的符号
symbol()
//返回Token的精度
decimals()

ERC20 Token 合约 构建

使用合约,可以轻松创建自己的ERC20 Token合约,可以用于跟踪虚拟游戏中的内部货币黄金 (GLD)。
一个简单的示例如下:

// contracts/GLDToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract GLDToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("Gold", "GLD") {
        _mint(msg.sender, initialSupply);
    }
}

在该合约中通过内部接口,并使用ERC20合约实现了ERC20基本的接口和Token名称、Token符号、Token精度这些可选的扩展,另外,通过initialSupply指定了初始Token数量,并将指定数量的Token赋予到部署合约的账户地址。
当合约部署完成,将能够去查询合约部署的账户的余额:

> GLDToken.balanceOf(部署者账户地址)
1000000000000000000000

同样,也可将Token交易到其他账户:

> GLDToken.transfer(otherAddress, 300000000000000000000)
> GLDToken.balanceOf(otherAddress)
300000000000000000000
> GLDToken.balanceOf(deployerAddress)
700000000000000000000

有关ERC20介绍的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  3. Ubuntu20.04系统WineHQ7.0安装微信 - 2

    提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信

  4. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  5. ruby-on-rails - encode_www_form 将空格转换为 + 而不是 %20 - 2

    我正在尝试从使用RubyonRails的散列创建http参数,我尝试使用URI.encode_www_form(params),但这没有正确生成参数。下面是我的哈希值params['Name'.to_sym]='NiaKun'params['AddressLine1'.to_sym]='AddressOne'params['City'.to_sym]='CityName'这个方法把空格转成+,我要的是把空格转成%20我收到"Name=Nia+Kun&AddressLine1=Address+One&City=City+Name"但我需要将此空格转换为%20

  6. Spring Cloud Gateway 服务网关的部署与使用详细介绍 - 2

    为什么需要服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。有了网关之后,网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务。使用网关的好处1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发

  7. ruby - 如何在 Node.js/RoR 中监控 20 个网站(Ping 或 HTTP)的正常运行时间 - 2

    每5分钟(例如)ping20个网站的列表以了解该网站是否响应HTTP202的最佳方法是什么?最简单的想法是将20个URLS保存在数据库中,然后运行数据库并对每个URL执行ping操作。但是,当一个人不回答时会发生什么?之后的人会怎样?此外,是否有更好但更简单的解决方案?恐怕该列表会增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内全部ping通它们。基本上,我是在描述PingDom、UptimeRobot等的工作原理。我正在使用node.js和RubyonRails构建这个系统。我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。建议?非常感谢!

  8. ruby - Vim 详细介绍了 Rails 的自动完成功能 - 2

    我发现python的细节自动完成很好RubyonRails有类似的方法描述吗? 最佳答案 有篇不错的文章"UsingVIMasacompleteRubyonRailsIDE"其中引用rails.vim.这似乎是RailsforVIM的实际标准。(不过,我还没有使用过它,但很快就会尝试。)这允许你做很多与Rails相关的任务,但对自动完成没有帮助。还有一篇"RubyAutocompleteinVim"(遗憾的是不再可用)这就是您要搜索的内容。我不知道,理解Rails的所有插件魔法和元编程的东西是否足够聪明。它至少在vim的配置中提到了

  9. ruby-on-rails - 如何在 Rails 中使用空格作为 '%20' 而不是 '+' 获取 url 的参数 - 2

    如果我有这个参数用于添加到URLparams={name:'JohnKey'}并使用方法to_param:params.to_param=>"name=John+Key"重点是'+'没有被所使用的服务正确读取,需要'%20'而不是name=John%20Key:Whentoencodespacetoplus(+)or%20?有没有办法在不使用gsub的情况下返回带有“%20”的参数? 最佳答案 我会建议只坚持使用gsub,也许用注释来解释这种行为的必要性。虽然您可以通过使用URI.escape解决问题,但据说它已被弃用,因为它不完全

  10. 华为防火墙简单介绍 - 2

    防火墙防火墙分类第一代防火墙:包过滤防火墙包过滤防火墙的缺点第二代防火墙:代理防火墙第三代防火墙:状态防火墙第四代防火墙:UTM防火墙第五代防火墙:下一代防火墙华为防火墙介绍安全策略防火墙的会话表防火墙分类第一代防火墙:包过滤防火墙属于第一代防火墙技术,在没有专用防火墙设备时,一般由路由器实现该功能。将网络上传送数据包的IP首部以及TCP/UDP首部,获取发送源的IP地址和端口号,以及目的地的IP地址和端口号,并将这些信息作为过滤条件,决定是否将该分组转发至目的地网络分组过滤的执行需要设置访问控制列表。访问控制列表也可以称为安全策略(简称策略)或安全规则(简称规则)。类似于进站检票的做法,符合

随机推荐