ERC777的特点
ERC777与ERC20都是一类的合约,都是fungible tokens的一种标准。并且ERC777是对ERC20兼容的,ERC20中的相关操作在ERC777中都能够实现,并且ERC777还提供了更加复杂的操作,还在ERC20的不足的地方进行了改善提升。可以说ERC777是在ERC20的基础上进行的升级改造,但是由于ERC777出现的时间较晚,现在市场上主流的货币还是使用的ERC20,但是这并不能否定ERC777相比于ERC20更高效与更安全。详情可以查看https://docs.openzeppelin.com/contracts/4.x/erc777
.
相较于ERC20,ERC777的改变有以下几个方面:
个人认为在ERC777中最具有特点的的就是hook函数,hook函数在一定程度上保护了用户的财产安全。相比于ERC20来说,在使用ERC20进行转账时,我们无法确定接受的账户的类型,并且无法确定账户的状态,即为无法确定账户是否为一个合约黑洞。
所以可能会导致用户财产损失。但是ERC777的hook函数就避免了这个问题,erc777在交易中会通过hook函数对接收的地址进行一个审查,查看其是否有ERC777TokensSender接口,预防了合约黑洞的出现。并且在要求某个合约地址发送token是hook函数也会查看其是否实现了ERC777TokensRecipient接口。
那么此时我们会产生一个疑问hook函数如何确认是否接收的合约实现了接口?
ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH)
,进行接收接口验证ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH)
,进行发送的接口验证通过IERC1820Registry的getInterfaceImplementer(address account, bytes32 _interfaceHash)
,通过将方法名进行哈希之后,在一个全局注册表(一个双重嵌套映射)中进行查询mapping(bytes32 => mapping(address => bool)) private _supportedInterfaces;
,查看对应地址的合约是否实现了相应的接口,返回一个true或false。
详情可以查看:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/introspection/ERC1820Implementer.sol
。
相较于openzeppelin提供的方法,我们来看一下ERC1820提供的验证的方法在ERC1820中则是提供了两种接口的验证方法.
详情可以查看:https://eips.ethereum.org/EIPS/eip-1820#interface-implementation-erc1820implementerinterface
mapping(address => mapping(bytes32 => address)) internal interfaces;
我们来观察两种不同的验证方法,ERC1820中提供了更全面跟广泛的验证方式,简化了再写合约时的复杂操作而OpenZeppelin中的验证方法相当于是ERC1820的一刀切,强制要求合约必须实现相应的方法,禁止调用其他合约来替代。这样做增强了安全性并且便于直观的去理解。
如果只是通过查看方法名的哈希值,那么写一个相同的方法名,参数一致,但方法内不执行任何操作会不会形成一个合约黑洞?
ERC777相比于ERC20而言提高了交易的安全性,和交易的效率。极大的保护了用户的权益,这样的对于一个新手用户来说是很友好的。并且ERC777的产生也代表着,技术在发展,每一个协议都需要进行更多的考虑更多的更新换代,朝着跟方便更安全的方向发展。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!