BTOA

比特币生态二级代币模型分析

2024-08-11 15:35 · 比特币

在比特币区块链上,有一些基于比特币原生交易进行封装的协议,其中最出圈的是 Ordinals 协议,也就是我们常说的铭文,除此之外,热门的协议还有 Atomicals 和今年区块减半后诞生的 Runes 协议。这些协议有一个共同点:它们都支持数字代币(Token)的发行、铸造、转移和销毁。我们常说的 BTC 和 ETH 其实也属于数字代币,只不过它们是公链代币,而上述协议发行的代币,可以简单认为是“二级代币”,因此它们的价值很大程度上和比特币价值相关。当然,本文并不讨论代币价值,而是讨论它们模型的不同之处。

与以太坊相比,比特币区块链的一个缺陷是并不支持链上智能合约,因此想要追踪这些协议所发行代币的链上行为,需要使用链下索引器。因此,如何设计这类代币的发行、铸造、转移和销毁等规则,对索引器的解析效率有着巨大的影响。目前,比特币生态的二级代币基本使用三种模型:

  • 基于聪(sat,比特币最小单位)位置的模型
  • 基于聪数量的染色币模型
  • 基于未花费输出(Unspent Transaction Outputs)的模型

Ordinals 协议

Ordinals 协议下最热门的铭文代币是 BRC-20 代币,它使用的是基于聪位置的模型和账户体系。比特币的总量是有限的,总共 2100 万枚,Ordinals 协议为每一个聪规定了具体的序号,称为序数理论,我们可以将 BRC-20 代币的转账信息铭刻在某一个具体的聪上,形成转账铭文(Transferable Token),并使用转账铭文构建比特币交易,在交易中找出这个聪输入位置对应的输出,就能确定 BRC-20 代币的转移链路。这种模型有巨大的缺点,下文中会详细谈到,我们先来看一个最基本的 BRC-20 代币转移交易,哈希如下:816c3906da5dd4b01dec6dab05b89fc247a25b8b0a6630408aab5e93864d5395

图中绿线框出的部分就是代币的转移输入和输出,可以看到它们的偏移量是相同的,因此通过这笔交易,这个 BRC-20 代币会转移到第一个输出的地址上,注意这里使用的是“地址”而不是“UTXO”或“聪”,是因为 BRC-20 代币的索引是基于账户体系的,若后续该地址把第一个输出花费掉,并不会导致该地址的 BRC-20 代币被转移。

那么,这种模型有什么缺点呢?由于这种模型和聪的位置强绑定,因此在单地址全签转移中问题不大,但在两个地址之间进行买卖操作时,特别是批量购买,买家支付的手续费就会比较高。我们来看一笔批量购买的交易,哈希如下:6eacaaf3ed55e25afd07564d5a0c48b38bc7fd34808eadf1fbb8e8f691e8321d

这笔交易是一个 BRC-20 代币的批量购买交易,存在三个卖家地址和一个买家地址,其中框出的绿色部分是代币转移链路,我们可以看到,在代币输入之前还有来自买家的 4 个 600 聪输入,并且这 4 个输入归集到了第一个 2400 聪的输出上(红色框)。这是比特币的签名特性造成的,因为输入的地址并不只一个,所以需要所有地址都对这一笔交易进行签名,买家地址为了保证自己的输入不会被恶意替换,会要求和输入对应的输出索引位必须具有指定数量的 BTC,在交易中这就是卖家收到的钱。假设我们把 4 个 600 聪的输入去掉,直接把卖家的交易依次放在输入最前面,这会发生什么问题呢?可以看到第五个输入,bc1p5xadtswe848mus7hz2s7c439l0qkef2qmwwxmmlh7q7hl0mftr0s8eq769 这个地址对应的输出必须是 12 万聪,因此当这个输入移到首位时,第一个输出就是 12 万聪,根据 BRC-20 代币的转移规则,前 3 个 546 聪的输入直接落在了第一个输出的偏移量中,因此所有的代币都给了第一个买家。买家 4 个 600 聪的输入,起到的作用是把代币转移位置精准限定到了第二到第四个输出上,然而,过多的交易输入和输出会导致手续费暴增,假如批量购买的代币来自 9 个不同卖家,买家就需要垫 10 个输入在开头。

其实这个例子举的不是很恰当,因为 BRC-20 代币是基于账户体系的,买家不需要对输出做任何拆分,以上面这个例子来说,第一个输入可以用 600 聪,对应第一个输出改为 2238 聪,这样就可以从第二个输入开始放卖家的代币了。但如果不是基于账户体系的代币,或者说 Ordinals 协议本身的 NFT 铭文,就需要买家确保每个 NFT 落在单一的 UTXO 输出中,而不是归集起来,否则他就需要在交易之前重新把 UTXO 按照偏移量拆分,这会导致整个流程更加复杂。

Atomicals 协议

Atomicals 协议的代币使用的是染色币模型,顾名思义,染色币就是对 BTC 进行染色形成的代币。在拆分功能出来之前,该协议发行的代币数量都是和聪绑定的,即 1 聪对应 1 个代币,换句通俗的话讲,假如我的铸造交易输出是 1000 聪,那么我铸造的代币数量就是 1000 个,下图就是 Atomicals 协议的一笔代币铸造交易。

Atomicals 协议代币的转移也基于染色币模型,默认情况下交易中所有输入的代币数量会归集到第一个输出中,当第一个输出的聪完全被染色后,若输入代币仍有剩余,就会继续染色第二个输出,依此类推。这种模型的优点是可读性好,即便不借助链下索引,我们也能根据交易直观地看出代币的转移链路和数量,并且,因为代币数和聪的数量强绑定,只要比特币还有价值,Atomicals 协议的代币就不会归零。然而,染色币模型是把双刃剑,它虽然保证了代币不会归零,但同时也导致了大量的比特币被占用,假如 Atomicals 协议的代币市场转冷,而其他协议突然变得热门,那么持有 Atomicals 协议代币的大户很可能会把已经染色的代币销毁转为 BTC,从而去铸造其他协议的代币,下图就是一笔较大的代币销毁交易。

从这里我们也能看出该模型的另一个缺点,Atomicals 协议的染色币模型是全染色而不是局部染色,这意味着每一个 UTXO 的聪必须完全覆盖代币数量,否则代币就会被销毁。举个例子,假如我的输入有 4000 个代币,输出有 3 个,第一个 1000 聪,第二个 2000 聪,第三个也 2000 聪,按照规则,第一个输出的 1000 聪全部被染色,之后还剩下 3000 个代币,继续染色第二个输出,最后还剩下 1000 个代币,不够染色第三个输出了,这时就会把 1000 个代币销毁,导致代币数量减少。这种染色规则需要确保输出的聪数量和代币数量完全一致,少了会导致找不到染色目标,多了会导致不够染色,都会造成代币销毁,对精确性要求很高。

Runes 协议

Runes 协议也是一个比较出圈的比特币协议,中文叫做“符文协议”,是 2024 年 4 月比特币减半后诞生的新协议。与上面两种协议不同,Runes 协议代币的载体不是“聪”,而是“UTXO”。虽然聪是比特币最小单位,但实际上比特币交易的所有输入输出都是指定数量的聪的合集。Runes 协议代币的绑定逻辑意味着,任意聪数量的 UTXO 都可以作为代币的载体,这就保证了该代币不会轻易被销毁,也不会占据过多的比特币。下图是 Runes 协议的一笔代币转移交易,可以看到输入的 5 个携带代币的 UTXO 在交易中被归集到了第一个输出中,这种归集是依靠 OP_RETURN 指令实现的。

与 Ordinals 协议对比,Runes 协议的批量购买功能更加简单,不需要买家垫上指定数量的聪,与 Atomicals 协议对比,也不需要精确计算聪的数量。这让我始终觉得 Runes 协议太过普通,它的代币转移和比特币交易并没有本质上的区别。目前我最感兴趣的还是 Ordinals 协议,先不说价值层面的贡献,光是如何追踪聪的转移链路就需要考虑很多技术上的问题,毕竟聪是有可能转移到矿工手上的。