hi,我是Xoen,一个区块链小白,我对WEB3世界充满了好奇,就像达芬奇一样。
进入币圈后,无论是谁,多多少少都会持有一些小图片对吧,这些小图片就是NFT,也就是非同质化代币,为什么叫非同质化呢,就是它没办法像同质化代币,可以把1个拆成10个0.1。随着接触NFT越来越久,我就越来越好奇它的原理。
也正是因为有一定的标准,OpenSea才能正确的显示我们NFT图片,以及NFT的属性。我们先来看个例子,比如说无聊猴:

可以看出,一个NFT的展示分为几个部分,一是图片(其实它也可以是视频)二是属性(Properties),三是详细信息(Details)。其实这几部分数据也可以称作为NFT的元数据,它也是有一定标准,有兴趣的可以点击这里了解详细。
点击Details下的TokenID后面的数字,一般会跳转到一个链接,这个链接就是该NFT的tokenURI,它指向的就是NFT元数据的存储地址。OpenSea会根据这个地址拿到元数据,然后在页面上呈现。
我们看无聊猴5465和7029的URI:


你可以发现除了后面tokenId之外,其他都一样。所以一般NFT他的URI都是由一个基础的前缀和tokenId来组成一个唯一的tokenURI。
因此我们发现,其实对于一个NFT,大部分数据都在链下,而链上只是存储了一个唯一ID,再通过这个tokenId组成一个链接来索引到NFT的元数据。而NFT的图片和元数据其实是放在中心化托管服务器上,也有的是放在ipfs上。当然也有例外的,比如说,CyberBrokers据说是fully on chain的,这个等有空了好好研究一下。分析完NFT原理了,那我们就再来看看大名鼎鼎的ERC721标准合约里到底有哪些内容呢。
官方链接在这里:
https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721
截图里的代码只是包含了其中一部分内容。
IERC721是标准接口,如果不使用官方的ERC721,也可以自己实现:

再看看官方的ERC721实现:





个人总结:ERC721包含了所有基础的功能,拥有者可以发送tokenId给其他人,但是其他人要转移别人的tokenId,需要通过approve和setApprovalForAll获得权限之后才能转移他人tokenId。看完了标准代码,我们再看看,如果我们自己要发一个NFT要怎么做呢?
找一个示例,来看看无聊猴的合约代码(删除了一些无关代码)其实还是很简单的:

在OpenZeppelin合约库里其实还有很多针对ERC721的扩展合约,大家有兴趣可以自己去github上看看。一定能收获不少。还有就是不同的项目,可能都集成了ERC721,但是还有一些自己的实现,大家也可以通过OpenSea来找到他们的合约代码看看。
今天又是大太阳天,希望大家都能买到喜欢的NFT,并赚到钱~~~~~
