caict-4iot-dev / bif-rfcs

11 stars 5 forks source link

请问星火链网是否有数字资产协议标准可参考? #11

Open qian12345619688 opened 2 years ago

qian12345619688 commented 2 years ago

动机

随着星火链网业务场景的不断发展,数字资产场景应用需求不断增加。为了保证基于星火链网创建数字资产的规范性和通用性,现需要向开发者提供星火链网数字资产协议标准。

生命周期

提出日期:2022-04-26 演示日期:2022-04-29 接受日期:2022-07-29 采纳日期:2022-07-29

maruolong commented 2 years ago

认可关于“星火链网数字资产协议标准”的提议,现将拟定关于“星火链网数字资产协议标准”的RFC标准。

jackma-cloud commented 2 years ago

1.序言

编号: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:无

2.摘要

本文介绍星火链网数字资产的协议标准和规范流程。

3.动机

目前星火应用生态处于起步阶段,随着业内区块链应用生态的发展,数字藏品发展迅速。为了将诸类应用嫁接到星火链网,需要在星火链网上实现诸类应用的智能合约。为了保证资产创建后的规范性和通用性,参照非常成熟的以太坊ERC721,我们为开发人员提供星火链网的数字资产协议标准。

4.标准设计

4.1 总体设计

在以太坊ERC721基础上,DNA(digital native assets,数字原生资产)根据星火链网的应用场景进行以下改进:

4.2 协议标准

DNA协议中定义了如下接口,为了保持合约的规范性,用户在使用的过程中,必须实现全部接口,但允许实现内容为空。

下面对该协议的具体接口进行介绍,该协议支持solidity、js等多种编程语言的实现。

文中出现的BID地址,指的是did:bid地址类型。关于did:bid地址,请参考 星火链网RFC-002:星火链网分布式标识BID

DNA165是实现DNA721协议的一部分,IDNA165实现了检查合约接口定义的功能。如下:

interface IDNA165 {
  // 接口
}

supportsInterface()

功能说明

检查其他合约对接口的支持情况,如果合约实现了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);

当建立起tokenIdBID的映射关系时,触发此事件。

5)设置DNA的可用状态时:

event setState(string tokenId,string state);

当设置DNA的可用状态时,触发此事件。

接口如下:

create()

功能说明

创建一个DNA。

接口描述

create(string to)
参数名称 类型 必要性 参数描述
to string DNA的接收者,用BID表示

​ 触发{Transfer} 事件。

balanceOf()

功能说明

查询用户所持有的DNA数量。

接口描述

balanceOf(string owner)
参数名称 类型 必要性 参数描述
owner string DNA的所有人,用BID表示
参数名称 类型 参数描述
balance string 余额数量

ownerOf()

功能说明

查询tokenId所指的DNA的所有者。

接口描述

ownerOf(string tokenId)
参数名称 类型 必要性 参数描述
tokenId string 某一个DNA的唯一标识符
参数名称 类型 参数描述
owner string tokenId所指的DNA的所有者

approve()

功能说明

授权操作,A将自己的某一个DNA授权给其他账户B,B获得权限:B可以对该DNA进行转移操作。

一次只能授权一个帐户。授权另一个账户时,会取消对上一个账户的授权。

接口描述

approve(string to, string tokenId)
参数名称 类型 必要性 参数描述
to string 目标账户
tokenId string 某一个DNA的唯一标识符

​ 触发 {Approval} 事件

getApproved()

功能说明

查询某个DNA授权给了哪个帐户。

接口描述

getApproved(string tokenId)
参数名称 类型 必要性 参数描述
tokenId string 某一个DNA的唯一标识符
参数名称 类型 参数描述
operator string 获得授权的账户地址

​ 无

setApprovalForAll()

功能说明

该授权操作与approve操作无直接联系。

授权(取消授权)操作,A将自己的所有DNA授权给其他账户B,B获得权限:B可以对该DNA进行转移操作。

接口描述

setApprovalForAll(string operator, bool approved)
参数名称 类型 必要性 参数描述
operator string 获得授权的账户地址
approved bool true:授权;
false:取消授权;

isApprovedForAll()

功能说明

查询某个账户A是否将自己所有的DNA授权给另一个账户B。

接口描述

isApprovedForAll(string owner, string operator)
参数名称 类型 必要性 参数描述
owner string DNA的所有者
operator string 授权的账户
参数名称 类型 参数描述
result bool 是否获得了授权

​ 无

transferFrom()

功能说明

转移DNA给其他账户。转移的时候需要满足以下情况:

1) fromtokenId 所指的DNA的所有者。

2) 合约调用者是from,如果不是from,则合约调用者必须通过 {approve} 或 {setApprovalForAll} 得到了授权,才能转移此DNA。

接口描述

transferFrom(
    string from,
    string to,
    string tokenId
) 
参数名称 类型 必要性 参数描述
from string DNA的所有者账户地址
to string 接收DNA的账户地址
tokenId string 某一个DNA的唯一标识符

​ 触发{Transfer} 事件。

safeTransferFrom()

功能说明

安全地转移DNA给其他账户。转移的时候需要满足以下情况:

1) fromtokenId 所指的DNA的所有者。

2) 合约调用者是from,如果不是from,则合约调用者必须通过 {approve} 或 {setApprovalForAll} 得到了授权,才能转移此DNA。

安全转移的含义是指: 当接收方to 是智能合约时,首先根据DNA165的接口,检查该合约是否实现 {IDNA721Receiver-onDNA721Received},若实现了,则代表该合约在接收到DNA之后,有一套确保该DNA继续流通的机制;若没有实现,则中止操作,防止DNA丢失。

接口描述

safeTransferFrom(
    string from,
    string to,
    string tokenId
) 
参数名称 类型 必要性 参数描述
from string DNA的所有者账户地址
to string 接收DNA的账户地址
tokenId string 某一个DNA的唯一标识符

​ 触发{Transfer} 事件。

bindDNA()

功能说明

建立tokenId和BID的映射关系。

接口描述

bindDNA(string tokenId, string bid);
参数名称 类型 必要性 参数描述
tokenId string 某一个DNA的唯一标识符
bid string 账户地址

​ 触发{bindDNA} 事件。

setState()

功能说明

设置DNA的可用状态。为了便于监管资产的合规性,设置DNA的状态,锁定状态的DNA不能被转移。

接口描述

setState(string tokenId,string state);
参数名称 类型 必要性 参数描述
tokenId string 某一个DNA的唯一标识符
state string 0:锁定、不可用
1:可用

​ 触发{setState} 事件。

getState()

功能说明

获取唯一标识为tokenId的DNA的可用状态。

接口描述

getState(string _tokenId) returns (string)
参数名称 类型 必要性 参数描述
tokenId string 某一个DNA的唯一标识符
参数名称 类型 必要性 参数描述
DNAstate string DNA的可用状态

​ 无

maruolong commented 2 years ago

分配RFC编号RFC-010,进入演示阶段。

qian12345619688 commented 2 years ago

4.3 metadata格式

DNA协议中规范了元数据(metadata)的格式内容,具体字段如下:
内容 描述
name 项目名称
image NFT图片的RUL,建议使用350*350的图像。
description 对NFT的描述
external_url 外部连接,可以展示NFT相关的网站
attributes state:NFT的状态,如果为冻结状态,不可转让。
collection:所属集合名称
bid:绑定的主链bid
qian12345619688 commented 2 years ago

4.3 metadata格式

DNA协议中规范了元数据(metadata)的格式内容,具体字段如下:
内容 描述
seriesId 集合ID
seriesIssuer 发行方
dnaName 数字资产名称
dnaNumber 数字资产编号
dnaDes 数字资产描述
url 数字资产url,建议图片尺寸350*350
hash 数字资产原文件哈希值
dnaType 数字资产类型
extension 扩展字段,用户自定义
maruolong commented 1 year ago

7月29日宣布接受该RFC。 由于RFC-010未涉及底层链系统研发,其直接进入采纳阶段。