Beeple:6900 万美元 3LAU:1100 万美元 Grimes:600 万美元

他们都使用 Alchemy 强大的 API 铸造了他们的 NFT。在本教程中,我们将教您如何在 10 分钟内完成相同的操作。

“铸造 NFT”是在区块链上发布您的 ERC-721 令牌的唯一实例的行为。在本教程结束时,您将能够铸造尽可能多的 NFT,只要您的心(和钱包)渴望!

让我们开始吧!

第 1 步:安装 WEB3

如果您按照第一个教程创建 NFT 智能合约,那么您已经有使用 Ethers.js 的经验。Web3 类似于 Ethers,因为它是一个用于更轻松地创建对以太坊区块链的请求的库。在本教程中,我们将使用Alchemy Web3,它是一个增强的 web3 库,提供自动重试和强大的 WebSocket 支持。

在您的项目主目录中运行:

npm install @alch/alchemy-web3

第 2 步:创建一个 MINT-NFT.JS 文件

在您的脚本目录中,创建一个 mint-nft.js 文件并添加以下代码行:

require(“dotenv”).config()
const API_URL = process.env.API_URL
const { createAlchemyWeb3 } = require(“@alch/alchemy-web3”)
const web3 = createAlchemyWeb3(API_URL)

第 3 步:获取您的合同 ABI

我们的合约 ABI(应用程序二进制接口)是与我们的智能合约交互的接口。Hardhat 会自动为我们生成一个 ABI 并将其保存在 MyNFT.json 文件中。为了使用它,我们需要通过将以下代码行添加到我们的 mint-nft.js 文件来解析内容:

const contract = require(“../artifacts/contracts/MyNFT.sol/MyNFT.json”)

如果您想查看 ABI,可以将其打印到控制台:

console.log(JSON.stringify(contract.abi))

要运行 mint-nft.js 并查看打印到控制台的 ABI,请导航到终端并运行

node scripts/mint-nft.js

第 4 步:使用 IPFS 为 NFT 配置元数据

如果你还记得我们在第 1 部分的教程,我们的 mintNFT 智能合约函数接收一个 tokenURI 参数,该参数应该解析为描述 NFT 元数据的 JSON 文档——这确实使 NFT 栩栩如生,允许它具有可配置的属性,例如作为名称、描述、图像和其他属性。

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

我们将使用方便的 IPFS API 和工具包 Pinata 来存储我们的 NFT 资产和元数据,以确保我们的 NFT 真正去中心化。如果您没有 Pinata 帐户,请在https://app.pinata.cloud/注册一个免费帐户并完成验证您的电子邮件的步骤。

创建帐户后:

  • 导航到“文件”页面,然后单击页面左上角的蓝色“上传”按钮。

  • 将图像上传到 pinata — 这将是您的 NFT 的图像资产。随意命名资产

  • 上传后,您将在“文件”页面的表格中看到文件信息。您还将看到 CID 列。您可以通过单击旁边的复制按钮来复制 CID。您可以在以下位置查看您的上传:https://gateway.pinata.cloud/ipfs/<CID>。例如,您可以在此处找到我们在 IPFS 上使用的图像。

对于更多的视觉学习者,上面的步骤总结在这里:

现在,我们要再上传一份文档到 Pinata。但在我们这样做之前,我们需要创建它!

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

{
“attributes”: [
{
“trait_type”: “Breed”,
“value”: “Maltipoo”
},
{
“trait_type”: “Eye color”,
“value”: “Mocha”
}
],
“description”: “The world’s most adorable and sensitive pup.”,
“image”: “ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb”,
“name”: “Ramses”
}

随意更改 json 中的数据。您可以删除或添加到属性部分。最重要的是,确保图像字段指向您的 IPFS 图像的位置——否则,您的 NFT 将包含一张(非常可爱!)狗的照片。

完成 json 文件的编辑后,将其保存并上传到 Pinata,按照我们上传图片的相同步骤进行操作。

如何将您的 nft-metadata.json 上传到 Pinata

第 5 步:创建合同实例

现在,要与我们的合约交互,我们需要在代码中创建它的一个实例。为此,我们需要我们的合约地址,我们可以通过查找您用于部署合约的地址从部署或Etherscan中获得该地址。

在 Etherscan 上查看您的合约地址

在上面的例子中,我们的合约地址是 0x81c587EB0fE773404c42c1d2666b5f557C470eED。

接下来,我们将使用 web3合约方法,使用 ABI 和地址创建我们的合约。在您的 mint-nft.js 文件中,添加以下内容:

const contractAddress = “0x81c587EB0fE773404c42c1d2666b5f557C470eED”

const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

第 6 步:更新 .ENV 文件

现在,为了创建交易并将交易发送到以太坊链,我们将使用您的公共以太坊账户地址来获取账户随机数(将在下面解释)。

将你的公钥添加到你的 .env 文件中——如果你完成了教程的第 1 部分,我们的 .env 文件现在应该如下所示:

API_URL = “https://eth-ropsten.alchemyapi.io/v2/your-api-key”
PRIVATE_KEY = “your-private-account-address”
PUBLIC_KEY = “your-public-account-address”

第 7 步:创建您的交易

首先,让我们定义一个名为的函数mintNFT(tokenData)并通过执行以下操作创建我们的事务:

  1. 从文件中获取您的PRIVATE_KEYPUBLIC_KEY 。.env

  2. 接下来,我们需要弄清楚帐户随机数。随机数规范用于跟踪从您的地址发送的交易数量——出于安全目的和防止重放攻击,我们需要这些数据。要获取从您的地址发送的交易数量,我们使用getTransactionCount。

  3. 最后,我们将使用以下信息设置交易:

  • 'from': PUBLIC_KEY— 我们的交易来源是我们的公共地址

  • 'to': contractAddress— 我们希望与之交互并发送交易的合约

  • 'nonce': nonce— 包含从我们地址发送的交易数量的帐户 nonce

  • 'gas': estimatedGas— 完成交易所需的估计 gas

  • 'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()— 我们希望在此交易中执行的计算 — 在本例中是铸造 NFT

您的 mint-nft.js 文件现在应该如下所示:

require(‘dotenv’).config();
const API_URL = process.env.API_URL;
const PUBLIC_KEY = process.env.PUBLIC_KEY;
const PRIVATE_KEY = process.env.PRIVATE_KEY;

const { createAlchemyWeb3 } = require(“@alch/alchemy-web3”);
const web3 = createAlchemyWeb3(API_URL);

const contract = require(“../artifacts/contracts/MyNFT.sol/MyNFT.json”);
const contractAddress = “0x81c587EB0fE773404c42c1d2666b5f557C470eED”;
const nftContract = new web3.eth.Contract(contract.abi, contractAddress);

async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, ‘latest’); //get latest nonce

//the transaction
const tx = {
‘from’: PUBLIC_KEY,
‘to’: contractAddress,
‘nonce’: nonce,
‘gas’: 500000,
‘data’: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI()
};
}​

第 8 步:签署交易

现在我们已经创建了交易,我们需要对其进行签名才能将其发送出去。这是我们将使用我们的私钥的地方。

web3.eth.sendSignedTransaction将为我们提供交易哈希,我们可以使用它来确保我们的交易被挖掘并且没有被网络丢弃。您会在交易签名部分注意到,我们添加了一些错误检查,以便我们知道我们的交易是否成功通过。

require(“dotenv”).config()
const API_URL = process.env.API_URL
const PUBLIC_KEY = process.env.PUBLIC_KEY
const PRIVATE_KEY = process.env.PRIVATE_KEY

const { createAlchemyWeb3 } = require(“@alch/alchemy-web3”)
const web3 = createAlchemyWeb3(API_URL)

const contract = require(“../artifacts/contracts/MyNFT.sol/MyNFT.json”)
const contractAddress = “0x81c587EB0fE773404c42c1d2666b5f557C470eED”
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, “latest”) //get latest nonce

//the transaction
const tx = {
from: PUBLIC_KEY,
to: contractAddress,
nonce: nonce,
gas: 500000,
data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
}

const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
signPromise
.then((signedTx) => {
web3.eth.sendSignedTransaction(
signedTx.rawTransaction,
function (err, hash) {
if (!err) {
console.log(
“The hash of your transaction is: “,
hash,
“\nCheck Alchemy’s Mempool to view the status of your transaction!”
)
} else {
console.log(
“Something went wrong when submitting your transaction:”,
err
)
}
}
)
})
.catch((err) => {
console.log(” Promise failed:”, err)
})
}

第 9 步:调用 MINTNFT 并运行 NODE MINT-NFT.JS

还记得您上传到 Pinata 的 metadata.json 吗?从 Pinata 获取其哈希码并将以下作为参数传递给函数 mintNFThttps://gateway.pinata.cloud/ipfs/<metadata-hash-code>

以下是获取哈希码的方法:

如何在 Pinata 上获取您的 nft 元数据哈希码如何在 Pinata 上获取您的 nft 元数据哈希码

通过加载到单独的窗口中,仔细检查您复制的哈希码是否链接到metadata.json 。https://gateway.pinata.cloud/ipfs/<metadata-hash-code>该页面应类似于下面的屏幕截图:

您的页面应显示 json 元数据您的页面应显示 json 元数据

总而言之,您的代码应如下所示:

require(“dotenv”).config()
const API_URL = process.env.API_URL
const PUBLIC_KEY = process.env.PUBLIC_KEY
const PRIVATE_KEY = process.env.PRIVATE_KEY

const { createAlchemyWeb3 } = require(“@alch/alchemy-web3”)
const web3 = createAlchemyWeb3(API_URL)

const contract = require(“../artifacts/contracts/MyNFT.sol/MyNFT.json”)
const contractAddress = “0x81c587EB0fE773404c42c1d2666b5f557C470eED”
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, “latest”) //get latest nonce

//the transaction
const tx = {
from: PUBLIC_KEY,
to: contractAddress,
nonce: nonce,
gas: 500000,
data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
}

const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
signPromise
.then((signedTx) => {
web3.eth.sendSignedTransaction(
signedTx.rawTransaction,
function (err, hash) {
if (!err) {
console.log(
“The hash of your transaction is: “,
hash,
“\nCheck Alchemy’s Mempool to view the status of your transaction!”
)
} else {
console.log(
“Something went wrong when submitting your transaction:”,
err
)
}
}
)
})
.catch((err) => {
console.log(“Promise failed:”, err)
})
}

mintNFT(“ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP”)

现在,运行node scripts/mint-nft.js以部署您的 NFT。几秒钟后,您应该会在终端中看到如下响应:

您的交易哈希为:0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e00
检查 Alchemy 的内存池以查看您的交易状态!

接下来,访问您的Alchemy 内存池以查看您的交易状态(无论是待处理、已开采还是被网络丢弃)。如果您的交易被丢弃,检查Ropsten Etherscan并搜索您的交易哈希也很有帮助。

在 Etherscan 上查看您的 NFT 交易哈希在 Etherscan 上查看您的 NFT 交易哈希

就是这样!你现在已经在以太坊区块链上部署和铸造了 NFT

使用 mint-nft.js,你可以铸造尽可能多的 NFT,只要你的心(和钱包)想要!只需确保传入一个描述 NFT 元数据的新 tokenURI(否则,您最终将制作一堆具有不同 ID 的相同的)。

发表评论

后才能评论