什么是非同质通证?

非同质通证(NFT)可以被看作是一个财产契约——每个财产都是唯一的,并且携带一些不可更改的信息(例如,财产的物理地址),不过其他信息,例如财产的所有者,是可以更改的。NFT智能合约有助于追踪真实世界中物品的所有权,在网络游戏中也是如此,它允许用户拥有特有的角色或限量供应的道具,这些道具可以在用户之间转移,而无需获得游戏所有者的许可。

NEO智能经济的NFT提案标准目前正在开发中。这是使用C#写的一个例子,展示了如何编写这样一个智能合约。在NEP-5 (可替换的) 通证功能之间有一些重叠,以便API的编写能更容易的进行适配调整。

方法

name

public static string name()

返回通证的名称。例如, "MyNFT"

每次调用此方法时,它都必须返回相同的值。

symbol

public static string symbol()

返回此合约中管理的通证的短字符串符号。例如,"MNFT"。这个符号应该是简短的 (推荐是3-8个字符),没有空格字符或换行符,并且应该限于大写的拉丁字母(即英语中使用的26个字母)。

每次调用此方法时,它都必须返回相同的值。

totalSupply

public static BigInteger totalSupply()

返回系统中部署的通证的供应总量。

decimals

public static byte decimals()

返回通证使用的小数位数——例如,8,表示将通证数量除以100,000,000,从而得到它的用户表示。

如果这个合约中管理的通证是不可分割的,函数应该返回 0

如果函数返回非零值,则必须实现此标准中的所有’‘OPTIONAL’‘方法。

每次调用此方法时,它都必须返回相同的值。

tokens

public static enumerator tokens()

返回此合约中已经发行的所有通证的 枚举值

transfer

public static bool transfer(byte[] to, byte[] tokenid)

将id为 tokenid的通证转到地址to

参数 tokenid应该是一个有效的NFT。如果无效,这个方法应该抛出异常。

参数to 应该是一个20字节长的地址。如果不是,这个方法应该抛出异常。

如果要转账的通证有多个所有者,函数应该返回false

如果方法执行成功,它必须触发转账 事件,并且必须返回 true,即使通证是被发送给合约所有者本人。

函数应该检查所有者的地址是否等于合约调用者的散列值。如果是,则应处理转账;如果不是,函数应该使用SYSCALL Neo.Runtime.CheckWitness 来对转账操作进行验证。

如果 to 地址是已经部署的合约,函数应该检查该合约的 payable 标志,从而决定是否应该将通证转账到该合约。

如果没有处理转账事件,函数应该返回 false

public static bool transfer(byte[] from, byte[] to, BigInteger amount, byte[] tokenid)

'’OPTIONAL’’: 如果decimals() > 0,则必须实现此方法。

将具有id tokenid 的通证相应的数量从一个地址from转到另一个地址to

参数tokenid应该是一个有效的NFT。如果不是,这个方法应该抛出异常。

参数 fromto 应该是20字节长的地址。如果不是,这个方法应该抛出异常。

参数 amount 应该大于或等于 0,并且应该小于或等于pow(10, decimals())。如果不是,这个方法应该抛出异常。

如果from账户余额没有足够的通证来消费,函数应该返回false

如果方法执行成功,它必须触发转账事件,并且必须返回 true,即使数量0,或者通证被发送给合约所有者本人。

函数应该检查from 地址是否等于合约调用者的散列值。如果是,则应处理转账;如果不是,函数应该使用SYSCALL Neo.Runtime.CheckWitness 来对转账操作进行验证。

如果to地址是已经部署的合约,函数应该检查该合约的payable 标志,从而决定是否应该将通证转到该合约。

如果没有处理转账操作,函数应该返回false

ownerOf

public static enumerator ownerOf(byte[] tokenid)

返回一个枚举值,该枚举值包含拥有指定通证的所有共同所有者。

参数tokenid应该是一个有效的NFT。如果不是,这个方法应该抛出异常。

tokenURI

public static string tokenURI(byte[] tokenid)

返回给定资产的不同的统一资源标识符(URI)。通证的URI数据提供了一个引用,以获取关于特定通证或通证数据的更多信息。

参数tokenid应该是一个有效的NFT。如果不是,这个方法应该抛出异常。

balanceOf

public static BigInteger balanceOf(byte[] owner, byte[] tokenid)

返回指定所有者账户的指定通证的余额。

参数tokenid应该是一个有效的NFT。如果不是,这个方法应该抛出异常。

参数owner 应该是一个20字节长的地址。如果不是,这个方法应该抛出异常。

如果owner 是未使用的地址,或者不是指定通证的所有者,则此方法应该返回0

tokensOfOwner

public static enumerator tokensOfOwner(byte[] owner)

返回一个枚举值,该枚举值包含指定地址所拥有的所有通证。

参数owner 应该是一个20字节长的地址。如果不是,这个方法应该抛出异常。

事件

transfer

public static event transfer(byte[] from, byte[] to, BigInteger amount, byte[] tokenid)

必须在通证转账(包括零值转账)时触发。

创建新通证的合约应该在通证创建时触发转账事件,其中地址from设置为null