Skip to main content

简介

本文展示了如何在 Quai 网络的 Orchard 测试网上构建和部署一个功能完整的 NFT dApp。

前置条件

要部署合约并构建 webapp 前端,我们需要一些工具包和依赖项。以下是我们将使用的所有主要依赖项的概述。

实践步骤

今天我们将在 QUAI 上构建一个 NFT dApp,包含一个用于与其交互和管理诸如铸造价格和总供应量等属性的 Web 界面。 为了在遵循本指南时获得最佳体验,我们建议您在 MacOS 或 Linux 上使用 Chrome 浏览器。此外,如果您还没有 VSCode,请下载并安装它,因为我们将在终端中工作并直接编辑代码来构建此应用。最后,我们将使用 Node.js 构建我们的 webapp,因此提前安装和设置它很重要。

获取带有资金的 Quai 钱包

为了构建此应用,您需要有一个带有一些资金的钱包。 您可以在 pelaguswallet.io 获取 Pelagus 钱包,并从水龙头获取一些测试网 Quai。

设置开发环境

让我们为开发工作创建一个目录。
现在让我们初始化新的 Next.js 应用。运行以下命令,它会询问您几个问题。您可以使用下面的值。
npxcreate

构建和部署 NFT 智能合约

创建 Next.js 应用后,我们可以在 VSCode 中打开 quai-nft-dapp 文件夹并运行新的终端。 为了在 Quai 上构建和部署 NFT 智能合约,我们将使用官方的 hardhat-example 仓库作为参考。 github 上的参考仓库有用于部署的 solidity 示例。 您可以通过参考 hardhat-example 仓库中的 Solidity 文件夹 来跟随操作。

安装依赖项

为了构建和部署我们的智能合约,我们需要更多的依赖项。 首先我们将安装 @openzeppelin/contracts,它提供了用于构建标准 ERC721 (NFT) 智能合约的辅助函数。
接下来我们将安装 dotenv,它允许我们通过环境变量配置应用。
此外,我们将利用 hardhat 来编译和部署我们的智能合约。
最后我们将安装 quais.js,这是用于在 Quai Network 上构建的类似 ethers 的 SDK。

初始化和设置 Hardhat

要初始化我们的新 hardhat 项目,我们将运行以下命令,在询问时选择默认值。
npxhardhat 此命令为 hardhat 创建基本的文件夹结构和一些示例。 我们需要配置 hardhat 以使用 .env.local 环境变量部署我们的智能合约。
请确保在整个演练过程中保存您的更改。
在根文件夹中找到 hardhat.config.js 并将其替换为以下内容:
hardhat.config.js
这将告知 hardhat 需要了解的关于 Quai 网络的信息,以便稍后部署我们的合约。它依赖于一些我们接下来将设置的环境变量。 在 VSCode 的文件夹结构根目录中创建一个 .env.local 文件,并填入正确的信息。
.env.local
CYPRUS1_PKINITIAL_OWNER 的值分别替换为您的 Quai 钱包的私钥和公钥。如果您使用 Pelagus,您可以复制您的公钥并替换 INITIAL_OWNER。您需要导出您的私钥并用它替换 CYPRUS1_PK pelaguspriv 接下来我们需要创建用于部署合约的脚本。
这是我们稍后将调用以部署智能合约的脚本。
在根目录中创建名为 scripts 的文件夹,并在其中创建名为 deployERC721.js 的文件。使用以下内容填充 deployERC721.js
scripts/deployERC721.js
在这里,让我们删除 contracts/ 文件夹下的 Lock.sol 文件,以防止 hardhat 在我们要编译时引入它。

编写智能合约

contracts 文件夹中,我们将创建一个 ERC721.sol 文件,并使用以下内容填充它:
contracts/ERC721.sol
此合约有 3 个公共变量:tokenIds、mintPrice 和 supply,合约部署后将由合约所有者或 INITIAL_OWNER 修改。初始 tokenId 为 0,mintPrice 为 5 Quai,总供应量为 10,000。 NFT 合约的名称和符号被硬编码到 Solidity 代码中,分别为 TestERC721TNFT 有一些功能仅供合约所有者使用,允许他们更新 mintPrice 和 supply。此外,随着 NFT 的铸造,合约的余额会增长。我们提供了 withdraw 函数,供所有者从合约中提取这些资金。

编译和部署智能合约

完成所有这些后,我们可以继续编译我们的智能合约。
hardhatcompile 如果一切配置正确,我们可以运行 deployERC721.js 脚本在 Quai 上启动我们的智能合约:
hardhatdeploy 此脚本首先在 Quai 网络上广播交易。我们需要等待交易被挖掘以获得结果,但我们可以在 orchard.quaiscan.io 上监控交易哈希。 只需在 Quaiscan 上搜索显示的哈希。一旦成功,脚本将返回我们的合约地址。 deployfinished 记下此合约地址。我们稍后需要它来构建与其交互的应用。将其保存在 .env.local 中作为 NEXT_PUBLIC_DEPLOYED_CONTRACT contractenv 您还可以通过在 orchard.quaiscan.io 上搜索地址来检查此合约的详细信息。

构建 dApp

现在我们在 Quai 区块链上有了 NFT 合约,我们需要构建一个可以与其交互的 Web 界面。 首先,让我们安装另一个依赖项,以帮助我们的用户界面看起来不错,并在用户与智能合约交互时允许一些美味的 toast 通知。第二个命令会询问您是否要安装 chakra cli。按 Enter 继续。
我们将在项目的 src 文件夹中构建此应用。按照以下代码创建以下文件以开始。 src/app/ 中,我们需要一个 providers.tsx 文件和一个 store.tsx 文件。我们将使用这些来管理整个应用中的钱包状态。
src/app/store.tsx
src/app/providers.tsx
为了帮助我们使用 Typescript 的应用了解更多细节,我们将在 src/app/additional.d.ts 中添加一些额外的类型
src/app/additional.d.ts
我们在以下文件中定义了一些实用程序,用于应用与用户钱包的交互。您可能需要在过程中创建一些文件夹。
src/components/utils.ts
src/components/wallet/requestAccounts.ts
src/components/wallet/useGetAccounts.ts
src/components/wallet/index.ts
最后,我们可以开始构建应用的主页面。
src/app/layout.tsx
src/app/connectButton.tsx
src/app/page.tsx

运行应用

保存所有更改后,您可以在终端中运行 npm run dev,并将浏览器指向 https://localhost:3000 以查看您的应用! runningapp 当您使用部署应用的钱包连接时,您将看到提取资金以及更新供应量或铸造价格的选项。所有其他钱包只能铸造 NFT。该应用不会向其他钱包显示这些额外功能,智能合约编写为仅允许所有者执行这些功能。

总结!

恭喜!您刚刚在 Quai 上构建了您的第一个 NFT 应用! 如果您想查看此项目的完整仓库,请浏览教程的仓库

下一步

如果您想继续构建并添加更多功能,这里有一些想法可以进一步推进此项目。
  • 为您的 NFT 创建一些艺术品。
    • 设置元数据后,您可以为您的 NFT 制作和发布一些艺术品,可在 NFT 市场或 Quaiscan 上查看
  • 为您的 NFT 生成一些元数据。
    • 默认情况下,应用使用 https://example.com 作为每个铸造的 NFT 的 tokenuri。这在 page.tsx 的第 29 行设置。您可以修改此行为,使其指向您在自己的网站或 IPFS 上托管的 JSON 文件。
  • 在 QuaiMark 上启动您的 NFT!
    • QuaiMark 是 Quai Network 上的 NFT 市场,人们来这里查看可以购买、出售和交易的 NFT。一旦您觉得项目准备就绪,请前往 Quaimark.com 查看!