Open Tx 协议头脑风暴[3]: CKB 上的场景分析
Cipher Wang
Nervos Core TeamNervos CKB 上的 OTX 场景
我认为设计协议的第一步应该是要考虑它的使用场景。Nervos CKB 是分层系统的安全之锚,它通过 lock script
和 type script
来支持 UTXO 模型下的交易结构和图灵完备的虚拟机。CKB 上的交易模式要比以太坊复杂得多,但它也提供了更多的可能性。
这里我列出了一些可能需要 open transaction 技术的场景。归功于 CKB 先进的框架,以下的示例都不需要进行额外的系统升级。
灵活的交易手续费收取模式
大多数区块链系统只支持原生代币作为交易手续费。将原生代币的价值与交易手续费绑定并不是一个完美的经济模型,因为交易手续费本质上是一个按优先级付费的模型,而不是一个按使用付费的模型。此外,不管用户拥有多少其他资产,也不管 DApp 运营商多么迫切地想要为用户支付手续费,系统都要求普通用户需要购买一些原生代币作为交易手续费,这非常奇怪。
在上面的演示中,Alice(初始化了 OTX#0)持有 100 USDT,然后要将其中的 20 USDT 转给 Bob,剩下的 80 USDT 作为找零。但是 Alice 没有原生代币可以用来支付交易手续费。然而,另一个人想要为这笔交易提供补贴,他/她就可以附加上 OTX#1 来提供足够的原生代币(作为手续费),这两个 open TXs 合并在一起,就组成了一笔完整的可验证的交易,并为矿工提供了足够的交易手续费。
对于更常见的情况,Alice 没有那么幸运,她必须自己支付交易手续费。还记得她并没有原生代币吗?她只需要简单地在找零中减去 1 USDT,并将其留给任何一位愿意为她支付交易手续费而提供足够的原生代币的人。另一个用户,或者矿工,谁可以附上一个 open transaction 来提供交易手续费,谁就可以拿走这部分 USDT 作为补偿。
类似于以太坊的智能合约调用
在 Nervos CKB 上每一笔交易都是确定的。客户端组装一笔交易时,必须将输出的状态都完全准备好。在某些情况下,这不是很方便,特别是对于那些管理共享状态的智能合约。
在上面的演示中,Alice 和 Bob 签名了两笔 open transactions,其中包含了他们各自状态的 cells 和在 witness 字段中他们的目的。让我们假设他们是在和像 Uniswap 这样的 DEX 在交互,user state cells
用来存储他们的存款信息,在 witness 字段中的 function arguments
用来存储他们的操作命令。操作命令将修改全局状态也包括它们自身的状态。因此,如果每个人都分别发送交易来分别修改它,它们将竞争全局状态 cell 的控制权,这是非常低效的。通过 open transaction,Alice 和 Bob 分别发送他们的状态的 cells 和目的,操作者、矿工或者其他任何人都可以将它们组装成一笔完整的交易,并计算结果、更新用户和全局状态。这将极大地减少网络拥堵并改善用户体验。
Lay 1.5 DEX(去中心化交易所)
OTX 可以用来加入用户的代币交换请求,并通过一笔交易完成这些请求。如上图所示,Alice 和 Bob 一个想要用 100 DAI 交换 700 CNYT,一个想要用 500 CNYT 交换 70 USDT。这个时候,一些中间人注意到了这些 OTXs,觉得其中有利润空间。中间人就可以通过一些必要的输入和输出补全这笔交易,在满足他人需求的同时也赚取了利润。
资产折现
折现是用现在的价格去决定一笔或者一系列将在未来收到的款项的过程。以 Nervos DAO 的存款为例,它们在解锁之前是不能使用的,但是它们的所有者可以按照现在的价格出售未来的取款权。
在本例中,存款所有者将在未来收到 110 万个 CKB 代币,但是所有者现在就需要这些代币。因此,所有者可以发布一个 OTX,并且只索要其中的 100 万个 CKB。如果其他人认为这是有利可图的,那他/她就可以补全这笔交易,发送 100 万个代币给到存款所有者,然后拿走存款单(其中额外的 1 万 CKBytes 作为交易手续费)。
往交易所存 UDT
CKB 上的 UDT 数据结构包含在 cell 的 data 字段中,你需要 CKBytes 来提供存储所需的空间。因此,当用户往交易所存 UDT 时,最简单的方法就是创建一个新的 cell,将存款数量写入 cell 的 data 字段中。这将需要花费用户额外的 CKBytes。在 CKBytes 在 UDT 转移中这部分内,Jan 提出了一个基于 OTX 的方法来解决这个问题,这里我对他的方法做了一些修改,以避免抢先交易攻击。
在这个演示中,Bob 和 Clare 存 220 和 1000 USDT 到交易所,他们需要要回他们的 CKBytes。Bob 和 Clare 的 OTXs 都需要一个带有交易所 lock 的 cell 作为输入,这样交易所可以收集这些存款,而没有其他人可以替换它。
OTX 协议应满足的要求
通过对于典型场景的分析,我们可以得出结论,CKB 上的 OTX 协议应该具有描述输入/输出,witness 和一个 cell 中特定字段的能力。这就是在上文,Open Tx 协议头脑风暴[2]: 在 CKB 上设计一个实用的协议,中定义的 Scope Level 2 (范围级别 2)
。看来我们不需要 Scope Level 3 (范围级别 3)
的协议。
我们需要对于(OTX 的)约束条件的描述是可组合的和反抢先交易攻击的。在下一篇文章中,我将给出一个可能在 CKB 上可行的建议。