NFT新手教程:如何铸造一个NFT(第2部分)
- 原文链接:https://ethereum.org/en/developers/tutorials/how-to-mint-an-nft/
- 译文出自:登链翻译计划
- 译者:翻译小组
- 校对:Tiny 熊
- 本文永久链接:learnblockchain.cn/article…
在本教程中,我们继续通过使用Alchemy的API来铸造NFT。
铸造NFT
是在区块链上发布 ERC-721 真实代币的行为。继续使用我们在NFT教程第一部分中的智能合约,让我们发挥web3技能,铸造一个NFT。在本教程结束时,你将能够按照你的内心(和钱包)的愿望铸造更多的NFT!
让我们开始吧!
如果你跟随第一个教程创建好了 NFT 智能合约,你已经有使用Ethers.js的经验。Web3与Ethers相似,因为它同样是一个用于方便和以太坊区块链进行交互的库。在本教程中,我们将使用Alchemy Web3,它是一个增强的web3库,提供自动重试和强大的WebSocket支持。
在项目根目录下运行:
npm install @alch/alchemy-web3
在脚本目录中,创建一个mint-nft.js文件并添加以下几行代码:
require("dotenv").config()
const API_URL = process.env.API_URL
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)
合约的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
如果你还记得第一部分的教程,我们的mintNFT智能合约函数接收了一个tokenURI参数,这是一个描述NFT元数据的JSON文档 -- 这才是真正给NFT带来生命的东西,可许它有可配置的属性,如名称、描述、图像和其他属性。
星际文件系统(IPFS)是一个去中心化的协议和点对点网络,用于在分布式文件系统中存储和共享数据。
我们将使用Pinata,一个方便的IPFS API和工具包,来存储我们的NFT资产和元数据,以确保我们的NFT是真正去中心化的。如果你没有Pinata账户,请注册一个免费账户这里,并完成账户电子邮件验证。
在你创建完账户后:
Files
页面,点击页面左上方的蓝色 Upload
按钮。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图像的位置。
一旦你完成了对json文件的编辑,保存它并将其上传到Pinata,按照我们上传图片的相同步骤进行。
现在,为了与合约交互,我们需要在代码中创建一个合约的实例。要做到这一点,需要使用合约地址,可以从部署或Etherscan查询你用来部署合约的地址来获得。
在上面的例子中,我们的合约地址是0x81c587EB0fE773404c42c1d2666b5f557C470eED。
接下来,我们将使用web3的合约方法,使用ABI和地址创建合约示例,在你的mint-nft.js文件中,添加以下内容:
const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
现在,为了创建和发送交易到以太坊链,将使用你的以太坊账户地址。
将你的私钥及地址添加到.env文件中--如果你完成了本教程的第一部分,.env
文件现在应该是这样的:
API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"
PRIVATE_KEY = "your-private-account-address"
PUBLIC_KEY = "your-public-account-address"
首先,让我们定义一个名为mintNFT(tokenData)
的函数,并通过以下方式创建交易。
.env
文件中获取你的PRIVATE_KEY和PUBLIC_KEY。'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()
};
}
现在我们已经创建了交易,我们需要对它进行签名,以便将它发送出去。在这里,需要使用我们的私钥。
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)
})
}
还记得你上传到Pinata的metadata.json吗?从Pinata获取它的哈希码,并将以下内容作为参数传给函数mintNFT https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
。
下面动图是演示如何获得文件哈希:
<center>如何获取 NFT metadata hasahcode </center>
通过加载https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
到一个单独的窗口,仔细检查你复制的哈希代码是否链接到你的metadata.json。该页面应该类似于下面的截图:
<center>你的页面应该显示json元数据。</center>
总的来说,你的代码应该看起来像这样:
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。几秒钟后,你应该在终端看到这样的响应:
The hash of your transaction is: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e00
Check Alchemy's Mempool to view the status of your transaction!
接下来,可以访问Alchemy mempool,查看交易状态(是否pending、已开采,或被网络丢弃)。如果你的交易被丢弃,也可以查看Ropsten Etherscan并搜索交易哈希值。
<center>在Etherscan上查看你的NFT交易哈希</center>
这就完成了,你现在已经在以太坊区块链上部署了NFT合约,并铸造了自己的 NFT 代币。
使用mint-nft.js,你可以根据自己的意愿(使用钱包)铸造任意数量的NFT,只要确保传入一个描述NFT元数据的新tokenURI(否则,你最终只会制造出一堆不同ID的相同的NFT)。
你应该希望能够在你的钱包中展示你的NFT - 所以一定要查看:第三部分:如何在钱包中查看你的NFT。
本翻译由 Duet Protocol 赞助支持。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!