本文详细介绍了如何使用OpenZeppelin标准创建和部署ERC-721(NFT)代币,包括NFT的基本概念、ERC-721标准的功能和事件、NFT的应用场景,以及通过IPFS存储NFT元数据和图像的具体步骤。
自 Cryptokitties 推出以来,兼容 ERC-721 标准的数字收藏品变得非常流行,并在最近几个月朝着大规模应用迈进。本指南将介绍如何使用 OpenZeppelin 标准创建和部署一个 NFT(ERC-721)。
更喜欢视频教程?跟随 Radek 学习如何在 20 分钟内创建和部署 ERC-721(NFT)。
如何在 YouTube 上创建和部署 ERC-721(NFT)
QuickNode
131K 订阅者
QuickNode
搜索
信息
购物
点击取消静音
如果播放没有立即开始,请尝试重启设备。
你已退出登录
你观看的视频可能会添加到电视的观看历史记录中,并影响电视推荐。为避免这种情况,请取消并在电脑上登录 YouTube。
取消确认
分享
包含播放列表
检索共享信息时出错。请稍后再试。
稍后观看
分享
复制链接
观看
0:00
/ •直播
•
订阅我们的 YouTube 频道以获取更多视频!订阅
同质化意味着相同或可互换。例如,以太坊代币,特定代币类别的所有成员,都具有相同的价值。Cardano 代币也是如此。同质化代币可以 1:1 互换。
考虑到这一点,NFT 是唯一的;每个都是不同的。每个代币都有独特的特征和价值。可以作为 NFT 的东西包括收藏卡、艺术品、飞机票等。它们彼此之间明显不同且不可互换。将非同质化代币(NFT)视为稀有收藏品;每个都有独特的特征、不寻常的属性,大多数时候还有其元数据。
ERC 代表 Ethereum Request for Comment,721 是提案标识号。ERC 是以太坊生态系统中的应用级标准,它们可以是代币的智能合约标准,如 ERC-20,ERC 的作者负责与以太坊社区达成共识,一旦提案经过社区审查和批准,它就成为标准。你可以在此处跟踪最近的 ERC 提案 这里。ERC-721 的创建是为了提出在智能合约中跟踪和转移 NFT 的功能。
ERC-721 是一个开放标准,描述了如何在 EVM(以太坊虚拟机)兼容的区块链上构建非同质化代币;它是非同质化代币的标准接口;它有一组规则,使得与 NFT 的工作变得容易。NFT 不仅限于 ERC-721 类型;它们也可以是 ERC-1155 代币。
以下是 ERC-721 标准中定义的一组函数和事件:
balanceOf:此函数用于返回特定地址拥有的 NFT(非同质化代币)数量。
ownerOf:此函数返回特定代币的所有者地址。每个 ERC721 代币都是唯一的,由 ID 表示。此函数允许用户或应用程序根据其唯一 ID 确定代币的所有者。
safeTransferFrom(无数据):此函数安全地将特定代币的所有权从一个地址转移到另一个地址。此函数检查接收者是否为智能合约。如果是,它必须实现特定函数(onERC721Received)以接受转移。
transferFrom:此函数用于将代币的所有权从一个地址转移到另一个地址。通常在发送者已被批准转移代币时使用。
approve:此函数用于批准一个地址转移特定代币。这允许委托转移,其中所有者可以允许另一方代表他们转移代币。
getApproved:此函数用于获取特定代币的批准地址。如果代币没有批准地址,此函数将返回空地址。
setApprovalForAll:此函数允许一个或多个代币的所有者批准或撤销对操作员管理其所有代币的批准。
isApprovedForAll:此函数用于检查操作员是否被批准管理所有者的所有代币。
safeTransferFrom(带数据):此函数与 safeTransferFrom(无数据)类似,但带有一个额外的数据参数。如果接收者是智能合约,则此额外数据可用于在转移期间传递附加信息。此函数还检查接收者是否为智能合约以及是否实现了 onERC721Received 函数。
Transfer:当代币的所有权从一个地址转移到另一个地址时,会触发此事件。事件包括有关发送者(from)、接收者(to)和特定代币(通过 ID)的详细信息。此事件允许外部监听器(如 UI 或其他合约)对转移做出反应。
Approval:当批准一个地址转移特定代币时,会触发此事件。它包括代币的当前所有者(owner)、现在可以转移代币的批准地址(approved)以及已批准转移的特定代币(通过 ID)。此事件使应用程序能够跟踪代币的批准并做出相应反应。
ApprovalForAll:当所有者批准或撤销对操作员管理其所有代币的批准时,会触发此事件。它包括所有者的地址(owner)、操作员的地址(operator)以及指示操作员是否被批准的布尔值(approved)。此事件使应用程序能够跟踪哪些地址已被授予管理特定所有者所有代币的权利。
数字艺术(或实体艺术): 艺术品是 NFT 最流行的用例。数字艺术拍卖是 NFT 的第一个应用,并继续增长。
游戏: 提供游戏内购买和收藏品。
房地产: 将财产和智能合约代币化并进行买卖。
金融: 金融工具如贷款、期货和其他责任。
软件标题: 软件许可证以确保反盗版和隐私。
音乐会门票/体育比赛门票: 以确保门票销售中不发生欺诈,粉丝可以有一个地方查看过去的经历。
KYC 合规: 为特定用户的 KYC 创建代币。
现在我们知道 ERC-721 代币是什么以及它们如何工作,让我们看看如何构建和部署我们自己的代币。
我们将在以太坊 Sepolia 测试网上部署我们的合约。要开始,你需要 MetaMask 浏览器扩展(或其他兼容的 web3 钱包;Phantom、WalletConnect 兼容)和一些测试 ETH,你可以通过访问 QuickNode Multi-Chain Faucet 获取。只需连接你的钱包或粘贴地址并点击继续。你将被提示分享一条推文以获得奖励(我们推荐!);否则,只需点击不,谢谢,只需发送我 0.05 ETH。请注意,使用 EVM faucets 需要以太坊主网上的 0.001 ETH 余额。
在编写我们的 NFT 合约之前,我们需要为 NFT 托管我们的艺术作品并创建一个元数据文件;为此,我们将使用 IPFS - 一个点对点的文件存储和共享分布式系统。有多种方法与 IPFS 协议交互。你可以选择在自己的系统上设置和操作 IPFS,或者选择 QuickNode 作为更简单的解决方案。QuickNode 通过管理底层基础设施简化了你对 IPFS 的访问。这种方法使你能够专注于你的内容,而无需承担维护本地 IPFS 节点以固定数据的责任。使用 QuickNode,技术复杂性由我们处理。
我们介绍了两种将文件上传到 IPFS 的方法:使用标准的 IPFS CLI 或简化的 QuickNode IPFS 服务。
根据你的操作系统,按照 IPFS 文档中的安装指南 下载并安装 IPFS CLI。
以下是托管图像和元数据文件的步骤。
在终端/cmd 窗口中输入以下内容以启动 IPFS 仓库。
ipfs init
启动 IPFS 守护进程,打开另一个终端/cmd 窗口,并输入以下内容。
ipfs daemon
转到第一个终端窗口并将图像添加到 IPFS(这里以 art.png 为例)。
ipfs add art.png
复制以 Qm 开头的哈希值,并添加 “ https://ipfs.io/ipfs/” 前缀;它应该看起来像这样 https://ipfs.io/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg
创建一个名为 nft.json 的 JSON 文件,并将其保存在与图像相同的目录中。
JSON 文件格式:
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC"
}
现在,添加 JSON 文件。
ipfs add nft.json
取以 Qm 开头的哈希值,并添加 “ https://ipfs.io/ipfs/” 前缀;它应该看起来像这样 https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7
保存此 URL。我们需要它来铸造我们的 NFT。
信息
要了解有关 QuickNode IPFS 的价格信息,请查看我们的定价计划 这里。
如果你正在寻找更简单的方法,QuickNode 的 IPFS 服务提供了一个易于使用、高效的解决方案来上传你的 NFT 资产。使用 QuickNode,管理基础设施的复杂性由我们处理,使你能够专注于你的内容,而不是维护本地 IPFS 节点。
要开始使用 QuickNode 进行 IPFS,请按照以下步骤操作:
登录 QuickNode 并从左侧边栏中选择 IPFS 选项:
通过拖放或点击从 Finder/文件资源管理器窗口中选择文件来快速上传你的图像文件。在本指南中,我们使用下图。
上传后,点击 文件 选项卡中的文件名,然后点击复制 IPFS URL 按钮。类似于下面的截图。
https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg
创建一个名为 nft.json 的 JSON 文件,替换 image
字段中的 IPFS URL,然后保存。保存后,将你的 JSON 文件上传到 IPFS,类似于上一步。
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg"
}
上传后,点击 文件 选项卡中的文件名并复制 IPFS URL。它应该看起来像下面这样。
https://qn-shared.quicknode-ipfs.com/ipfs/QmeVHZzKGEDbEbG5MVz4hUucNf4qZTRfW18AgdJNTrv22m
保存此 URL。我们需要它来铸造我们的 NFT。
为了简便和安全,我们将使用 OpenZeppelin ERC-721 合约来创建我们的 NFT。使用 OpenZeppelin,我们不需要编写整个 ERC-721 接口。相反,我们可以导入库合约并使用其函数。
前往 Ethereum Remix IDE 并创建一个新的 Solidity 文件,例如 - MyToken.sol
将以下代码粘贴到你的新 Solidity 脚本中:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts@5.0.0/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721Burnable.sol";
import "@openzeppelin/contracts@5.0.0/access/Ownable.sol";
contract MyToken is ERC721, ERC721URIStorage, ERC721Burnable, Ownable {
constructor(address initialOwner)
ERC721("MyToken", "MTK")
Ownable(initialOwner)
{}
function safeMint(address to, uint256 tokenId, string memory uri)
public
onlyOwner
{
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
// The following functions are overrides required by Solidity.
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721URIStorage)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
上面代码的解释:
第 1 行:指定 SPDX 许可证类型为 MIT。这表明代码是在 MIT 许可证下授权的,这是一个允许代码使用、修改和分发的宽松开源许可证,几乎没有任何限制。
第 2 行:声明 Solidity 版本为 ^0.8.20。这表明代码是使用 Solidity 版本 0.8.20 或兼容版本编写的。
第 4-7 行:从 OpenZeppelin 库导入必要的合约。
ERC721.sol: 此合约是从 OpenZeppelin 库导入的,表示 ERC721 标准的基本实现。ERC721 是非同质化代币(NFT)的标准。
ERC721URIStorage.sol: 此合约扩展了 ERC721 并添加了存储和管理与 NFT 相关的元数据 URI 的功能。元数据 URI 通常指向有关 NFT 的附加信息。
ERC721Burnable.sol: 此合约也扩展了 ERC721 并添加了销毁(销毁)NFT 的能力。它提供了一个永久从流通中移除 NFT 的功能,只有所有者
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!