从零开始构建 NFT 网站(2)- 铸造 NFT

Ethers.js
Vue3
DAPP
Alchemy

安装 Ethers.js

npm install --save ethers

创建 mint-nft.js

require("dotenv").config();
const ethers = require("ethers");

// Alchemy 的 API_KEY
const API_KEY = process.env.API_KEY;
// 创建测试网 provider
const provider = new ethers.AlchemyProvider("sepolia", API_KEY);

获取 Contract ABI

合约 ABI 是智能合约和前端应用交互的接口。我们在部署 MyNFT.sol 的时候,Hardhat 会自动生成一个 ABI 并保存在 MyNFT.json 文件里,文件路径如下:

const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");

使用 IPFS 配置 NFT 元数据

IPFS:星际文件系统,一种去中心化协议和点对点网络,用于在分布式文件系统中存储和共享数据。

Pinata:一个 IPFS API 和工具包,它可以用来存储我们的 NFT 资产和元数据,确保我们的 NFT 是真正去中心化的。我们首先要去 Pinata 官网上注册一个账户。

然后,把图片上传到 pinata。上传成功后,会得到一个哈希值,复制哈希值,我们可以在这里查到上传的内容:https://gateway.pinata.cloud/ipfs/image-hash-code

接下来,要上传一份文档到 pinata,这份文档将用来描述我们刚才上传的 NFT 图片。

在根目录中,创建一个名为 nft-metadata.json 的新文件并添加以下 json 代码:

{
	"attributes": [
		{
			"trait_type": "Breed",
			"value": "Maltipoo"
		},
		{
			"trait_type": "Eye color",
			"value": "Mocha"
		}
	],
	"description": "A Ghost man",
	"image": "https://gateway.pinata.cloud/ipfs/QmSnVy4jcHn5uYSL91vc1SfC3Wpom4d3BGdf4SD9cn5Yfy",
	"name": "Ramses"
}

attributes 里的字段就是 NFT 的属性,可以随便修改。只要确保 image 属性指向我们刚才上传的图片即可。

编辑完成后,保存它并上传到 pinata,和上传图片的步骤一样。

创建 Signer 和合约实例

Signer:用钱包私钥定义,定义了 Signer,才能调用合约函数。

合约实例:在 从零开始构建 NFT 网站(1)- 部署合约 里,我把合约部署在了 Sepolia 测试网上,获得了一个合约地址0x7130Df343097ED88d112Cec1B366bDaa3530a67e,接下来,我将利用合约地址、合约 ABI 和 Signer 来定义一个 Contract 实例。

mint-nft.js 文件中添加以下代码:

// 创建 signer
const privateKey = process.env.PRIVATE_KEY;
const signer = new ethers.Wallet(privateKey, provider);

// 定义 abi 和 address
const abi = contract.abi;
const contractAddress = "0x7130Df343097ED88d112Cec1B366bDaa3530a67e";

// 创建合约实例
const myNftContract = new ethers.Contract(contractAddress, abi, signer);

调用合约的 mintNFT 函数

首先,在 pinata 上获取刚才上传的 nft-metadata.json 的哈希值,例如:QmWz4AEJSYmLbZmASezdChbKxTc6gh6fnzjuJtXftsq2uc

然后,继续在 mint-nft.js 里编写代码(调用 mintNFT 函数):

// Get the NFT Metadata IPFS URL
const tokenUri =
	"https://gateway.pinata.cloud/ipfs/QmWz4AEJSYmLbZmASezdChbKxTc6gh6fnzjuJtXftsq2uc";

// Call mintNFT function
const mintNFT = async () => {
	let nftTxn = await myNftContract.mintNFT(signer.address, tokenUri);
	await nftTxn.wait();
	console.log(
		`NFT Minted! Check it out at: https://sepolia.etherscan.io/tx/${nftTxn.hash}`
	);
};

mintNFT()
	.then(() => process.exit(0))
	.catch((error) => {
		console.error(error);
		process.exit(1);
	});

运行代码:node scripts/mint-nft.js

成功运行后应该输出:

01

现在我可以通过这个 URL 查看 NFT 铸造情况:进入 Sepolia 测试网

也可以到 OpenSea 上通过搜索合约地址来查看,但在测试网上部署的 NFT 也要到测试版的 Opensea 查看才能看到:地址

02