翻译 SUDT Cheque Deposit Design and Implementation
要解决的问题
为了要存 sUDT 到交易所,用户必须要准备一个有 142 ckb 的 cell 已包含这个 sUDT token 所需的容量,或者说交易所就必须准备许多的 cell 来服务每位用户和每一种代币,这个负担对双方来说都贼重的。
先前我们针对这个问题有过一些 讨论 社区最后终于想出这个方案了,步骤大概如下:
- 交易所生成
secp256k1_sighash_all
地址分别给每位用户 - 用户存入我们的 SUDT 到暂时的
Cheque Cell
. - 交易所扫描了全部的处于 live 状态的
Cheque Cells
,并且提取他。 - 同时,这个索取的交易会退回这个暂时的
Cheque Cell
中的 capacity 给回到用户
Implementation 实现
Cheque cell 的锁定脚本长这样:
Lock:
code_hash: <cheque_cell_lock_script>
hash_type: type
args: <receiver_lock_hash[:20]> | <sender_lock_hash[:20]>
对传送人或者接收者来说我们都有两种方法来解锁 cheque cell
使得作为输入的 Cell 匹配的方法
- Cheque cell 的 witness 字段必须为空
- 至少要有一个作为输入的 cell 的 lock script 要匹配 Cheque cell 的 lock args 声明的 lock_hash
*相应作为输入的 cell 的 witness 不能为空
签名匹配法
- Cheque cell 的 witness 字段是一个有效的 secp256k1 签名。
- 借由以下的规则生成一个解锁脚本
*从签名中恢复公钥, 获得了他用来当作是lock args
的 blake2b 哈希的 第一个 20 bytes
*使用预设的 secp256k1_signhash_all 脚本作为code_hash
- 设定
hash_type
来当作type
- 设定
- 确保生成的锁脚本的哈希与 Cheque Cell 的 lock 参数中声明的
lock_hash
相匹配
此外,交易必须遵循此规范定义的其他业务逻辑,包括取款时间限制等等。
repo: GitHub - duanyytop/ckb-cheque-script: The lock script of cheque cell on Nervos CKB
Creation example
create cheque cell #1
create cheque cell #2
create cheque cell #3
Claim example
claim cheque cell