ERC721 - OpenZeppelin 文档

本文介绍了ERC721标准,用于表示非同质化代币的所有权,每个代币都是唯一的。与ERC20相比,ERC721更为复杂,具有多个可选扩展。文章通过一个游戏道具的例子,展示了如何使用OpenZeppelin Contracts构建ERC721代币合约,并介绍了tokenURI中元数据的JSON格式。

你当前阅读的不是此文档的最新版本。5.x 是当前版本。

ERC721

我们已经讨论了如何使用 ERC20 创建一个同质化代币,但如果不是所有代币都一样呢?这在房地产收藏品等情况下会出现,由于它们的有用性、稀有性等,某些物品的价值高于其他物品。ERC721 是一个标准,用于表示 非同质化代币 的所有权,也就是说,每个代币都是唯一的。

ERC721 是一个比 ERC20 更复杂的标准,有多个可选扩展,并分布在多个合约中。OpenZeppelin 合约在如何组合这些合约方面提供了灵活性,以及自定义的有用扩展。查看 API 参考 以了解更多信息。

构建 ERC721 代币合约

我们将使用 ERC721 来追踪我们游戏中的物品,每个物品都有自己独特的属性。每当一个物品被奖励给玩家时,它将被铸造并发送给他们。玩家可以自由地保留他们的代币,或者像在区块链上交易任何其他资产一样,与其他玩家交易。请注意,任何帐户都可以调用 awardItem 来铸造物品。为了限制哪些帐户可以铸造物品,我们可以添加 访问控制

以下是代币化物品的合约可能如下所示:

// contracts/GameItem.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract GameItem is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() public ERC721("GameItem", "ITM") {}

    function awardItem(address player, string memory tokenURI)
        public
        returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

ERC721 合约包括所有标准扩展 ( IERC721MetadataIERC721Enumerable)。这就是 _setTokenURI 方法的来源:我们使用它来存储物品的元数据。

另请注意,与 ERC20 不同,ERC721 缺少 decimals 字段,因为每个代币都是不同的,不能被分割。

可以创建新物品:

> gameItem.awardItem(playerAddress, "https://game.example/item-id-8u5h2m.json")
Transaction successful. Transaction hash: 0x...
Events emitted:
 - Transfer(0x0000000000000000000000000000000000000000, playerAddress, 7)

并查询每个物品的所有者和元数据:

> gameItem.ownerOf(7)
playerAddress
> gameItem.tokenURI(7)
"https://game.example/item-id-8u5h2m.json"

tokenURI 应解析为 JSON 文档,该文档可能如下所示:

{
    "name": "Thor's hammer",
    "description": "Mjölnir, the legendary hammer of the Norse god of thunder.",
    "image": "https://game.example/item-id-8u5h2m.png",
    "strength": 20
}

有关 tokenURI 元数据 JSON 模式的更多信息,请查看 ERC721 规范

你会注意到物品的信息包含在元数据中,但是这些信息不在链上!因此,游戏开发者可以更改底层元数据,从而更改游戏规则!如果你想将所有物品信息都放在链上,你可以扩展 ERC721 来实现(尽管这将非常昂贵)。你也可以利用 IPFS 来存储 tokenURI 信息,但这些技术超出了本概述指南的范围。

预设 ERC721 合约

可以使用预设的 ERC721,ERC721PresetMinterPauserAutoId。它被预设为允许使用代币 ID 和 URI 自动生成来铸造(创建)代币,停止所有代币转账(暂停)并允许持有者销毁(销毁)他们的代币。该合约使用 访问控制 来控制对铸造和暂停功能的访问。部署该合约的帐户将被授予铸币者和暂停者角色,以及默认管理员角色。

此合约已准备好部署,无需编写任何 Solidity 代码。它可以按原样用于快速原型设计和测试,但也适用于生产环境。

← 创建供应量

ERC777 →

  • 原文链接: docs.openzeppelin.com/co...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。