_safeMint() 在幕后做了什么?

what does _safeMint() do under the hood?

以下是一些精简的示例代码,我用它来表述我的问题。这与 Patrick Collins 的 Youtube 视频有关,标题为:如何使用 On-Chain 元数据制作 NFT 艺术 |完整的 HARDHART / JS 教程! (含 Polygon 和 Opensea)

contract RandomSVG is ERC721URIStorage, VRFConsumerBase {
    ....
    ....    
    function create() public returns (bytes32 requestId) {
        requestId = requestRandomness(keyhash, fee);
        ...
    ...
    }
 

    function fulfillRandomness(bytes32 requestId, uint256 randomNumber)
        internal
        override
    {
       
    ...
    ...
        _safeMint(nftOwner, tokenId); 
    ...
    }

}

RandomSVG 是一个将创建随机 NFT 的合约。

问题 1: 我阅读了文档,但仍然无法理解。 _safeMint() 函数到底做了什么?

问题2:合约中的什么时候应该调用_safeMint()函数?

在他的示例中,帕特里克在 fulfillRandomness() 回调中使用 _safeMint() 函数。为什么 _safeMint() 甚至在图像创建之前就被调用了?不应该在创建 TokenURI 之后调用它吗?

_safeMint() 与 IERC721Receiver 一起使用,检查您是否将铸造的令牌发送到能够管理 NFT 的合约。这是为了防止令牌丢失。