ERC721以太坊通证实战,从零开始铸造你的第一个NFT
时间:
2026-02-25 10:51 阅读数:
1人阅读
在区块链的世界里,NFT(非同质化代币)无疑是最炙手可热的概念之一,它赋予了数字资产独一无二的稀缺性和所有权,从艺术品、收藏品到游戏道具、房产证明,应用场景层出不穷,而ERC721,作为以太坊上首个实现NFT标准的智能合约接口,正是这一切的基石,本文将带你进入ERC721以太坊通证实战,从概念到代码,一步步铸造出你的第一个NFT。
理解ERC721:什么是NFT的“身份证”
在深入实战之前,我们首先要明白ERC721到底是什么。
- ERC (Ethereum Request for Comments):以太坊改进提案,类似于以太坊上的“技术标准”。
- 721:这是一个特定的提案编号。
- 核心特性:与同质化代币(如ERC20的以太币或SHIB,每个代币完全相同)不同,ERC721代币是独一无二的,每个代币都有一个独特的ID,这意味着即使它们来自同一个智能合约,彼此之间也不可互换,就像你钱包里的每一张钞票(同质化)和你的身份证(非同质化)一样。
ERC721标准定义了一系列接口(Interface)和事件(Event),确保了不同NFT项目之间的互操作性和兼容性,关键接口包括:
ownerOf(uint256 tokenId):查询某个ID的NFT当前所有者。balanceOf(address owner):查询某个地址拥有的NFT数量。transferFrom(address from, address to, uint256 tokenId):转移NFT所有权。approve(address to, uint256 tokenId):授权另一个地址转移你的NFT。getApproved(uint256 tokenId):获取被授权的地址。setApprovalForAll(address operator, bool approved):批量授权一个地址管理你所有的NFT。
关键事件包括:
Transfer(address indexed from, address indexed to, uint256 indexed tokenId):NFT转移事件。Approval(address indexed owner, address indexed approved, uint256 indexed tokenId):NFT授权事件。
ERC721通证实战准备:环境与工具
要开始ERC721的通证实战,你需要准备以下环境和工具:
- 以太坊钱包:如MetaMask,用于管理你的私钥、与以太坊网络交互、支付Gas费。
- 测试网ETH:为了在测试网络上部署合约和进行交易,你需要免费的测试网ETH(如Goerli测试网的ETH),可以从水龙头(Faucet)获取。
- 集成开发环境(IDE):推荐使用 Remix IDE,它是一个基于浏览器的Solidity开发环境,对初学者非常友好,无需本地配置。
- Solidity基础知识:了解Solidity语言的基本语法,如合约结构、变量、函数修饰器(如
public,external,view,payable)等。
实战步骤一:编写ERC721智能合约
我们将使用OpenZeppelin库,这是一个提供安全、审计过的智能合约标准的开源库,可以大大减少我们的开发风险和成本。
-
打开Remix IDE:访问 remix.ethereum.org。
-
创建新文件:在左侧文件浏览器中,点击“Create New File”,命名为
MyNFT.sol。 -
引入OpenZeppelin 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"; contract MyNFT is ERC721 { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor(string memory baseTokenURI) ERC721("MyNFT", "MNFT") { _baseTokenURI = baseTokenURI; } // 函数:铸造一个新的NFT function mintNFT(address to, string memory tokenURI) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _safeMint(to, tokenId); _setTokenURI(tokenId, tokenURI); _tokenIdCounter.increment(); } // 可选:实现tokenURI函数,用于返回NFT的元数据URI function _baseTokenURI() internal view override returns (string memory) { return _baseTokenURI; } string private _baseTokenURI; // 可选:设置基础URI function setBaseTokenURI(string memory baseTokenURI) public onlyOwner { _baseTokenURI = baseTokenURI; } }代码解释:
import:引入了OpenZeppelin的ERC721基础合约、计数器工具和Ownable(所有权)合约。contract MyNFT is ERC721:我们的MyNFT合约继承自ERC721。constructor:构造函数,初始化NFT的名称("MyNFT")和符号("MNFT")。baseTokenURI是NFT元数据的基础URI。mintNFT:核心铸造函数,只有合约所有者(onlyOwner)可以调用,它接收接收地址to和NFT的元数据URItokenURI,使用_safeMint
_tokenIdCounter:用于生成唯一的NFT ID。_baseTokenURI和setBaseTokenURI:用于管理和设置NFT元数据的基础路径。编译合约:
- 在Remix左侧,点击“Solidity Compiler”图标(第二个)。
- 选择编译器版本(建议与代码中
pragma solidity指定的版本兼容,如0.8.20)。 - 点击“Compile MyNFT.sol”,确保没有编译错误。
实战步骤二:部署智能合约
- 连接钱包:
- 在Remix左侧,点击“Deploy & Run Transactions”图标(第三个)。
- 在“ENVIRONMENT”下拉菜单中,选择“Injected Provider - MetaMask”,这将连接你的MetaMask钱包。
- 确保MetaMask切换到了测试网络(如Goerli)。
- 部署合约:
- “CONTRACT”下拉菜单会自动选择我们刚刚编译的
MyNFT。 - 在“Deploy”按钮下方的输入框中,你需要输入
baseTokenURI,你可以输入ipfs://YourBaseCID/(这里需要你提前将元数据文件上传到IPFS,并获取基础CID),如果是测试,可以先输入一个简单的字符串,如"https://my-nft-metadata.com/"。 - 点击“Deploy”按钮。
- MetaMask会弹出一个交易确认窗口,显示Gas费等信息,确认交易。
- 等待几秒钟,交易被打包后,你会在Remix的日志中看到合约部署成功的消息,并显示合约地址。恭喜!你的ERC721 NFT合约已经部署到以太坊测试网了!
- “CONTRACT”下拉菜单会自动选择我们刚刚编译的
实战步骤三:铸造你的第一个NFT
-
调用mintNFT函数:
- 确保在“Deploy & Run Transactions”界面,并且刚部署的合约已经显示在“DEPLOYED CONTRACTS”列表中。
- 展开
MyNFT合约的接口。 - 找到
mintNFT函数。 - 在
to输入框中,输入你想要接收NFT的地址(可以是你的MetaMask地址)。 - 在
tokenURI输入框中,输入具体这个NFT的元数据URI,如果你有一个名为nft1.json的元数据文件,并上传到了IPFS,其URI可能是ipfs://YourBaseCID/nft1.json,或者,如果你有图片的直接链接,也可以使用(但通常推荐使用JSON元数据文件,包含图片描述、属性等信息)。 - 点击
mintNFT按钮。 - MetaMask会再次弹出交易确认窗口,确认并支付Gas费。
- 等待交易成功。
-
验证NFT是否铸造成功:
- 通过区块链浏览器:将你的合约地址输入到以太坊测试网浏览器(如 Etherscan Goerli)中,查看合约的
Transfer事件,或者直接查询你地址持有的代币。 - 通过钱包:在MetaMask中,虽然默认不显示ERC721代币,但你可以添加自定义代币(通过合约地址和NFT的 decimals 通常为 0),或者使用支持NFT的钱
- 通过区块链浏览器:将你的合约地址输入到以太坊测试网浏览器(如 Etherscan Goerli)中,查看合约的