# 【NFT实现原理】当你点开Opensea上的一个NFT，这背后发生了什么？

By [熊猫撸白.nft](https://paragraph.com/@fomoplz) · 2023-01-12

---

> _Web3是一场以技术驱动的革命，我认为了解一些基本的技术原理对于每一个参与者都很有必要。_

相信大部分都知道NFT是非同质化代币，但是对于NFT如何实现非同质化以及如何展现出各种不同属性的可能不太了解。本文试图以点开一个Opensea的nft，背后发生的一系列过程，带大家了解NFT到底是如何实现的。

**流程简图**

整个过程可以简化成下图所示,接下来我们会一一进行讲解

![](https://storage.googleapis.com/papyrus_images/127e72029e9f1e1c5be2bf09d6de3b31bd229b13490cc151a4983922f67d82ab.png)

**发送http请求**

首先，当我们点击一个nft集合时（这里以无聊猿为例),我们注意观察一下上方的网络链接, 在collection的下一级boredapeyachtclub 就是用于区分具体的某个集合。

![](https://storage.googleapis.com/papyrus_images/e2be48d5f8f2386139d77b71c17b8c0e4d61a3056abc2acdbf2b034671ea222a.png)

但是，当我们点击合集中的某个nft之后，我们再来观察一下上方的网络链接就变成了如下所示，我们主要关注的是：

1.  **合约地址：0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d**
    
2.  **nft的编号：4873**
    

当浏览器得到这两个参数之后，就携带参数向服务端发起一个http请求

![](https://storage.googleapis.com/papyrus_images/a6556eb4e864fd2e5f46c119f77cbacb3b38e86b69009419bf6e05596f13f78a.png)

 **调用合约获取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上无聊猿的合约地址。

![](https://storage.googleapis.com/papyrus_images/841e9012a48c195d3430ca141875715a2a86151253a2cda284c17ff9cb49daf5.png)

接着会跳转到Etherscan,接着切换到点击"Contract"切换到合约页面，选择"Read Contract"。

![](https://storage.googleapis.com/papyrus_images/3f540b0291509458f51057adc1301e931aa3299cbff340f9e26ec47c30538091.png)

找到tokenURI方法，输入tokenId即可获得URI。

![](https://storage.googleapis.com/papyrus_images/269f0c144a691a8de105bbf2855de681b39d8d3a93677ed8d139e00eb04c7ce3.png)

**元数据（Metadata）**

你可能会对上面这个像网址一样的tokenURI感到奇怪，你可以在浏览器中输入以下网址：

    https://ipfs.io/ipfs/QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/4873
    

就可以看到如下的结果，这个链接指向的就是存储**nft元数据**的地址

![](https://storage.googleapis.com/papyrus_images/3c63f17feaff60485544b6d32fa701c99018d2790e4b67ded81e8ddbf5dc1c1e.png)

所谓的元数据存储了nft所有的信息，包括背景，衣服，眼睛，帽子等属性，就是你在opensea上看到的这些信息。

![](https://storage.googleapis.com/papyrus_images/c6962618fca7a6d7a788ea87b582b33361182de4ea46eb5316eac809886aa002.png)

除了上面这些属性之外，元数据中还包含了每一个nft展示的图片的存储地址，这只4873无聊猿的图片地址如下,输入到浏览器中即可查看。

![](https://storage.googleapis.com/papyrus_images/4a78d131f4be77b869ad8641fd72e41e47674cd86d3728ecea32e3b6b5949fe9.png)

**元数据的存储方式**

常见的元数据存储方式有**去中心化存储和中心化存储**

**去中心化存储**

去中心化存储是将元数据存储到分布式文件系统中，比如**IPFS**（**InterPlanetary File System，星际文件系统）**，去中心化存储可以保证nft的元数据不被篡改，更符合加密精神，而且存储成本更低，是现在主流的存储方式，无聊猿的元数据就是存储在ipfs中。

**中心化存储**

中心化存储是指将元数据存储在中心化服务器上，比如之前大火的链游Axie的tokenURI就是指向一个中心化的网站地址。这种存储方式长期看将面临两个主要风险。一是数据可以被网站的所有者所篡改，二是网站有可能在某一天失去维护导致链接无法访问。

![](https://storage.googleapis.com/papyrus_images/b3b119962bb911d625f24df936561474de61ac03efeac159564ce5300ead76a8.png)

**所以NFT的非同质化主要体现在每个nft所保存的元数据的不同，这就要求元数据是无法被篡改的，特别是头像类nft，元数据中保存的图片地址直接决定了其价值的高低。**

**前端渲染服务端响应的数据**

最后根据官方api文档描述，后端会返回如下的数据，当前端拿到这些数据之后就会将数据渲染成一个比较好看的样式，比如展示图片，展示属性值，展示稀有度等等。更多api信息可以点击文档链接：https:_//docs.opensea.io/reference/asset-object_

![](https://storage.googleapis.com/papyrus_images/46ef951506f054055e320874165711853f7b04302ac4b64058b25e90ef330cff.png)

**总结：**

以上就是关于nft背后的技术原理的简单介绍，如果你想了解更多关于nft的知识，欢迎添加下方微信，备注”撸白“，加入免费交流群

![](https://storage.googleapis.com/papyrus_images/1fdcad0276cec05abee3585439ad4bbdfe3f37a26991bd585ba321ec61cded82.png)

[Subscribe](null)

---

*Originally published on [熊猫撸白.nft](https://paragraph.com/@fomoplz/nft-opensea-nft)*
