0x1 ERC721R是什么协议
ERC721R 是为了ERC721 和 ERC1155 标准打造的退款功能。在NFT智能合约中增加了去信任的退款协议设计,允许铸造在给定的期限内退还按成本铸造的NFT,并且收获相应的退款。
当用户在 ERC721R 集合中铸造 NFT 时,资金由购买时的智能合约持有。该智能合约可以设置特定时间区间,在该时间范围内,用户随时可将NFT发送给合约并获取自己的初始购买资金,合约在该时间内也不能提走用户的购买资金。
例如:一份含有ERC721R的智能合约,该合约设置了NFT购买的可退款时间为10天内,用户在该合约中花费 0.5 ETH 购买了1枚NFT,两天之后,用户想拿回自己的ETH,随后在该合约归还NFT,获取自己的初始购买资金0.5ETH。本次操作中用户只会损失交易的 gas 成本。
0x2 ERC721R的优势
对于买家:
- 低风险购买(可以退款,只承担手续费)
- 防止项目跑路
- 迫使创作者承担更大的责任来交付
对于卖家:
- 与买家建立信任
对双方都有好处:
- 在退款开放期间,项目底价不太可能跌破新币价格。
- 短期恐惧提前离开项目,留下完整的高质量核心。
0x3 ERC721R存在的安全风险
当越来越多人关注ERC721R的便利性时,ERC721R代码层面安全问题也随之显露。从ERC721R最具特点的refund退款方法来看,该方法可以在合约设置的时间区间内进行退款,退款的确可以成功,但不代表没有其他风险。
ERC721R可能存在的安全风险点
风险一:用户退款至管理员,管理员可获取合约中所有ERC20资金。
假如有10个用户购买了该合约的NFT,当其中一个用户退款后,该用户的NFT会转移至refundAddress地址,也就是管理员地址,之后refundAddress管理员调用refund方法,将自己所属的NFT进行退款,由于现在transferFrom方法中的发送者和接收者均为自己,所以NFT归属者不受影响,但转移NFT后会进行ERC20资金发送,所以此时管理员可以一直进行NFT退款操作,得到合约内部所有的ERC20资金。
风险二:管理员铸造NFT,利用该NFT获取合约中所有ERC20资金。
假如有10个用户购买了该合约的NFT,在规定时间区间内也未归还,管理员可以铸造一个NFT,之后进行循环退款,取走合约内部ERC20资金,也就是上述风险1中的描述。
0x4 总结及建议
由于ERC721R刚刚被提出来,出现安全问题可以及时修复改进,目前来看该提议解决了大多数人的痛点,为NFT市场添加了推动剂。
对于以上ERC721R的安全风险,零时科技安全团队给出以下建议
• 建议对合约中管理员地址进行区别。
• 建议设置退款之后的NFT流动限制。