本指南详细介绍了如何使用 Ethers.js 库在 Polygon 区块链上铸造 NFT。文中涵盖了相关前提条件、Ethers.js 的简介、智能合约的回顾,详细讲解了设置 QuickNode 端点、创建项目,以及编写铸造 NFT 所需的 JavaScript 代码。最后,展示了如何通过命令行运行代码完成 NFT 的铸造,并提供了核实交易和查看铸造的 NFT 的方法。
本指南演示了如何使用 Ethers.js 库在 Polygon 区块链上铸造 NFT,以及如何在 Polygon Mumbai 测试网络上使用已经部署的 ERC-721 代币。通过本指南获得的信息,你将更好地了解如何使用 Ethers.js 与其他智能合约进行交互。
先决条件
5<=
)Ethers.js 是一个完整的以太坊库和钱包实现,使用 Javascript 编写。由于其高效的代码库、易于使用以及良好的文档,它最近成为 dApp 开发者的首选库。
Ethers.js 有多个不同的模块。本指南将使用 Providers、Signers、Contract Interact 和 Utility 模块。
提醒一下,“铸造 NFT”的行为是调用 ERC-721 或 ERC-1155 智能合约上的 mint 函数。并非所有智能合约都可能有相同的命名约定。
让我们快速审查一下我们将调用的用于铸造 ERC-721 代币的 Solidity 代码:
function safeMint(address to, string memory uri) public onlyOwner {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
这段代码定义了一个名为 safeMint 的 Solidity 函数。该函数有两个参数:to(接收者的地址)和 URI(表示 URI 的字符串)。public 关键字使得该函数可以从合约外部访问。
该函数完成以下操作:
你需要一个 API 端点来与 Polygon Mumbai 测试区块链进行通信。你可以使用公共节点或部署和管理自己的基础设施;但是,如果你希望获得 8 倍的响应速度,可以将繁重的工作留给我们。你可以在 这里 注册一个免费的账户。
登录后,点击 创建端点 然后选择 Polygon Mumbai 测试区块链。
是时候编写代码了!首先打开一个终端窗口,导航到你希望该项目所在的目录。然后运行以下命令:
mkdir mintWithEthers && cd mintWithEthers && npm init -y
接下来,我们将创建我们的项目文件并安装所需的依赖:
touch mint.js && touch abi.json && touch .secret && npm install ethers@5.4
确保安装 ethers@5.4
我们的项目目录现在应该看起来像这样:
我们将首先将我们的私钥粘贴到 .secret 文件中。要了解如何导出你的私钥,请查看此 MetaMask 导出私钥指南。
之后,我们需要检索我们想要交互的合约的 ABI(应用程序二进制接口)。ABI 定义了用于与合约交互的方法和结构,并以 JSON 格式表示。查看这个 什么是 ABI? 指南以了解更多信息。
由于我们想要交互的 NFT 智能合约已部署在 Polygon 上,我们将导航到 Polygonscan(区块浏览器),并搜索这个 地址: 0x66e47a27241f38b8482c0ae95e55a535324f9f54。一旦找到页面,单击 Contract 标签并向下滚动到底部查找合约 ABI。点击复制按钮并将内容粘贴到你的 abi.json 文件中。
现在是时候编写与 ERC-721 智能合约交互的脚本了。我们将逐部分说明代码,并在最后将所有内容结合在一起。
打开你的 mint.js 文件并开始添加依赖。
const { ethers } = require("ethers")
const fs = require('fs')
以下代码行使用 fs 模块从项目目录的 .secret 文件中检索私钥。
const privateKey = fs.readFileSync(".secret").toString().trim()
Ethers.js 有多个提供程序类。我们将使用 JsonRpcProvider,这是与以太坊交互的热门方法,适用于所有主要的以太坊节点实现。将以下代码块添加到你的 mint.js 脚本中,并将 QUICKNODE_HTTP_ENDPOINT 变量更新为包含你的 QuickNode HTTP 提供程序 URL。
const QUICKNODE_HTTP_ENDPOINT = "YOUR_QUICKNODE_HTTP_ENDPOINT"
const provider = new ethers.providers.JsonRpcProvider(QUICKNODE_HTTP_ENDPOINT)
现在,是时候创建我们想要交互的智能合约的抽象。合约抽象可以这样创建:
const contractAddress = "0x66e47a27241f38b8482c0ae95e55a535324f9f54"
const contractAbi = fs.readFileSync("abi.json").toString()
const contractInstance = new ethers.Contract(contractAddress, contractAbi, provider)
为了使用 Ethers.js 发送交易,我们需要一个 Signer 对象。你可以通过以下代码创建一个:
const wallet = new ethers.Wallet(privateKey, provider)
我们还将创建一些帮助函数,以帮助我们根据需要读取和修改数据:
async function getGasPrice() {
let feeData = (await provider.getGasPrice()).toNumber()
return feeData
}
async function getNonce(signer) {
let nonce = await provider.getTransactionCount(wallet.address)
return nonce
}
例如,getGasPrice() 函数调用 provider 对象的 getGasPrice() 方法,该方法返回一个大数字。我们将使用 .toNumber() 方法将该值转换为数字。getNonce() 函数调用 ethers.provider.getTransactionCount() 方法,该方法接受一个地址并返回其交易计数。
接下来,我们将创建一个 mint 函数,利用我们上面创建的所有帮助函数来发送和签名交易。让我们深入解释以下代码:
这段代码定义了一个异步函数 mintNFT。该函数有两个参数:address(接收者的地址)和 URI(表示 NFT 的 URI 的字符串)。
该函数完成以下操作:
async function mintNFT(address, URI) {
try {
const nonce = await getNonce(wallet)
const gasFee = await getGasPrice()
let rawTxn = await contractInstance.populateTransaction.safeMint(address, URI, {
gasPrice: gasFee,
nonce: nonce
})
console.log("...正在提交交易,Gas价格为:", ethers.utils.formatUnits(gasFee, "gwei"), " - & nonce:", nonce)
let signedTxn = (await wallet).sendTransaction(rawTxn)
let reciept = (await signedTxn).wait()
if (reciept) {
console.log("交易成功!!!" + '\n' + "交易哈希:", (await signedTxn).hash + '\n' + "区块号: " + (await reciept).blockNumber + '\n' + "访问 https://polygonscan.com/tx/" + (await signedTxn).hash + " 查看你的交易")
} else {
console.log("提交交易时出错")
}
} catch (e) {
console.log("捕获到的错误: ", e)
}
}
剩下的就是在脚本底部添加函数调用。在我们的示例中,我们将使用以下 元数据 铸造 NFT。为此,我们将调用 safeMint 函数,传递以下参数:
mintNFT("WALLET_ADDRESS", "METADATA URI")
第一个参数(0)也指的是我们希望铸造 NFT 的地址,第二个地址设置代币 URI。如果你不知道如何创建元数据,请查看此 QuickNode 指南 中的“将文件添加到 IPFS”部分。
最后,你的完整脚本应如下所示:
const { ethers, Signer } = require("ethers")
const fs = require('fs')
const privateKey = fs.readFileSync(".secret").toString().trim()
const QUICKNODE_HTTP_ENDPOINT = "YOUR_QUICKNODE_HTTP_ENDPOINT"
const provider = new ethers.providers.JsonRpcProvider(QUICKNODE_HTTP_ENDPOINT);
const contractAddress = "0x66e47a27241f38b8482c0ae95e55a535324f9f54"
const contractAbi = fs.readFileSync("abi.json").toString()
const contractInstance = new ethers.Contract(contractAddress, contractAbi, provider)
const wallet = new ethers.Wallet(privateKey, provider)
async function getGasPrice() {
let feeData = (await provider.getGasPrice()).toNumber()
return feeData
}
async function getNonce(signer) {
let nonce = await provider.getTransactionCount(wallet.address)
return nonce
}
async function mintNFT(address, URI) {
try {
const nonce = await getNonce(wallet)
const gasFee = await getGasPrice()
let rawTxn = await contractInstance.populateTransaction.safeMint(address, URI, {
gasPrice: gasFee,
nonce: nonce
})
console.log("...正在提交交易,Gas价格为:", ethers.utils.formatUnits(gasFee, "gwei"), " - & nonce:", nonce)
let signedTxn = (await wallet).sendTransaction(rawTxn)
let reciept = (await signedTxn).wait()
if (reciept) {
console.log("交易成功!!!" + '\n' + "交易哈希:", (await signedTxn).hash + '\n' + "区块号: " + (await reciept).blockNumber + '\n' + "访问 https://polygonscan.com/tx/" + (await signedTxn).hash + " 查看你的交易")
} else {
console.log("提交交易时出错")
}
} catch (e) {
console.log("捕获到的错误: ", e)
}
}
mintNFT("WALLET_ADDRESS", "METADATA_URL")
最后一行代码使用钱包地址和元数据 URL 参数调用 mintNFT 函数。如果你想要一些占位符元数据作为 NFT,请使用此 URL: https://bafkreif4rv2kafqbmrmifwg7davpwmd4vgkehe63ryosdzajn7nnbifnfm.ipfs.nftstorage.link/
注意,你需要在 Polygon Mumbai 测试网络上拥有一些 MATIC 才能继续进行此铸造交易
距离铸造你的 NFT 只有一个命令!在终端中导航到项目的主目录并运行命令 node mint.js。输出应该如下所示:
我们可以通过检查 Polygonscan 和 OpenSea 来验证 NFT 是否已经铸造:
就是这样!你已经使用 Ethers.js 铸造了一个 NFT!要了解有关 Ethers 的更多信息,你可以查看我们其他的 Web3 SDK 指南 或查看 Ethers 的 文档。
订阅我们的 新闻通讯,获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过 Twitter 联系我们。你还可以在我们的 Discord 社区服务器上与我们聊天,服务器中有一些你见过的最酷的开发者 :)
- 原文链接: quicknode.com/guides/oth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!