十分钟发布自己的NFT

概述

本文将以一个例子来说明如何在opensea快速发布自己的NFT智能合约(ERC721)。本着DRY(Don't Repeat Yourself)原则,我们需要站在巨人的肩膀上来搭建自己的应用,使用经过社区审计和实践检验的代码可以有效提高我们智能合约的安全性,所以我们使用openzeppelin来构建我们的智能合约。

预备知识

metamask钱包

以太坊Sepolia网络账号,获取测试以太币

IPFS上传文件,windows安装参考这里

Remix编译、部署合约

流程

  1. 根据个人需求编写NFT合约;
  2. 编译合约、并向Sepolia网络部署合约;
  3. IPFS上传文件(NFT要展示的内容),并生成文件的元信息(metadata);
  4. 将NFT元信息上链;
  5. 在opensea查看自己的NFT;

合约开发

  1. 打开openzeppelin开发向导,选择ERC721,输入NFT的名字及符号,如下:
  1. 特性有如下几项,根据需要选择即可。
  • Mintable 添加铸造NFT的功能,默认只允许合约开发者铸造NFT;
  • Autoincrement IDs 铸造NFT时每个NFT的编号递增;
  • Burnable允许销毁NFT;
  • Pausable转让或出售NFT时允许暂时锁定;
  • Votes类似于自治系统中的投票功能,比如根据NFT数量的投票权,可以将投票权委托给其它人;
  • Enumerable 允许查看链上所有的NFT及其拥有者;
  • URI Storage允许更新某个NFT对应的资源;

代码示例

点击openzeppelin开发向导上方的"Open in Remix",或者将代码复制到你自己在Remix中的工作区中,我选择了后者。

javascript 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract PearlArt is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
    uint256 private _nextTokenId;

    constructor(address initialOwner)
        ERC721("PearlArt", "PAT")
        Ownable(initialOwner)
    {}

    function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _nextTokenId++;
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _update(
        address to,
        uint256 tokenId,
        address auth
    ) internal override(ERC721, ERC721Enumerable) returns (address) {
        return super._update(to, tokenId, auth);
    }

    function _increaseBalance(address account, uint128 value)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._increaseBalance(account, value);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, ERC721URIStorage)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

部署

注意:

  1. 部署环境选择"Injected Provider",并将metamask钱包连接Sepolia网络;
  2. 部署时需要设置NFT合约的拥有者(有些功能只有拥有者才有权限,比如本例中铸造NFT的功能)

NFT文件元信息生成

上传文件

生成元信息

这一步主要是配置NFT在opensea显示的一些属性,具体配置可以参考这里。这里给出一个配置文件的样例,将样例配置文件命名为metadata.json。

注:修改本示例文件中的image即可

javascript 复制代码
{ 
  "description": "This NFT proves I've created and deployed my daugther's colored pencil art on Sepolia with my first ERC721",
  "image": "https://ipfs.io/ipfs/<你上传文件的CID>",
  "name": "A cool NFT", 
  "attributes": [
    {
      "trait_type": "Base", 
      "value": "Starfish"
    }, 
    {
      "trait_type": "Level", 
      "value": 5
    }, 
    {
      "trait_type": "Stamina", 
      "value": 1.4
    }, 
    {
      "display_type": "boost_number", 
      "trait_type": "Aqua Power", 
      "value": 40
    }, 
    {
      "display_type": "boost_percentage", 
      "trait_type": "Stamina Increase", 
      "value": 10
    }, 
    {
      "display_type": "number", 
      "trait_type": "Generation", 
      "value": 2
    }]
  }

生成metadata.json文件后,将该文件也上传到IPFS,同时复制该文件的CID(后面会用到)

铸造你的NFT

  1. 在Remix部署合约的页面,选择你上面部署的合约;

  2. 调用safeMint方法,铸造你的第一个NFT;

参数说明:

  • to: 这个NFT隶属于谁;
  • uri: metadata.json文件地址,其格式为:ipfs://<metadata.json的CID>
  1. 上述步骤完成后,你可以调用合约的tokenURI方法来查看刚才设置的结果,该函数的参数为tokenID,由于我们的ID是从0自增的,因此此处输入0查看结果;

在opensea查看

本文中的操作均在测试网络中进行,因此我们打开opensea的测试网络来查看我们的NFT,步骤如下:

  1. 首先,点击右上角的"login"按钮登录opensea;
  2. 在连接弹窗中选择metamask
  1. 登录成功后,点击用户信息-->Profile即可看到我们发布的NFT。

注:由于网络问题,你的NFT图片可以一直不显示,但我们可以看到我们NFT合约的名称,如下:

相关推荐
mirrornan1 小时前
什么是Web3D?有何优势?有哪些应用场景?
3d·web3·webgl·3d模型
天晟科技2 小时前
GameFi的前景:游戏与金融的未来交汇点
游戏·金融·区块链
Roun32 小时前
Web3和区块链如何促进数据透明与隐私保护的平衡
web3·区块链·隐私保护
The_Ticker9 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟9 小时前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
TechubNews9 小时前
Helius:从数据出发,衡量 Solana 的真实去中心化程度
去中心化·区块链
dingzd9511 小时前
Web3的核心技术:区块链如何确保信息安全与共享
web3·去中心化·区块链
清 晨11 小时前
Web3与智能合约:区块链技术下的数字信任体系
web3·区块链·智能合约
脆皮泡泡11 小时前
Ultiverse 和web3新玩法?AI和GameFi的结合是怎样
人工智能·web3
CertiK12 小时前
Web3.0安全开发实践:Clarity最佳实践总结
web3·区块链·clarity