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

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

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

流程简图

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

发送http请求

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

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

  1. 合约地址:0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d

  2. nft的编号: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无聊猿的图片地址如下,输入到浏览器中即可查看。

元数据的存储方式

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

去中心化存储

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

中心化存储

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

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

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

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

总结:

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

Subscribe to 熊猫撸白.nft
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.