赞
踩
本文讲解如何从零到一打造自己的NFT
所有代码已上传至https://gitee.com/SJshenjian/blockchain/tree/master/hardhat-nft-fcc
git clone https://gitee.com/SJshenjian/blockchain.git
cd hardhat-nft-fcc
yarn
在https://vrf.chain.link/中新增订阅,然后修改
helper-hardhat-config.js中的subscriptionId值为自己的
5: {
name: "goerli",
subscriptionId: "5115", // add your ID here!
},
注册API_KEY修改.env中配置
NFT_STORAGE_KEY=XXXXXX
PINATA_API_KEY=XXXXXX
PINATA_API_SECRET=XXXXXX
我们运行本地部署yarn hardhat deploy
发现一切正常
(base) PS D:\blockchain\blockchain\hardhat-nft-fcc> yarn hardhat deploy
yarn run v1.22.19
warning package.json: No license field
$ D:\blockchain\blockchain\hardhat-nft-fcc\node_modules\.bin\hardhat deploy
Nothing to compile
Local network detected! Deploying mocks...
deploying "VRFCoordinatorV2Mock" (tx: 0x1f95b6dc03b0f019875a16c4e529a7ce7c20897a493463c3aa4a80a5f053f1af)...: deployed at 0x5FbDB2315678afecb367f032d93F642f64180aa3 with 2543420 gas
deploying "MockV3Aggregator" (tx: 0x07b11cc60051bd9be3bba6b22675974999ac14b8fc841ae5bf19418b634b86cc)...: deployed at 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 with 569671 gas
Mocks Deployed!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
You are deploying to a local network, you'll need a local network running to interact
Please run `yarn hardhat console --network localhost` to interact with the deployed smart contracts!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
----------------------------------------------------
deploying "BasicNft" (tx: 0x3ea769ae9694432e56ec58ca884df6853fda5a1a0f4f89ecf3c2aecf24e747ac)...: deployed at 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 with 2014793 gas
----------------------------------------------------
deploying "DynamicSvgNft" (tx: 0x05659748cafee03724c05003a44e1712cc8cddba0dcb4e73d5de2732d2e52372)...: deployed at 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 with 4585544
gas
----------------------------------------------------
deploying "RandomIpfsNft" (tx: 0x69864f92b769bc30e7759fd5e3048bafaf7125ea146d3528c346d585628b0b16)...: deployed at 0x0165878A594ca255338adfa4d48449f69242Eb8F with 3575089
gas
Basic NFT index 0 tokenURI: ipfs://bafybeig37ioir76s7mg5oobetncojcm3c3hxasyd4rvid4jqhy4gkaheg4/?filename=0-PUG.json
Dynamic SVG NFT index 0 tokenURI: data:application/json;base64,eyJuYW1lIjoiRHluYW1pYyBTVkcgTkZUIiwgImRlc2NyaXB0aW9uIjoiQW4gTkZUIHRoYXQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgQ2hhaW5saW5rIEZlZWQiLCAiYXR0cmlidXRlcyI6IFt7InRyYWl0X3R5cGUiOiAiY29vbG5lc3MiLCAidmFsdWUiOiAxMDB9XSwgImltYWdlIjoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJ6ZEdGdVpHRnNiMjVsUFNKdWJ5SS9QZ284YzNabklIZHBaSFJvUFNJeE1ESTBjSGdpSUdobGFXZG9kRDBpTVRBeU5IQjRJaUIyYVdWM1FtOTRQU0l3SURBZ01UQXlOQ0F4TURJMElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBnb2dJRHh3WVhSb0lHWnBiR3c5SWlNek16TWlJR1E5SWswMU1USWdOalJETWpZMExqWWdOalFnTmpRZ01qWTBMallnTmpRZ05URXljekl3TUM0MklEUTBPQ0EwTkRnZ05EUTRJRFEwT0MweU1EQXVOaUEwTkRndE5EUTRVemMxT1M0MElEWTBJRFV4TWlBMk5IcHRNQ0E0TWpCakxUSXdOUzQwSURBdE16Y3lMVEUyTmk0MkxUTTNNaTB6TnpKek1UWTJMall0TXpjeUlETTNNaTB6TnpJZ016Y3lJREUyTmk0MklETTNNaUF6TnpJdE1UWTJMallnTXpjeUxUTTNNaUF6TnpKNklpOCtDaUFnUEhCaGRHZ2dabWxzYkQwaUkwVTJSVFpGTmlJZ1pEMGlUVFV4TWlBeE5EQmpMVEl3TlM0MElEQXRNemN5SURFMk5pNDJMVE0zTWlBek56SnpNVFkyTGpZZ016Y3lJRE0zTWlBek56SWdNemN5TFRFMk5pNDJJRE0zTWkwek56SXRNVFkyTGpZdE16Y3lMVE0zTWkwek56SjZUVEk0T0NBME1qRmhORGd1TURFZ05EZ3VNREVnTUNBd0lERWdPVFlnTUNBME9DNHdNU0EwT0M0d01TQXdJREFnTVMwNU5pQXdlbTB6TnpZZ01qY3lhQzAwT0M0eFl5MDBMaklnTUMwM0xqZ3RNeTR5TFRndU1TMDNMalJETmpBMElEWXpOaTR4SURVMk1pNDFJRFU1TnlBMU1USWdOVGszY3kwNU1pNHhJRE01TGpFdE9UVXVPQ0E0T0M0Mll5MHVNeUEwTGpJdE15NDVJRGN1TkMwNExqRWdOeTQwU0RNMk1HRTRJRGdnTUNBd0lERXRPQzA0TGpSak5DNDBMVGcwTGpNZ056UXVOUzB4TlRFdU5pQXhOakF0TVRVeExqWnpNVFUxTGpZZ05qY3VNeUF4TmpBZ01UVXhMalpoT0NBNElEQWdNQ0F4TFRnZ09DNDBlbTB5TkMweU1qUmhORGd1TURFZ05EZ3VNREVnTUNBd0lERWdNQzA1TmlBME9DNHdNU0EwT0M0d01TQXdJREFnTVNBd0lEazJlaUl2UGdvZ0lEeHdZWFJvSUdacGJHdzlJaU16TXpNaUlHUTlJazB5T0RnZ05ESXhZVFE0SURRNElEQWdNU0F3SURrMklEQWdORGdnTkRnZ01DQXhJREF0T1RZZ01IcHRNakkwSURFeE1tTXRPRFV1TlNBd0xURTFOUzQySURZM0xqTXRNVFl3SURFMU1TNDJZVGdnT0NBd0lEQWdNQ0E0SURndU5HZzBPQzR4WXpRdU1pQXdJRGN1T0MwekxqSWdPQzR4TFRjdU5DQXpMamN0TkRrdU5TQTBOUzR6TFRnNExqWWdPVFV1T0MwNE9DNDJjemt5SURNNUxqRWdPVFV1T0NBNE9DNDJZeTR6SURRdU1pQXpMamtnTnk0MElEZ3VNU0EzTGpSSU5qWTBZVGdnT0NBd0lEQWdNQ0E0TFRndU5FTTJOamN1TmlBMk1EQXVNeUExT1RjdU5TQTFNek1nTlRFeUlEVXpNM3B0TVRJNExURXhNbUUwT0NBME9DQXdJREVnTUNBNU5pQXdJRFE0SURRNElEQWdNU0F3TFRrMklEQjZJaTgrQ2p3dmMzWm5QZ289In0=
Random IPFS NFT index 0 tokenURI: ipfs://QmZYmH5iDbD6v3U2ixoVAjioSzvWJszDzYdbeCLquGSpVm
Done in 10.52s.
IPFS是星际文件系统的简写,是去中心化存储龙头。我们NFT制作依赖于IPFS存储,最原始的文件如图片、视频都存储在IPFS中,一但上传不可更改。
首先我们访问https://github.com/ipfs/ipfs-desktop/releases下载对应版本客户端安装
在客户端文件中我们输入bafybeig37ioir76s7mg5oobetncojcm3c3hxasyd4rvid4jqhy4gkaheg4
浏览后可以看到如下信息
{
"name": "PUG",
"description": "An adorable PUG pup!",
"image": "https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png",
"attributes": [
{
"trait_type": "cuteness",
"value": 100
}
]
}
这就是NFT中的TOKEN_URI:值是json文件,定义了metadata信息,其中image指定图片的去中心化存储位置,当我们浏览器访问https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png
地址时,一个可爱的小狗图片就展现了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yV9XmZNH-1666522940517)(https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png)]
好了,到此为止我们总结下NFT图像制作具体步骤
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract BasicNft is ERC721 {
string public constant TOKEN_URI =
"ipfs://bafybeig37ioir76s7mg5oobetncojcm3c3hxasyd4rvid4jqhy4gkaheg4/?filename=0-PUG.json";
uint256 private s_tokenCounter;
constructor() ERC721("Dogie", "DOG") {
s_tokenCounter = 0;
}
function mintNft() public {
s_tokenCounter = s_tokenCounter + 1;
_safeMint(msg.sender, s_tokenCounter);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
// require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
return TOKEN_URI;
}
function getTokenCounter() public view returns (uint256) {
return s_tokenCounter;
}
}
其中ERC-721 为 NFT 引入了一个标准,换言之, 这种类型的代币是独一无二的,并且可能与来自同一智能合约的另一代币有不同的价值,也许是因为它的年份、稀有性、甚至是它的观感
yarn hardhat deploy --network goerli --tags basicnft
部署NFT图像至goerli测试网络,注意之前在alchemy申请的GOERLI_RPC_URL是否过期,如果不能访问重新申请$ D:\blockchain\blockchain\hardhat-nft-fcc\node_modules\.bin\hardhat deploy --network goerli --tags basicnft
Nothing to compile
----------------------------------------------------
reusing "BasicNft" at 0xa14Bb4725c302c04888010C343dC660902D6B50C
Done in 5.25s.
访问部署地址,NFT至此完成https://goerli.etherscan.io/address/0xa14Bb4725c302c04888010C343dC660902D6B50C
对于RandomIpfsNft.sol做的功能类似盲盒抽奖,用户充值然后抽取NFT,普通稀缺各占一定比例,这种去中心化的机制下,让商家没有作假的可能。完全透明
DynamicSvgNft.sol实现了SVG图片制作为NFT,自行查看吧
到此为止,区块链系列先告一段落了
2023年1月30日,比特币核心开发者Casey Rodarmor创建了NFT协议Ordinals
Ordinals序数: 比特币的最小单位是Satoshi聪,1BTC=1亿聪,每个聪的比特币都是同质化代币,它们之间并没有任何差别。Ordinals给聪打上了编号,这使得每个聪具有独特的唯一性,方便追踪与识别
Inscription铭文:每个聪打上编号后,就可以将一段内容写入见证的隔离区,简单来讲就是在聪里面嵌入各种信息,只要大小在4MB以下就可以了。比如文字、图片、视频都可以进行嵌入聪,我们称为Inscription铭文
Inscribe铭刻:我们将上传的Inscription铭文与特定的聪绑定,这个过程称为铭刻
最终绑定后产生的就是携带铭文的聪,这才有了我看所说的比特币网络的NFT
NFT协议Ordinals优点:
2023年3月9日,推特叫@domodata的用户提出了一个比特币网络上的token标准,叫BRC-20标准
同时他也在链上部署了BRC20标准的第一枚token,叫ORDI代币
BRC-20标准优点:
特征 | BRC20 | ERC721 |
---|---|---|
不变性 | Ordinals数据铭文不可变 | ERC721可以是可变或不可变,取决于智能合约代码 |
位置 | Ordinals数据必须直接写在链上,因为它不能引用链下内容 | 以太坊NFT内容可以在链上或链下 |
简易程度 | Ordinals简单,只是分配给一个聪的交易数据附件,具有统一格式 | ERC721高度可编程,因为它们是智能合约 |
欢迎关注公众号算法小生或沈健的技术博客shenjian.online
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。