【CKB.DEV 茶话会】如何在 CKB 上实现用户自定义 Token
本贴内容主要来自于 CKB.DEV 茶话会第一期,本期主题是:如何在 CKB 上实现 UDT,分享人是:Cipher 王博。
茶话会现场视频:
https://v.qq.com/x/page/x30304t25l4.html
CKB 的交易与合约模型
因为 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 的内容,经过分析,我们会发现 ERC20 是存在非常多问题的:
常见 ERC20 合约提供的方法和事件
- ERC20 仅定义了接口,未统一实现。你每创建一个新的 ERC20,都需部署一个新的合约,而用户很难一个个去了解每一个合约。另外由于每个新的合约都是开发者重新创建的,这导致很多的 ERC20 合约或故意或无意地出现了安全问题。
- ERC20 接口中用户的行为是耦合的。比如其中的 totalSupply,mint,burn 是管理员的行为;而 balanceOf,approve,transfer 是普通用户的行为,而 allowance,transferFrom 则是授权用户的行为。我们可以看到这一个 ERC20 的合约内至少耦合了三种用户的行为,是相对混乱的。
- ERC20 中的逻辑和数据是耦合的。合约的实现逻辑和用户地址下拥有的金额数据都是在这个合约内的,正因为这种耦合,因此以太坊上无法进行统一实现。
CKB 上实现 UDT 的设计思路:
- 逻辑与状态分离,使用统一的业务代码。安全将得到极大的保障。
- 用户行为、管理员行为、授权行为分离。
- 仅提供最核心的 UDT 功能。指提供最核心的 UDT 功能,保障开发者对 UDT 灵活性的需求。
- 采用面向状态,注重行为结果的设计模式,去定义 UDT 的行为。
最小化的 UDT
最小化 UDT 最核心的两大功能:一个是发币,这里需要定义 UDT 的基本信息,并保持 UDT 唯一性;另一个是转账,保证 UDT 前后的一致性。
发币:Create Action
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
UDT 的转账会相对容易,销毁一部分 UDT,生成一部分新的 UDT 即可实现转账。
Input Cells :
放入一部分 UDT_BALANCE_CELL(s) 作为 Input。
Output Cells :
放入一部分 UDT_BALANCE_CELL(s) 作为 Output。
扩展 Minimal UDT
上面我们实现的是最小化 UDT,只设计了发币和转账这两个最基础的功能。那对于其他的复杂的功能要如何实现呢?
增发/销毁:Mint/Burn Action
对于 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
那么如何实现授权行为呢?一样的我们可以在最小 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 Community 致力于成为最好的 Nervos 社区,我们将持续地推广和普 及 Nervos 技术,深入挖掘 Nervos 的内在价值,开拓 Nervos 的无限可能, 为每一位想要深入了解 Nervos Network 的人提供一个优质的平台。
添加微信号:BitcoinDog 即可加入 Nervos Community,如果是程序员请备注,还会将您拉入开发者群。
【CKB.DEV 茶话会】如何在 CKB 上实现用户自定义 Token的更多相关文章
- 【CKB.DEV 茶话会】第二期:聊聊 CKB 钱包和 Nervos DAO 全流程
CKB.DEV 茶话会第二期:聊聊 CKB 钱包和 Nervos DAO 全流程 为了鼓励更多优秀的开发者和研究人员参与到 CKB 的开发和生态建设中去,我们希望组织一系列 CKB Developer ...
- (转)如何在Windows上安装多个MySQL
原文:http://www.blogjava.net/hongjunli/archive/2009/03/01/257216.html 如何在Windows上安装多个MySQL 本文以免安装版的mys ...
- 如何在GitHub上大显身手?
推荐一篇良许大佬的文章,如何在github上大显身手.拥有自己的github,且有所贡献,这是一件很有意义的的事情,在面试上也是加分项哦,赶紧搞起来. 转载至http://uee.me/aHAfN 这 ...
- 如何在 GitHub 上高效阅读源码?
原文链接: 如何在 GitHub 上高效阅读源码? 之前听说过一个故事,一个领导为了提高团队战斗力,把团队成员集中起来,搞封闭开发,重点还是在没有网的条件下. 结果就是一个月过去了,产出基本为零. 我 ...
- 如何在Zabbix上安装MySQL监控插件PMP
PMP,全称是Percona Monitoring Plugins,是Percona公司为MySQL监控写的插件.支持Nagios,Cacti.从PMP 1.1开始,支持Zabbix. 下面,看看如何 ...
- 如何在MyEclipse上添加更换JRE
如何在myeclipse上添加更换JRE 由于兼容性的问题,有些WEB项目会依赖jdk的版本.如果需要更换jdk,那么,知道如何更换JRE的方法很有必要. 一种在myeclipse上添加和更换JRE的 ...
- 关于如何在github上创建团队开发环境
今天想写个如何在github上创建团队开发环境的博客.送给那些还不知道如何在github上创建团队开发环境的开发人员. 1.首先,当然你要有个github的账号.具体怎么注册我这里就不说了.可以上gi ...
- 如何在windows7上安装启明星系统。
启明星系统提供多种安装方式.安装包里自带了setup.exe.每个程序的 install下有在线安装(例如请假应用程序为book,则默认为 http://localhost/book/install ...
- 如何在Linux上通过grub添加内核参数
转自Linux中国 我们可以在linux内核启动时为其提供各种各样的参数.这些参数可以自定义内核默认的行为,或者通知内核关于硬件的配置信息.内核参数应在内核启动时通过引导装载程序,如GRUB或LILO ...
随机推荐
- OpenCV图像处理以及人脸识别
OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import ...
- 爬虫之selenium爬取京东商品信息
import json import time from selenium import webdriver """ 发送请求 1.1生成driver对象 2.1窗口最大 ...
- NOIP模拟 32
我在31反思中膜拜过了B哥 没想到这次又... 我给老姚家丢脸了...STO 首先T1暴力就写挂了... 贪图从$n^3$*$2^n$优化成$n^2$*$2^n$然后打错了 哗哗的扔分 而且正解都想不 ...
- 面试精选:JVM垃圾回收
Tips:关注公众号:松花皮蛋的黑板报,领取程序员月薪25K+秘籍,进军BAT必备! Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事情就是确定哪些对象是“活着的”,哪些是可 ...
- 因为 GitHub Actions 我发现了 Jake Wharton 的一个仓库
本文微信公众号「AndroidTraveler」首发. 背景 昨天(2019-11-14)上去 GitHub 上面一看,结果来了个下面的提示: 点进去一看: 看来是自动化构建相关的. 那就试一下,选了 ...
- Typescript I: 遍历Array的方法:for, forEach, every等
Typescript的官方文档 Iterators and Geneators (https://www.typescriptlang.org/docs/handbook/iterators-and- ...
- 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化
问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...
- PHP 教你使用 Swoole-Tracker 秒级定位 PHP 卡死问题
PHPer 肯定收到过这样的投诉:小菊花一直在转!你们网站怎么这么卡!当我们线上业务遇到这种卡住(阻塞)的情况,大部分 PHPer 会两眼一抹黑,随后想起那句名言:性能瓶颈都在数据库然后把锅甩给DBA ...
- [LC]219题 Contains Duplicate II (存在重复元素 II )
①英文题目: Given an array of integers and an integer k, find out whether there are two distinct indices ...
- windows 激活工具链接
链接:https://pan.baidu.com/s/1FphGFZhhLp01akGTDWjW2A 密码:f9t7