NFT-集合
原文地址: NFT-Collection
翻译: JulySong
现在是你推出自己的 NFT 收藏的时候了 - Crypto Devs
.
要求
- 应该只存在 20 个 Crypto Dev NFT,并且每个都应该是唯一的。
- 用户应该能够通过一笔交易仅铸造 1 个 NFT。
- 白名单用户应在实际销售前有 5 分钟的预售期,保证每笔交易获得 1 NFT。
- 你的 NFT 收藏应该有一个网站。
让我们开始建造 🚀
先决条件
- 你应该已经完成了Whitelist dApp tutorial教程
理论
什么是不可替代代币?可替代意味着相同或可互换,例如 Eth 是可替代的。考虑到这一点,NFT 是独一无二的。每一个都是不同的。每个令牌都有独特的特征和价值。它们都可以相互区分并且不可互换,例如独特的艺术
什么是 ERC-721?ERC-721 是一个开放标准,描述了如何在 EVM(以太坊虚拟机)兼容的区块链上构建不可替代的代币;它是不可替代代币的标准接口;它有一套规则,可以很容易地使用 NFT。在继续之前,先看看ERC721支持的所有功能
建造
喜欢视频?
如果您想从视频中学习,我们的 YouTube 上有本教程的录音。单击下面的屏幕截图观看视频,或继续阅读教程!
智能合约
我们还将使用 Openzeppelin 的 Ownable.sol 来帮助您管理
Ownership
合同- 默认情况下,Ownable 合约的所有者是部署它的帐户,这通常正是您想要的。
- Ownable 还可以让您:
- 将所有权从所有者帐户转移到新帐户,以及
- rrenounceOwnership 让所有者放弃此管理特权,这是集中管理初始阶段结束后的常见模式。
我们还将使用 ERC721 的扩展,称为ERC721 Enumerable
- ERC721 Enumerable 可帮助您跟踪合约中的所有 tokenIds 以及给定合约的地址持有的 tokensIds。
- 在继续之前,请先看看它实现的功能
为了构建智能合约,我们将使用Hardhat。Hardhat 是一个以太坊开发环境和框架,专为 Solidity 中的全栈开发而设计。简单来说,您可以编写智能合约、部署它们、运行测试和调试代码。
- 要设置 Hardhat 项目,请打开终端并执行以下命令
1 | mkdir NFT-Collection |
- 在安装 Hardhat 的同一目录中运行:
1 | npx hardhat |
1 | - Select Create a Javascript project |
现在你有一个 hardhat 项目准备好了!
如果您在 Windows 上,请执行此额外步骤并安装这些库:)
1 | npm install --save-dev @nomicfoundation/hardhat-toolbox |
- 现在在同一个终端中安装
@openzeppelin/contracts
,因为我们将在我们的CryptoDevs
合同中导入Openzeppelin’s ERC721Enumerable。
1 | npm install @openzeppelin/contracts |
我们将需要调用您为之前级别部署的地址
Whitelist Contract
,以检查列入白名单的地址并授予他们预售访问权限。因为我们只需要调用mapping(address => bool) public whitelistedAddresses;
我们可以为这个映射创建一个Whitelist contract
带有函数的接口,这样我们就可以节省气体,因为我们不需要继承和部署整个Whitelist Contract
,而只需要它的一部分。在目录中创建一个新文件
contracts
并调用它IWhitelist.sol
1 | // SPDX-License-Identifier: MIT |
- 现在让我们在目录中创建一个新文件
contracts
并调用它CryptoDevs.sol
1 | // SPDX-License-Identifier: MIT |
- 现在我们将安装
dotenv
包以便能够导入 env 文件并在我们的配置中使用它。打开指向hardhat-tutorial
目录的终端并执行此命令
1 | npm install dotenv |
- 现在在
hardhat-tutorial
文件夹中创建一个.env
文件并添加以下行,使用注释中的说明获取您的 Alchemy API 密钥 URL 和 RINKEBY 私钥。确保您获得 rinkeby 私钥的帐户由 Rinkeby 以太币提供资金。
1 | // 转到 https://www.alchemyapi.io,注册, |
让我们将合约部署到
rinkeby
网络。创建一个新文件,或者替换在 scripts 文件夹下默认文件 deploy.js现在我们将编写一些代码来在
deploy.js
文件中部署合约。
1 | const { ethers } = require("hardhat"); |
如您所见,
deploy.js
需要一些常量。让我们在hardhat-tutorial
文件夹下创建一个名为constants
的文件夹现在在
constants
文件夹中添加一个index.js
文件,并将以下行添加到文件中。将“address-of-the-whitelist-contract”替换为您在上一教程中部署的白名单合约的地址。对于 Metadata_URL,只需复制已提供的示例。我们将在教程中进一步替换它。
1 | // 您部署的白名单合约 |
- 现在打开 hardhat.config.js 文件,我们将在
rinkeby
此处添加网络,以便我们可以将合约部署到rinkeby
。用下面给出的行替换hardhat.config.js
文件中的所有行
1 | require("@nomicfoundation/hardhat-toolbox"); |
- 编译合约,打开一个指向
hardhat-tutorial
目录的终端并执行这个命令
1 | npx hardhat compile |
- 要部署,请打开指向
hardhat-tutorial
目录的终端并执行此命令
1 | npx hardhat run scripts/deploy.js --network rinkeby |
- 将打印在终端上的 Crypto Devs Contract Address 保存在记事本中,您将在教程中进一步使用它。
网站
为了开发网站,我们将使用React和Next Js.React 是一个用于制作网站的 javascript 框架,Next Js 构建在 React 之上。
首先,您需要创建一个新 next 应用程序。您的文件夹结构应该类似于
1 | - NFT-Collection |
- 要创建
my-app
,请在终端指向 NFT-Collection 文件夹并键入
1 | npx create-next-app@latest |
并按下enter
所有问题
- 现在运行应用程序,在终端中执行这些命令
1 | cd my-app |
现在转到
http://localhost:3000
,您的应用程序应该正在运行 🤘现在让我们安装 Web3Modal 库(https://github.com/Web3Modal/web3modal)。Web3Modal 是一个易于使用的库,可帮助开发人员通过简单的可自定义配置在其应用程序中添加对多个提供程序的支持。默认情况下,Web3Modal 库支持注入的提供程序,例如(Metamask、Dapper、Gnosis Safe、Frame、Web3 浏览器等),您还可以轻松配置库以支持 Portis、Fortmatic、Squarelink、Torus、Authereum、D’CENT 钱包和 Arkane。打开指向
my-app
目录的终端并执行此命令
1 | npm install web3modal |
- 在同一个终端也安装
ethers.js
1 | npm install ethers |
在您的公用文件夹中,下载此文件夹及其中的所有图像(下载链接)。确保下载的文件夹的名称是
cryptodevs
现在转到样式文件夹并用以下代码替换
Home.modules.css
文件的所有内容,这将为您的 dapp 添加一些样式:
1 | .main { |
- 打开 pages 文件夹下的 index.js 文件并粘贴以下代码,代码解释可以在评论中找到。
1 | import { Contract, providers, utils } from "ethers"; |
现在在 my-app 文件夹下创建一个新文件夹并将其命名为
constants
.在 constants 文件夹中创建一个文件
index.js
,然后粘贴以下代码。- 替换
"addres of your NFT contract"
为您部署并保存到记事本的 CryptoDevs 合约的地址。 - 替换
---your abi---
为您的 CryptoDevs 合约的 abi。要获取您的合同的 abi, 请转到您的hardhat-tutorial/artifacts/contracts/CryptoDevs.sol
文件夹并从您的CryptoDevs.json
文件中获取标记在"abi"
密钥下的数组。
- 替换
1 | export const abi =---your abi--- |
- 现在在指向
my-app
文件夹的终端中,执行
1 | npm run dev |
您的 Crypto Devs NFT dapp 现在应该可以正常运行了 🚀
推送到 github
确保在继续之前您已将所有代码推送到 github :)
部署你的 dApp
我们现在将部署您的 dApp,以便每个人都可以看到您的网站,并且您可以与所有 LearnWeb3 DAO 朋友分享它。
- 转到https://vercel.com/ 并使用您的 GitHub 登录
- 然后单击
New Project
按钮,然后选择您的 NFT-Collection 存储库 - 在配置您的新项目时,Vercel 将允许您自定义您的
Root Directory
- 单击
Edit
旁边Root Directory
并将其设置为my-app
- 选择框架为
Next.js
- 单击部署
- 现在,您可以通过转到仪表板、选择您的项目并
domain
从那里复制来查看您部署的网站!保存domain
在记事本上,稍后您将需要它。
在 Opensea 上查看您的收藏
现在让您的收藏在 Opensea 上可用
为了使该集合在 Opensea 上可用,我们需要创建一个元数据端点。该端点将返回给定 NFT 的元数据tokenId
。
- 打开您的
my-app
文件夹并在pages/api
文件夹下创建一个名为的新文件[tokenId].js
(确保名称也包含括号). 添加括号有助于next js中创建动态路由 - 将以下行添加到
[tokenId].js
文件中。在here阅读有关添加next js
API 路由的信息
1 | export default function handler(req, res) { |
- 现在你有一个 api 路由,
Opensea
可以调用它来检索 NFT 的元数据 - 让我们用这个新的 api 路由部署一个新
Crypto Devs
合约作为你的METADATA_URL
- 打开您的
hardhat-tutorial/constants
文件夹并在您的index.js
文件中,将”https://nft-collection-sneh1999.vercel.app/api/"替换为您保存到记事本的域,并在其末尾添加"/api/"。 - 保存文件并打开一个指向
hardhat-tutorial
文件夹的新终端并部署新合约
1 | npx hardhat run scripts/deploy.js --network rinkeby |
- 将新的 NFT 合约地址保存到记事本中。
- 打开”my-app/constants”文件夹,在
index.js
文件中将旧的 NFT 合约地址替换为新的 - 将所有代码推送到 github,等待 vercel 部署新代码。
- 在 vercel 部署你的代码后,打开你的网站并铸造一个 NFT
- 交易成功后,在浏览器中打开此链接,替换
your-nft-contract-address
为您的 NFT 合约地址(https://testnets.opensea.io/assets/your-nft-contract-address/1) - 你的 NFT 现在可以在 Opensea 上使用 🚀 🥳
- 在 discord 上与所有人分享您的 Opensea 链接 :) 并传播快乐。