链中自有黄金屋–NFT浅析
前言
2021年3月11日,佳士得历史上首次拍卖以 NFT 形式展现的纯数字艺术品,这幅底价100美元的作品最终以6934.6万美元成交,一举成为在世艺术家成交作品第三高价。
这一事件,将越来越多的目光吸引向 NFT 的世界。对于区块链行业外的人士而言,NFT 还是一个新鲜事物。但实际上,NFT 很早就已经出现了——即 在2017 年末以太坊上兴起的谜恋猫游戏。“谜恋猫是世界首款区块链游戏。“区块链”是支持类似比特币这样的加密货币的运作技术基础。尽管谜恋猫不是数字货币,但它也能提供同样的安全保障:每一只谜恋猫都是独一无二的,而且100%归您所有。它无法被复制、拿走、或销毁。”当时这款游戏推出后便风靡一时,一度导致了以太坊网络的堵塞。
不过相信大多数人还是对NFT停留在应用上的认知,今天我们来尝试从新的角度来认识它。
什么是NFT
NFT 是 Non-Fungible Token 的缩写,中文称为「非同质化代币」,通常是指开发者在以太坊平台上根据 ERC721 标准/协议所发行的代币。
既然NFT被称作「非同质化代币」,那么相应的肯定有「同质化代币」,下图是二者一个形象的举例。
同质化代币
同质化代币的典型代表就是以 ERC20 标准/协议发行的 token。 在 ERC20 标准/协议我们中可以知道,ERC20 的 token 是指定小数位数的,也就是 token 可以任意分割,token 与 token 之间是等价的。简单来说同质化代币就是一种能够相互替换、具有统一性、可被拆分的代币。就像美元之间可以进行交换,即使序号不同,价值却不会有任何不同。
非同质化代币
非同质化代币的典型代表就是以 ERC721 标准/协议发行的 token。而在 ERC721标准/协议 中则定义的是一种不可分割的 token ,每个 token 都是独一无二的,我们可以追踪每个 token 的转移和其价值的变动的。可以认识到非同质化代币就是由于包含了记录在其智能合约中的识别信息使得每种代币都具有独一无二的特性,因此不能被另一种代币直接取代。
NFT铸造
说了NFT的独特,那我们再来谈谈它是怎么被铸造的,基于什么逻辑实现它的独一无二。
以下非同质化代币的铸造分析,原始代码参考以太坊ERC721 提案。
首先非同质化代币的铸造会执行
_safeMint
函数,该函数存在两个参数,他们分别的作用是:
-
to
:新铸的代币接受地址 -
tokenId
:新铸代币的 id 序列
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");//接收以上两个参数加上空字符凑齐3个参数传入同名 _safeMint 函数(重载)
}
可以看到接下来调用三参数同名 _safeMint
函数,
function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
//接收_safeMint 函数传参
_mint(to, tokenId);//将传参 to 和 tokenId 传入 _mint 函数
require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");//调用_checkOnERC721Received函数来检测函数接口合法性
}
最后调用 _mint
函数进行铸币:
function _mint(address to, uint256 tokenId) internal virtual {
//接收来自_safeMint 函数的传参
require(to != address(