NFT元数据

NFT(非同质化通证)是THE OASIS协议核心的资产表征形式。它包含以下元数据字段:

  • uuid:全局唯一的标识,作为NFT的主索引;

  • uri:统一资源标识符,用于简要描述URI的关键信息;

  • symbol:通证符号,用于区分一大类的NFT;

  • signature :NFT元数据的签名,用于验证数据完整性;

另外,THE OASIS采用二层解析的方式。上层可以根据UUID、URI与SYMBOL进行定制化解析得到更详细的数据对象,称为「扩展元数据」。

UUID

UUID是每个NFT在全局的唯一标识,也是NFT的主索引。对于不同的区块链网络,其格式有微小的区别:

EOSIO

在EOSIO中,UUID为uint128的整数,结构如下:

64bit

64bit

发行合约账户名

自增ID

Ethereum

在以太坊中,UUID为uint256 的整数,结构如下:

160bit

64bit

32bit

发行合约地址

自增ID

预留

URI

URI全名为统一资源标识符,遵循RFC3986协议,是NFT扩展元数据的解析入口。

THE OASIS协议约定的URI格式如下:

oasis://[World(世界名)]/[Type(类型)]/[Name(资产名称)]?customField=customValue&...

World - 世界名

由发行方指定的应用名称,也称为「世界名」,须先在OASIS.MAIN 合约内注册,与应用方的资产合约关联。

Type - 资产类型

由发行方指定的资产类型,方便各类应用理解道具最初的用途。为了规范字段类型的使用,我们预设了以下几种字段:

  • CONSUMABLE - 消耗类道具,如药品、卷轴等一次性用品;

  • ARMOR - 装备类道具,如武器、防具、饰品等带属性增益的物品;

  • MATERIAL - 材料类道具,通常用于合成、强化装备,或其他特殊用途;

  • TASK - 任务类道具,获得途径特殊,且用途也较为单一;

  • OTHER - 其他类道具,即无法归类为上述四类的道具。

项目方也可以使用自定义的字段。但我们更建议采用统一的分类,这样能方便不同游戏项目更好地进行资产互通的解析设计。

Name - 资产名称

资产名称,通常用于表示某个细分类别的资产总称,如蓝宝石、红宝石、火焰剑等,便于应用方提供扩展元数据。该字段与symbol的区别在于,symbol 是资产符号,用于表征一大类资产,且有长度限制;name 对该类资产进行进一步细分。例如,symbol 可以表示“剑”这一大类武器道具,name 可以细分出“火焰剑”,“水晶剑”,“钻石剑”等各类剑。

Query String

发行方可以在query string部分添加任意的字段以更细致地描述资产。例如,可以增加更细致的子类型,如subtype1=type1&subtype2=type2

与IPFS集成

如果您将Extend Metadata上传至IPFS,并希望将CID关联至URI,则可以在Query String部分增加形如

?ipfs=bafkreihghxw43i3l75ep5eg6qe2ye4ub4ov3y2znpmbijqcd335ypyt4tu

URI例子

例如对于游戏应用「洛克人」,在注册了rokeman 的域名后,计划发行一把「火焰枪 」武器资产。同时详细的资产描述数据已上传至IPFS,CID为bafkreihghxw43i3l75ep5eg6qe2ye4ub4ov3y2znpmbijqcd335ypyt4t,则可以将URI设计如下:

oasis://rokeman(必须)/ARMOR/firegun?ipfs=bafkreihghxw43i3l75ep5eg6qe2ye4ub4ov3y2znpmbijqcd335ypyt4t

SIGNATURE

元数据签名,用于保护NFT资产元数据不被篡改。签名生成公式如下:

signature = Sign(Sha256(uuid + uri + symbol))

扩展元数据

扩展元数据是应用方根据UUID,URI与Symbol进行定制化解析所得到的JSON数据,表示该NFT在当前游戏中的具体属性、用途等内容。得益于THE OASIS的双层结构设计,应用方可以自由定制资产的解析逻辑。

我们提供一个统一的扩展元数据格式,以JSON数据对NFT进行:

{
"name":"Asset Name",
"description":"This is a armor hat",
"image":"https://google.com/image/xxx.jpg",
"properties":{
// 添加自定义的字段
},
"locales":{
"zh":{
"name":"xxx",
"description":"xxx",
...
},
"cn":{
...
}
}
}

官方提供了JS-SDK用于更方便地解析并输出NFT扩展元数据。