我看到的大多数使用 Open Zeppelin 的 ERC721 示例都要求 mint 函数具有访问控制,其中只允许合约的所有者调用该函数。例如,_
function mint(address to) public virtual {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
_mint(to, _tokenIdTracker.current());
_tokenIdTracker.increment();
}
或以下使用Ownable库。
function mint(address receiver) external onlyOwner returns (uint256) {
_tokenIds.increment();
uint256 newTokenId = _tokenIds.current();
_mint(receiver, newTokenId);
return newTokenId;
}
这是否意味着每次铸造新代币时都必须部署新合约?这似乎不仅在 gas 费用方面过高,而且 ERC721 合约还具有映射不同所有者和代币的属性:
// Mapping from token ID to owner address
mapping (uint256 => address) private _owners;
// Mapping owner address to token count
mapping (address => uint256) private _balances;
如果铸币仅限于合约所有者,这将毫无意义。
对我来说,部署单个ERC721 合约(及其依赖项)并让用户调用 mint 函数更有意义。ERC721的mint功能的最佳实践是什么?