【CKB.DEV 茶话会】如何在 CKB 上实现用户自定义 Token

本贴内容主要来自于 CKB.DEV 茶话会第一期,本期主题是:如何在 CKB 上实现 UDT,分享人是:Cipher 王博。 html

茶话会现场视频:https://v.qq.com/x/page/x3030...程序员

CKB 的交易与合约模型

由于 CKB 与以太坊的编程模型彻底不一样,所以有必要在开始以前向你们介绍一下 CKB 的交易与合约模型。算法

file

首先 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。微信

file

另外 CKB 和以太坊的设计模式是彻底不一样的。在以太坊上合约重点关注的是行为的意图,而不是行为的结果,相反的在 CKB 上,咱们重点关注的是行为的结果。以太坊上的合约交互采用的是接口对接口的方式,而 CKB 的 Script 交互采用的是状态对状态的方式。网络

ERC20 回顾与分析

这边咱们再回顾一下 ERC20 的内容,通过分析,咱们会发现 ERC20 是存在很是多问题的:app

file
常见 ERC20 合约提供的方法和事件spa

  • ERC20 仅定义了接口,未统一实现。你每建立一个新的 ERC20,都需部署一个新的合约,而用户很难一个个去了解每个合约。另外因为每一个新的合约都是开发者从新建立的,这致使不少的 ERC20 合约或故意或无心地出现了安全问题。
  • ERC20 接口中用户的行为是耦合的。好比其中的 totalSupply,mint,burn 是管理员的行为;而 balanceOf,approve,transfer 是普通用户的行为,而 allowance,transferFrom 则是受权用户的行为。咱们能够看到这一个 ERC20 的合约内至少耦合了三种用户的行为,是相对混乱的。
  • ERC20 中的逻辑和数据是耦合的。合约的实现逻辑和用户地址下拥有的金额数据都是在这个合约内的,正由于这种耦合,所以以太坊上没法进行统一实现。

file

CKB 上实现 UDT 的设计思路:

  • 逻辑与状态分离,使用统一的业务代码。安全将获得极大的保障。
  • 用户行为、管理员行为、受权行为分离。
  • 仅提供最核心的 UDT 功能。指提供最核心的 UDT 功能,保障开发者对 UDT 灵活性的需求。
  • 采用面向状态,注重行为结果的设计模式,去定义 UDT 的行为。

最小化的 UDT

最小化 UDT 最核心的两大功能:一个是发币,这里须要定义 UDT 的基本信息,并保持 UDT 惟一性;另外一个是转帐,保证 UDT 先后的一致性。

发币:Create Action

file

Input Cells :填入 Cells,销毁这部分 CKB 的状态。能够是你们目前正在持有的 CKB,也能够是正在使用中的 CKB 等等。

Output Cells:这边包括两部分,一个是 UDT_ID_CELL 用来描述这个 UDT 的逻辑规则、基本信息和惟一性。另外一个是 UDT_BALANCE_CELL 用来描述这个 UDT 的余额,保证转帐先后的一致性。

UDT_ID_CELL 这边主要包含几个内容:

  • Type Script:用于存放 UDT 建立的逻辑规则,和 UUID 用于描述这个 UDT 的惟一性;
  • Lock Script:简单而言就是签名算法,解释谁能够解开这个 Cell;
  • Data:用于存放 UDT 的定义数据。建立者信息,建立 UDT 数量,小数点尾数等等。

UDT_BALANCE_CELL 这边主要包含几个内容:

  • Type Script:用于存放 UDT 转帐的逻辑规则,和 UUID 用于描述这个 UDT 的惟一性;
  • Lock Script:简单而言就是签名算法,解释谁能够解开这个 Cell;
  • Data:用于表示 UDT 的余额。

转帐:Transfer Action

file

UDT 的转帐会相对容易,销毁一部分 UDT,生成一部分新的 UDT 便可实现转帐。

Input Cells :
放入一部分 UDT_BALANCE_CELL(s) 做为 Input。

Output Cells :
放入一部分 UDT_BALANCE_CELL(s) 做为 Output。

扩展 Minimal UDT

上面咱们实现的是最小化 UDT,只设计了发币和转帐这两个最基础的功能。那对于其余的复杂的功能要如何实现呢?

增发/销毁:Mint/Burn Action

file

对于 UDT 的管理员,他可能须要对 UDT 进行一些增发和销毁的操做。这里就须要对于咱们上面建立的 UDT_ID_CELL 进行一些修改。

Input Cells :

  • 输入 UDT_ID_CELL,固然只有以前 UDT_ID_CELL 中 Lock Script 规定的管理员才能够进行这样的操做,不是谁均可以进行这样的操做的。
  • (optional) UDT_BALANCE_CELL:若是是销毁,就在这里输入须要销毁的 UDT 的地址和 UDT 数量。

Output Cells:

  • 输出新的 UDT_ID_CELL,这是规则发生更改后,新生成的 UDT_ID_CELL;
  • (optional) UDT_BALANCE_CELL:若是是增发,就在这里输入增发的 UDT 须要发送到的地址和 UDT 数量。

受权:Approve/Transfer_from

file

那么如何实现受权行为呢?同样的咱们能够在最小 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 个地址,也能够是另外一个合约。

file

在分享的最后,Cipher 还向你们介绍了一个 Token Swap 的例子。

加入 Nervos Community

Nervos Community 致力于成为最好的 Nervos 社区,咱们将持续地推广和普 及 Nervos 技术,深刻挖掘 Nervos 的内在价值,开拓 Nervos 的无限可能, 为每一位想要深刻了解 Nervos Network 的人提供一个优质的平台。

添加微信号:BitcoinDog 便可加入 Nervos Community,若是是程序员请备注,还会将您拉入开发者群。

相关文章
相关标签/搜索