SUDT 业务整合简明方案

SUDT 业务整合简明方案

请首先参考《交易所整合 ckb 简明方案》实现 CKB 基础代币整合

SUDT 标准简介

与 ERC20 类似,Simple UDT 是 Nervos CKB 上的用户自定义代币协议。该协议定义了 SUDT 的核心数据结构和流转逻辑。您在这里可以查到协议的规范细节,以及开发团队部署的公共 sudt 合约引用方法

// 数据结构
capacity:
    ckb amount
data:
    udt amount (uint128)
type:
    code_hash:
        sudt code hash
    args:
        issuer lock hash
lock:
    user defined

铸造逻辑

任何人都可以在无需部署合约前提下发行一种 sudt,该 sudt 的标识由发行者的 blake2b(lock script) 唯一确定。即一个地址对应一种代币,同一个地址多次发行的 sudt 是无差别可互换的。不同地址发行的代币不同。该标识会被以 type script args 的形式记录在输出的代币 cell 中。

如果代币由多签地址发行,那么该多签逻辑就可以允许多个管理者共同管理发行权。发起多签转账交易的代码可以参考这里

理论上也可以自己部署新的 sudt 合约,但这样会付出额外的部署成本,以及可能导致应用之间的兼容问题。

参考:
命令行发币:GitHub - shaojunda/ckb-udt-cli
dApp 发币:https://udt.ckbapp.dev/ 源码:GitHub - zmcNotafraid/thunder-issue-SUDT: CKB Dapp For Manage Your SUDT
代码发币:java example

转账/销毁逻辑

对一笔交易的同种 sudt 来说,输出总额必须小于等于输入总额。等于对应转账操作,小于对应销毁操作。

代码例子:java example

代币信息

SUDT 协议标准并不包含诸如代币名称、简称、小数点、ICON 等信息,社区团队建议用另一个附加规范来公示这些信息。注意这些信息在 ERC20 标准中也是可选字段,绝大部分场合下仍然需要白名单形式添加到应用中。否则用户会对多个取名冲突的资产感到迷惑,或者遭受欺诈。

任何在 CKB Explorer 上展示的 sudt 代币都需要手动提交代币信息,入口在 CKB Explorerhttps://explorer.staging.nervos.org/aggron/tokens.

SUDT 转账/收款

Nervos CKB 采用 UTXO 作为基础的交易模型,带来巨大灵活性的同时也导致每一个代币转账生成的 Cell 都同时有 CKB 余额和 udt 余额。前者的最小值是 sudt cell 的存储需求最小值,即 142 CKB。用户向交易所充值代币,或者向其他用户转账代币时,面临同时转账 ckb 的问题。这里根据不同的场景推荐大家采用不同的 sudt 转账模式。

交易所充值

付款方转账时创建一个临时 Cell,等待收款方认领,交易所主动收取后临时 Cell 所使用的 CKB 被自动退还给付款方。这种模式解决了收款方需要为收款方支付 Cell capacity 的问题。参阅这篇文章可以了解“临时 Cell”的设计和实现细节:SUDT Cheque Deposit Design and Implementation

  • :white_check_mark: 仅建议交易所充值场景使用
  • :white_check_mark: 统一 ckb、sudt 充值地址
  • :x: 不建议其他任何场景使用
  • 该模式仅支持收款方为标准短地址(secp256k1_blake160_sighash_all)

发起充值的例子: create a cheque cell (需要使用 ckb-sdk-go

交易所入账

  1. 生成用户充值默认短地址(与 ckb 充值地址相同)
  2. 用户向该地址创建临时充值 Cell
  3. 扫描链上所有收款人为本交易所的临时 Cell
  4. 将这些充值入账,并将 CKB 同时退还给充值用户
  5. 等待 24 个区块(不可逆区块间隔),完成入账

image

入账例子:claim_cheque_cell_example.go (需要使用 ckb-sdk-go

交易所提现

这是最简单的 sudt 转账方案。付款方支付 142 CKB 为收款方创建一个 sudt Cell,并转入 sudt。考虑到交易所提现场景可以收取部分手续费作为提现费用,由交易所扣除一定的提现余额来作为 CKB 空间费用。

  • :white_check_mark: 交易所提现场景
  • :white_check_mark: 支持提现至任意地址
  • :x: 不建议转账场景使用

sudt 转账代码示例: Java example

钱包账户

钱包方每种代币预先创建一个 cell,并使用 anyone-can-pay 地址 作为该 cell 的 lock。这种模式下付款方会把 sudt 直接加到收款方预留的 sudt acp cell 上,从而无需提供 CKB 作为存储空间。建议钱包应用引导用户进行该操作。但不建议交易所以这种方式进行充值,因为它要求交易所为每一个用户每种资产创建一个 sudt cell,开销很大。

  • :white_check_mark: 钱包支持 sudt 的默认方案
  • 该模式仅支持收款方为 acp 地址
  • 需要钱包方同时支持以临时 Cell 模式转账至 secp256k1_blake160_sighash_all 默认短地址的功能

Neuron、Bitpie、Portal Wallet 均使用了 acp 转账方案。

3 Likes