作者:Hanssen;翻译:saku;原文链接:
https://talk.nervos.org/t/en-cn-misc-single-use-seals/8279
一次性密封是 RGB/RGB++ 协议的基石,它拓展了比特币的能力。但究竟什么是一次性密封(Single-Use-Seals, SUS)?我们如何在区块链上实现它?你知道一次性密封在 RGB++ 协议提出之前就已经存在于 CKB 的技术架构之中了吗?
我们将简要讨论以上问题,并展示一些基于一次性密封理念的 CKB 脚本设计。
什么是 SUS?
为了实现一次性密封,我们建议矿工证明一系列关于键值对集的真值表达式的内容。键是表达式,值是声明,它们与(可丢弃的)witness 一起组成了表达式的参数。一旦一个表达式被加入了封条集,与它相关联的值就不能被改变。
Peter Todd - Closed Seal Sets and Truth Lists for Better Privacy and Censorship Resistance
下面这张图来自 Peter Tod 的 SUS 实用例子,它生动而准确地描述了 SUS:就像现实生活中的封条一样,它们封上就不能再打开,且每个都有唯一标识。
想象一下,在数字世界,你可以拥有独一无二且不可摧毁的封条来封印任何数据,而任何人(包括你自己)都无法伪造这些印章,这就是 SUS。
简单易懂 SUS
当我们花费一笔输出时,我们的目标是让花费的资金流向另一组输出上,通过将这组输出的分配提交到这些一次性密封上的方式。
Peter Todd - Closed Seal Sets and Truth Lists for Better Privacy and Censorship Resistance
在区块链世界中,UTXO(Unspent Transaction Outputs)是用户储存资产的地方。用户通过交易转移他们的资产的过程,基本上就是消耗 UTXO,并为其他人创建新的 UTXO。
SUS 和 UTXO 的天然一致性,使得一次性密封在 UTXO 模型上的设计上直接而又简单。我们可以将 TXO(Transaction Outputs)视为我们的封条,而在区块链上提交的的每笔交易都可以被视为将其数据封入所有的输入 TXO。这么一来,我们就完成了 UTXO 模型上的一次性密封设计:交易的输出满足我们对一次性密封的所有要求:
被封上的封条不能被毁坏,因为我们需要花费 TXO 来封上封条,而一笔钱不能被花费两次。
封条是独特的,而且不能被伪造,因为所有的 TXO 都是独特的。
我在将数据封入前我们就可以拥有封条,因为创造和花费 TXO 是分开的过程。
封条链和 Type ID
Type ID 描述了一种通过使用特殊的 type script 来创造单例类型的方式——即在这个 Type 下只有一个 Live Cell。
CKB RFC 0022 - CKB Transaction Structure
我们可以通过在关闭一个封条时将新封条连接到其上,从而创建封条链。这种方法简化了验证过程,因为验证者只需要在初始封条上达成共识,就可以通过封条链来获取最新的封条。尽管,这同样意味着验证者必须检索整个封条链来验证最新的数据。
得益于CKB的图灵完备虚拟机和它的扩展 UTXO 模型—— Cell 模型,我们可以在封条中包含更多信息。CKB 上的 Cell 与 BTC 上的 UTXO 的不同之处在于,Cell 可以存储任意数据,这些数据的转换受到 “Type” Script 的限制。
在 CKB 的 Type ID 方案中,我们要求封条链上的每个封条都必须包含第一个封条的 ID 作为起始信息。Type ID 意味着 Type Script 赋予了 Cell 唯一的 ID,并限制其在封条链的开始到结束的过程中 ID 都不能被更改。这个 ID 允许验证者仅通过 CKB 上的通用索引器就可以检索最新的封条。
更多 CKB 上的 SUS
Single Use Lock:这种 Lock 需要消耗指定的 Live Cell 才能解锁。正如我们先前所言,一个封条只能被封上一次。因此,Single Use Lock 只能被解锁一次。
Type Proxy Lock:这种 Lock 需要使用带有特定 Type Script 的 Cell 进行解锁。在这种 Type Script 是 Type ID 的情况下,只有拥有更新封条链全限的人才能进行解锁。
资产发行权限控制是这两种 Script 的一个实际应用场景。在 CKB 的 xUDT 协议中,发行者可以在证明他们能够解锁 Owner lock 时铸造新代币。仅使用简单的基于签名的 Lock,我们无法确定发行者是否仍然拥有他们的私钥,这意味着他们总是可以铸造新代币,使得每种资产都可以无限增发。
在这里,Single Use Lock 为我们提供了解决方案。消耗指定 Cell 后,由于没有人能够解锁 Owner lock 来铸造新代币,我们可以相信代币供应量确实有上限。
作为一种更灵活的解决方案,代币发行者可以使用 Type Proxy Lock 将铸造权限绑定到 Type ID Cell。它就像一把无法被伪造的钥匙,可以交给其他人,或是被销毁。