2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 深入浅出ERC777合约

深入浅出ERC777合约

时间:2021-12-11 20:44:15

相关推荐

深入浅出ERC777合约

引言

在合约盛行的年代,各式各样的协议应开发者需求而生,今天我们讨论一个潜力巨大的合约协议——ERC777。

ERC777介绍

ERC-777代币来自最初的EIP(以太坊改进建议)——/EIPS/eip-777,由Jacques Dafflon、Jordi Baylina和Thomas Shababi编写。名称中的777实际上没有任何意义,只是由于 githubissues的当前索引生成。这个提议的最初动机是提供比当前ERC-20规范具有更少摩擦的事务。如果您在该领域工作的时间足够长,您就会知道维护自己钥匙和钱包的个人之间的交易很容易。您还知道,一旦您偏离了这个简单的用例,事情就会变得更加困难。有些人甚至声称ERC777标准是ERC20标准的有效继承者。ERC777标准规范在EIP777(以太坊改进提案)文件中有详尽描述。

ERC777应用场景

这里先讨论ERC777适合哪些运营场景,以便读者有大致概念,至于设计细节优缺点,我们后文讨论。

天然气(GAS)消费解决方案

在交易所或dApp上使用钱包时,一个常见的问题是支付交易的天然气费。用户不希望或不需要关心是哪个块阻止了他们的事务,只要它是合理的速度就行了。使用“运营商”可以让您作为dApp或交易所所有者来管理消费成本,以维护用户体验。

所有权与支出

ERC20标准的优点之一是有很多代币与之兼容。这为它的开发和用户采用提供了一个很好的生态系统基础。然而,当您拥有以太坊钱包时,每个地址构成一个具有唯一公钥/私钥的帐户,如果您在一个交易所拥有数千名用户,但是您没有该用户资金的私钥,您如何提供结算呢?运营商将是一个很好的用例,因为它并不真正构成所有权,但将允许您为交易结算转移资金。需要注意的是,地址可以在任何时候添加/删除运营商,所以这是一件棘手的事情。

ERC777解决了哪些ERC20的问题?

ERC20的优缺点我们在后文有详细讨论,这里了解过合约的也都对于ERC20有基本概念略过。

假设您希望允许第三方帐户(或合约)使用您的代币。最常见的需求是在使用去中心化交易所智能合约交易代币时。

此过程中的第一步是你需要通过调用ERC20智能合约上的approve方法函数来批准转账账户并设置他们有权获得的资金限额。除了用你的资金信任第三方之外,你还需要确保支出限额始终足以满足所需的交易。

ERC-777标准希望通过引入运营商的概念来解决第三方支出问题。在服务体系结构中,运营商是一个众所周知的概念,因为它们是具有执行特定任务的特定权限帐户。

ERC777运营商

ERC777标准通过引入运营商的概念来解决上述问题。像往常一样,运营商是某些具有执行特定任务权限的帐户。在ERC777标准下,有两类运营商:

1.默认运营商

2.指定运营商

一个指定运营商是允许代表另一个地址发送和销毁代币的地址。 一个默认运营商是允许代表所有代币持有者发送和销毁代币的地址。

任意ERC777代币持有者地址可以通过调用authorizeOperator方法函数授权给一个指定运营商获得权限。与此类似,任意ERC777代币持有者都可以通过调用revokeOperator方法函数撤运营商地址的授权(包括默认运算符)。

在易代币的ERC777实现中,默认运营商是用于部署代币的地址。

利用运营商功能的另一个小的(并且不太明显的)好处是用户不再需要担心交易费Gas价格。现在可以将其委托给运营商。

ERC777挂钩 - 一个额外的安全机制

ERC777挂钩是与转账方和接收方帐户绑定(挂钩)的代码段。实质上,它们是智能合约实例:

IERC777Sender接口有一个函数tokensToSendIERC777Recipient接口有一个函数tokensReceived

这两个接口的智能合约的地址实例存储在ERC1820注册表中,与它们“挂钩”的地址配对。

如果转账地址在注册表中具有匹配的IERC777Sender实例,则在执行交易之前将调用其tokensToSend函数。如果未找到匹配的实例,则转移交易将照常进行。

如果接收地址在注册表中具有匹配的IERC777Recipient实例,则在执行交易后将调用其tokensReceived函数。如果接收地址是普通地址且未找到匹配的实例,则转账将照常进行。但是,如果收件人地址是合约地址,并且未找到匹配的实例,则将取消转账交易

在下图中,你可以看到“挂钩”转账调用的流程。

因此,挂钩的引入使我们能够增强ERC777代币的转账功能,即使在部署代币之后也是如此。它还提供了取消交易的可能性,如果此交易未满足某些条件。

ERC20和ERC777

ERC20最牛逼的地方在于它提供了一键发币的功能,并且允许钱包、交易所和其他智能合约以一种便捷的方式对接各种代币。(几乎所有支持以太币的钱包,包括Jaxx、MEW、imToken等,都支持 erc-20的代币)。

ERC20的缺陷

虽然ERC20优势很大,也凭借这些优势实现了"垄断",但它也有一些重大缺陷,只不过人们暂时找不到更好的协议来替代它。

当ERC20代币钱包用户向钱包用户发送token时,不会出现问题;但当钱包用户向智能合约发送token时,这些token会永远消失。如果用户不知道这一点,出现操作失误,将会造成token的丢失。

ERC20里有两种操作代币转账的方法,分别是针对账户和智能合约地址。我觉得这里可以理解成个人账户,和一个有智能合约代码的"对公账户":

1.从你的账户把token发到别人的账户,用"Transfer"方法。

2.从你的账户把token发到一个智能合约地址,需要连续调用两个方法:"approve "和"transferFrom"。也就是两步:

a. 授权(approve):我允许这个智能合约账户来转我的token

b. 转币(Transfer):从我的账户转xxx token过去

这看起来没什么问题,但如果有人在操作的时候,不小心在一个"私对公"的转账功能里面,错用了"Transfer"呢?下面的错误就会发生:

举个例子,假设A把代币从钱包转到B智能合约,假设A转代币的时候错用了Transfer,结果就是A的余额减少了,而B那边其实收到了币,但由于使用了错误的转账方法,没有显示到账。

ERC777的优势

在ERC20之后,提出过很多新的提案,来试图改进它,如ERC223、ERC677。但是它们要么会出现新的重大漏洞,要么只是略对ERC作了修改,并无实质上的创新。直到ERC777的出现,才看到了新时代来临的曙光,ERC777标准将允许代币持有者获得更多的控制权和更容易的交易。

降费提速:在ERC777标准中,一些高级交易——比如在去中心化交易合约中进行代币兑换——能够在一次交易中完成,而不是像过去那样分成两笔交易才能完成,这样的话,不仅代币兑换成本大幅降低(更便宜),而且兑换速度也能变得更快。

向后兼容:ERC777兼容与ERC20兼容的所有应用程序,包括EtherDelta,IDEX,0x等。它具有ERC20所有的功能,同时还有附加功能

避免代币丢失:ERC777相对于ERC20的另一个优势是,防止以太币生态系统中不必要的加密货币损失。因为与ERC777兼容的地址能够拒绝某些特定类型的Token传入事件,例如来自黑名单地址的Token传入事件。

支持发送数据:ERC777可以像以太坊那样发送交易数据,调用智能合约的功能,使得可以使用超出以太坊本地可定制容量的Token。

ERC777的缺点

ERC777的新功能确实带来一些小缺点:

由于它使用挂钩,转账交易费用略高持有代币需更谨慎的审查,因为你必须信任你选择的运营商

使用易代币创建你自己的ERC777代币!

ERC-777 代币合约的功能

ERC-777 代币合约具有很多功能,可以让用户查找账户余额,并且在不同条件下将代币从一个账户转到另一个账户上。这些函数的详情如下。

totalSupply()函数说明了所有地址持有的代币总量。如果有新的代币被铸造出来,这个值就会增加,如果已有的代币被销毁,这个值就会减少。

balanceOf()函数说明了特定地址所持有的代币数量。要注意的是,任何人都可以询问任意地址的余额,因为区块链上的所有数据都是公开的。

send()函数将一定数量的代币从信息发送方的地址转到另一个地址上。相比于 ERC-20 代币,ERC-777 代币的发送功能更完善,详情见后文。

burn()函数会销毁信息发送方所持有的一部分代币。相比于 ERC-20 代币,ERC-777 代币的销毁功能更完善,详情见后文。

authorizeOperator()函数允许消息发送方将自己的代币授权给另一个地址(译者注:即给运营者授权)。

revokeOperator()函数可以将撤销现有运营者控制消息发送方代币的权限。

isOperatorFor()说明了某个地址是否是某个代币持有者的运营者。

只要发送方拥有某个账户的运营者权限,就可以通过operatorSend()函数将一定数量的代币从那个账户发送至另一个账户。

defaultOperators()函数提供了一个代币运营者合约列表,列表中的运营者均已得到所有代币的全部权限;关于这个功能,可以参见下文的 “代币运营者合约” 一节。

本文对ERC777合约已做较为详细的讲解,详解 ERC-777 代币合约的发送功能后面我们用一篇文章讲解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表CSDN网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。