在了解了我上一篇推文《畅聊NFT(1):概念、机制和历史》后,如果你对NFT产生了浓厚的兴趣,或者是想要发行自己的NFT,那么你应该会去以太坊的社区中去寻找资源了。
这篇教程来自以太坊官网,目前只发布了英文版。我提交了一个翻译版本,但是还未通过,所以我把译文整理了一起发布出来。
原作者:Sumi Mudgil
翻译:1a96ff,shaokui
NFT的出现,让区块链又重新火了起来。现在是通过在以太坊区块链上发布自己的 NFT(ERC721 代币)来宣传自己的绝佳机会。
Alchemy非常自豪能够为 NFT 领域的知名人士提供支持,包括Makersplace(最近在佳士得Christie’s创下了6900万美元的数字艺术品拍卖纪录)、Dapper Labs(NBATopShot和 Crypto Kitties的创作者)、OpenSea(全球最大的NFT交易市场)、Zora,、Super Rare、NFTfi、Foundation、Enjin、Origin Protocol、Immutable等等。
在此教程中,我们将介绍如何在Ropsten测试网络上编写和部署ERC721代币的智能合约,我们将会使用到MetaMask、Solidity、Hardhat、Pinata和Alchemy(别担心,我们待会会解释这些东西)。
在Part2,我们会介绍怎样通过智能合约发行NFT。Part3,我们会解释如何在MetaMask上查看你的NFT。
有很多方法可以向以太坊区块链发出请求,但为了方便起见,我们将使用 Alchemy 上的免费帐户。Alchemy是一个区块链开发平台,它能够提供API,能让我们无需运行自己的节点,即可与以太坊公链进行通信。
在本教程中,我们将利用Alchemy平台的开发者工具进行监测和分析,以便了解智能合约部署的底层逻辑。如果你没有Alchemy账号,你可以点击此链接免费注册。
在创建Alchemy账号之后,你可以通过创建一个APP来生成API密钥,它能让我们向Ropsten测试网络发送请求。
如果您想了解有关测试网络的更多信息,可以点此链接。
1、将鼠标悬停在Alchemy网页导航栏中的「App」,单击「Create App」并前往此页面。
2、为你的App取名,并做出简单的描述,在「Enviroment」一栏选择「Staging」(用于APP记账)、「Network」一栏选择「Ropsten」。
3、点击「Create App」即可。你的App将会出现在下表中。
我们需要一个以太坊账户发送和接受交易请求。在这次教程中,我们会用MetaMask,这是浏览器中一个可用于管理以太坊账户地址的电子钱包。
你可以点击此链接下载并创建一个MetaMask账户。
当你在创建账号时,或你已经注册的账号,确保切换到Ropsten测试网络(页面右上角),这样我们才不会用到真实的货币。
我们需要一些假的以太币在测试网络上来部署智能合约。要获得以太币,你可以前往FaucETH网站,然后进入你的Ropsten账户地址,点击「Request funds」,在下拉菜单中选择「Ethereum Testnet Ropsten」,最后再次点击「Request funds」。一会你就能在你的MetaMask账户中看到以太币了。
为了对余额进行再次核实,我们将用Alchemy composer tool来发送eth_getBalance请求。这会返回我们钱包中的以太币数额。输入你的MetaMAsk账号地址后,点击「Send Request」,你可以看到以下反馈:
`{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}`
注意:这个结果是Wei为单位,并不是ETH。Wei是以太币的最小面额。1 ETH=10¹⁸ Wei。因此如果将0xde0b6b3a7640000转换成10进制,我们将得到1*10¹⁸ wei,即1个eth。
咻!我们的假钱都在这了!
首先,我们需要给项目创建一个文件夹。
进入命令行吧,输入:
mkdir my-nft
cd my-nft
现在我们已经在项目文件夹中,我们将使用 npm init 来初始化项目。如果你还没下载npm,按照说明进行操作(我们还需要 Node.js,请一起下载!)。
npm init
怎么样进行具体的安装我在这里不做解释。下面是我们给出的参考:
package name: (my-nft)
version: (1.0.0)
description: My first NFT!
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/thesuperb1/Desktop/my-nft/package.json:{
"name": "my-nft",
"version": "1.0.0",
"description": "My first NFT!",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
添加package.json,我们就可以开始了!
Hardhat是一个用于编译、部署、测试和调试以太坊软件的开发环境。它可以帮助开发者在部署到正式链之前进行智能合约和Dapps(分布式应用程序)的创建。
在my-nft项目中运行:
npm install --save-dev hardhat
在此网页的 installation installation中可了解更多细节。
在项目文件夹中运行:
npx hardhat
你会看到一条欢迎消息和用于选择您想要执行的操作的选项。选择「create an empty hardhat.config.js」
888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
888 888 "88b 888P" d88" 888 888 "88b "88b 888
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
👷 Welcome to Hardhat v2.0.11 👷
? What do you want to do? …
Create a sample project
❯ Create an empty hardhat.config.js
Quit
这将会生成一个 hardhat.config.js 文件,用于配置项目的所有设置(在步骤13)。
为了让我们有序管理项目,我们需要创造2个新文件夹。在命令行中导航到项目根目录并输入:
mkdir contracts
mkdir scripts
· contracts/ 用于存放NFT智能合约代码
· scripts/ 用于存放脚本以部署和交互我们的智能合约
现在我们的环境已经配置完成,接下来是更令人兴奋的事情:
编写我们的智能合约代码!
在你最常用的编辑器中打开my-nft项目(我们比较喜欢用VScode)。智能合约是用Solidity语言来编写的,这也是我们即将用来写MyNFT.sol智能合约的语言。
1、导航 contracts 文件夹,创建一个名为 MyNFT.sol 的新文件。
2、这里我们给你一个基于OpenZeppelin库的ERC721协议来实现的NFT智能合约代码。
你可以复制粘贴到你的 MyNFT.sol 文件中。
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";contract MyNFT is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;constructor() ERC721("MyNFT", "NFT") {}function mintNFT(address recipient, string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);return newItemId;
}
}
3、因为我们要继承OpenZeppelin合约库中的类,所以请在命令行中运行 npm install @openzeppelin/contracts ,将这个库安装到文件夹中。
那么这段代码实现了什么呢?让我们一行一行的进行分解。
在智能合约的顶部,我们引入了3个OpenZeppelin的智能合约类:
引入这些声明后,我们的自定义NFT智能合约就完成了。它非常的精简,只包含了一个计数器、一个构造函数和一个函数!这主要归功于我们继承了OpenZepplin合约,它帮助我们执行了创造NFT所需要的大部分方法。例如,返回NFT所有者的 ownerOf ,将NFT所有权从一个账户转移到另一个账户的 transferFrom 。
在ERC721构造函数中,你会发现我们传了2个字符串, “MyNFT”和“NFT”。第一个变量是智能合约的名称,第二个是它的符号(数据类型)。你可以随意给这些变量命名!
最后,我们用 函数 mintNFT(address recipient, string memory uri) 来铸造NFT。这个函数有两个变量:
mintNFT 从继承的ERC721库中调用了一些方法,最终返回一个数字,代表最新铸造的NFT的ID。
目前我们已经建立了MetaMask钱包、Alchemy账户和编写好的智能合约,是时候将三者连接一起了。
每笔从电子钱包发送的交易,都需要使用你独有的私钥进行签名。为了让我们程序拥有这类权限,我们可以将私钥(以及Alchemy的API密钥)安全地储存在一个环境变量文件中。
如需了解更多关于发送交易的信息,请查看使用web3发送交易的教程。
首先,在项目目录中安装dotenv包:
npm install dotenv --save
然后,在项目的根目录中建立一个名为 .env 的环境变量文件,并将你的MetaMask私钥和HTTP Alchemy API URL添加进去。
你的 .env 文件应该如下所示:
API_URL="https://eth-ropsten.alchemyapi.io/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"
为确保我们成功将其连接到我们的代码,我们将在步骤13中引用 hardhat.config.js 文件中的变量。
*不要提交 .env !请确保不要与任何人共享或公开您的 .env 文件,否则会泄露您的密钥。如果您使用版本控制,请将您的 .env 添加到 **gitignore *文件中。
Ethers.js是一个库,它打包了更具有易用性的标准JSON-RPC方法,使得向以太坊发出请求和交互更加容易。
Hardhat使得将插件集成到附加工具和扩展功能中这件事变得超级简单。我们将使用以太币插件Ethers Plugins来部署合约。Ethers.js有一些非常简洁的合约部署方法。
在你的项目目录中输入:
npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0
在下一步中,我们还需要在 hardhat.config.js 中使用以太币。
目前我们已经添加了几种依赖库和插件,为了让我们的项目使用这些组件,现在我们需要更新hardhat.config.js。
下面是更新hardhat.config.js的方法:
/**
* @type import('hardhat/config').HardhatUserConfig
*/
require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;
module.exports = {
solidity: "0.8.1",
defaultNetwork: "ropsten",
networks: {
hardhat: {},
ropsten: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
},
}
为了确保事情都能运转起来,我们现在来编译合约。编译任务是Hardhat内置任务之一。
在命令行执行:
npx hardhat compile
您可能会收到关于源文件中未提供SPDX许可证标识符的警告,但无需担心,希望其他一切看起来都不错!如果遇到问题,您可以随时在Alchemy discord中发送消息。
目前我们的合约已经编写好,配置文件也已准备好,是时候编写合约部署脚本。
导航到 scripts/ 文件夹,并创建一个名为 deploy.js 的新文件,在里面添加如下内容:
async function main() {
const MyNFT = await ethers.getContractFactory("MyNFT")// Start deployment, returning a promise that resolves to a contract object
const myNFT = await MyNFT.deploy()
await myNFT.deployed()
console.log("Contract deployed to address:", myNFT.address)
}main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
Hardhat在他们的合约教程中,非常详细的说明了每一行代码的作用,我们这里直接采用他们的解释。
const MyNFT = await ethers.getContractFactory("MyNFT");
ethers.js 中的 ContractFactory 是用于部署新的智能合约的一种抽象类,因此在这,MyNFT是NFT合约实例中的工厂。当使用Hardhat-ethers插件时,ContractFactory和合约实例默认会连接第一个签名者。
const myNFT = await MyNFT.deploy();
在ContractFactory中调用 deploy() 函数将会启动部署,并返回解析为合约的Promise实例。这个对象包括我们智能合约中每个函数的对应调用方法。
我们终于准备好部署我们的智能合约了!
回到项目的根目录,并在命令行中运行:
npx hardhat --network ropsten run scripts/deploy.js
接着你会看到类似于下面的交易:
Contract deployed to address: 0x81c587EB0fE773404c42c1d2666b5f557C470eED
如果我们访问Ropsten etherscan搜索我们的合约地址,就可以看到它已经部署成功了。如果您无法立即看到它,请稍等片刻。
交易将如下所示:
你的MetaMask账户地址应该和发送地址相匹配,收件人地址会显示:“Contract Creation”。如果我们点进交易,可以在“To”的那一栏看到我们的合约地址。
真是太赞啦!你已经成功将你的NFT智能合约部署在以太坊区块链上了!
为了更深入地了解背后的逻辑,我们导航到Alchemy仪表盘的「Explorer」选项卡。如果你有多个Alchemy的apps,记得按应用程序筛选并选择“MyNFT”。
你会看到一些JSON-RPC的远程调用,这里是当我们调用 .deploy() 函数时,Hardhat/Ethers为我们在底层完成的。在这指出2个比较重要的,一个是 eth_sendRawTransaction ,这是实际将我们的智能合约写入Ropsten链上的请求;另一个是 eth_getTransactionByHash ,这是在交易指定哈希(发送交易时的典型模式)的情况下,读取相关交易信息的请求。若要详细了解关于发送交易的信息,请查看此有关使用 Web3 发送交易的教程。
Beeple: 6900万美元,3LAU: 1100万美元,Grimes: 600万美元
以上项目都使用了Alchemy的强大API来铸造的NFT。在此教程中,我将教你如何在10min内完成同样的操作。
铸造NFT就是在区块链上发布一个专属于你自己的ERC721代币。
使用我们Part1教程中讲到的智能合约,可以让我们灵活运用我们的web3技能来铸造NFT。在本教程结束时,只要你或者你的钱包想要,都可以随心所欲的铸造足够多的NFTs。
让我们开始吧!
如果你参照第一篇教程来创建了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(Application Binary Interface 应用程序的二进制接口)是与智能合约交互的接口。你可以在此链接中了解更多有关Contract ABIs的信息。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
如果你还记得Part1的教程那你应该知道,我们的 mintNFT 智能合约函数里包含有一个tokenURI参数,该参数会解析为一个JSON文件,用于描述NFT元数据 — — 它让NFT栩栩如生,因为元数据让NFT具有很多可配置的属性,比如名称、图像和其他属性。
IPFS(Interplanetary File System,星际文件系统)是一个去中心化协议和P2P网络,它用来在分布式文件系统中储存和共享数据。
我们将会使用到Pinata,一个便捷的IPFS API和工具包,用来来存储NFT资产和元数据,确保NFT是真正去中心化的。如果你没有Pinata账户,点此链接免费注册并完成邮箱验证。
当你创建账户后:
下面是给初学者总结的图像教学步骤:
现在我们想在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": "https://gateway.pinata.cloud/ipfs/QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
"name": "Ramses"
}
你可以随意更改json中的数据。你可以删除或添加属性。最重要的是,请确保图片的字段是指向你的IPFS图像的位置,否则,你的NFT会包含一张(非常cute的!)狗狗的照片。
完成json文件的编辑后,参照如下图片指南的参考,将其保存并上传到Pinata。
现在,为了与合约交互,我们需要在代码中创建一个实例。
为了做到这些,首先需要一个合约地址,我们可以这样来找到该地址:从部署或者在Etherscan中查找之前部署合约的地址。
在上面的示例中,我们的合约地址是0x81c587EB0fE773404c42c1d2666b5f557C470eED。
下一步我们会用web3的合约方法,调用ABI和address来创建合约。
在你的 mint-nft.js. 文档中,添加下列代码:
const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
现在,为向以太坊区块链创建并发送交易,我们使用你的公用的以太坊账户地址来获取账户的区块编号/区块高度(account nouce,我们会在后面解释)。
注:
account nonce是每个账户中交易的计数器,它等于从该地址发送交易的数量,或者在具有关联代码的账户的情况下,该账户创建的合约数量。
以太坊所有的交易都是基于account ,因此需要对每次交易都按顺序记录,nonce值便是这个顺序。
ETH(ETC)节点要求每笔交易必须有一个nonce数值。每一个账户从同一个节点发起交易时,这个nonce值从0开始计数,发送一笔nonce对应加1。当前面的nonce处理完成之后才会处理后面的nonce。
nonce是交易原始地址的属性。它不存储在以太坊区块链上,而是通过计算从一个地址发送的交易数量来计。
将你的公钥添加到 .env 文件,如果你按照Part1教程操作, .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) 的函数,并通过执行以下操作来创建我们的交易:
1、从 .env 文件中获取你的 PRIVATE_KEY (私钥)和 PUBLIC_KEY (公钥)。
2、下一步,我们需要计算出区块高度(account nonce)。nonce规范是用来跟踪从你的地址所发送的交易的数量,同时还为了确保安全以阻止重放攻击。我们需要用到getTransactionCount来获取从你的地址发送的交易的数量。
3、最后,我们需要根据下列信息来设置交易:
你的 mint-nft.js file 应该如下所示:
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_KEYconst { 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>
这是我们获取哈希码的操作步骤:
如何在Pinata上获取你的NFT元数据的哈希码
在一个新窗口加载 https://gateway.pinata.cloud/ipfs/<metadata-hash-code> ,仔细检查你复制的哈希码是否链接到 metadata.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_KEYconst { 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(
"https://gateway.pinata.cloud/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内存池来查看你的交易状态(待处理、成功铸造、被区块链网络拒绝)。如果你的交易被拒绝,可以在Ropsten Etherscan中搜索你的交易哈希来查看详细情况。
在Etherscan上查看你的NFT交易哈希
以上就是全部了!现在你已经在以太坊区块链上部署并铸造一个NFT了!
你可以用 mint-nft.js 随心所欲地铸造NFT!只要确保传入一个新的描述NFT元数据的tokenURLI即可(否则你就只是制作了拥有不同ID的同一个NFT)。
也许你还想展示你钱包里的NFT,请查看 Part3教程 — — 如何在您的钱包中查看您的 NFT 吧!
在Part3,我们会讲述如何查看我们新铸造的NFT。当然,你也可以使用MetaMask上关于ERC721协议的通用教程,包括主网上和任何测试网络上的。如果你想学如何在以太坊上铸造你自己的NFT,你可以查看本教程的Part1部分。
恭喜!你来到了本次NFT教程系列中最短最简单的部分 — — 如何在一个电子钱包中查看最新铸造的NFT。因为我们在前两部分使用了MetaMask,这次我们依然用它来举例。
首先,你手机上需要安装MetaMask,并且已经登陆了你铸造NFT所用的帐户。该应用程序在iOS和Android均免费。
点击app顶部的「Wallet」按钮后,你便会获得设置网络的提示。因为我们的NFT是在Ropsten网络上铸造的,你需要选择Ropsten。
当你设置为Ropsten网络后,选择右侧的「Collectibles」栏,添加NFT智能合约地址和NFT的ERC721代币ID,你可以在Part2部分所部署的NFT中,根据交易哈希在Etherscan上找到它们。
你可能会需要刷新好几次,才能看到你的NFT。别担心,它在那里的!
恭喜,你已经成功铸造一个NFT,还可以查看它!好了,我们迫不及待地想看看你将如何席卷 NFT 世界!