区块链全栈以太坊(十二)nft学习之静态NFT、动态NFT

一、简介

ERC-721

以太坊创建的一个令牌标准。

NFT 代表不可替换的令牌,类似如 ERC20是可替换的令牌。

还有一个半可替换标准 ERC1155

NFT 平台 openSea wearable

opensea 测试网 https://testnets.opensea.io/zh-CN
https://blog.csdn.net/xingxincsdn/article/details/126399192

tokenURI

在区块链上存储数据GAS成本贵,所以有了IPFS, 而区块链里只存放 tokenURI。
tokenURI 返回一个json,json里包含image ipfs uri。

游戏中角色的图像 可以作为NFT
游戏中角色属性 ---> NFT的元数据
图像一般在ipfs中,属性放ipfs和 链上都可以。

二、demo 快速开始

源码hardhat-nft-fcc

(一) 部署合约


hh  deploy --network Sepolia --tags main

(二)etherscan

找到合约地址,复制

(三)testnet.openSea

黏贴 合约地址并搜索,打开可以看到一个项目的集合。
(testnet.openSea 可能要过几个小时才可以看到)

三、NFT合约实战

源码hardhat-nft-fcc

视频教程https://www.bilibili.com/video/BV1yT411g7jQ?p=12&vd_source=7594135856473fd97a107454ca1b920a

(一)入门Demo

详见源码文件 BasicNft.sol
极简的示范了一个ERC 721 NFT合约应该是什么样子。

1.BasicNft.sol 直接派生openzeppelin ERC721。
2.每个NFT 都有owner,都有一个合约内唯一的tokenID。
3.但是,还没有实现tokenURI,uri 一般为 ipfs链节,内容一般为如下json信息:

(二)进阶demo:基于IPFS的静态NFT

1)源码分析

详见源码文件RandomIpfsNft.sol
实现如下几点功能:

  1. 当用户铸造NFT时,随机生成不同品种的狗。
    (继承openzeppelin ERC721URIStorage.sol ,使用chainlinkVRF)
  2. 使用随机数的数字范围分布,来控制狗品种的稀有性。
  3. 铸造NFT需要收费。
  4. 合约所有人可以提现。(继承openzeppelin Ownable.sol)

参考协议https://eips.ethereum.org/EIPS/eip-721
image 的url 可以在链上,也可以在ipfs上,但是一般不会是http(IPFS gateway)

本例子中返回nft Metadata的json如下:

{
    "name": "PUG",
    "description": "An adorable PUG pup!",
    "image": "https://ipfs.io/ipfs/QmSsYRx3LpDAb1GZQm7zZ1AuHZjfbPkD6J7s9r41xu1mf8?filename=pug.png",
    "attributes": [
        {
            "trait_type": "cuteness",
            "value": 100
        }
    ]
}

2)部署脚本分析

1.00-deploy-mocks.js

用了chainlink,开发时就要mock。

2.03-deploy-random-ipfs-nft.js

2.1上传图像到IPFS-pinata

web3 存储方案:1.自己搭建 ipfs。2. pinata (ipfs云服务) .3 nft.storage

https://ipfs.tech/
https://www.pinata.cloud/
https://nft.storage/
NFT.storage
是一个专门的接口,用于在 IPFS 网络上存储 NFT,它会自动复制到 Filecoin 区块链。
js 库,npm安装,它先用元数据再ipfs上生成cid,然后再处理 filecoin。

pinata
鼓励你Pin数据到你的本地节点(需要自己来pin数据,这就是 缺点,对比数据存放在区块链上)。

比较pinatanft.storage

  • pinata是一个完整的服务,包括IPFS节点、API和用户界面,而nft.storage只提供IPFS服务和API,用户需要自己维护IPFS节点。
  • pinata提供了更多的文件上传限制,而nft.storage提供了更高的免费存储限额。
  • pinata提供了更多的API调用选项,如直接通过API管理Pin列表、获取文件的Pin状态等,而nft.storage的API更侧重于存储和检索。
  • nft.storage专注于NFT存储,提供了额外的工具来帮助验证NFT数据的完整性,而pinata不专注于NFT,但可以用于存储任何类型的文件。

在选择IPFS服务时,你需要考虑成本、可靠性、安全性和需求的特定功能。如果你是在做NFT项目,可能更倾向于选择nft.storage,因为它专门针对NFT优化。如果你需要更多的API功能或更高的文件上传限制,pinata可能是更好的选择。

文件可以手工上传,也可以如下用程序上传:

a.API Keys 新建key: APIKey、API Secret、JWT
b.查看docs,找到Nodejs Sdk
c.用法找到pinFileToIPFS、pinJSONToIPFS(分别用来传图片和tokenURI metaData)。
d.增加metaData(自定义属性attributes ).
通常attributes 这些数据也要放到链上,这样合约里才能访问到,完成游戏逻辑。
e.pin data To IPFS

hh deploys -tags randomipfs,mocks

IPFS DeskTop 能import cid,把 Pinata的资源 pin到本地节点。

IPFS 同个文件多次上传,不会出现重复文件,因为cid一样。

2.2部署合约

如果是测试网部署,那就在testnet.openSea上能看到了。
打开testnets.opensea.io,搜索部署后的合约即可(可能要过几个小时)。

2.3(可选)钱包查看NFT
需要导入这个nft合约 和 tokenid。

3)单测编写

randomIpfs.test.js 略

4)思维扩展

GameFi项目是怎么把游戏的数据和NFT市场(openSea)相互结合的?NFT被交易 游戏里卡牌的归属怎么改变?
例如把卡牌游戏里的卡片 做成NFT,然后当NFT 被交易后,
此时游戏后端websocket监听 ERC-731 里的Transfer事件,即可修改卡牌的归属。

(三)高级demo-动态NFTs

1)源码分析

详见源码文件 DynamicSvgNft.sol

Dynamic SVG NFT,它的图像会根据一些参数而改变

优势: svg数据存放在链上,不需要像ipfs(pinata)那样,还需要自己pin数据。

缺点: 花费更多。

Bases64 编码 svg图像 (这一步通常在链下操作,省gas费用)

data:image/svg+xml;base64,BASE64CONTENT 这串放到浏览器就可以直接解码base64,显示图片,也就是可以把这一串保存倒区块链上。abi.encodePacked()

2) 前景分析

静态NFT 一般只用来艺术创作,证明归属。
动态NFT,提供了很多的可能性。

动态 NFT 的具体用例: 游戏 NFT 的动态更新、票务 NFT 化、交易所仓位、可组合艺术收藏等。

参考如下分析:
https://zhuanlan.zhihu.com/p/643045612
https://zhuanlan.zhihu.com/p/610253213

版权声明:
作者:dingding
链接:https://www.techfm.club/p/128190.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>