前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NFT新手教程:如何铸造一个NFT(第2部分)

NFT新手教程:如何铸造一个NFT(第2部分)

作者头像
Tiny熊
发布2022-05-25 16:11:55
2.8K0
发布2022-05-25 16:11:55
举报

译文出自:登链翻译计划[1] 译者:翻译小组[2] 校对:Tiny 熊[3]

在本教程中,我们继续通过使用 Alchemy 的 API 来铸造 NFT。

铸造NFT是在区块链上发布 ERC-721 真实代币的行为。继续使用我们在NFT 教程第一部分[4]中的智能合约,让我们发挥 web3 技能,铸造一个 NFT。在本教程结束时,你将能够按照你的内心(和钱包)的愿望铸造更多的 NFT!

让我们开始吧!

第 1 步:安装 web3

如果你跟随第一个教程创建好了 NFT 智能合约,你已经有使用 Ethers.js 的经验。Web3 与 Ethers 相似,因为它同样是一个用于方便和以太坊区块链进行交互的库。在本教程中,我们将使用Alchemy Web3[5],它是一个增强的 web3 库,提供自动重试和强大的 WebSocket 支持。

在项目根目录下运行:

代码语言:javascript
复制
npm install @alch/alchemy-web3

第 2 步:创建 mint-nft.js

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

代码语言:javascript
复制
require("dotenv").config()
const API_URL = process.env.API_URL
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)

第 3 步:获取合约 ABI

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

代码语言:javascript
复制
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")

如果你想看 ABI,你可以把它打印到控制台:

代码语言:javascript
复制
console.log(JSON.stringify(contract.abi))

要运行 mint-nft.js 并看到 ABI 被打印到控制台,在终端运行:

代码语言:javascript
复制
node scripts/mint-nft.js

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

如果你还记得第一部分的教程,我们的 mintNFT 智能合约函数接收了一个 tokenURI 参数,这是一个描述 NFT 元数据的 JSON 文档 -- 这才是真正给 NFT 带来生命的东西,可许它有可配置的属性,如名称、描述、图像和其他属性。

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

我们将使用 Pinata,一个方便的 IPFS API 和工具包,来存储我们的 NFT 资产和元数据,以确保我们的 NFT 是真正去中心化的。如果你没有 Pinata 账户,请注册一个免费账户这里[7],并完成账户电子邮件验证。

在你创建完账户后:

  • 导航到 Files页面,点击页面左上方的蓝色 Upload按钮。
  • 上传一张图片到 pinata - 这将是你的 NFT 的图片资产。随意给资产起个你想要的名字
  • 上传后,你会在文件页面的表格中看到文件信息。你还会看到一个 CID 列。你可以通过点击旁边的复制按钮来复制 CID。你可以在以下网址查看你上传的文件:https://gateway.pinata.cloud/ipfs/<CID>。例如,你可以在 IPFS 上找到我们使用的图片这里[8]

为了更直观的学习,为上述步骤制作了一个图片:

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

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

代码语言:javascript
复制
{
  "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,按照我们上传图片的相同步骤进行。

第 5 步:创建 Web3 合约实例

现在,为了与合约交互,我们需要在代码中创建一个合约的实例。要做到这一点,需要使用合约地址,可以从部署或Etherscan[9]查询你用来部署合约的地址来获得。

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

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

代码语言:javascript
复制
const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"

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

第 6 步: 更新.env 文件

现在,为了创建和发送交易到以太坊链,将使用你的以太坊账户地址。

将你的私钥及地址添加到.env 文件中--如果你完成了本教程的第一部分[11].env 文件现在应该是这样的:

代码语言:javascript
复制
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. .env文件中获取你的PRIVATE_KEYPUBLIC_KEY
  2. 接下来,确定账户的 nonce。nonce 规范用于跟踪从你的地址发送的交易数量--我们需要它来保证安全并防止重放攻击[12]。为了获得从你的地址发送的交易数量,我们使用getTransactionCount[13]
  3. 最后,我们将用以下信息设置交易:
  • 'from': PUBLIC_KEY - 交易所使用的地址。
  • 'to': contractAddress - 希望与之交互的合约地址。
  • 'nonce': nonce - 帐户 nonce,是从我们的地址发送的交易数量。
  • 'gas': estimatedGas - 完成交易所需的估算 Gas 量
  • 'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI() - 我们希望在这个交易中执行的计算(功能) - 在这个例子中是铸造一个 NFT

你的 mint-nft.js 文件现在应该看起来像这样:

代码语言:javascript
复制
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会返回交易哈希值,我们可以用它来检查的交易是否被挖掘出来。你会注意到在交易签名部分,我们添加了一些错误检查,以便我们知道我们的交易是否成功通过。

代码语言:javascript
复制
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)
    })
}

第九步:运行 node mint-nft.js 调用 mintnft

还记得你上传到 Pinata 的 metadata.json 吗?从 Pinata 获取它的哈希码,并将以下内容作为参数传给函数 mintNFT https://gateway.pinata.cloud/ipfs/<metadata-hash-code>

下面动图是演示如何获得文件哈希:

如何获取 NFT metadata hasahcode

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

你的页面应该显示 json 元数据

总的来说,你的代码应该看起来像这样:

代码语言:javascript
复制
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。几秒钟后,你应该在终端看到这样的响应:

代码语言:javascript
复制
The hash of your transaction is: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e00

Check Alchemy's Mempool to view the status of your transaction!

接下来,可以访问Alchemy mempool[14],查看交易状态(是否 pending、已开采,或被网络丢弃)。如果你的交易被丢弃,也可以查看Ropsten Etherscan[15]并搜索交易哈希值。

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

这就完成了,你现在已经在以太坊区块链上部署了 NFT 合约,并铸造了自己的 NFT 代币。

使用 mint-nft.js,你可以根据自己的意愿(使用钱包)铸造任意数量的 NFT,只要确保传入一个描述 NFT 元数据的新 tokenURI(否则,你最终只会制造出一堆不同 ID 的相同的 NFT)。

你应该希望能够在你的钱包中展示你的 NFT - 所以一定要查看:第三部分:如何在你的钱包中查看你的 NFT。

原文:https://ethereum.org/en/developers/tutorials/how-to-mint-an-nft/

参考资料

[1]

登链翻译计划: https://github.com/lbc-team/Pioneer

[2]

翻译小组: https://learnblockchain.cn/people/412

[3]

Tiny 熊: https://learnblockchain.cn/people/15

[4]

NFT教程第一部分: https://learnblockchain.cn/article/3947

[5]

Alchemy Web3: https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3

[6]

这里: https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is

[7]

这里: https://app.pinata.cloud/

[8]

这里: https://gateway.pinata.cloud/ipfs/QmarPqdEuzh5RsWpyH2hZ3qSXBCzC5RyK3ZHnFkAsk7u2f

[9]

Etherscan: https://ropsten.etherscan.io/

[10]

合约方法: https://learnblockchain.cn/docs/web3.js/web3-eth-contract.html

[11]

本教程的第一部分: https://learnblockchain.cn/article/3947

[12]

重放攻击: https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce

[13]

getTransactionCount: https://docs.alchemy.com/alchemy/apis/ethereum#eth_gettransactioncount

[14]

Alchemy mempool: https://dashboard.alchemyapi.io/mempool

[15]

Ropsten Etherscan: https://ropsten.etherscan.io/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第 1 步:安装 web3
  • 第 2 步:创建 mint-nft.js
  • 第 3 步:获取合约 ABI
  • 第 4 步:使用 ipfs 为 NFT 配置元数据
  • 第 5 步:创建 Web3 合约实例
  • 第 6 步: 更新.env 文件
  • 第 7 步:创建交易
  • 第 8 步:签署交易
  • 第九步:运行 node mint-nft.js 调用 mintnft
    • 参考资料
    相关产品与服务
    区块链
    云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档