概述
本文将以一个例子来说明如何在opensea快速发布自己的NFT智能合约(ERC721)。本着DRY(Don't Repeat Yourself)原则,我们需要站在巨人的肩膀上来搭建自己的应用,使用经过社区审计和实践检验的代码可以有效提高我们智能合约的安全性,所以我们使用openzeppelin来构建我们的智能合约。
预备知识
metamask钱包
以太坊Sepolia网络账号,获取测试以太币
IPFS上传文件,windows安装参考这里
Remix编译、部署合约
流程
- 根据个人需求编写NFT合约;
- 编译合约、并向Sepolia网络部署合约;
- IPFS上传文件(NFT要展示的内容),并生成文件的元信息(metadata);
- 将NFT元信息上链;
- 在opensea查看自己的NFT;
合约开发
- 打开openzeppelin开发向导,选择ERC721,输入NFT的名字及符号,如下:
- 特性有如下几项,根据需要选择即可。
- 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);
}
}
部署
注意:
- 部署环境选择"Injected Provider",并将metamask钱包连接Sepolia网络;
- 部署时需要设置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
-
在Remix部署合约的页面,选择你上面部署的合约;
-
调用safeMint方法,铸造你的第一个NFT;
参数说明:
- to: 这个NFT隶属于谁;
- uri: metadata.json文件地址,其格式为:ipfs://<metadata.json的CID>
- 上述步骤完成后,你可以调用合约的tokenURI方法来查看刚才设置的结果,该函数的参数为tokenID,由于我们的ID是从0自增的,因此此处输入0查看结果;
在opensea查看
本文中的操作均在测试网络中进行,因此我们打开opensea的测试网络来查看我们的NFT,步骤如下:
- 首先,点击右上角的"login"按钮登录opensea;
- 在连接弹窗中选择metamask
- 登录成功后,点击用户信息-->Profile即可看到我们发布的NFT。
注:由于网络问题,你的NFT图片可以一直不显示,但我们可以看到我们NFT合约的名称,如下: