本白皮书主要叙述关于一个 nft 钱包 / 交易平台的技术实现,从现在主流的数据和交易平台出发,探索一种更高效更易用的数据分析和交易平台。
2021 年可以称之为 NFT 元年,不管是年初的 nft 代币的行情,还是年中到年尾的一系列相关 nft 产品更新着我们的视野,大到艺术家的某个作品,小到一段文字,以及包括 opensea 平台的火热,都将 nft 这一新鲜事物推到大众的视角之中。加之近一段时期的元宇宙的火热,以及 gamefi 的场景,相对这些来说,nft 的门槛要更低一点,再加上像周杰伦、林俊杰这样的热门 IP 的引导,越来越多的普通消费者得以进入此领域,从中也不乏很多对此不解的人,还是保持着怀疑的态度,“为何要花钱买一个虚拟的收藏品,价值在哪里”,以及这样的东西可以有什么样的应用,这都值得我们深层次的思考。
目前 web3 的概念在不断地被激发被讨论,元宇宙、NFT、GameFi 等的出现开始满足了人们对 web3 的想象,同时与人的日常生活开始融合。什么是这些的讨论基础,目前来说应该是 NFT。
在传统游戏里,更多的是中心化的数字资产,并且只有是当登录以后,才能看到相关内容,是封闭的。而 Web3 游戏,资产直接链上可以查阅相关内容(可能是像 Arbitrum 的 L2 方案,也可能是 Solana 更高效的网络),同时,GameFi 也可能像传统游戏厂商一样跑路,如何在生态发展上分析项目,以及更好地保护个人数字资产,也是数据分析探索的方向。
目前 NFT 的发展,相对比较早期,尚且缺乏各类基础设施。同时以太坊和 Solana 这样的第一层解决方案不断地升级,应用方面,像 OpenSea、Sorare、Axie Infinity 这样实际上都是建立在去中心化基础设施的中心化公司,利用去中心化基础设施创造更多价值。
nft 产业链由基础设施、项目创作和衍生应用这些组成,用区块律动的话来说,nft 是以太坊上的二次元,独一无二的体现。虽然现在以太坊链目前占主流,但其他链也在不断发展中,在之后的数据分析板块可以感受到。NFT 领域在经过几年的发展当中,通过市场刺激出了更多的玩法,一方面是 CryptoPunk 不断刷新系列美元交易最高纪录,以及国内外很多公司在发行相关的艺术品,包括腾讯的幻核之类的,另一方面在技术上,为面对每笔交易数等的限制和 gas 的情况,相继发展出 L2 的 NFT、以及跨链 NFT 等场景。
基础设施方面,nft 相比其他的虚拟货币方向还算比较早期,交易平台比较有限,实际玩法上更多地偏社交和游戏,据 nftgo 发布数据显示,目前 NFT 市值大约在 170 亿美元,约占加密产业总市值的 1 %,随着越来越多的公司利用现有 IP 发行相关 Token,这一行业仍将持续繁荣,因此相关数据分析和交易的需求不断攀升。
在数据分析方面,目前只有 nftscan 以及 nftgo 做的还算比较完善,但实际缺乏像 etherscan 这样现象级垄断类产品,投资者更多地是在一种小众群体中交流相关的内容,比如说像 Twitter、discord 这样的加密社区,从长远来看,去中心化和自由是加密社区的走向,同时市场也在不断地发展,涌现出大量相关的应用。
在交易平台领域,目前 opensea 是主流平台,但并不意味着没有竞争对手的挑战,并不意味着它是完美的,按照 ZellaNews 的报道,Opensea 在以太坊和 Polygon 上的交易量大量放缓,而且由于其主要是由智能合约的实现,势必在交易上会有一些限制,且不支持以物易物的方式,目前也有其他的挑战者不断出现,包括像 LooksRate 这样的社区,实现了独特的奖励机制,包括质押奖励、流动性提供奖励和交易奖励,其本质上是一种在 NFT 上的流动性挖矿实践。
同时 NFT 的基本价值与传统代币不同,包含了所有权、稀缺性、美学、社区和效用等,在某个时期,可能会被高估,但从长远来看,依然是蓬勃发展的,每个项目不仅是要有优秀的想法,更需要完善的社区,特别的激励机制,独特的价值。如何更好地展现这些方面,是一个数据分析平台需要思考的问题。
nft 其实发展历史上并没有很长,最早可以追朔到加密猫时期,在昙花一现之后,进入了 18,19 两年的技术发展期,在此期间,制定了相关标准,通过各种方案也在不断提升 TPS,而这技术背景实际上是和以太坊这一智能合约执行平台是分不开的,因此有很多内容会跟智能合约息息相关。
在 以太坊Ethereum 生态系统中, 应用二进制接口Application Binary Interface(ABI) 是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。 数据会根据其类型按照这份手册中说明的方法进行编码。这种编码并不是可以自描述的,而是需要一种特定的概要(schema)来进行解码。
假定合约函数的接口都是强类型的,且在编译时是可知的和静态的;不提供自我检查机制。假定在编译时,所有合约要调用的其他合约接口定义都是可用的。
简单来说就是以太坊的调用合约时的接口说明。
技术上,核心是 nft,Non Fungible Token,非同质化代币,这种虽然说是一种代币,但与常见的 Token 有所不同,遵循的一般是 ERC721 标准、ERC1155 标准,以下详细说明一下这两个标准:
EIP 原文地址在:https://eips.ethereum.org/EIPS/eip-721
如何理解非同质,那么意味着独一无二,就像是 map 结构,没有重复的因素。且是不可分割的,最小单位是1
Every ERC-721 compliant contract must implement the ERC721
and ERC165
interfaces
ERC721 标准如下:
pragma solidity ^0.4.20;
interface ERC721 /* is ERC165 */ {
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
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);
}
interface ERC165 {
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
interface ERC721TokenReceiver {
function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}
interface ERC721Metadata /* is ERC721 */ {
function name() external view returns (string _name);
function symbol() external view returns (string _symbol);
function tokenURI(uint256 _tokenId) external view returns (string);
}
interface ERC721Enumerable /* is ERC721 */ {
function totalSupply() external view returns (uint256);
function tokenByIndex(uint256 _index) external view returns (uint256);
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}
ERC721标准同时要求必须符合ERC165标准 ,其接口如下:
interface ERC165 {
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
ERC165同样是一个合约标准,这个标准要求合约提供其实现了哪些接口,这样再与合约进行交互的时候可以先调用此接口进行查询。
可选实现接口:ERC721Metadata:
ERC721Metadata 接口用于提供合约的元数据:name , symbol 及 URI(NFT所对应的资源)。
其接口定义如下:
interface ERC721Metadata /* is ERC721 */ {
function name() external pure returns (string _name);
function symbol() external pure returns (string _symbol);
function tokenURI(uint256 _tokenId) external view returns (string);
}
可选实现接口:ERC721Enumerable
ERC721Enumerable的主要目的是提高合约中NTF的可访问性,其接口定义如下:
interface ERC721Enumerable /* is ERC721 */ {
function totalSupply() external view returns (uint256);
function tokenByIndex(uint256 _index) external view returns (uint256);
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}
openzeppelin 官方示例:
我们可以在这个标准里注意到以下内容:
This event emits when NFTs are created (`from` == 0) and destroyed
(`to` == 0).
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
额外内容:
ERC721A:
ERC 1155 的目标就是解决这个问题,可以在一个合约中定义多种 NFT,也可以为一种 NFT 定义多个数量,后续我们再详细展开 ERC 1155。
NFT Implementations and Other Projects
NFT 数据分析类
NFT如何成为Web3社交的基础?