# 【NFT实现原理】当你点开Opensea上的一个NFT,这背后发生了什么? **Published by:** [熊猫撸白.nft](https://paragraph.com/@fomoplz/) **Published on:** 2023-01-12 **URL:** https://paragraph.com/@fomoplz/nft-opensea-nft ## Content Web3是一场以技术驱动的革命,我认为了解一些基本的技术原理对于每一个参与者都很有必要。相信大部分都知道NFT是非同质化代币,但是对于NFT如何实现非同质化以及如何展现出各种不同属性的可能不太了解。本文试图以点开一个Opensea的nft,背后发生的一系列过程,带大家了解NFT到底是如何实现的。 流程简图 整个过程可以简化成下图所示,接下来我们会一一进行讲解发送http请求 首先,当我们点击一个nft集合时(这里以无聊猿为例),我们注意观察一下上方的网络链接, 在collection的下一级boredapeyachtclub 就是用于区分具体的某个集合。但是,当我们点击合集中的某个nft之后,我们再来观察一下上方的网络链接就变成了如下所示,我们主要关注的是:合约地址:0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13dnft的编号:4873当浏览器得到这两个参数之后,就携带参数向服务端发起一个http请求 调用合约获取tokenURI 首先介绍一下什么是智能合约,所谓的智能合约就是运行在以太坊上的一个程序,它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。 为了便于开发人员对合约进行扩展以及实现定制化的功能,以太坊基金会便为合约制定了标准的规范,比如常见的有ERC20,ERC721,ERC1155等。NFT最常见的标准就是ERC721,其规范方法如下:// 查询NFT中某个owner拥有的数量 balanceOf(owner) // 查询NFT中某个编号属于的是哪个人,例如查询某个编号的猴属于哪个owner ownerOf(tokenId) // 返回NFT的名字 name() // 返回NFT的符号 symbol() // NFT总发行量 totalSupply() // 返回某个NFT的URI,这个URI就是这个NFT的一切描述信息 tokenURI(tokenId) // 按index序号返回该owner的所有持有NFT的编号 tokenOfOwnerByIndex(owner, index) // 按index序号返回NFT的编号 tokenByIndex(index) // 允许to这个地址可以转移他的tokenId编号的NFT(攸关你的NFT安全!) approve(to, tokenId) // 查询tokenId编号的NFT授权给了谁(查询谁可以转走你的NFT!) getApproved(tokenId) // 授权或者取消授权operator这个地址转移你这一Collection下的所有NFT(攸关你的NFT安全!) setApprovalForAll(operator, approved) // 查询某个operator是否有权转移某个owner的这一Collection中的所有NFT(查询某个地址是否可以转走你这个Collection的所有NFT!) isApprovedForAll(owner, operator) // 将from这个地址的tokenID编号的NFT转给to这个地址(需要授权才行) transferFrom(from, to, tokenId) 当后台收到请求之后,就会将参数4873传入函数tokenURI(tokenId),并执行该方法,所获得的返回值是这个样子的:ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/4873 这里也教一下大家如何自己去查看nft的tokenURI,首先点击opensea上无聊猿的合约地址。接着会跳转到Etherscan,接着切换到点击"Contract"切换到合约页面,选择"Read Contract"。找到tokenURI方法,输入tokenId即可获得URI。元数据(Metadata) 你可能会对上面这个像网址一样的tokenURI感到奇怪,你可以在浏览器中输入以下网址:https://ipfs.io/ipfs/QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/4873 就可以看到如下的结果,这个链接指向的就是存储nft元数据的地址所谓的元数据存储了nft所有的信息,包括背景,衣服,眼睛,帽子等属性,就是你在opensea上看到的这些信息。除了上面这些属性之外,元数据中还包含了每一个nft展示的图片的存储地址,这只4873无聊猿的图片地址如下,输入到浏览器中即可查看。元数据的存储方式 常见的元数据存储方式有去中心化存储和中心化存储 去中心化存储 去中心化存储是将元数据存储到分布式文件系统中,比如IPFS(InterPlanetary File System,星际文件系统),去中心化存储可以保证nft的元数据不被篡改,更符合加密精神,而且存储成本更低,是现在主流的存储方式,无聊猿的元数据就是存储在ipfs中。 中心化存储 中心化存储是指将元数据存储在中心化服务器上,比如之前大火的链游Axie的tokenURI就是指向一个中心化的网站地址。这种存储方式长期看将面临两个主要风险。一是数据可以被网站的所有者所篡改,二是网站有可能在某一天失去维护导致链接无法访问。所以NFT的非同质化主要体现在每个nft所保存的元数据的不同,这就要求元数据是无法被篡改的,特别是头像类nft,元数据中保存的图片地址直接决定了其价值的高低。 前端渲染服务端响应的数据 最后根据官方api文档描述,后端会返回如下的数据,当前端拿到这些数据之后就会将数据渲染成一个比较好看的样式,比如展示图片,展示属性值,展示稀有度等等。更多api信息可以点击文档链接:https://docs.opensea.io/reference/asset-object总结: 以上就是关于nft背后的技术原理的简单介绍,如果你想了解更多关于nft的知识,欢迎添加下方微信,备注”撸白“,加入免费交流群Subscribe ## Publication Information - [熊猫撸白.nft](https://paragraph.com/@fomoplz/): Publication homepage - [All Posts](https://paragraph.com/@fomoplz/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@fomoplz): Subscribe to updates - [Twitter](https://twitter.com/dajingou1): Follow on Twitter