更新
- 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
数据字段编码的格式可以确定为某种序列化方案,例如molecule
或json
,我们需要明确使用哪一种以便标准化。 建议使用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是允许更改的。