本文介绍了 ERC-721 标准,用于表示非同质化代币(NFT)的所有权,每个代币都是独一无二的。文章提供了一个 GameItem 合约的示例,该合约使用 ERC721URIStorage 扩展来跟踪游戏中的物品,并包含如何创建新物品以及查询物品的所有者和元数据方法。
我们已经讨论了如何使用 ERC-20 制作一个加粗同质化加粗的 token,但如果不是所有的 token 都一样呢?在诸如房地产、投票权或收藏品等情况下,由于它们的效用、稀有性等原因,某些物品的价值高于其他物品。ERC-721 是一个用于表示 加粗非同质化 token加粗 所有权的规范,也就是说,每个 token 都是唯一的。
ERC-721 是一个比 ERC-20 更复杂的标准,具有多个可选扩展,并分布在多个合约中。OpenZeppelin Contracts 提供了关于如何组合这些合约的灵活性,以及自定义的有用扩展。请查看 API 参考 以了解更多关于这些的信息。
我们将使用 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 信息,但这些技术超出了本概述指南的范围。 |
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!