区块链全栈以太坊(十二)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 快速开始
(一) 部署合约
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
实现如下几点功能:
- 当用户铸造NFT时,随机生成不同品种的狗。
(继承openzeppelin ERC721URIStorage.sol ,使用chainlinkVRF) - 使用随机数的数字范围分布,来控制狗品种的稀有性。
- 铸造NFT需要收费。
- 合约所有人可以提现。(继承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数据,这就是 缺点,对比数据存放在区块链上)。
比较
pinata
和nft.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
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论