20 openzeppelin的erc721代币标准问题求指导

为什么接受erc721代币的合同必须实现onERC721Received才可以使用safemint等safe的函数,safe的理由是什么,我知道safe函数必须调用接收合约的onERC721Received函数,可为什么它是所谓的safe呢,不调用这个函数的unsafe在哪里.还有return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));为什么必须是这个值,我看了源码,可能是和IERC721Receiver.onERC721Received.selector`有关,可是这个selector到底是什么,返回的又是什么啊,我的基础不好请见谅,给个地方让我自己查资料都可以,登链上的selector解释我没看懂,现在不知道找什么资料。

请先 登录 后评论

最佳答案 2022-02-12 15:24

使用 safe 转账或铸造,表示这个动作是安全的,即便你转账的对象是一个合约,而不会发生代币锁定在合约的情况。因为只有合约明确表明接收 NFT(实现 onERC721Received),才可以完成转账。

使用普通转账,那合约在逻辑上是不会你给谁转,如果你不小心转到一个错误的合约地址上,你的 NFT 就永远无法从合约中取出。

onERC721Received 的返回值,仅仅是一个约定,约定采用这个值而已。而函数选择器 selector 值,代表了这个函数,就约定用这个值。

请先 登录 后评论

其它 1 个回答

zen
请先 登录 后评论
  • 1 关注
  • 0 收藏,2956 浏览
  • ddjun123 提出于 2022-02-12 14:19