RFC: Info Cell for sUDT Draft Spec

更新

  • 2021.11.29 给单独控制sUDT的Info_cell添加规则三和规则四,给脚本驱动sUDT的info_cell添加规则三。

1. 概述

sUDT 是一个非常简单的 udt 标准。 使用这个标准部署的udt,我们只能从链上得到余额,而不能得到代币名称、代币符号、小数等参数。
为了扩展现有的 sUDT 标准,需要设计一个方案来存储UDT信息并将其绑定到相应的 sUDT,但不破坏与现有 sUDT 的任何兼容性。

这里有一个针对本议题的提议[A SUDT Information Storage Meta Cell Design Proposal],但是该提议需要改进。

2. sUDT Info cell

在 info_cell 中,必须包含的最基本信息是 token_name、token_symbol和精度。 至于总供应量和余额,它们都可以通过对Cell索引来获得。

规范中的 SUDT 信息单元如下所示:

data:
    decimals: uint8
    name: Common knowledge Byte
    symbol: CKB
    extra: {website:"https://nervos.org"} // optional
type:
    code_hash: sudt_info type script
    args: sudt type script hash or type_ID
lock:
    sUDT creator defined

数据字段编码的格式可以确定为某种序列化方案,例如moleculejson,我们需要明确使用哪一种以便标准化。 建议使用json,使用其他格式也许可以减少CKB的用量,可以提出建议。

数据:

  • decimals:(uint8 类型)token 使用的小数位数,如果decimals 为8 表示token 至少可以被整除为0.00000001。
  • tokenname: 令牌名称
  • symbol: 令牌的标识符,例如“HIX”
  • extra:你想写的任何东西,比如网站,某张图片的哈希值等。

前三项是必须填写的参数,extra可以根据需要添加信息。

3. 单独控制的sUDT

CKB 上 sUDT 的发行是由 lockscript 控制的,所以最简单的 sUDT 是由个人或组织使用由私钥控制的 lockscript 发行的,例如 USDC 和其他稳定币。

对于这种类型的UDT,你可以在铸造sUDT的同时构造一个info_cell,它的type的code_hash是Info_cell类型,它的args是sUDT的type_script hash。 Info_cell 会检查交易是否满足条件。

// Issue new SUDT/SUDT_Info
Inputs:
    <... one of the input cell must have owner lock script as lock>
Outputs:
    SUDT_Cell:
        Data:
            amount: uint128
        Type:
            code_hash: simple_udt type script
            args: owner lock script hash (...)
        Lock:
            <user defined>
    SUDT_Info_Cell:
        Data:
            decimals: uint8
            tokenname: xxxx
            symbol: xxx
        Type:
            code_hash: sudt_info type script
            args: sudt type script hash
        Lock:
           <user defined>

sUDT info cell(type script)应满足以下规则:

  • 规则 一: 在本次交易中,输出单元中必须至少存在一个 sUDT cell,并且其type script的哈希与 Info_cell 的 args 匹配。
  • 规则二: 在本次交易中,输入单元格中必须至少存在一个cell,其lock script为sUDT的Owner的lock script。
  • 规则三: info_cell的lockscript默认采用无法解锁的死锁,但某些时候开发者可以选择其他lock_script。
  • 规则四: 如果存在多个info_cell,选择产生时区块高度最小的info_cell,如果同一高度有多个info_cell,选择交易索引最小的,info_cell的type应该规定同一交易不能生成多个info_cell。

4. 脚本驱动的sUDT

但是CKB 上还有一种 sUDT,它不是由私钥控制的lockscript发行,而是遵循特定的脚本逻辑。 比如NexisDAO的dCKB和Tai,之前的Info_cell设计就不适合这种情况。

由于任何人都可以在遵循脚本逻辑的同时生成 sUDT,如果我们继续使用之前的逻辑,任何人都可以生成相应的 info_cell。 所以我们需要在之前的设计基础上增加新的逻辑。

// Issue new SUDT/SUDT_Info
Inputs:
    <any cell>
Outputs:
    SUDT_Info_Cell:
        Data:
            decimals: uint8
            tokenname: xxxx
            symbol: xxx
        Type:
            code_hash: sudt_info type script
            args: type_id
        Lock:
           <user defined>

sUDT Info cell (type script)应满足以下规则:

  • 规则一:Cell data符合格式。
  • 规则二: args 符合type id 的规则。
  • 规则三: info_cell的lockscript默认采用无法解锁的死锁,但某些时候开发者可以选择其他lock_script。

info cell的type script会检查交易,是否满足上面的两个逻辑(单独控制或者脚本驱动)之一。

构造完这个Info Cell后,使用它的type_script的hash作为sUDT的owner lockscript的args的前32个字节,由此就将Info cell绑定到sUDT上了,并且info_cell的拥有者可以继续修改Info_cell的信息。

因为Info Cell在sUDT创建之前就会生成,所以推荐将其设置为一个公认的格式标准,否则之后为了满足解析标准而升级UDT会比较麻烦。

也许我们可以参考脚本设计,即使用33Byte指定一个Info_cell。 当flag字节为0时,args的32Bytes就是某个cell数据的hash,即sUDT info是不允许更改的。当标志字节为1时,查找 type_hash 符合 args 的单元格,即sUDT Info是允许更改的。