10 为什么openzeppelin版本的ERC721实现合约的_safeTransfer函数要把参数校验语句放在转账之后?

代码如下所示:

function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

先执行了_transfer函数后执行_checkOnERC721Received函数,而后者是为了检测to这个参数是否具备接收erc721 token的资质(主要针对合约账号)。 既然如此为什么不把顺序调过来? 而且把顺序调过来更符合编程规范才对啊。实现函数功能之前,不是应该先校验参数的合法性吗?

请先 登录 后评论

最佳答案 2021-10-29 09:12

既然是检查接收方, 当然是应该在转之后检查。

尽管实现效果上大部分情况是一样的, 有一种情况是,接收方在收到某个特定资产之后,再根据自身逻辑判断是否接收(注意,这不是721合约判断是否有接收资质),这个时候就有差异了。

请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 0 收藏,2710 浏览
  • lilianwen 提出于 2021-10-28 16:43