Open qian12345619688 opened 2 years ago
认可关于“星火链网数字资产协议标准”的提议,现将拟定关于“星火链网数字资产协议标准”的RFC标准。
编号:RFC-010
类型:RFC
标题:星火链网DNA协议标准
作者:金健,jinjian1@caict.ac.cn;谢家贵,xiejiagui@caict.ac.cn;李志平,lizhiping@caict.ac.cn;魏星,weixing3@caict.ac.cn
发布时间:2022-04-29
状态:
更新时间:
讨论地址:https://github.com/CAICT-DEV/BIF-RFCs/issues/11
依赖RFC:无
本文介绍星火链网数字资产的协议标准和规范流程。
目前星火应用生态处于起步阶段,随着业内区块链应用生态的发展,数字藏品发展迅速。为了将诸类应用嫁接到星火链网,需要在星火链网上实现诸类应用的智能合约。为了保证资产创建后的规范性和通用性,参照非常成熟的以太坊ERC721,我们为开发人员提供星火链网的数字资产协议标准。
在以太坊ERC721基础上,DNA(digital native assets,数字原生资产)根据星火链网的应用场景进行以下改进:
钱包地址和合约地址为BID
DNA协议中用于接收、发送NFT的钱包地址和合约地址为BID,与星火链网钱包相互兼容。最终实现用户注册一次钱包,连接星火链网主链所有应用。
监管功能
监管方作为去中心化的第三方对NFT的合法合规进行监管,监管规则写入“监管合约”中,监管过程全部公平透明。违反监管的NFT资产将被“冻结”,“冻结”后不能进行转让。但是监管方无权“销毁”或“转让”用户的NFT资产。
每个NFT生成一个BID身份
每个NFT都会生成一个BID身份,用户可以通过解析主链BID,获取相关信息,如创建NFT的合约地址、NFT名称、tokenId、tokenURI等。
metadata格式
DNA协议中规范了元数据(metadata)的格式内容,避免不同应用方展示NFT的信息不一致而混乱。
DNA协议中定义了如下接口,为了保持合约的规范性,用户在使用的过程中,必须实现全部接口,但允许实现内容为空。
下面对该协议的具体接口进行介绍,该协议支持solidity、js等多种编程语言的实现。
文中出现的BID地址,指的是did:bid地址类型。关于did:bid地址,请参考 星火链网RFC-002:星火链网分布式标识BID
DNA165是实现DNA721协议的一部分,IDNA165实现了检查合约接口定义的功能。如下:
interface IDNA165 {
// 接口
}
功能说明
检查其他合约对接口的支持情况,如果合约实现了interfaceId
代表的接口,则返回true。
接口描述
supportsInterface(string interfaceId)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
interfaceId | string | 是 | 参数类型以solidity语言为例,interfaceId代表某个接口 |
参数名称 | 类型 | 参数描述 |
---|---|---|
result | bool | 是否实现了接口 |
无
以下是 DNA721协议的事件以及接口规范:
interface IDNA721 is IDNA165 {
// 事件
// 接口
}
DNA协议中有5个事件,分别是:
1)转移DNA时:
event Transfer(string from, string to, string tokenId);
当tokenId
所指的DNA从 from
转移到 to
时触发此事件,或者当一个DNA被创建出来的时候,触发此事件。
2)授权DNA时:
event Approval(string owner, string approved, string tokenId);
当 owner
使用 approved()
接口将 tokenId
所指的DNA授权给approved
时,触发此事件。
3)授权所有DNA时:
event ApprovalForAll(string owner, string operator, bool approved);
当 owner
使用 setApprovalForAll()
接口将自己所有的DNA授权给operator
时,触发此事件。
4)建立tokenId和BID的映射关系时:
event bindDNA(string tokenId,string bid);
当建立起tokenId
和BID
的映射关系时,触发此事件。
5)设置DNA的可用状态时:
event setState(string tokenId,string state);
当设置DNA的可用状态时,触发此事件。
接口如下:
功能说明
创建一个DNA。
接口描述
create(string to)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
to | string | 是 | DNA的接收者,用BID表示 |
返回值
无
触发{Transfer} 事件。
功能说明
查询用户所持有的DNA数量。
接口描述
balanceOf(string owner)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
owner | string | 是 | DNA的所有人,用BID表示 |
参数名称 | 类型 | 参数描述 |
---|---|---|
balance | string | 余额数量 |
事件
无
功能说明
查询tokenId所指的DNA的所有者。
接口描述
ownerOf(string tokenId)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
tokenId | string | 是 | 某一个DNA的唯一标识符 |
参数名称 | 类型 | 参数描述 |
---|---|---|
owner | string | tokenId所指的DNA的所有者 |
事件
无
功能说明
授权操作,A将自己的某一个DNA授权给其他账户B,B获得权限:B可以对该DNA进行转移操作。
一次只能授权一个帐户。授权另一个账户时,会取消对上一个账户的授权。
接口描述
approve(string to, string tokenId)
参数说明
合约调用者必须是DNA的所有者,或者是DNA所有者已经对合约调用者进行了全部授权的操作。
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
to | string | 是 | 目标账户 |
tokenId | string | 是 | 某一个DNA的唯一标识符 |
返回值
无
触发 {Approval} 事件
功能说明
查询某个DNA授权给了哪个帐户。
接口描述
getApproved(string tokenId)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
tokenId | string | 是 | 某一个DNA的唯一标识符 |
参数名称 | 类型 | 参数描述 |
---|---|---|
operator | string | 获得授权的账户地址 |
无
功能说明
该授权操作与approve操作无直接联系。
授权(取消授权)操作,A将自己的所有DNA授权给其他账户B,B获得权限:B可以对该DNA进行转移操作。
接口描述
setApprovalForAll(string operator, bool approved)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
operator | string | 是 | 获得授权的账户地址 |
approved | bool | 是 | true:授权; false:取消授权; |
返回值
无
事件
触发{ApprovalForAll} 事件
功能说明
查询某个账户A是否将自己所有的DNA授权给另一个账户B。
接口描述
isApprovedForAll(string owner, string operator)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
owner | string | 是 | DNA的所有者 |
operator | string | 是 | 授权的账户 |
参数名称 | 类型 | 参数描述 |
---|---|---|
result | bool | 是否获得了授权 |
无
功能说明
转移DNA给其他账户。转移的时候需要满足以下情况:
1) from
是tokenId
所指的DNA的所有者。
2) 合约调用者是from
,如果不是from
,则合约调用者必须通过 {approve} 或 {setApprovalForAll} 得到了授权,才能转移此DNA。
接口描述
transferFrom(
string from,
string to,
string tokenId
)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
from | string | 是 | DNA的所有者账户地址 |
to | string | 是 | 接收DNA的账户地址 |
tokenId | string | 是 | 某一个DNA的唯一标识符 |
返回值
无
触发{Transfer} 事件。
功能说明
安全地转移DNA给其他账户。转移的时候需要满足以下情况:
1) from
是tokenId
所指的DNA的所有者。
2) 合约调用者是from
,如果不是from
,则合约调用者必须通过 {approve} 或 {setApprovalForAll} 得到了授权,才能转移此DNA。
安全转移的含义是指: 当接收方to
是智能合约时,首先根据DNA165的接口,检查该合约是否实现 {IDNA721Receiver-onDNA721Received},若实现了,则代表该合约在接收到DNA之后,有一套确保该DNA继续流通的机制;若没有实现,则中止操作,防止DNA丢失。
to
指的是智能合约,接口描述
safeTransferFrom(
string from,
string to,
string tokenId
)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
from | string | 是 | DNA的所有者账户地址 |
to | string | 是 | 接收DNA的账户地址 |
tokenId | string | 是 | 某一个DNA的唯一标识符 |
返回值
无
触发{Transfer} 事件。
功能说明
建立tokenId和BID的映射关系。
接口描述
bindDNA(string tokenId, string bid);
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
tokenId | string | 是 | 某一个DNA的唯一标识符 |
bid | string | 是 | 账户地址 |
返回值
无
触发{bindDNA} 事件。
功能说明
设置DNA的可用状态。为了便于监管资产的合规性,设置DNA的状态,锁定状态的DNA不能被转移。
接口描述
setState(string tokenId,string state);
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
tokenId | string | 是 | 某一个DNA的唯一标识符 |
state | string | 是 | 0:锁定、不可用 1:可用 |
返回值
无
触发{setState} 事件。
功能说明
获取唯一标识为tokenId的DNA的可用状态。
接口描述
getState(string _tokenId) returns (string)
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
tokenId | string | 是 | 某一个DNA的唯一标识符 |
参数名称 | 类型 | 必要性 | 参数描述 |
---|---|---|---|
DNAstate | string | 是 | DNA的可用状态 |
无
分配RFC编号RFC-010,进入演示阶段。
内容 | 描述 |
---|---|
name | 项目名称 |
image | NFT图片的RUL,建议使用350*350的图像。 |
description | 对NFT的描述 |
external_url | 外部连接,可以展示NFT相关的网站 |
attributes | state:NFT的状态,如果为冻结状态,不可转让。 |
collection:所属集合名称 | |
bid:绑定的主链bid |
内容 | 描述 |
---|---|
seriesId | 集合ID |
seriesIssuer | 发行方 |
dnaName | 数字资产名称 |
dnaNumber | 数字资产编号 |
dnaDes | 数字资产描述 |
url | 数字资产url,建议图片尺寸350*350 |
hash | 数字资产原文件哈希值 |
dnaType | 数字资产类型 |
extension | 扩展字段,用户自定义 |
7月29日宣布接受该RFC。 由于RFC-010未涉及底层链系统研发,其直接进入采纳阶段。
动机
随着星火链网业务场景的不断发展,数字资产场景应用需求不断增加。为了保证基于星火链网创建数字资产的规范性和通用性,现需要向开发者提供星火链网数字资产协议标准。
生命周期
提出日期:2022-04-26 演示日期:2022-04-29 接受日期:2022-07-29 采纳日期:2022-07-29