繁体   English   中英

为什么ERC721的铸币function有权限控制?

[英]Why does the minting function of ERC721 have an access control?

我看到的大多数使用 Open Zeppelin 的 ERC721 示例都要求 mint function 具有访问控制,其中只有合约的所有者被允许调用 function。 例如

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 function 更有意义。 ERC721的薄荷function的最佳实践是什么?

ERC-721标准没有定义铸造新代币的“最佳”或“正确”方式(例如是否应该开放或限制),并且由每个合约开发人员以一种方式实现或省略铸造功能反映了他们的需求。

规范中不包括创建 NFT(“铸造”)和销毁 NFT(“燃烧”)。 您的合同可以通过其他方式实施这些。 在创建或销毁 NFT 时,请参阅事件文档以了解您的职责。

但是拥有一个授权铸造新代币的地址白名单(例如MINTER_ROLEonlyOwner )似乎比允许任何人自由铸造新代币更常见。


尽管理论上可以在每次铸造新代币时部署新合约,但这不是标准方法(我个人还没有看到任何这样做的合约)。 在大多数情况下,铸币过程“只是”创建一个新 ID,存储与该 ID 关联的新字符串/URL 值,将这个新令牌与所有者地址(令牌的,而不是合约所有者)相关联,并更新一些元数据,例如作为地址拥有的代币数量(参见下面的示例)。

然后,代币所有者可以转移他们的代币,让任何人控制他们的代币,并根据合约实施做其他事情。

您在问题中指出的映射( _owners_balances )表明它们存储代币所有者(而非合约所有者)地址以及每个地址持有的代币数量。

例子:

  1. 合约所有者将令牌 ID 1铸造到地址0x123

    • _owners[1]的值为0x123 (为 0,默认值)

    • _balances[0x123]的值变为1 (原为 0,默认值)

  2. 合约所有者铸造代币 ID 2到地址0x123

    • _owners[1]的值仍然是0x123

    • _owners[2]的值现在是0x123 (原为 0,默认值)

    • _balances[0x123]的值变为2 (因为他们现在拥有 2 个令牌)

回复评论:如示例合约所有者(市场所有者)将铸造代币,然后该所有者必须承担汽油费。 如果我希望地址 0x123 代币所有者支付 gas 费用怎么办?..谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM