ERC 20 优缺点,以及 eth 3 种转账方式

这篇具有很好参考价值的文章主要介绍了ERC 20 优缺点,以及 eth 3 种转账方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ERC 20 协议的产生(优点):

  • 定义统一的函数名:名称、发行量、转账函数、转账事件等
  • 以便交易所、钱包进行集成
  • 所有实现了这些函数的合约都是 ERC20Token
  • ERC20 可以表示任何同质的可以交易的内容: 货币、股票、积分、债券、利息...
  • 可以用数量来表示的内容 基本上可以ERC20 表示

ERC 20 的缺点

以下是一个遇到很多次的场景:有一天老板过来找你(开发者),最近存币生息很火,我们也做一个合约吧, 用户打币过来给他计算利息, 看起来是一个很简单的需求,你满口答应说好,结果自己一研究发现,使用 ERC20 标准没办法在合约里记录是谁发过来多少币,从而没法计算利息(因为接收者合约并不知道自己接收到ERC20代币)。

ERC20 标准下,可以通过一个变通的办法,采用两个交易组合完成,方法是:第1步:先让用户把要转移的金额用 ERC20 的approve 授权的存币生息合约(这步通常称为解锁),第2步:再次让用户调用存币生息合约的计息函数,计息函数中通过 transferFrom 把代币从用户手里转移的合约内,并开始计息。

同样由于ERC20 标准没有一个转账通知机制,很多ERC20代币误转到合约之后,再也没有办法把币转移出来,已经有大量的ERC20 因为这个原因被锁死。

另外一个问题是ERC20 转账时,无法携带额外的信息,例如:我们有一些客户希望让用户使用 ERC20 代币购买商品,因为转账没法携带额外的信息, 用户的代币转移过来,不知道用户具体要购买哪件商品,从而展加了线下额外的沟通成本。

如何解决 ERC 20 中存在的问题

使用这个ERC777:send(dest, value, data) 解决。

ERC777 使用 send转账时会分别在持有者和接收者地址上使用ERC1820 的getInterfaceImplementer函数进行查询,查看是否有对应的实现合约,ERC777 标准规范里预定了接口及函数名称,如果有实现则进行相应的调用。

即便是一个普通用户地址,同样可以实现对 ERC777 转账的监听, 听起来有点神奇,其实这是通过 ERC1820 接口注册表合约来是实现的。

ERC1820 如此的重要,以至于ERC777单独把它拆出来作为一个EIP。

ERC1820合约提过了两个主要接口:

  • setInterfaceImplementer(address _addr, bytes32 _interfaceHash, address _implementer)
    用来设置地址(_addr)的接口(_interfaceHash 接口名称的 keccak256 )由哪个合约实现(_implementer)。
  • getInterfaceImplementer(address _addr, bytes32 _interfaceHash) external view returns (address)
    这个函数用来查询地址(_addr)的接口由哪个合约实现。

ERC1820 是一个全局的合约,有一个唯一在以太坊链上都相同的合约地址,它总是 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24 ,这个合约是通过非常巧妙的方式进行部署的。

如果面试官问 :有没有办法不使用 erc 777 来解决误转入合约锁死?

可以查看 erc 20 的源码 发现 transfer 方法如下 :

  function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

我们在实现自己的erc 20 合约的时候重载 _afterTokenTransfer 这个方法 。

并且判断 我们这个代币 如果转入的是合约,就要就他实现一个接受代币的方法 。

这种处理方式是有 副作用的 ,比如你转到 uniswap ,等 ,他应该是没有实现你指定的方法 。

我思考 可以参考 erc 721 的做法增加一个新的函数 ,叫safexxx 来执行转账的逻辑。

eth 3 种转账方式的区别 :

erc20 transfer data,协议,区块链,以太坊

erc 20:

如果要给合约转账,则需先授权给合约:合约能使用多少个币,然后才能进行转账

举例说明,如果账户A有1000个ETH,想允许B账户随意调用他的100个ETH,过程如下: 

A账户按照以下形式调用approve函数approve(B,100)
B账户想用这100个ETH中的10个ETH给C账户,调用transferFrom(A, C, 10)
调用allowance(A, B)可以查看B账户还能够调用A账户多少个token

此处的token 需要是只要符合erc20 标准的token

ERC 777

参考上面提到的 :

ERC777 使用 send转账时会分别在持有者和接收者地址上使用ERC1820 的getInterfaceImplementer函数进行查询,查看是否有对应的实现合约,ERC777 标准规范里预定了接口及函数名称,如果有实现则进行相应的调用。

ERC 2612 (ERC20 permit)

线下签名授权

(授权)可以在线下签名进行,签名信息可以在执行接收转账交易时提交到链上,让授权和转账在一笔交易里完成。 同时转账交易也可以由接收方(或其他第三方)来提交,也避免了用户(ERC20的拥有者)需要有 ETH的依赖。文章来源地址https://www.toymoban.com/news/detail-803754.html

到了这里,关于ERC 20 优缺点,以及 eth 3 种转账方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET的发展历程以及优缺点

    .NET是由微软推出的一个开放的编程平台,它支持多种编程语言和操作系统,旨在为开发人员提供一种快速、灵活、高效的应用程序开发方法。下面是.NET的发展历史: .NET Framework 1.0(2002年):.NET Framework 1.0 在2002年发布,这是.NET平台的第一个版本,包含了基本的API和运行时环

    2024年02月03日
    浏览(33)
  • singularity 运行方式汇总,运行方式的优缺点,及其调用方法

    1. Shell 模式 调用方法 : singularity shell [options] container_path 优点 : 提供了一个交互式的环境,用户可以在容器内探索和运行命令,非常适合开发和测试。 不需要预先定义要运行的命令或脚本,增加了灵活性。 缺点 : 交互式使用可能不适合自动化脚本或批处理作业。 在容器内手

    2024年02月22日
    浏览(27)
  • TCP/UDP区别以及优缺点详解

    TCP/IP协议的具体含义 TCP协议位于传输层,IP协议位于网络层。 TCP/IP协议很多情况下只是利用IP进行通信时所必须用到的协议群的统称。具体来说,IP或ICMP、TCP和UDP、TELNET或FTP,以及FTTP等都属于TCP/IP协议,有时候也称TCP/IP为网络协议群。 TCP、UDP协议的区别: 注:可从以下几个方

    2024年02月04日
    浏览(41)
  • 浅谈 iframe的优缺点以及使用场景

    提示:以下是本篇文章正文内容 iframe 是嵌入式框架,是 HTML框架 ,还是一个 内联元素 ,iframe元素会创建包含另一个文档的内联框架(行内框架),说白了就是,iframe用来在页面嵌入其他的页面。 通常我们使用iframe直接在页面嵌套iframe标签指定src就可以了。 iframe能够把嵌入

    2024年02月05日
    浏览(38)
  • 什么是js,以及js优缺点

    JavaScript(简称 JS)是一种轻量级、解释型的编程语言,通常用于在 Web 页面上添加交互性、动态性和动画效果。它是世界上最流行的编程语言之一,也是唯一一种可以在 Web 浏览器中运行的编程语言。 JavaScript 的优点: 灵活性:JavaScript 可以用于多种应用场景,例如创建交互

    2024年02月09日
    浏览(31)
  • Torch中常见插值方式及各自的优缺点

    插值指的是利用已知数据去预测未知数据,图像插值则是给定一个像素点,根据它周围像素点的信息来对该像素点的值进行预测。 当我们调整图片尺寸或者对图片变形的时候常会用到图片插值。 常见的插值算法可以 分为两类 : 自适应和非自适应 。 自适应的方法可以根据插

    2024年02月10日
    浏览(25)
  • Unity获取物体组件的所有方法以及优缺点

    1.GetComponent(): 获取物体上的指定组件 T,如果物体上不存在该组件,则返回 null。 优点:简单易用,可以快速获取指定组件的实例,方便直接操作组件。 缺点:如果需要获取多个组件,需要多次调用该方法,较为繁琐。 2.GetComponentInChildren(): 在物体及其子物体中查找指定组件

    2024年02月13日
    浏览(30)
  • Springboot四种实现鉴权方式各自的优缺点

    拦截器 :拦截器是基于SpringMVC的一种机制,它可以在请求到达控制器之前或之后进行拦截和处理,比如验证用户身份,记录日志,添加响应头等。 优点 :拦截器可以获取到请求的上下文信息,如请求路径,参数,方法等,可以根据不同的业务逻辑进行灵活的处理。拦截器也

    2024年02月10日
    浏览(36)
  • js常用判断数据类型方法以及优缺点 以及 instanceof 原理实现

    使用typeof操作符可以 判断一个值的数据类型 。它返回一个表示数据类型的字符串。 优点:typeof 操作符是一种简单、快速的方式来 判断基本数据类型 。它返回的结果是一个字符串,可以直接用于条件判断。 缺点: 对于引用类型(除了函数)的判断结果都是\\\'object\\\' ,无法细

    2024年02月12日
    浏览(30)
  • 面试题:Spring 与 Springboot 的区别以及优缺点

    Spring是一个开源的Java开发框架,旨在简化企业级Java应用程序的开发。它提供了一套完整的基础设施,包括依赖注入、面向切面编程、声明式事务管理等。 Spring Boot是一个用于创建独立的、生产级别的基于Spring的应用程序的框架。它将各种Spring组件和第三方库整合到一个能够

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包