为什么接受erc721代币的合同必须实现onERC721Received才可以使用safemint等safe的函数,safe的理由是什么,我知道safe函数必须调用接收合约的onERC721Received函数,可为什么它是所谓的safe呢,不调用这个函数的unsafe在哪里.还有
return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));为什么必须是这个值,我看了源码,可能是和
IERC721Receiver.onERC721Received.selector`有关,可是这个selector到底是什么,返回的又是什么啊,我的基础不好请见谅,给个地方让我自己查资料都可以,登链上的selector解释我没看懂,现在不知道找什么资料。
使用 safe 转账或铸造,表示这个动作是安全的,即便你转账的对象是一个合约,而不会发生代币锁定在合约的情况。因为只有合约明确表明接收 NFT(实现 onERC721Received
),才可以完成转账。
使用普通转账,那合约在逻辑上是不会你给谁转,如果你不小心转到一个错误的合约地址上,你的 NFT 就永远无法从合约中取出。
onERC721Received
的返回值,仅仅是一个约定,约定采用这个值而已。而函数选择器 selector 值,代表了这个函数,就约定用这个值。