剖析ERC20,ERC721和ERC1155标准。ERC20将地址映射到金额,ERC721将唯一的ID映射到所有者,而ERC1155则将ID嵌套映射到所有者和金额。
2.2.1 可组合性
由ERC-998标准领导的Composables提供了一个模板,NFT可以通过该模板拥有非同质化资产和同质化资产。目前只有几个可组合的NFT在主网络上,但是我们认为有很多令人兴奋的机会来使用它们!
2.3 非Ethereum标准
尽管以太坊是目前大多数行动的发生地,但其他链条上还出现了其他几种NFT标准。由Mythical Games团队首创的 DGoods致力于从EOS开始提供功能丰富的跨链标准。Cosmos项目还正在开发一个NFT模块,该模块可以作为 Cosmos SDK.的一部分加以利用。
https://mythicalgames.com/
https://dgoods.org/
非同质化代币的元数据
如上所述,ownerOf方法提供了一种查询NFT所有者的方法。例如,通过在CryptoKitties智能合约上查询ownerOf(1500718),我们可以看到CryptoKitty在#1500718写入时是一个地址为0x6452的帐户...这可以通过在OpenSea或 CryptoKitties.co进行验证。
但是,OpenSea和CryptoKitties如何知道CryptoKitty#1500718是什么样的呢?那它的名称和独特属性又如何呢?
这就是元数据的作用所在。元数据为一个特定的代币ID提供描述性信息。对于CryptoKittty,元数据是猫的名字、猫的图片、描述和任何额外的特征(traits)(对于CryptoKitties,称为“属性”)。如门票之类的应用,元数据除了名称和描述外,还可能包括事件的日期和票据的类型。上述猫的元数据可能看起来像这样:
{
"name": "Duke Khanplum"
"image": "https://storage.googleapis.com/ck-kitty-image/0x06012c8cf97bead5deae237070f9587f8e7a266d/1500718.png"
"description": "Heya. My name is Duke Khanplum, but I've always believed I'm King Henry VIII reincarnated.
}
问题在于如何和在何处存储这些数据,以便NFT的应用程序可以访问它。
3.1 链上与链下
对于开发者们来说,第一个决定是在链上或链下表示元数据。也就是说,你是要将元数据直接写入该代币智能合约中,还是单独托管它。
3.1.1 链上元数据
在链上表示元数据的好处是:1)元数据与代币一起永久存在,在任何应用的生命周期结束后仍会存在;2)元数据可以根据链上逻辑进行更改。如果资产意在拥有远超其最初创造的长期价值,那么第1点很重要。例如,一件数字艺术作品被认为可以保存到各个时代,不管最初用来创作艺术作品的网站是否还存在。那么,其元数据必须与代币标识符的生命周期同时存在。
此外,链上逻辑可能需要与元数据进行交互。例如,以CryptoKitty为例,CryptoKitty的“世代”会影响CryptoKitty的繁殖速度,并且繁殖都发生在链上(高世代猫的繁殖速度较慢)。因此,智能合约内部的逻辑需要能够从其内部状态读取元数据。
3.1.2 链下元数据
尽管链上元数据有这些好处,但大多数项目仅由于Ethereum区块链目前的存储限制而将其元数据存储在链下。因此,ERC721标准包含一个名为tokenURI的方法,开发人员可以实现该方法来告诉应用程序在何处查找给定项的元数据。
function tokenURI(uint256 _tokenId) public view returns (string)
tokenURI方法返回一个公共URL。然后反过来又会返回一个JSON数据字典,类似于上面的CryptoKitty的示例字典。此元数据应符合官方的ERC721元数据标准,然后才能被OpenSea之类的应用程序所使用。在OpenSea,我们希望给开发者提供构建在我们市场内所显示的丰富元数据的能力。因此,我们在ERC721元数据标准中添加了扩展,允许开发者加入诸如包含特征、动画和背景色之类的内容。