一文带你了解NFT的底层技术有哪些

写在前面

不知道从什么时候起,NFT突然火了。你会时不时的看到一个新闻说某个数字藏品的NFT买了几十万美金,似乎NFT是财富密码一样。

如果你关注这个行业,你肯定挺听过无聊猿游艇俱乐部(BAYC),BAYC在opensea上有大概10000只NFT,图像是各种各样的猿。比如下面这种

关于NFT的各种咨询的文章到处都是,不过涉及底层技术的却比较少,本文就带你了解下是哪些技术支撑着这个全球交易规模数百亿美元的产业。(根据第三方数据机构 nonfungible 统计,2021 年 NFT
交易规模达到 140 亿美元)

不过要强调的是,我不会就某个技术细节详细展开,比如讲到区块链,不会详细到给你讲共识算法,这篇文章只是抛砖引玉,有兴趣的可以就某个知识点自行查阅。

相关的底层技术

NFT是 Non-Fungible Token 的缩写,意为非同质化通证(或代币)。这里有个概念叫非同质化,说白了就是不一样的意思。我们平时使用的货币,比如人民币和美元,或者是一些数字货币比如BTC等都是同质化的,他们可以交换,可以被替换,因为我们只关心货币的面值,而不是钞票上的唯一编码。

NFT的非同质化,意思是说每个NFT都是独一无二的,被加密的,不可替换的。而且还有一个最大的特点是不可分割。它的特点有点像我们平时生活中的房产证、合同,票据之类的东西。

NFT在区块链技术栈的位置大概是这样的:

最底层当然还是区块链,这一层主要是提供基础设施,比如共识算法,P2P网络等。这个链可以是公链,也可以是联盟链,甚至是私链。

公链领域当然首先要提以太坊,以太坊是NFT最早的公链。但是由于后来以太坊主网的拥堵,后来又出现了一些别的公链,比如flow,SOLANA等。关于以太坊拥堵的前后背景,如果想了解可以看下面这篇文章:

白话ETH2.0:你要了解的都在这里

像我们前面提到的BAYC,就是在以太坊主网发行的NFT。

区块链本身是一个去中心化的分布式账本,其使用的哈希加密算法是具有原像抗性和次原像抗性,我们在区块链上发行的NFT本身就是在链上确认的交易,那么交易一旦确认形成区块加入主链,那这个NFT就是不能被恶意篡改的,它具有唯一的标识。

再往上看,是虚拟机EVM,EVM(ETHereum Virtual Machine)是「以太坊虚拟机」的缩写,EVM的存在是为了能让我们编写的智能合约代码,能够被解析并运行在公链环境中。关于EVM里面的一些细节,可以看我以前写的一篇文章:

以太坊虚拟机EVM究竟是个啥

下一个要说的技术点是智能合约。基于区块链的智能合约使用图灵完备的脚本语言来实现复杂功能的兼容,并通过依靠共识算法来进行执行,以保证一致性。智能合约让不依赖第三方信用中介的公平交易成为可能,可以实现跨行业、跨领域、跨生态的价值交互。

NFT的本质其实是由智能合约创建、维护、执行的非同质化数字资产通证。要创建NFT,首先你要有一个智能合约,这个智能合约在以太坊主链上会有一个唯一的地址,比如前面提到的BAYC,它智能合约的地址是

0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D

我们可以在以太坊的浏览器中查看这个地址:

然后基于这个合约,我们可以创建NFTs,这里加s表示可以创建多个不同的NFT,比如BAYC就有10000个不同的猿,每个猿的区别是他们的元数据(metadata)不同,所以才会展示不同的图像效果。

有了智能合约后,如果要创建NFT,通常我们遵循某个协议,现自常用的协议是ERC721,ERC1155和ERC998三种。使用不同的协议创建NFT,一般是出于不同的使用场景,比如ERC1155的交易速度比ERC721高等,我们只需要关注其中一种协议创建nft的方法,其他的也不难。

所以这里我就以ERC721为例,简单说明下创建NFT的过程。下面的内容会展示小部分代码,这些代码的语法是solidity,这是在以太坊编写智能合约的一个语言。不会这个语言也没关系,大概能看懂什么意思就可以了。

ERC721协议定义了一组接口方法和事件,你写一个智能合约只要实现了这些方法和事件,它就是一个NFT的智能合约。

方法,

    function balanceOf(address _owner) external view returns (uint256);function ownerOf(uint256 _tokenId) external view returns (address);function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;function transferFrom(address _from, address _to, uint256 _tokenId) external payable;function approve(address _approved, uint256 _tokenId) external payable;function setApprovalForAll(address _operator, bool _approved) external;function getApproved(uint256 _tokenId) external view returns (address);function isApprovedForAll(address _owner, address _operator) external view returns (bool);

随便挑几个方法解释下,

ownerOf函数,参数是_tokenId,它返回该token的持有者地址

approve函数,可以授权给另外一个人转移代币的权利

事件,

    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

上面这些是标准接口,还有一些扩展接口,根据需要决定是否实现。比如还有 ERC721Metadata 接口,这个是元数据接口,前面我们也提到了元数据。

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface ERC721Metadata /* is ERC721 */ {/// @notice A descriptive name for a collection of NFTs in this contractfunction name() external view returns (string _name);/// @notice An abbreviated name for NFTs in this contractfunction symbol() external view returns (string _symbol);/// @notice A distinct Uniform Resource Identifier (URI) for a given asset./// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC///  3986. The URI may point to a JSON file that conforms to the "ERC721///  Metadata JSON Schema".function tokenURI(uint256 _tokenId) external view returns (string);
}

还有枚举相关的接口,

/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x780e9d63.
interface ERC721Enumerable /* is ERC721 */ {/// @notice Count NFTs tracked by this contract/// @return A count of valid NFTs tracked by this contract, where each one of///  them has an assigned and queryable owner not equal to the zero addressfunction totalSupply() external view returns (uint256);/// @notice Enumerate valid NFTs/// @dev Throws if `_index` >= `totalSupply()`./// @param _index A counter less than `totalSupply()`/// @return The token identifier for the `_index`th NFT,///  (sort order not specified)function tokenByIndex(uint256 _index) external view returns (uint256);/// @notice Enumerate NFTs assigned to an owner/// @dev Throws if `_index` >= `balanceOf(_owner)` or if///  `_owner` is the zero address, representing invalid NFTs./// @param _owner An address where we are interested in NFTs owned by them/// @param _index A counter less than `balanceOf(_owner)`/// @return The token identifier for the `_index`th NFT assigned to `_owner`,///   (sort order not specified)function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

下面这个链接,你可以看到一个实现了ERC721的例子:

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

这里例子属于OpenZeppelin的一部分,Openzeppelin是一个开源的智能合约库,我们可以很方便的通过直接继承它里面的一些实现好的类来写一个自己的NFT,比如:

 pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";import "@openzeppelin/contracts/utils/Counters.sol";import "@openzeppelin/contracts/access/Ownable.sol";import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";contract MyNFT is ERC721URIStorage, Ownable {using Counters for Counters.Counter;Counters.Counter private _tokenIds;constructor() ERC721("MyNFT", "NFT") {}function mintNFT(address recipient, string memory tokenURI)public onlyOwnerreturns (uint256){_tokenIds.increment();uint256 newItemId = _tokenIds.current();_mint(recipient, newItemId);_setTokenURI(newItemId, tokenURI);return newItemId;}}

这个代码很短,它包含一个计数器(Counter)、一个构造函数(constructor),和一个函数(mintNFT)。是的,这些代码我们就实现了一个简单的NFT。这要得益于ERC721URIStorage,这个的OpenZeppelin合约类,它已经帮我们实现了前面提到的协议接口中的大部分方法。

总结

目前全球NFT的主要应用还是在数字藏品领域,前面提到的BAYC就属于这个领域。我个人觉得这个领域泡沫比较严重,存在大量炒作投机的行为。未来NFT想要得到快速的发展还是需要落地一些真正解决社会问题的场景,比如一些工具类的应用,个人信息的认证等。否则,最终的命运很可能像当年的ico一样昙花一现。


参考:

  • https://ethereum.org/en/developers/docs/standards/tokens/erc-721/
  • https://eips.ethereum.org/EIPS/eip-721

一文带你了解NFT的底层技术有哪些相关推荐

  1. 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

    前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...

  2. 什么是5G NR技术?一文带你深入了解5G NR技术

    什么是5G NR技术?一文带你深入了解5G NR技术 工信部IMT-2020(5G)推进组正式发布了5G第三阶段研发试验规范,5G第三阶段研发试验已启动.该研发试验基于3GPP 5G标准,构建统一环境 ...

  3. 网关是什么,一文带你快速入门腾讯技术工程

    今天来开门见山地讲讲网关是一个怎么样的组件,网关在做什么事情.网关这个词其实到处都在用,它可以工作在硬件层面,也可以工作在网络层,还可以工作在应用层. 网关快速入门 网关在做什么? 我们今天讲的实际上 ...

  4. 一文带你领略虚拟化领域顶级技术会议KVM Forum 2018

    KVM Forum是由Linux基金会组织的高端技术论坛会议,主要为社区各个维护者,开发人员,和用户提供一个讨论Linux虚拟化技术发展趋势以及挑战的交流场所.参会人员都集中在KVM虚拟化相关领域,是 ...

  5. 一文带您了解软件多租户技术架构

    1. 多租户技术概述 随着近几年云计算技术的不断发展和成熟.云计算多租户技术在 SaaS 服务领域获得得快速的发展和广泛的应用.基于多租户技术的业务平台首先要保证不同租户业务的隔离,业务隔离主要包括下 ...

  6. 这9本书,带你了解 ChatGPT 的底层逻辑(文末赠书)

    自2022年11月30日发布以来,ChatGPT已经真正意义上地火爆全球:它在不到40天内就拥有了1000万用户,而Instagram足足用了355天:最近它的日活已经达到1000万,这意味着其用户已 ...

  7. 一文带你了解Java Agent

    转载自  一文带你了解Java Agent Java Agent这个技术,对于大多数同学来说都比较陌生,像个黑盒子.但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现 ...

  8. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  9. 一文带你搞懂从动态代理实现到Spring AOP

    摘要:本文主要讲了Spring Aop动态代理实现的两种方式. 1. Spring AOP Spring是一个轻型容器,Spring整个系列的最最核心的概念当属IoC.AOP.可见AOP是Spring ...

最新文章

  1. http://blog.csdn.net/xingfuzhijianxia/article/details/6433918
  2. Spring Data 发布更改版本管理方案之后的第一个版本:2020.0.0
  3. Spring.net 模块组成
  4. php curl 传输大文件,空白目录 · php下载大文件curl · 看云
  5. 彩票假设 (Lottery Ticket Hypothesis) 在CV、NLP和OOD领域的应用
  6. 阿里影业“灯塔平台”今日正式启动,阿里影视云解决方案强势推出
  7. FPS游戏自动枪械识别+压枪(以PUBG为例)
  8. cocos2d-x 2.2 CocoStudio动画和界面编辑器按钮控制以及场景编辑器使用
  9. python在mac模拟鼠标点击_python模拟鼠标点击和键盘输入的操作
  10. 【求职】江苏省 2020 年大学生核心就业能力培训笔记
  11. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放
  12. vue 项目中 自动生成 二维码
  13. 可扩展标记语言XML(淅淅沥沥的小雨)
  14. linux qt中文输入法,解决 Ubuntu 14.04 下 Qt5 中文显示和中文输入法问题
  15. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架
  16. u盘启动 联想一体机_联想一体机如何设置U盘启动
  17. opnet学习001,入门的好例子
  18. 超重车辆高速动态称重系统设计方案
  19. Cocos Play提升3倍转化率:手游微端革命
  20. WiFi(Wireless Fidelity)基础(八)

热门文章

  1. js提取img标签url
  2. 1-6 类、属性和方法(一)
  3. MP3,AAC,AC3技术比较
  4. 机器人建模、计算正解、逆解
  5. Linux下生产者消费者问题的C语言实现
  6. 收藏 - android
  7. win7计算机u盘不显示盘符,Win7电脑插入U盘不显示盘符?电脑盘符不正常显示解决技巧...
  8. win10系统如何开启高级设置
  9. wordpress主题基本文件配置
  10. 如何检测域名被微信屏蔽或拦截了