染色币:Colored Coins
Colored Coins 的想法最早由 Yoni Assia,现 eToro 的 CEO,在 2012 年 3 月 27 日的编写的一篇名为 bitcoin 2.X (aka Colored bitcoin) 文章提出。 文章认为比特币作为底层技术是完美的,就像 HTTP 是网络的基础一样。因此在复用 BTC 的基础上去设计了 Colored Coins 这个代币协议。
Yoni Assia 希望通过这样的形式创建 BTC2.0 的经济 - 任何社区都可以通过这种方式来创建多种货币。这种将比特币作为底层技术用于清算交易和避免双重支付的方式在当时无疑于是非常大胆的想法。
Colored Coins 作为一种基于比特币发行资产的协议,其做法就是将一定数量的比特币「上色」以表示这些资产。这些标记的比特币在功能上仍然是比特币,但它们同时也代表了另一个资产或价值。但是这样的想法该如何在比特币上实现呢?
2014 年 7 月 3 日,ChromaWay 开发了增强型基于填充订单的着色协议(EPOBC),该协议简化了开发人员制造彩色硬币的过程,这便是最早采用 Bitcoin Script 的OP_RETURN功能的协议。
最终实现的效果如下图所示:

这样的实现非常简洁,但是由此也带来了很多问题:
1.同质化代币与最小绑定值
在创世交易中为某个染色币绑定了 1000 sat,则该染色币的最小分裂单位为 1 sat。这意味着该资产或代币可以被切分或分配为最多 1000 份(但是仅为理论上的,为了防止粉尘攻击,比如当年的 sat 都定在 546 SAT,后面到 ordinal 则是更高)。
2.验证问题
为了确定染色币的真实性和其所有权,需要从该资产的创世交易追踪验证到当前的 UTXO。因此需要专门开发钱包与配套的全节点,甚至是浏览器。
3.潜在的矿工审查风险
因为 ColoredTransaction 的特征较为明显,即在 output 中写入了 metadata 信息,这给矿工审查带来了可能性。
染色币实际上是一种资产跟踪系统,它使用比特币的验证规则来追踪资产转移。不过,为了证明任何特定的输出(txout)代表某一特定资产,需要提供一整条从资产起源到现在的转移链。这意味着验证某笔交易的合法性可能需要很长的证明链。为了解决这个问题当初也是有人提出了 OP_CHECKCOLORVERIFY 来帮助在 btc 上直接对 Colored Coins 的交易正确性进行验证,但是该提案也并没有通过。
加密行业的第一个 ICO:Mastercoin
Mastercoin 的最初概念由 J.R. Willett 提出。在 2012 年,他发布了一个名为「The Second Bitcoin Whitepaper」的白皮书,描述了在比特币的现有区块链上创建新的资产或代币的概念,这后来被称为「MasterCoin」。而再后来则改名为 Omni Layer。

Mastercoin 项目在 2013 年进行了一个初步的代币销售(今天我们称之为 ICO 或初始代币销售),并成功筹集了数百万美元,这被认为是历史上第一个 ICO。Mastercoin 最著名的应用则是 Tether (USDT),作为最知名的法币稳定币,最初是在 Omni Layer 上发行的。
其实 Mastercoin 的想法是要比 Colored Coins 出现得要早的,之所以在这里放在第二个去讲,是因为相对于 Colored Coins 来说,MasterCoin 是一个相对来说更重的方案。MasterCoin 建立了一个完整的节点层,从而提供了更为复杂的功能(如智能合约),Colored Coins 则更加简单和直接,主要侧重于「染色」或标记比特币 UTXO,以代表其他资产。
与 Colored Coins 最大的不同是,在链上 Mastercoin 只会去发布各种类型的交易行为,而不会记录相关的资产信息。在 Mastercoin 的节点中,会通过扫描比特币区块来维护一个状态模型的数据库在链下的节点中。

相对于 Colored Coins 来说,其能完成的逻辑要更加复杂。并且由于不在链上记录状态和进行验证,所以其交易之间可以不要求连续(持续染色)。
但为了实现 Mastercoin 的复杂逻辑,用户需要去相信节点中的链下数据库中的状态,或者自己允许 Omni Layer 节点来进行验证。
总结:
Mastercoin 与 Colored Coins 最大的差异在于,其没有选择在链上维护协议所需的所有数据,而是通过寄生了 BTC 的共识系统,来实现了自己交易发布和排序,然后在链下数据库中维护状态。
据 OmniBolt 的相关提供的消息:Omni Layer 正在向泰达提出新 UBA(UTXO Based Asset) 资产协议,会利用 Taproot 升级,把资产信息编入 tapleaf,从而做到条件支付等功能。与此同时 OmniBolt 正在将 Stark 引入 OmniLayer 的闪电网络设施。
客户端验证 (Client Side Validation) 思想
如果我们要去了解客户端验证的概念,那么我们就要把时间拉回到 Colored Coins 和 Mastercoin 出现的第二年,那便是 2013 年。Peter Todd 在这一年发布文章:Disentangling Crypto-Coin Mining: Timestamping, Proof-of-Publication, and Validation。虽然看文章名字上去和客户端验证没有关系,但是仔细阅读便可以发现这便是最早关于客户端验证的启蒙思想。
Peter Todd 是比特币和密码学的早期研究者,一直在寻找一种使比特币工作方式更高效的方法。他基于时间戳的概念开发了一个更为复杂的客户端验证概念。此外,他还提出了「single use seal」的概念,这将在后面有所提及。
现在让我们顺着 Peter Todd 的思想,先要去了解 BTC 实际上解决了什么样的问题。在 Peter todd 看起来 BTC 总共解决了三个问题:
1.证明的发布(Proof-of-publication)
证明的发布本质是解决双花问题,比如 Alice 有一些比特币想要转给 Bob,虽然通过签署了一笔交易转账给了 Bob,所以 Bob 在物理上并不一定知道有这么一笔转账的存在。所以我们需要一个公共的地方进行交易的发布,并且每个人可以从中对交易进行查询。
2.交易定序(Order consensus)
在计算机系统,并不存在我们平常感受的物理时间。在分布式系统这个时间通常是分布式时钟 lamport,这个时钟并不是为我们的物理时间提供度量,而是为我们的交易进行定序。
3.交易验证(Validation)(可选项)
BTC 上的验证便是关于签名和 BTC 转账金额的验证。但是在这里,Peter Todd 认为这个验证对于在 BTC 之上构建一个代币系统是非必要的,只是一个优化选项。
大家看到这里其实已经想到之前提到的 Ominilayer,OminiLayer 本身并没有把状态的计算和验证交给 BTC,但是它同样复用了 BTC 安全性。Colored Coins 则是把状态的追踪交给了 BTC。这两者的存在已经证明了验证并不一定要发生在链上。
那么客户端验证如何有效验证交易?
首先来看看哪些东西是需要被验证的:
状态(交易逻辑验证)
输入 TxIn 是否有效(防止双花)
很容易可以发现在 btc 上发布的资产,每次交易都需要校验整个相关的交易的历史,才能确保引用的输入是没有被消费并且状态是正确的。这非常不合理,那么如何去改进呢?
Peter Todd 认为,我们可以通过改变验证的焦点来简化这一过程。而不是确认一个输出没有被双重支出,这个方法重点放在了确认交易的输入已被发布,并且没有与其他输入冲突。通过对每个区块中的输入进行排序和使用 Merkle 树,可以更高效地进行这种验证,因为每次验证都只需要一小部分的数据,而不是该输入的整个链上的历史。
Peter Todd 提出的 commitment tree 结构如下:
CTxIn -> CTxOut -> <merkle path> -> CTransaction -> <merkle path> -> CT= xIn
但是我们该如何在链上存储这样一个 commitment tree 呢?所以在这里我们就可以引出一次性密封(single use seal)的概念了。
一次性密封 Single Use Seal
Single use seal 是理解客户端验证的核心概念之一,这与实际世界中用于保护货运集装箱的物理、单次使用的密封相类似。Single use seal 是一个独特的对象,可以确切地在一个消息上关闭一次。简言之,一次性密封是一个抽象的机制,用于防止双花。

对 SealProtocol 来说,有三个要素,两个动作。
基础要素:
l: seal, 即是密封
m: message, 消息
w:witness, 见证人
基本操作:有两个基础操作:
Close(l,m) → w:在消息m上关闭密封l,产生一个见证人w。
Verify(l,w,m) → bool:验证密封l是否在消息m上被关闭。
single use seal 的实现在安全性方面是无法被攻击者找到两个不同的消息m1和m2,并使得 Verify 函数对同一个密封返回true的。
首先一次性密封(Single-Use Seal)是一个概念,它确保某种资产或数据只被使用或锁定一次。在比特币的环境中,这通常意味着一个 UTXO(未使用的交易输出)只能被消费一次。因此,比特币交易的输出可以被看作是一次性密封,而当这个输出被用作另一个交易的输入时,该密封就被「打破」或「使用」了。
对于在 BTC 上的 CSV 资产来说,比特币自己就充当了一次性密封的「见证人」(witness)。这是因为,为了验证一个比特币交易,节点必须检查交易的每个输入是否引用了一个有效且尚未花费的 UTXO。如果一个交易试图双重花费一个已经被使用的 UTXO,那么比特币的共识规则和全网的诚实节点会拒绝该交易。
能不能再简单一点?
single use seal 就是把任意一个区块链当作一个数据库,我们将某个消息的承诺通过某种方式存入这个数据库里,并且为它维护一个已消费或者待消费的状态。
是的,就是这么简单。
综上所述,客户端验证的资产有以下特点:
- 链下数据存储:客户端验证的资产其交易历史、所有权和其他相关数据大多数都存储在链下。这大大减少了链上的数据存储需求,并有助于提高隐私。
- 承诺机制:虽然资产数据存储在链外,但对这些数据的更改或转移会通过承诺(commitments)被记录到链上。这些承诺使得链上的交易能够引用链外的状态,从而确保链外数据的完整性和不可篡改性。
- 链上见证者(不一定是 BTC):虽然大部分数据和验证都在链外,但通过嵌入到链上的承诺,客户端验证的资产仍然可以利用基础链的安全性(证明的发布,交易的排序)。
- 验证工作在客户端完成:大部分验证工作都在用户设备上完成。这意味着不需要全网节点都参与验证每笔交易,只有涉及到的参与者需要验证交易的有效性。
对于使用客户端验证资产的人来说,还会有一点需要注意:
在链下交易和验证客户端验证的资产的时候,不仅要出示持有资产的私钥,也要同时出示对应资产的完整的 merkel 路径的证明。