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的通证实战,你需要准备以下环境和工具:

  1. 以太坊钱包:如MetaMask,用于管理你的私钥、与以太坊网络交互、支付Gas费。
  2. 测试网ETH:为了在测试网络上部署合约和进行交易,你需要免费的测试网ETH(如Goerli测试网的ETH),可以从水龙头(Faucet)获取。
  3. 集成开发环境(IDE):推荐使用 Remix IDE,它是一个基于浏览器的Solidity开发环境,对初学者非常友好,无需本地配置。
  4. Solidity基础知识:了解Solidity语言的基本语法,如合约结构、变量、函数修饰器(如public, external, view, payable)等。

实战步骤一:编写ERC721智能合约

我们将使用OpenZeppelin库,这是一个提供安全、审计过的智能合约标准的开源库,可以大大减少我们的开发风险和成本。

  1. 打开Remix IDE:访问 remix.ethereum.org

  2. 创建新文件:在左侧文件浏览器中,点击“Create New File”,命名为MyNFT.sol

  3. 引入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随机配图
ode>安全铸造,并设置元数据。
  • _tokenIdCounter:用于生成唯一的NFT ID。
  • _baseTokenURIsetBaseTokenURI:用于管理和设置NFT元数据的基础路径。
  • 编译合约

    • 在Remix左侧,点击“Solidity Compiler”图标(第二个)。
    • 选择编译器版本(建议与代码中pragma solidity指定的版本兼容,如0.8.20)。
    • 点击“Compile MyNFT.sol”,确保没有编译错误。
  • 实战步骤二:部署智能合约

    1. 连接钱包
      • 在Remix左侧,点击“Deploy & Run Transactions”图标(第三个)。
      • 在“ENVIRONMENT”下拉菜单中,选择“Injected Provider - MetaMask”,这将连接你的MetaMask钱包。
      • 确保MetaMask切换到了测试网络(如Goerli)。
    2. 部署合约
      • “CONTRACT”下拉菜单会自动选择我们刚刚编译的MyNFT
      • 在“Deploy”按钮下方的输入框中,你需要输入baseTokenURI,你可以输入ipfs://YourBaseCID/(这里需要你提前将元数据文件上传到IPFS,并获取基础CID),如果是测试,可以先输入一个简单的字符串,如"https://my-nft-metadata.com/"
      • 点击“Deploy”按钮。
      • MetaMask会弹出一个交易确认窗口,显示Gas费等信息,确认交易。
      • 等待几秒钟,交易被打包后,你会在Remix的日志中看到合约部署成功的消息,并显示合约地址。恭喜!你的ERC721 NFT合约已经部署到以太坊测试网了!

    实战步骤三:铸造你的第一个NFT

    1. 调用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费。
      • 等待交易成功。
    2. 验证NFT是否铸造成功

      • 通过区块链浏览器:将你的合约地址输入到以太坊测试网浏览器(如 Etherscan Goerli)中,查看合约的Transfer事件,或者直接查询你地址持有的代币。
      • 通过钱包:在MetaMask中,虽然默认不显示ERC721代币,但你可以添加自定义代币(通过合约地址和NFT的 decimals 通常为 0),或者使用支持NFT的钱