ERC-721 - OpenZeppelin 文档

本文介绍了 ERC-721 标准,用于表示非同质化代币(NFT)的所有权,每个代币都是独一无二的。文章提供了一个 GameItem 合约的示例,该合约使用 ERC721URIStorage 扩展来跟踪游戏中的物品,并包含如何创建新物品以及查询物品的所有者和元数据方法。

ERC-721

我们已经讨论了如何使用 ERC-20 制作一个加粗同质化加粗的 token,但如果不是所有的 token 都一样呢?在诸如房地产投票权收藏品等情况下,由于它们的效用、稀有性等原因,某些物品的价值高于其他物品。ERC-721 是一个用于表示 加粗非同质化 token加粗 所有权的规范,也就是说,每个 token 都是唯一的。

ERC-721 是一个比 ERC-20 更复杂的标准,具有多个可选扩展,并分布在多个合约中。OpenZeppelin Contracts 提供了关于如何组合这些合约的灵活性,以及自定义的有用扩展。请查看 API 参考 以了解更多关于这些的信息。

构建一个 ERC-721 Token 合约

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

以下是一个 token 化物品的合约示例:

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

import {ERC721URIStorage, ERC721} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract GameItem is ERC721URIStorage {
    uint256 private _nextTokenId;

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

    function awardItem(address player, string memory tokenURI) public returns (uint256) {
        uint256 tokenId = _nextTokenId++;
        _mint(player, tokenId);
        _setTokenURI(tokenId, tokenURI);

        return tokenId;
    }
}

ERC721URIStorage 合约是 ERC-721 的一个实现,包括元数据标准扩展(IERC721Metadata)以及每个 token 元数据的机制。这就是 _setTokenURI 方法的来源:我们使用它来存储物品的元数据。

另请注意,与 ERC-20 不同,ERC-721 缺少 decimals 字段,因为每个 token 都是不同的,不能被分割。

可以创建新物品:

> 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 Schema 的更多信息,请查看 ERC-721 规范

你会注意到物品的信息包含在元数据中,但该信息不在链上!因此,游戏开发者可以更改底层元数据,从而更改游戏规则!
如果你想把所有的物品信息都放在链上,你可以扩展 ERC-721 来做到这一点(尽管成本会相当高),方法是提供一个带有 JSON 模式编码的 Base64 Data URI。你也可以利用 IPFS 来存储 tokenURI 信息,但这些技术超出了本概述指南的范围。

← 创建供应

ERC-1155 →

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

0 条评论

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