本贴内容主要来自于 CKB.DEV 茶话会第一期,本期主题是:如何在 CKB 上实现 UDT,分享人是:Cipher 王博。 html
茶话会现场视频:https://v.qq.com/x/page/x3030...程序员
由于 CKB 与以太坊的编程模型彻底不一样,所以有必要在开始以前向你们介绍一下 CKB 的交易与合约模型。算法
首先 CKB 的交易模型是 UTXO 结构,每一笔交易会销毁一部分 Cells,生成一部分新的 Cells,Cells 是 CKB 网络上最小的结构单位。编程
CKB 的交易模型是和比特币相似的,可是在此基础上进行了扩展,在比特币上的销毁和生成规则是肯定的,而 CKB 的核心进步点在于 CKB 上的脚本是用户能够自定义的。设计模式
好比说,咱们如今在 CKB 上用的签名算法是 SECP256K1,这个和比特币,以太坊使用的签名算法是一致的,可是在比特币和以太坊上这个签名算法是写在节点里面的,是没法更改的,而在 CKB 上不存在原生的签名算法,若是你想在 CKB 上实现另外一种签名算法 SECP256R1,你只须要本身编写关于 SECP256R1 的脚本,而后写入 Lock Script 就能够实现了,而在以太坊上须要实现这一功能必须通过硬分叉。而在 CKB 上签名算法是随时可替换的。安全
CKB 另外一个较大的进步在于,在比特币上转帐先后的余额必须一致,这一等式是固化在节点内的,所以比特币上只有原生的 BTC,没法实现其余的 UDT。而这一点在 CKB 上也是能够自定义的,也就是 CKB 内的 Type Script,也就是说用户能够在此基础上进行额外的转帐规则的开发。好比用户能够自定义 Type Script 中的某一个字段在转帐先后的余额必须一致,这实际上就能够在 CKB 上实现新的 UDT,由于这里面 Type Script 指定的对象能够再也不局限于原生的 CKB Token,而能够是任意一种新建立的 UDT。微信
另外 CKB 和以太坊的设计模式是彻底不一样的。在以太坊上合约重点关注的是行为的意图,而不是行为的结果,相反的在 CKB 上,咱们重点关注的是行为的结果。以太坊上的合约交互采用的是接口对接口的方式,而 CKB 的 Script 交互采用的是状态对状态的方式。网络
这边咱们再回顾一下 ERC20 的内容,通过分析,咱们会发现 ERC20 是存在很是多问题的:app
常见 ERC20 合约提供的方法和事件spa
CKB 上实现 UDT 的设计思路:
最小化 UDT 最核心的两大功能:一个是发币,这里须要定义 UDT 的基本信息,并保持 UDT 惟一性;另外一个是转帐,保证 UDT 先后的一致性。
Input Cells :填入 Cells,销毁这部分 CKB 的状态。能够是你们目前正在持有的 CKB,也能够是正在使用中的 CKB 等等。
Output Cells:这边包括两部分,一个是 UDT_ID_CELL 用来描述这个 UDT 的逻辑规则、基本信息和惟一性。另外一个是 UDT_BALANCE_CELL 用来描述这个 UDT 的余额,保证转帐先后的一致性。
UDT_ID_CELL 这边主要包含几个内容:
UDT_BALANCE_CELL 这边主要包含几个内容:
UDT 的转帐会相对容易,销毁一部分 UDT,生成一部分新的 UDT 便可实现转帐。
Input Cells :
放入一部分 UDT_BALANCE_CELL(s) 做为 Input。
Output Cells :
放入一部分 UDT_BALANCE_CELL(s) 做为 Output。
上面咱们实现的是最小化 UDT,只设计了发币和转帐这两个最基础的功能。那对于其余的复杂的功能要如何实现呢?
增发/销毁:Mint/Burn Action
对于 UDT 的管理员,他可能须要对 UDT 进行一些增发和销毁的操做。这里就须要对于咱们上面建立的 UDT_ID_CELL 进行一些修改。
Input Cells :
Output Cells:
那么如何实现受权行为呢?同样的咱们能够在最小 UDT 方案上进行扩展。
Action Approve
Input Cells :
输入UDT_BALANCE_CELL
Output Cells:
输出新的UDT_BALANCE_CELL_WITH_APPROVE,这是中间状态,表示这个 Cell 处于受权中的状态;
Lock:UDT_APPROVE_LOCK:这是一个 Script,其中写入了受权的逻辑规则
这边的 UDT_APPROVE_LOCK 能够实现两种逻辑,一个是受权方能够用本身的私钥解开这个 Cell,使用其中的 UDT 金额;另外一个是被受权方能够在受权金额的额度内,使用被受权方的私钥将这个 Cell 解开,使用其中的 UDT 金额。
Action Transfer_from
被受权方能够调用 Transfer_from,使用其中受权金额范围内的 UDT。
Input Cells :
输入 UDT_BALANCE_CELL_WITH_APPROVE
Output Cells:
输出新的 UDT_BALANCE_CELL_WITH_APPROVE,可能受权金额没有彻底使用,这是找零;
输出 UDT_BALANCE_CELL,这是被受权方转出的 UDT 部分。
注意:UDT_BALANCE_CELL_WITH_APPROVE 中的被受权方的信息,能够是 Lock Script 也能够是 Type Script。因此这里的被受权方能够是一个地址,也能够是 N 个地址,也能够是另外一个合约。
在分享的最后,Cipher 还向你们介绍了一个 Token Swap 的例子。
Nervos Community 致力于成为最好的 Nervos 社区,咱们将持续地推广和普 及 Nervos 技术,深刻挖掘 Nervos 的内在价值,开拓 Nervos 的无限可能, 为每一位想要深刻了解 Nervos Network 的人提供一个优质的平台。
添加微信号:BitcoinDog 便可加入 Nervos Community,若是是程序员请备注,还会将您拉入开发者群。