BTC生态扩容方案综述
文章转载:https://zhuanlan.zhihu.com/p/673573388
最后更新于
文章转载:https://zhuanlan.zhihu.com/p/673573388
最后更新于
原始作者:解旻
2023年12月6日,在比特币投资者们都在为铭文(Inscriptions)给比特币带来的涨幅而欢呼的时候,Bitcoin Core节点客户端的开发者Luke Dashjr浇来了一盆冷水。他认为铭文是一种“垃圾邮件”攻击,并提交了修复代码及CVE漏洞报告(CVE-2023-50428)。随后比特币社区炸开了锅,继2017年硬分叉的混乱之后,比特币社区再次陷入激烈的辩论中。
那么比特币应该更注重安全性而舍弃掉一些意料之外的feature呢,还是应该更加包容意料之外的创新而稍微容忍一点可能的安全性问题呢?
我们知道,比特币的旅程不仅仅是投机和炒作,更是其生态系统和安全格局不断演化的历程。本文旨在深入探讨比特币增长的双重叙事:其生态系统内不断扩展的效用和安全措施的强化。我们将探索创新与强大的安全协议的协同作用,如何为数字资产的新时代铺平道路。
我们知道作为加密货币革命的基石,比特币一直被人们当做黄金一样进行价值存储,在其他公链DEFI创新如火如荼之时,人们似乎都已经忘了比特币的存在。
然而,恰恰是在比特币上,先驱者们最早开启了稳定币、Layer2、甚至DEFI的实验,比如现在币圈的硬通货USDT最早就是发行在比特币Omnilayer网络上,下图就是从技术实现角度对比特币生态的一个基本分类。
包括基于双向锚定的侧链、基于输出脚本(OP_RETURN)的文本解析、基于Taproot脚本的铭刻、基于BIP300更新升级的驱动链和基于状态通道的闪电网络等技术。
上面可能很多术语大家还不了解,不着急,我们先熟悉以下的基础知识,然后再一一讲解这些生态的技术原理并探讨其中的安全问题。
与以太坊的账户余额体系不同,比特币的系统中并没有账户这个概念。以太坊引入了四颗棵复杂的Merkle Patricia Trie来存储和验证账户状态的变化。与之相比,比特币巧妙的利用UTXO来更加简洁的解决了这些问题。
以太坊的四棵树
比特币的输入与输出
UTXO(Unspent Transaction Outputs,未花费的交易输出),这个名字听上去特别拗口,但其实搞清楚输入、输出和交易这三个概念后,就很好理解了。
熟悉以太坊的朋友应该知道,交易(transaction)是区块链网络中基本通信单位,一旦交易被打包出块和确认,就意味着链上状态变更的确定。而在比特币的交易中,并不是单一的地址对地址的状态操作,而是多个输入脚本和输出脚本构成。
上图是一笔非常典型的比特币2对2交易。理论上,输入的BTC数量和输出的BTC数量应该相等,实际上输出比输入少的部分的BTC就作为矿工的手续费由出块矿工赚取,等同于以太坊中的Gas Fee。
我们可以看到两个输入地址在转移BTC的同时,需要在输入的脚本中做验证,证明这两个输入地址可以花费这两笔输入(也就是上一笔的未花费输出,UTXO),而输出脚本,则规定了花费两笔输出比特币的条件,也就是在下一次将这笔未花费的输出作为输入时,应满足什么条件(一般普通转账,条件就是输出地址的签名,例如上图,P2wPKH表示需要taproot地址的签名验证,P2PKH则表示需要legacy 地址私钥的签名)。
具体来说,比特币交易其数据结构如下:
版本
这笔交易参照的规则
4 字节
输入数量
交易输入列表的数量
1 - 9 字节
输入列表
一个或多个交易输入
不定
输出数量
交易输出列表的数量
1 - 9 字节
输出列表
一个或多个交易输出
不定
锁定时间
锁定时间
4 字节
在比特币交易中,基本结构由两个关键部分组成:输入和输出。输入部分指明了交易的发起方,而输出部分则指明了交易的接收方和找零(如果有的话)。交易费用则是输入总额与输出总额的差额。由于每一笔交易的输入都是之前某笔交易的输出,因此交易的输出成为了交易结构的核心要素。
这种结构形成了一种链式连接。在比特币网络中,每一笔合法的交易都可以追溯到之前的一个或多个交易的输出。这些交易链的起点是挖矿奖励,而终点则是当前尚未被花费的交易输出。网络中所有未花费的输出统称为比特币网络的UTXO(Unspent Transaction Output)。
在比特币网络中,每笔新交易的输入必须是未花费的输出。此外,每个输入还需要前一笔输出的对应私钥签名。比特币网络中的每个节点都存储着当前区块链上的所有UTXO,以此来验证新交易的合法性。通过UTXO和签名验证机制,节点能够在不追溯整个交易历史的情况下验证新交易的合法性,从而简化了网络的运行和维护过程。
比特币独特的交易结构是符合其白皮书《Bitcoin: A Peer-to-Peer Electronic Cash System》设计的,比特币是一个电子现金系统,其交易结构就是在模拟现金的交易过程,一个地址上可以花费的数量取决于之前收到的现金数量,每笔交易都是要把这个地址上的所有现金都整体花费出去,而交易的输出地址通常一个是接收地址,一个是找零地址,就像在超市使用现金交易时的找零。
在比特币网络中,脚本扮演着至关重要的角色。事实上,比特币交易的每个输出实际上是指向一个脚本,而不是一个具体的地址。这些脚本就像一组规则,定义了接收方如何才能使用输出中锁定的资产。
交易的合法性验证依赖于两种脚本:锁定脚本和解锁脚本。锁定脚本存在于交易的输出中,用于定义解锁该输出所需的条件。解锁脚本则与之相对应,必须遵循锁定脚本定义的规则来解锁UTXO资产,这些脚本位于交易的输入部分。这种脚本语言的灵活性使得比特币可以实现多种条件组合,展示出其作为“部分可编程货币”的特性。
在比特币网络中,每个节点都运行着一个堆栈解释器,用于基于“先进先出”的规则解释这些脚本。
最经典的比特币脚本主要有两种常用类型:P2PKH(Pay-to-Public-Key-Hash)和P2SH(Pay-to-Script-Hash)。P2PKH是一种简单的交易类型,其中接收方只需用相应的私钥签名即可使用资产。P2SH则更为复杂,例如在多重签名的情况下,需要多个私钥的组合签名才能使用资产,或者一段op_if的分支逻辑。
这些脚本和验证机制共同构成了比特币网络的核心运作方式,确保了交易的安全性和灵活性。
比如在比特币中,P2PKH的output脚本规则如下:
Input 则需要提供签名
而P2SH的output脚本规则如下:
Input需要提供多签列表
在上述的2种脚本规则里,Pubkey script代表着锁定脚本,Signature script代表着解锁脚本。OP_开头的单词是相关的脚本命令,也是节点所能解析的指令。这些命令规则根据Pubkey script的不同来进行划分,它也决定着解锁脚本的规则。
比特币中的脚本机制相对简单,只是一个基于堆栈式的,解释相关OP指令的引擎,能够解析的脚本规则并不是太多,不能实现很复杂的逻辑。但它为区块链可编程提供了一个原型,后续一些生态项目其实是基于脚本的原理发展起来的。而随着隔离见证和Taproot的更新,OP指令的类型变得更加丰富,每笔交易可包含的脚本大小得到了扩容,比特币生态迎来了爆发式的增长。
铭文技术的火爆,离不开比特币的隔离见证和Taproot更新。
技术上看,区块链的去中心化程度越高,其效率通常越低。以比特币为例,它的每个区块的大小仍然维持在1MB,与中本聪最初挖出的第一个区块大小相同。面对扩容的问题,比特币社区并没有选择简单直接地增加区块大小这一路径。相反,他们采取了一种名为“隔离见证”(Segregated Witness,简称SegWit)的方法,这是一种不需要进行硬分叉的升级方案,旨在通过优化区块中的数据结构来提高网络的处理能力和效率。
在比特币交易中,每笔交易的信息主要分为两个部分:基础交易数据和见证数据。基础交易数据包括了诸如账户资金结余等关键财务信息,而见证数据则用于验证用户的身份。对用户来说,他们主要关心的是与资产直接相关的信息,如账户资金结余,而身份验证的细节并不需要在交易中占用太多资源。换句话说,接收资产的一方主要关注的是资产是否可用,而不必过分关注发送方的详细信息。
然而,在比特币的交易结构中,见证数据(即签名信息)占据了大量的存储空间,这导致转账效率降低和交易打包成本增加。为了解决这个问题,隔离见证(SegWit)技术被引入,它的核心思想是将见证数据从主要的交易数据中分离出来,并单独存储。这样做的结果是优化了存储空间的使用,从而提高了交易效率并减少了成本。
这样,原有的1M大小区块不变的情况下,每个区块可以容纳的交易更多,而隔离见证数据(也就是各种签名脚本)则可以占用额外的3M空间,为Taproot脚本指令的丰富奠定了存储基础。
Taproot是比特币网络的一个重要软分叉升级,旨在提高比特币脚本的私密性、效率,以及智能合约的处理能力。这次升级被认为是自2017年SegWit升级之后的一个主要进步。
这次Taproot升级包括了三个不同的比特币改进提案(BIP):Taproot(默克尔抽象语法树, MAST)、Tapscript,以及一个全新的多签友好的数字签名方案,称为“Schnorr签名”。Taproot的目的是为比特币用户提供多种好处,包括提高交易的私密性和降低交易成本。此外,它还将增强比特币在执行更复杂交易方面的能力,从而扩展其应用范围。
Taproot更新直接影响了3个生态:一个是ordinals协议,它利用了Taproot的script-path spend scripts脚本来实现附加数据;另一个是闪电网络升级为Taproot Asset,从简单的点对点BTC支付进化为点对多且支持发行新的资产;还有一个就是新提出的BitVM,通过Taproot中的op_booland和op_not来把bool电路“蚀刻”到Taproot脚本里,从而实现智能合约虚拟机功能。
Ordinals是Casey Rodarmor在2022 年 12 月发明的协议,它为每个聪(Satoshi)赋予独特序列号,并在交易中追踪它们。任何人都可以通过 Ordinals 在UTXO的Taproot脚本中附加额外的数据,包括文本、图片、视频等。
熟悉Ordinals的朋友一定知道:比特币总量是2100万个,每个比特币包含10^8个Satoshi(聪),所以比特币网络上一共有2100万*10^8个聪,Ordinals协议会将这些聪区分出来,每个聪都有一个唯一的编号。这是理论上可以做到的,但是实际上做不到。
因为BTC网络出于抵御粉尘攻击的原因,转账有一个最少546聪(segwit最少294聪)的限制,也就是不可以1聪1聪的转账,根据转账的地址类型,至少要转546聪或294聪,而根据Ordinals先进先出的编号理论,至少每个区块的1号~294号聪是不可分割。
所以所谓的铭刻,并不是铭刻在某个聪上的,而是铭刻在一笔交易的脚本中,而这笔交易至少要包含294聪的转账,然后由中心化的indexer(比如unisat)来追踪和识别这294聪或456聪的转移情况。
原则上Taproot脚本的花费只能从现有的Taproot输出中进行,所以铭文理论上应该是通过一个两阶段的提交/揭示程序来进行的。首先,在提交交易中,创建一个基于script path spend的内容的Taproot输入,并在输出中指明花费/掲示的签名条件。其次,在揭示交易中,由提交交易创建的输出被花费,揭示链上的铭文内容。
不过在现实的indexer场景中,并不十分关注掲示交易的作用,而是直接在输入脚本中读取由一个OP_FALSE OP_IF ... OP_ENDIF组成的脚本片段,从其中读取铭文的内容。
因为OP_FALSE OP_IF的指令组合会导致该段脚本不会被执行,所以可以在其中存储任意内容的字节,而不影响原本脚本的逻辑。
一个包含字符串 "Hello, world!"的文本铭文被序列化如下:
Ordinals协议本质上就是将这一段代码序列化到Taproot脚本里面。
我们从链上找一笔交易来详细说明ordinals的编码原理:
885d037ed114012864c031ed5ed8bbf5f95b95e1ef6469a808e9c08c4808e3ae
我们可以查看这个交易的详细信息:
我们对witness字段从0063(OP_FALSE OP_IF)开始的编码进行分析,可以了解序列化的编码内容:
OP_FALSE
1
0
OP_IF
1
63
protocol name len
1
3
protocol name
3
6f7264
ord
OP_1
1
1
OP_1
1
1
content type len
1
0a
10
content type
24
746578742f706c61696e
text/plain
OP_0
1
0
inscription len
1
0d
13
inscription
58
3832313933372e6269746d6170
821937.bitmap
OP_ENDIF
1
68
所以只要我们能把这见证脚本中的这部分的代码解码出来,就能知道铭刻的内容了。这里编码的是纯文本信息,其他数据比如html、图片、视频等也都是类似的。
理论上你也可以定义自己的编码内容,甚至是只有自己知道的加密内容,只不过这些内容不能在ordinals浏览器中显示。
2023年3 月 9 日,一位名叫 domo 的匿名Twitter 用户在推特上发布了一条推文,在 Ordinals Protocol 之上创建一个同质化代币标准,称之为BRC20标准。这个想法是可以通过Ordinals协议将 JSON字符串数据刻在Taproot脚本中,以部署、铸造和传输同质化的 BRC-20 代币。
图 1:BRC-20 代币的卑微开端(domo 关于该主题的第一个帖子)
来源:Twitter(@domodata)
图 2:BRC-20 代币可能的三个初始操作(p = 协议名称,op = 操作,tick = 股票代码 / 标识符,max = 最大供应量,lim = 铸造限制,amt = 数量)
来源:https://domo-2.gitbook.io/brc-20-experiment/,币安研究
Token的发起方通过deploy将brc20代币部署上链,然后参与者通过mint来几乎无成本的获取Token(只有矿工费),当mint数量超过max后,mint铭文的铭刻会被indexer认为是无效的。这之后,拥有Token的地址可以通过transfer铭文来转移Token。
值得注意的是,Ordinals的创始人Casey,对BRC-20 的交易占据了 Ordinals 协议的大部分比例非常不爽。他曾公开表示 BRC-20 给他创造的 Ordinals 带来了一堆垃圾。所以,Casey 团队公开发信,让币安把 ORDI 代币介绍中的 Ordinals 删掉,他不想让 Ordinals 协议和 ORDI 扯上关系。
BRC20 swap
目前铭文交易最大的市场、indexer以及钱包供应商unisat针对BRC20的交易提出了BRC20 swap协议,现在已经可以允许早期用户进行试用。
之前的铭文交易,只能通过一种叫做PSBT(部分签名的比特币交易)的方式来进行,和Opensea的链下签名方案类似,通过中心化的服务来“撮合”买卖双方的签名。这就导致BRC20资产只能像NFT资产那样通过挂单方式来交易,流动性和交易效率都很低。
brc20 swap通过在brc20协议的json串中,引入了一种叫模块的机制,这个模块中可以部署一套类似智能合约的脚本。以swap模块为例,用户可以通过transfer将BRC20锁入模块中,也就是发起一笔给自己的转账交易,但是交易中的铭文被锁在模块中,用户在完成交易,或撤出LP后,可以发起一笔交易,再把brc20代币提取出来。
目前,brc20 swap采用黑模块的扩展模式运行,黑模块是出于安全考虑,在未经共识和验证的情况下,通过模块中的资金总和来确定用户可以提取的资金,也就是任何用户不能提取超过锁入模块资产总和的资产。
当黑模块的行为被用户理解和执行,逐步变得可靠,逐渐被更多索引者接受后,产品从黑模块过渡到白模块,达成共识升级。用户也就可以自由充提资产。
此外,因为brc20协议乃至整个Ordinals生态依然处于早期,Unisat占据较大影响力和声誉,其为协议提供了完整的交易和余额查询等索引服务,有一家独大的中心化风险。其模块化运行的架构,使得更多服务商可以参与进来,从而实现索引更加去中心化。
BRC420
Brc420协议由RCSV开发。他们在原有铭文的基础上,增加了递归索引的扩展。通过递归的方式定义了更复杂的资产格式。同时,Brc420 在单个铭文的基础上建立了使用权和版税之间的约束关系。当用户mint资产时,需要给创作者支付版税,并且拥有一个铭文时可以分配其使用权并为其设定价格,此举可激励Ordinals生态更多创新。
Brc420的提出为铭文生态提供了更广阔的想象空间,除了可以通过递归引用构建更复杂的元宇宙外,也可以通过代码铭文的递归引用,来构建智能合约生态。
ARC20
ARC20代币标准是由Atomicals协议提供的,在这个标准中,“原子”是基本单位,构建在比特币的最小单位聪(sat)之上。这意味着每个ARC20代币始终由1个sat支持。此外,ARC20还是首个通过工作量证明(PoW)铭文铸造的代币协议,允许参与者通过类似挖掘比特币的方式直接挖掘铭文或NFT。
将1个ARC20代币等同于1个sat带来了多个好处:
首先,每个ARC20代币的价值永远不会低于1个sat,这使得比特币在此过程中充当了一种“数字黄金锚定”的角色。
其次,验证交易时只需查询与sat相对应的UTXO,这与BRC20需要链下账本状态记录和第三方排序器的复杂性形成对比。
此外,ARC20的所有操作都可以通过比特币网络完成,不需要额外的步骤。
最后,由于UTXO的可组合性,理论上可以实现ARC20代币与比特币的直接交换,这为未来的流动性提供了可能性。
Atomicals协议为ARC20代币设置了Bitwork Mining的特殊前缀参数。代币发行者可以选择特殊前缀,而用户要通过CPU挖矿计算出匹配的前缀后,才能获得铸造该ARC20代币的资格。这种“一CPU一票”的模式与比特币原教旨主义者们的理念相符。
铭文看上去只是一段“无害”的文本上链,并通过中心化的indexer来解析,似乎安全问题只是中心化服务上的安全考虑,但在链上安全方面,还是需要注意以下几点:
增加节点负担:铭文会增加比特币区块的大小,这会增加节点在网络传播、存储和验证区块时所需的资源。如果铭文过多,会降低比特币网络的去中心化程度,使网络更容易受到攻击。
降低安全性:铭文可以用于存储任何类型的数据,包括恶意代码。如果恶意代码被添加到比特币区块中,可能会导致网络安全漏洞。
交易需要构造:铭文的交易需要进行交易的构造,并且关注ordinals的先入先出规则,以防止由于疏忽导致铭文的索引性被破坏。
买卖存在风险:铭文的交易市场,不论是OTC还是PSBT,都存在资产损失风险
以下是一些具体的安全问题:
孤块率和分叉率增加:铭文会增加区块的大小,这会导致孤块率和分叉率增加。孤块是指没有被其他节点承认的区块,分叉是指网络中存在多个竞争的区块链。孤块和分叉会降低网络的稳定性和安全性。
攻击者篡改铭文:攻击者可以利用铭文的开放性进行篡改攻击。例如,攻击者可以将铭文中存储的信息替换为恶意代码,从而在渗透进indexer的服务器或通过木马入侵用户设备。
钱包使用不当:如果钱包使用不当,钱包不能索引铭文的情况下,很可能错误的转移走铭文,导致资产损失。
钓鱼或诈骗:攻击者可能通过假冒的unisat等indexer网站,来诱导用户进行铭文交易,从而窃取用户资产。
PSBT签名疏漏:Atomicals Market曾经因为错误的签名方法使用,而导致用户资产受损:
为了解决这些安全问题,可以采取以下措施:
限制铭文的大小:可以限制铭文的大小,以减少对节点负担的影响,这一点文章开头提到的Luke已经在做了。
对铭文进行加密:可以对铭文进行加密,以防止恶意代码的攻击。
使用可信的铭文来源:可以使用可信的铭文来源,以防止签名问题和被钓鱼。
使用支持铭文的钱包:使用支持铭文的钱包来进行转账活动。
注重铭文代码及相关脚本的审核:在brc20-swap及递归铭文的新型实验中,由于代码和相关脚本的引入,需要确保这些代码及脚本的安全性。
从技术和安全的角度说,比特币铭文本质上还是一种规则绕过的漏洞,taproot脚本并不是为了存储数据而出现的,其安全性也存在一些问题。Luke对bitcoin core代码的修改从安全角度来说是正确的。Luke并未对比特币的共识层进行直接修改,而是选择调整Spam Filter(策略过滤器)模块,使得节点在接收到P2P广播消息时,能够自动过滤掉Ordinals交易。在这个策略过滤器中,有多个名为isStandard()的函数用于检查交易的各个方面是否符合标准。如果交易不符合标准,节点接收到的这笔交易将会被迅速丢弃。
换言之,尽管Ordinals交易最终还是可以被加入区块链,但大多数节点不会将这类数据加入交易池,这将增加Ordinals数据被愿意将其打包上链的矿池接收的延时。然而,如果某个矿池广播了一个包含BRC-20交易的区块,其他节点仍然会对其进行认可。
Luke已经在Bitcoin Knots客户端中推出了对策略过滤器(policy)的修改,并且计划在Bitcoin Core客户端中引入类似的更改。在这次修改中,他引入了一个新的参数,名为g_script_size_policy_limit,用于在多个不同的位置限制脚本的大小。这一改动意味着在处理交易时,脚本大小将受到额外的限制,影响着交易的接受和处理方式。
目前,该参数的默认值是1650Bytes,任何节点客户端都可以在启动时通过参数-maxscriptsize来设置:
不过即使代码更新,距离矿工节点全部更新为新版本还有很长的一段时间,这段时间,铭文社区的创新者们应该可以创造出更安全的协议。
上一节我们提到了用递归铭文来实现智能合约的可能性,但是因为Luke对Taproot脚本的限制,递归铭文似乎有了一些障碍,那在比特币网络上实现智能合约有没有其他的可能性呢?
区块链开发商ZeroSync的联合创始人Robin Linus,在2023年10月9日发表了一篇名为“BitVM:在比特币上进行所有运算(BitVM:Compute Anything on Bitcoin)”的论文,其中提出了一个计划,旨在将智能合约引入比特币区块链。
该论文提出了一个非常有趣的思路,可以用taproot完成几乎所有的任意计算,并使用这些计算来验证在比特币链下发生的事情。其中的诀窍是,将所有的逻辑都放在链下,并在其他人断言了不诚实的结果时,在链上用少数几步计算来挑战这些结果。
换句话说,就是将一个Verifier的逻辑放在比特币网络中,利用比特币的强共识安全,成为任何图灵完备运算层的可信第三方,再用Optimistic Rollups 的原理,来实现链外计算结果的验证。
那么怎么实现将一段Verifier的逻辑放在比特币网络中呢?为了和上一节的“铭刻”相呼应,我愿称之为在比特币网络上进行电路“蚀刻”的技术。
在你的电脑或手机内部,电流通过传递一系列的1和0来实现计算机的所有功能。这是通过数以百万计的微小组件——逻辑门(logic gates)——来实现的。这些逻辑门是构成计算机芯片的基本元素。
每个逻辑门都会接收一个或两个“比特(bit)”的信息,每个比特要么是1,要么是0。然后,逻辑门根据设定的规则执行一个简单的逻辑运算,如“与(AND)”、“或(OR)”或“非(NOT)”等操作。这些运算产生的结果同样是一个比特,也是1或0。完成运算后,这个结果又被传递到下一个逻辑门。
这种基于简单逻辑运算的系统产生了启示:即使是最复杂的计算和功能,也都可以通过组合大量简单的逻辑运算来实现。这种逻辑门的组合和协作是现代计算机和电子设备能够执行复杂任务的基础。通过这些基本的逻辑操作,电脑能够处理复杂的算术运算、数据存储、图像渲染等功能。
下图是一个非常特殊的逻辑门,叫做“与非门”(NAND gate),它可以构造任意类型逻辑门电路,当然,它不可能有其它专用类型的门那么高效,但还是能做到的。BitVM的逻辑门电路就由与非门组成。
在现有的比特币脚本上构造与非门(NAND gate)可以通过结合哈希锁和两个可能不太为人所熟知的操作码:OP_BOOLAND和OP_NOT来实现。
首先,哈希锁可以用来创建一个分支脚本,这个脚本可以通过两种方式中的一种来花费:要么满足哈希锁,要么满足哈希锁B。这样,路径A将1输出到堆栈,而路径B将0输出到堆栈。
通过满足特定哈希锁,你可以"解锁"一个比特,这个比特作为我们要构造的NAND门的输入之一。由于你只能满足其中一个路径的要求,所以这种方法只允许用户一次提交一个比特。
与非门的逻辑是接收两个比特作为输入,输出一个比特。如果两个输入比特都是1,则输出0;如果输入是其他组合,则输出1。使用两个哈希锁技巧,可以提交这两个输入,并验证输出是否正确,这就是OP_BOOLAND和OP_NOT的用途所在。
OP_BOOLAND的操作与与非门相反:如果两个输入都是1,则输出1;任何其他输入组合都会产生0。OP_NOT则输出与输入相反的值。因此,通过结合使用这两个操作码,可以在脚本堆栈中取两个输入并进行反和操作。最后,可以使用OP_EQUALVERIFY以及哈希锁技巧来验证断言的输出。如果堆栈中实际的与非操作结果与用户断言的输出不一致,脚本就无法通过验证。
这样,就在比特币脚本中“蚀刻”了与非门电路,实际上是通过比特币脚本来强制执行虚拟的与非门操作。
虽然这个利用Taproot脚本实现电路蚀刻的想法很酷,但是别说像PC那种超大规模电路了,就是要实现任意一组计算,都需要成千上万的与非门电路,那在比特币有限的Taproot脚本空间里,如何覆盖复杂计算呢?
BitVM提出了Taproot脚本树(Taproot Tree)的方法。为了在比特币脚本中实现复杂的计算过程,人们可以通过串联逻辑门来构建计算电路。在这个方案中,哈希锁被用来绑定各个门,从而实现顺序执行的逻辑操作。具体来说,如果一个门的脚本根据不同的哈希原像(哈希明文值)输入产生不同的输出结果C1或C2,那么下一个门会使用与之相匹配的哈希锁值作为其输入。
这种方法可以实现一种惩罚机制,即如果试图谎报前一个门的结果,就只能揭晓另一个哈希锁的原像。这种机制可以用于两个用户之间的交互式计算,其中他们预先同意参与特定的计算任务,然后将计算过程分解成只由与非门组成的电路。他们需要为电路中的每个门选择合适的哈希锁,并将其编码进锁定UTXO的脚本树中。
然后通过多个地址组成一个Taproot地址矩阵,再通过Taproot Tree的方式将逻辑电路蚀刻到一系列树状结构相连的UTXO交易的Taproot脚本中,最终形成一个可以处理一定计算任务的“类合约”逻辑电路。
欺诈挑战是OP(Optimism Rollup)技术的核心(虽然至今都没有真的实现~),思想是在一个batch的交易被批量提交之前,挑战者对认为有错的交易发起欺诈挑战(质押对赌),主网上的Verifier合约会根据状态根在执行后的变化来判断提交者是否作恶,然后分配双方质押的资产。
而在bitVM中,脚本树被设计成两个电路,除了允许证明者提交到一个电路之外,还需要挑战者能够挑战证明者的声明。这可以通过预签名一系列的交易来实现。这些预签名交易通过「挑战 ->应答 ->挑战 ->…」的方式连接。如果某一方停止一段时间后,另外一方就会赢得挑战并回收双方的存款。
上图展示了一系列预先签名的交易:
挑战:Vicky (挑战者 / 验证者)在脚本路径中释放一个原像(这些原像只有挑战者知道),用作对证明的挑战;
应答:Paul (证明者)执行对应的逻辑门,将资金发回初始的脚本中;
在几轮的查询后可以迅速驳斥任何一个不一致的声明。如果证明者停止在链下与挑战者合作,挑战者就会强制证明者在链上合作:挑战者每解锁一个哈希锁,使得证明者的 UTXO 中的每个 NAND 门对应的 Taproot 叶子节点只有在证明者知道挑战者持有的一个原像时才可以被花费。证明者可以通过揭示其输入和输出来证明给定的 Taproot 叶子节点执行正确。其前提是挑战者通过揭露对应 Tapleaf 的哈希的原像来解锁它,通过二分查找的方式,挑战者可以在经过有限轮(O(logn))的挑战和应答后锁定证明者的错误。
整个过程涉及到多轮交互,以确保合约能够正确结算。挑战者可以不断挑战证明者,直到证明者证实了每个门的正确结果,或者在证明者无法响应挑战的情况下,挑战者可以在特定时间后提取资金。在理想情况下,所有操作都在链下进行,双方协作完成结算,但如果合作破裂,双方可以通过链上的挑战游戏来确保合约得到正确的解决。
这项提议涉及处理和生成的数据量极其庞大。使用的Taproot脚本树可能包含数十亿个叶子节点,而相关的预先签名交易的处理时间可能至少需要几个小时,以确保准确的结算。每个Taproot地址的预设解锁条件执行都需支付矿工费,因此地址组合越多,成本也越大。
这种方案的一个主要限制在于,它只适用于两个参与者之间的交互:一个作为证明者,证明其执行的准确性;另一个作为验证者,挑战前者的声明。虽然未来的研究可能会找到方法让更多参与者加入,但目前看来还没有明确的解决方案。
在合作结算的场景中,所有参与者必须在线,这对于协议的实用性和便利性构成了一定的限制。
在安全性方面,主要有以下几点安全风险:
1、由于成本的限制,必然大量的计算工作要放在链下进行,链下计算就存在中心化服务的一些常见安全风险。
2、大量数据保存在链下,数据可用性和数据安全性也是必须要考虑的风险点
3、对于所蚀刻的电路本身是否存在逻辑漏洞也是一个安全风险点,由于电路的不易读性,需要付出更多的审计成本或形式化验证成本。
比特币Layer2基础设施公司Lightning Labs在10月18日晚间发布了Taproot Assets主网alpha版,为发行、管理和探索比特币区块链上的稳定币或其他资产提供了功能完整的开发体验。而Nostr Assets假借火出圈的Nostr来发行资产,以及Nostr创始人对闪电网络的批评等都为这个生态带来了不小的流量和争议。
如果说Ordinals和BitVM都是Taproot升级带来的意想不到的“骚操作”生态,那么Taproot Assets则是完全符合“正统性”这个概念的扩容生态了。从技术角度,完全是在Taproot脚本的规范操作范围内去构建;从历史角度,其属于历史悠久的闪电网络的升级版。
我们首先来了解下闪电网络,闪电网络的思想可以说是现在流行的Rollup技术的原型。概括来说就是将交易执行层放到链外,以提高执行的效率;最终结算的时候,再将最终状态上链。
由于比特币上并没有以太坊上的那种合约系统,所以闪电网络利用比特币有限的脚本能力(主要是HTLC 和 RSMC技术 )构建了一系列1对1的“状态通道”,再将这些状态通道连接成支付网络,以达成独特的快速支付的“Rollup”。
如果将上述各种技术的关系一步一步来展开,闪电网络的技术可以有以下递进的关系:
实现单向支付通道:这是最基本的形式,涉及到2-2多签(即需要两方的签名来完成交易)和时间锁(确保交易在特定时间内完成)的使用。
实现双向支付通道:在单向支付通道的基础上增加了可撤销的顺序成熟度合约(Revocable Sequence Maturity Contract,简称RSMC)。这种机制允许在双方同意的情况下进行双向支付,增加了灵活性和安全性。
实现支付网络(即闪电网络):在双向支付通道的基础上,进一步增加了哈希时间锁定合约(Hashed TimeLock Contracts,简称HTLC)。HTLC使得跨多个支付通道的资金转移成为可能,从而实现了一个更广泛的支付网络——即闪电网络。这种机制大大提高了网络的效率和扩展性,允许进行快速、安全的小额支付。
这些技术的递进关系展示了闪电网络如何从基本的状态通道发展成为一个复杂的支付网络,同时在每个阶段都增加了新的功能和提高了安全性。
单向支付通道的实现非常简单。只需要付款方(例如 Alice 付给 Bob)存入到一个 Alice 和 Bob 共同持有的 2-2 多签地址即可。
(来源:MIT Course: Cryptocurrency Engineering and Design)
准备退款合约
但在此之前, Bob 需要先给 Alice 签署一份退款合约(没有发布上链的交易信息),从链下传递消息给 Alice 持有(此时 Alice 未签名,即只有 Bob 的签名)。
(来源:MIT Course: Cryptocurrency Engineering and Design)
这个退款合约约定了Fund tx的id(可提前计算出来)和退款的日期,即此日期后,Alice 可以解锁 Alice 存在双签地址中的全部存款。这样保护了 Alice,防止 Bob 不配合后续流程而导致 Alice 资金被锁死。
拿到 Bob 的退款合约后, Alice 此时可放心的将资金转入到双方的多签地址中,发布在比特币主网上。待主网交易确认后,即可进行下一步操作。
在状态通道中如何付款
在这种情况下,Alice可以通过支付通道多次向Bob付款,方法是不断更新通道内双方的余额。具体操作是,Alice在链下将存款合约发送给Bob。这个过程仅需Alice的签名信息,因为Bob可以在必要时添加自己的签名来解锁多签交易。此合约的输入内容,即Fund tx的输出信息,而输出内容则反映了Alice和Bob在该笔交易后的通道内余额。
Alice可以通过签署新的合约来在通道内完成付款(状态更新)。这种方式不仅高效,而且增加了交易的灵活性和安全性,因为所有操作都是在链下进行的,只有最终结算时才需要在链上记录。
通道关闭/结算
支付通道具有时间限制,这是因为Alice拥有一个退款合约。当通道到期后,Alice可以将这个合约发布到主链上,从而取回通道内的所有资金。因此,为了确保通道内的资金能正确结算,Bob必须在Alice发布退款合约之前,将包含最新通道状态的合约发布到链上。
从这个角度看,支付通道的操作主要涉及两次与主链的交易:一次是通道的创建(存款),另一次是通道的关闭(结算)。这期间的所有付款操作都在链下进行,无需全网共识,也不会产生链上手续费,因此效率高且成本低。
然而,单向支付通道存在一些局限性:
- 它仅支持从Alice到Bob的单向支付。如果Bob需要付款给Alice,他可能会选择性地广播余额最大的合约到链上,以此否认自己的支付。
- 总时间受限。由于退款合约设置了时间锁,通道在到期后必须关闭,这限制了其使用周期。
所以,我们接下来需要构建一个双向通道。
双向状态通道是在单向支付通道的基础上,通过增加可撤销的顺序成熟合约(Recoverable Sequence Maturity Contract,RSMC)来实现的。这个机制的核心类似于准备金机制。
在这种通道中,交易双方预先存入一定金额的资金到所谓的“微支付通道”(类似于资金池)中。随后,每一次交易后,双方都会共同确认资金的新分配方案,并签字作废之前的旧版本。只有在提现时,最终的交易结果才会写入区块链并得到确认。因此,在整个过程中,只有在提现时才需要通过区块链。
这种通道的每一个版本方案都需要双方的签名来验证其合法性。任何一方都可以随时提出提现申请,但提现过程需要提供双方都签名认可的资金分配方案,意味着这一方案肯定是某次交易后的结果。如果在规定时间内,另一方能够证明该方案已被作废(即非最新的交易结果),则资金将罚没给成功提出质疑的一方。这样的机制确保了没有人能够使用旧的交易结果进行提现。
过程是:
双方各自产生 Revocation Key(Alice 和 Bob 的分别记作 AliceR、BobR)
双方通过不断互换合约来“刷新”状态
“刷新”时,利用 Revocation Key 来“撤销”(作废)掉上一个状态
将 Revocation Key 交给对方(Alice 将 AliceR 交给 Bob)
双方同时需要新生成一个 Revocation Key (AliceR' 和 BobR')
存款前
和单向支付通道在存款前类似,Alice 也需要先持有 Bob 的“退款合约”。但在基于 RSMC 的双向通道中,其被称为是“提交”(commit)。
(来源:MIT Course: Cryptocurrency Engineering and Design)
(来源:MIT Course: Cryptocurrency Engineering and Design)
存款
Alice 和 Bob 双方互持 Revocation Key 之后,即可分别存入资金到 2-2 多签地址中,进行存款上链的交易。
与退款合约类似的,Bob 对该“提交”合约也已签名;不同之处在于,输出脚本解锁条件为,Alice 在若干区块后可解锁或者 Bob 在提供了 AliceR 的信息后解锁。
交易
具体的过程可由付款方先发给对方 Revocation Key(收款方没有动机去撤销掉收款的交易)
例如 state 1 -> state 2 是 Alice 付款给 Bob
那么 Alice 先出示 AliceR
Bob 再出示 BobR
双方可删除上一笔交易
Alice和Bob两人通过不断的协商和推敲,最终建立了这样一个通道:
两人各自拿出一笔资金来放入这个通道中
每个人都可以随时随地自由解约,同时任何情况下两人的资金都不会有损失
通道的资金可以在两方协商同意的情况下任意分配,而不需要交易广播上链
RSMC 解决了两方间的双向支付通道问题。但如果涉及到多人,直接从双签(2-2多签)扩展到多签的方式并不具有大规模的可扩展性。但可以基于两方的支付通道上,增加更多技术来将多个支付通道连接起来,形成可支付的闪电网络。
最典型的实现支付通道连接的技术,是 HTLC(Hash Time Lock Contract)。
原理是在 RSMC 之上,收款人要新创建一个自己持有且待传递的 R。
1.收款人 Carol 根据 R 计算出 H。 H = Hash(R),即 R 是 H 的原像
(来源:MIT Course: Cryptocurrency Engineering and Design)
2.收款人 Carol 将 H 交给付款人 Alice,由付款人 Alice 增加在 UTXO 的输出解锁条件中
(来源:MIT Course: Cryptocurrency Engineering and Design)
合约形式的解锁条件也变为下图的形式。下图的例子中,Bob 只要向 Alice 揭示 R 即可付款(更新通道内的状态)
(来源:MIT Course: Cryptocurrency Engineering and Design)
3.正向的传播 H ,例如,从 Alice 和 Bob 的通道内先用 H 更新合约;然后 Bob 和 Carol 的状态通道也类似的使用 H 来更新。
但是在传递过程中,需要确保前一段付款人可收回退款的时间,要晚于后一段付款人的可收回退款时间。例如,下图例子中的 Alice 给 Bob 的付款可在 17:00 后收回,而 Bob 给 Carol 的付款可在 16:00 (早于17:00)收回。
(来源:MIT Course: Cryptocurrency Engineering and Design)
4.反向的消除,例如收款人 Carol 通过揭示 R 来向 Bob 收款(Bob 验证 H=Hash(R) 之后,Bob 和 Carol 即可更新双方间的通道状态)
(来源:MIT Course: Cryptocurrency Engineering and Design)
因此,闪电网络实际上是通过传递 R 来实现连接多个状态通道的收付款。同时也会利用 Tor 等技术来网络信息的隐匿,即中间人不知道实际的连接起点和终点。
HTLC 用于闪电网络可能存在的问题
HTLC 在应用到闪电网络中具有是需要将原像传递给发送方。这样会存在一些问题,例如支付路径上的某两个不直接连接的节点相互串通,则可能会存在绕过中间节点,占用原本属于中间的手续费。
例如,下图中 Mallory 和 Mike 是两个串通好的恶意节点。Mike 在向通道支付了 1 BTC 并拿到原像后,直接交给了 Mallory;Mallory 则进一步用该原像向上游获取了 1.1 BTC(假设中间环节的所有手续费是 0.1 BTC)。至此,Mike 和 Mallory 相当于同谋用 1 BTC 的成本获取了 1.1 BTC 的收益,而他俩中间环节的节点手续费则被侵占,且通道资金处于锁定状态,要到超时后才能恢复正常。
(来源:Payment Points Part 1: Replacing HTLCs)
PTLC 原理
上述问题在于 HTLC 传递的原像在路径上唯一,因此解决的办法也可以针对性的进行设计。PTLC 采用了椭圆曲线的不可逆和可同态计算的特性,这样使得秘密在传递的每一段上都需要和前一段有关。
PTLCs(Point Time Locked Contracts,点时间锁合约)从 2018 年左右开始讨论用于改进 HTLC。
PTLC 流程
(来源:Payment Points Part 1: Replacing HTLCs)
在 PTLC 下,以 Alice -> Bob -> Carol 的付款流为例:
Carol 生成一个秘密值 ,并把 交给 Alice。
其中 $G$ 是椭圆曲线上的一个点
Alice 不能通过 $z * G$ 来反推出 $z$
Alice 生产两个随机数 和
Alice 生成一个付款合约给 Bob,解锁条件是 Bob 能揭示 对应的“私钥”,即$(x + z)$ 。合约里的 可通过$x * G + z * G$ 计算出来
Alice 把 交给 Bob。
Bob 生成一个付款合约给 Carol,解锁条件是 Carol 能揭示 的”私钥“, $(x + y + z)$。合约里的 可通过 计算出来
Alice 把 交给 Carol。即 Carol 知道$(x+y)$,但不知道 或 的具体值
Carol 通过 ,给 Bob 展示该值,解锁第 5 步 Bob 的付款
Bob 得知了 之后,通过 计算出 ,并向 Alice 展示,以解锁第 3 步的付款合约。
最后, Alice 通过计算 得到 $z$,作为自己的支付证明。
也就是,通过同态运算和在付款流程中的每一个环节中增加随机数的方式,确保了每一个环节不可被绕过。
Taproot 支持 PTLC 的实现
Taproot 升级中的 Schnorr 签名也给 PTLC 带来了可能,通过使用 Schnorr 聚合签名的部分和适配器签名(partial and adaptor signatures)来实现。
闪电网络在支付的使用上仍然有一个没能很好回答的问题:为什么要用比特币来支付?如果一个 Bitcoin 长期支持者要用闪电网络,那么 TA 可能很难真的愿意用宝贵的比特币去支付;而对于闪电网络有极大希望去“破圈”的、unbanked 人群,比特币的高波动率可能也会比较难以接受。
Lightning Labs 在 2022 年 4 月宣布的 Taro (后更名为Taproot Assets)可能会解决这一问题。Taproot Assets基于 Taproot,允许在现有的 UTXO 输出中嵌入任意类型的元数据。
Sparse Merkle Sum Tree
Taproot Assets在记录账户状态数据时,使用了稀疏 Merkle 总和树(Sparse Merkle Sum Tree)。
首先看稀疏 Merkle 树(SMT)。这种二叉树结构和普通 Merkle 树的区别是将所有可能取值作为叶子节点。也就是通过这种方式,SMT 对所有可能的数据进行了“索引”,便于进行非存在性证明。
例如,key 的空间范围是 256 位 bit 的,即总共可能有 个 key。如果用二叉树的左分支表示 0、右分支表示 1,也就是需要一个 256 层的二叉树在叶子节点上表示所有可能的 key。如果将这个树用作状态树,即叶子节点上的 key 都是所有可能的账户地址。
也因为这种形式,SMT 会非常“稀疏”,毕竟对于全部账户地址集合来说,有状态的账户属于极少数。
(来源:What’s a Sparse Merkle Tree?)
另外,SMT 也具有插入顺序无关等特性,因为数据元素已经固定好位置。
(来源:Taro 技术文档)
连接现有闪电网络
将稀疏 Merkle 总和树的树根做 Hash 后,作为 UTXO 的 Taproot 树的一个叶子节点。因此,Taproot Assets 可以利用 Taproot 交易对 资产的状态进行更新。
Taproot SMT结构(根据 Taproot Assets 技术文档整理)
而这个交易只要在闪电网络的开始和结束这两个通道内完成即可。例如下图中,只需要 Alice 和 Bob 以及 Carol 和 Dave 之间通过 Taproot 方式维护了 Token 的状态即可。开始和结束这两段可以使用 稳定币(L-USD)来结算,而中间的连接部分可以对应的将稳定币转换成闪电网络中对应的 BTC。
致谢:以上闪电网络技术细节分析的内容,主要参考 Jeffrey Hu:学习闪电网络-1:技术原理和进展
整个Taproot Assets的技术原理看下来,你会发现,涉及到的概念和技术栈特别的复杂且互相之间有很强的依赖性,这是可能引发系统性安全风险的原因之一。而花了那么大力气,在这个生态底座仍然只是个支付网络,只是把比特币支付升级为可发行其他资产支付,这样的投入产出比还是让人充满疑惑的,也难怪Nostr的创始人要吐槽了。
在讨论Taproot Assets协议的安全性风险时,我们可以考虑以下潜在的安全威胁和被黑客攻击的可能点:
中心化风险:虽然闪电网络的底层设想足够的去中心化,但在实际操作中,想组成多资产的支付网络,一定是依赖几个特定资产的中心化状态通道相连的方式构建,普通的用户其实没有意愿损失自己的资金利用率来锁定资产参与到状态通道的构建中。大部分情况下,普通用户在需要使用的时候才会和大型的状态通道节点地址进行签约资产锁定。所以就像一个个跨链桥一样,充满了中心化资金池的风险,
可用性攻击:闪电网络的基础设施由于链外的消息传递,很可能受到拒绝服务攻击(DoS攻击)从而影响整个系统的性能和可用性。且支付中间状态的链下存储,也存在数据可用性的问题。
我们看到,铭文使用了taproot输入脚本上的数据来存储特殊的内容,而Taproot Asset则利用了输入和输出的双向脚本来构建状态通道。那么有没有一种生态是只利用输出脚本技术来实现的呢?因为输出脚本的大小限制很严格,在下个版本更新前,用来在链上存储数据的OP_Return只有80bytes的大小,下个版本更新后,将更加严格控制在40Bytes大小,可以最大程度的节省区块存储空间和手续费。
使用输出脚本的OP_Return来存储数据,然后通过复合层节点或者indexer来实现的生态项目,从最早的染色币开始,到USDT的首发网络OmniLayer,到RGB协议都是这类技术。值得注意的是,由于Ordinals协议的发明者Casey Rodarmor对Ordinals社区污染比特币网络的行为不满,怒而发明了Runes协议,舍弃了在输入Taproot脚本中添加内容的方案,通过输出脚本OP_Return来控制和追踪资产。
我们熟知的在比特币上发行代币的协议,比如 OmniLayer,其工作原理是在比特币交易中插入元数据来「染色」,并表示该笔交易应该被理解成一笔代币转移。Omni 协议中的 USDT(Tether)可以被看作是染色币的一种形式。在 Omni 协议中,USDT 是以 Tether 代币的形式存在,它通过在比特币交易中使用 Omni 协议的特定交易类型来表示。具体来说,当用户在 Omni 协议上发起一笔 USDT 交易时,他们会在比特币交易中添加 OmniLayer 的特殊数据字段,以指示该交易涉及 USDT 代币的转移。这种方式使得比特币交易能够代表 USDT 代币的转移,并且 USDT 的持有者可以使用比特币的地址来接收、发送和存储 USDT 代币。
这样的信号机制通常是用 OP_RETURN 操作码来实现的,带有该操作码的输出会被普通的比特币节点无视,但可以被能够感知这些代币协议的节点解释,这些节点会实施代币协议的验证规则。
虽然这种设计是很高效的,但它也存在一定局限:
1)与代币转账相关的信息量被限制在 OP_RETURN 输出可以容纳的字节数以内,一般来说是 80 字节,这个空间对普通的交易数据编码来说足够了,但更复杂的应用场景就难以被满足。
2)代币协议节点需要扫描整条区块链、在 OP_RETURN 输出中搜索可能与用户相关的代币转账,整个流程会因为比特币区块链体积的增长而更加耗费资源。
3)用户的隐私性方面,所有的交易数据对所有人都是可见的。
怀着优化这种设计的目的,RGB 协议提出了一种更可扩展、更加隐私、更面向未来的解决方案,其基石是 Peter Todd 在 2016 年 提出的客户端验证(client-side validation)和一次性密封(single-use-seals)的概念。
RGB 协议的核心理念是,仅在必要的时候才调用比特币区块链,也就是利用工作量证明和网络的去中心化来实现重复花费保护和抗审查性。所有的代币转移的验证工作都从全局共识层中移除、放在链下,仅由接收支付的一方的客户端来验证。
在RGB合约中,创世代币与一个比特币UTXO相关联(无论是已存在的还是新创建的)。要转移代币,就需要消费这个UTXO。在这个过程中,比特币交易需要额外添加一个输出,这个输出包含了RGB支付信息的承诺。这些信息定义了交易的输入、代币将被发送到的UTXO、资产ID、数量、消费的交易以及其他必要数据。比如,如果你拥有归属于比特币交易A的#1输出的代币,要转移这些代币,你需要创建一个RGB交易和一个消费交易A的#1输出的比特币交易,同时这个比特币交易承诺了RGB交易。
隐私保护方面,转移RGB代币时需要发起比特币交易。然而,RGB转账的输出不必与比特币交易的输出相同。例如,在上述案例中,RGB交易的输出(比特币交易C的#2输出)与承诺RGB交易的比特币交易(交易B)可能无关。这意味着,RGB代币可以从一个UTXO“传送”到另一个UTXO,而不会在比特币交易图中留下任何痕迹,从而大大提高了隐私性。
在这种设计中,比特币的UTXO充当了一次性容器来装载RGB资产。要转移资产,只需打开新容器、关闭旧容器即可。RGB代币的具体支付信息是通过专用通信渠道在链下传输的,从支付者发送到接收者的客户端,并由后者验证其符合RGB协议规则。这使得区块链观察者无法获取任何关于RGB用户活动的信息。
为了保证发送者真正拥有他们发给你的资产,你还需要接收这些代币的所有交易历史,从当前交易一直追溯到最初的发行。这样验证了所有交易历史,可以确保这些资产没有被通胀,所有附加在资产上的花费条件都得到了满足。
盲化秘密值的使用进一步提高了隐私性。发送支付请求时,你无需公开接收代币的UTXO,只需要求支付方将代币发送到一个哈希值,这个哈希值是你用目标UTXO和一个随机盲化秘密值生成的。这样,支付方无法知道代币将发送到哪个UTXO,从而保护了交易的隐私。需要注意的是,当代币被花费时,必须向接收方公开盲化秘密值,以便他们能验证与比特币交易相关的交易历史部分。这意味着,尽管使用RGB时你拥有完整的隐私,但未来的代币持有者可以看到他们手中代币的转移历史中的所有UTXO。因此,虽然接收和持有RGB代币时可以实现完美的隐私,但用户的过往金融活动的机密性会随着代币的转移而逐渐降低,最终趋于与比特币交易历史相似的隐私水平。
在9月26日,Casey Rodarmor发表文章,指出BRC-20代币存在“UTXO扩散的不良后果”,并提出Runes作为一种基于UTXO的替代方案。这是针对现有协议中普遍存在的诸如实施复杂、用户体验差、未花费交易输出(UTXO)的垃圾数据积累、操作需要原生代币等问题的一种解决方法。
Casey Rodarmor提到,采用基于链下可交换代币的协议会导致用户需要将链下数据与区块链协调,这可能会带来不佳的用户体验。
Runes的工作机制如下:
Runes的转移:在Runes协议中,协议消息的第一个数据输出被解码为整数序列,这些整数被解释为(ID,OUTPUT,AMOUNT)的元组序列。ID代表要转移的Token ID,OUTPUT代表被分配的输出索引,AMOUNT是分配的Runes数量。所有元组处理完毕后,未分配的Runes Token会分配给第一个非OP_RETURN输出。
Runes的发行:这是一种基于UTXO的同质代币追踪方法。如果协议消息有第二次数据推送,表示这是一笔发行交易。第二次数据推送被解码为SYMBOL和DECIMALS两个整数。SYMBOL是一个基于26位可读符号的标识,而DECIMALS指定小数点后的位数。新的Runes Token从其发行交易开始,指定了供应量、符号和小数位数,并将该供应量分配给特定的UTXO。
相对于BRC-20,Runes的设计减少了一层服务器共识,变得更简单,同时不依赖于链下数据,也没有原生代币的需求,这使得Runes非常适合比特币的原生UTXO模型。通过这种方式,Runes在保持比特币的UTXO模型的同时,增加了代币的灵活性和可用性。
首先,OmniLayer的USDT在历史上发生过很严重的假充值事件,虽然主要是由于交易所安全验证方面的缺失导致了假充值,但也给所有基于OP_Return来做生态扩容的项目提了个醒:如何更合理的设计与比特币网络交易的一致性。
空手套白狼?USDT 假充值逻辑缺陷漏洞利用分析-腾讯云开发者社区-腾讯云
其次,与OmniLayer的分布式节点来解析不同,RGB方案和Runes方案都得存在Indexer服务器的角色,如何推进Indexer的去中心化以及保障数据可用性是非常重要的安全性考量。
最后,不论是RGB还是Runes,在发行资产方面,都是模板化标准资产模式,需要确保“创世模版”的安全性。
比特币最成熟也是最古老的生态扩展方案,还是要看侧链方案。侧链(Sidechain)最早在2013年12月被提出,并于2018年被Blockstream公司通过Liquid项目首次实现,但在后续的发展中,RSK(Rootstock)和Stack是这两个项目逐渐变得更加有名,在实现方案上也更加合理。
Rootstock(RSK)利用合并挖矿保证了与比特币相媲美的安全性,尽管其吞吐量超过了比特币基础层的容量。
合并挖矿让比特币矿工同时处理和验证 BTC 和 RSK 交易在同一个区块内。在这种模式下,矿工可以同时在父链(比特币等较大的区块链)和子链(RSK 等较小的区块链)上挖矿。
合并挖矿的主要优势是为子链提供了更高的安全性。通过利用更强大父链的计算能力,较小的链获得了额外的安全性,可以防止双花和 51% 攻击。这种方式让 RSK 实现了扩展、效率和高级功能,这些功能对于比特币来说是不可能的,同时又避免了采用其他安全性较模糊的共识模式。
然而,尽管取得了进展,RSK 仍然面临着挑战。RSK 难以吸引到足够多的用户,而其合并挖矿机制的复杂性和新颖性也带来了风险。
Stacks 是一个专为比特币设计的第二层智能合约协议,旨在为比特币生态系统带来去中心化应用和智能合约功能。
首先,Stacks设计了一种特殊机制,允许Stacks链上产生称为微区块流(microblock stream)的多个小区块,让负责确认Stacks当前区块的矿工充分利用BTC网络产生两个区块的时间间隔,处理更多交易。当比特币确认当前区块时,这些微区块也将实现最终确认,并且下一个Stacks区块会链接到当前最后一个微区块。
如下图所示:
Stacks设定确认微区块的矿工将获得这些微区块手续费的60%,而产生这些微区块的节点将获得手续费的40%,以鼓励矿工打包微区块和避免微区块的滥用。
其次,Stacks采用了一种称为Proof of Transfer(PoX)的共识机制。PoX是两条区块链之间的共识算法,可以看作是Proof of Work + Proof of Burn。与 PoW 一样,PoX 要求矿工花费已有的资源(BTC),以竞争铸造下一个 Stacks 区块的机会;与 PoB 类似,PoX 要求矿工“燃烧”掉BTC获得STX代币奖励。
PoX 的一个特点是矿工花费的比特币不会被销毁,而是转移给已锁定STX代币的STX代币持有者,这称为Stacking。通过PoX机制,矿工花费BTC竞争Stacks的出块权力,获得STX代币奖励和该区块的交易手续费;STX持有者通过锁定STX代币,获得BTC奖励,目前APY约9%。
Source: https://docs.stacks.co/docs/stacks-academy/proof-of-transfer
Stacks网络会使用一个可验证随机函数VRF随机选择出块者(花费的BTC越多,被选中的概率越大)。当矿工获得Stacks出块权力后,他们会开始打包新的Stacks区块。每个Stacks区块都包含一个指向前一个Stacks区块的哈希指针与指向对应BTC区块的哈希指针,从而将Stacks网络和BTC网络连接起来。
侧链的安全性其实取决于侧链本身,虽然一定程度上依赖于主链安全性,但是最终还是考验自己这套共识体系以及智能合约机制的安全性。
Rootstock是一个EVM兼容的侧链,所以EVM所面临的安全问题,RSK上也同样面临。Metatrust可以为EVM项目提供全生命周期的安全工具,从形式化验证到自动化审计,再到项目部署后的监控与自动化防御,可以帮助项目方实现全方位多角度的安全运维。
Stacks在2023年4月19日,发现其pox-2合约中的stacks-increase函数存在漏洞,导致一个地址获得了比理论计算上更多的BTC奖励。该计算错误是因为stacks-increase函数将诸如数据库修改的操作与决定状态更改的逻辑混在一起,然后使用reward-cycle-total-stacked作为全局变量在连续迭代中保存状态。社区中有开发者呼吁将智能合约语言Clarity改良为函数式,表达式导向的开发语言,以方便静态分析和进行形式化验证,避免在未来主网上再次出现此类漏洞。
同时,Stacks的PoX机制过分依赖矿工的参与人数和当前STX币价,会导致共识本身的安全性问题。
大区块还是小区块?支持铭文还是不支持铭文?激光眼还是巫师帽?比特币社区围绕着扩容方案,似乎总是在争吵。而DriveChain方案的提出,似乎提供了一个平息争吵的解决方案,既能保持主链的极简,又能保证二层方案的安全性?
为了解决比特币网络的安全预算问题,LayerTwo Labs将在今年夏天推出支持Drivechain的BTC分叉。Drivechain (BIP300) 是由 LayerTwo Labs 创始人兼首席执行官 Paul Sztorc 自 2013 年以来创建和开发的BTC协议的升级版。
Drivechain 使开发人员能够通过连接到比特币网络的侧链来创建各种区块链应用程序。将侧链视作第二层,而将比特币视为第一层,开发人员在侧链上拥有广泛的自由度,可以创建各种山寨币、代币、智能合约、自定义区块大小、使用案例、去中心化应用程序(DApp)、用户体验和界面、功能和规则,而不受任何限制。
与此同时,比特币矿工可以定期从每个侧链收取费用,而无需额外的硬件或成本投入。即使侧链出现故障,也不会以任何方式损害比特币主链(Layer1)。对于比特币矿工来说,这是一个全盈无亏的情况。简而言之,通过侧链的创新应用,比特币矿工可以收取更多的费用,从而提供更多的挖矿激励。这在一定程度上有助于提高网络的哈希率,进而可能提高比特币的价格。
简单来说,drivechain就是包括bip300和bip301两个升级。
在比特币改进提案BIP300中,交易并不是通过传统的加密密钥签名方式进行验证。相反,这些交易随着时间的推移通过网络的哈希算力来“签名”。这个过程可以类比于一个大型的多重签名机制,其中每个区块的生成类似于一个新的“签名”。BIP300的设计强调慢速、透明和可审计的交易过程,使得诚实的用户容易正确执行,而不诚实的用户则难以滥用系统。
BIP300的一个主要设计目标是实现分区。这意味着,如果用户愿意,他们可以选择安全地忽略BIP300的交易。或者,如果他们对BIP300不感兴趣,也可以完全不去关注它。
简单来说,BIP300的目的是为比特币提供一种标准,使其能够实现从主链到侧链的价值双向流通。通过这种方式,BIP300旨在增强比特币网络的功能性,同时保持其去中心化和安全性的核心特点。
盲合并挖矿(Blind Merged Mining, BMM)允许矿工在不运行特定侧链或山寨币节点软件的情况下进行挖掘。这就意味着矿工不需要“看到”侧链的内容,因此称为“盲”挖矿。在BMM中,是由侧链用户来运行他们的节点并构建区块,并支付交易费用。然后,这些用户会使用等量的资金向传统的Layer1(比特币)矿工购买找到这个区块的权利。
与此相对的是传统的合并挖矿(Merged Mining, MM),它允许矿工利用他们的哈希算力同时保护多条链。然而,传统MM的缺点包括矿工需要运行其他链的完整节点,意味着他们需要运行可能存在缺陷的非比特币软件。此外,在传统MM中,矿工在其他链上获得的报酬是替代货币。
BIP300和BIP301提出了一种新的驱动链(Drivechain)概念,其目的是允许比特币矿工从每个侧链定期收取费用,而不需要额外的硬件或成本。侧链上的故障不会以任何方式损害比特币主链(Layer1),对比特币矿工来说是一种全盈无亏的模式。通过侧链的创新应用,比特币矿工可以收取更多的费用,这为他们提供了更多的挖矿激励,从而可能增加网络的哈希率和提高比特币的价格。
简而言之,Drivechain技术是比特币二层网络的一项重大创新。为了向后兼容并兼顾各方利益,Drivechain技术采用了更加开放和妥协的思维。
如果比特币升级到BIP300和BIP301,它有可能成为支撑下一波创新和颠覆性应用的基础层。
LayerTwo Labs 计划通过硬分叉创建一个全新的工作量证明(PoW)区块链,名为Mainchain。这个硬分叉的Mainchain将从一开始就预装所有Drivechain升级,包括BIP300和BIP301。
LayerTwo Labs打算在Mainchain的硬分叉期间推出七个自主开发的侧链,这些侧链可以被视为去中心化应用程序(DApp)。项目团队、开发人员和任何人都可以在Mainchain(第一层)上未经许可地创建侧链(第二层),以此来试验他们的各种想法和概念。所有比特币(BTC)地址都将以1:1的比例获得Mainchain代币。
Mainchain将遵循与比特币相同的规则:总供应量为2100万枚代币,每个区块时间为10分钟,区块奖励每四年减半,并采用与比特币相同的PoW共识机制。所有支持SHA256算法的比特币挖矿设备都可以挖掘Mainchain。由于Mainchain的挖矿难度较低,早期甚至过时的设备(如GPU、老式ASIC机器)也能挖掘MC,并且获得不错的收益(更多的MC区块奖励)。
Mainchain将成为唯一一个可以通过侧链支持任何概念和想法的PoW链。开发Mainchain的目的是在其上创建数以十万计的侧链。在这些侧链中,有些可能成为独角兽(被广泛采用的去中心化应用程序),随着时间的推移,Mainchain将形成一个蓬勃发展的生态系统,受到侧链用户的喜爱并得到大量矿工的支持。这些矿工可能已经从比特币转向MC。在Mainchain(MC)价格和其侧链生态系统成功的压力下,比特币矿工可能最终投票支持BIP300和BIP301的升级。
Drivechain升级后,可以把比特币的安全性带到各个子链,而子链只需要关注自己的业务范畴,个人认为,其结合了某些跨链Layer0层基础设施的思想,将安全性固定,将业务尽可能解耦,从而完成生态扩容,可能会是目前最佳的也是最有希望平息各方争议的解决方案。
到此为止,我们已经盘点完了主流的比特币生态扩容解决方案,并通过技术本质来分析其中可能存在的安全问题,希望对读者更全面的认识比特币生态有所帮助。
比特币的生态扩容方案主要依赖于UTXO交易结构中脚本能力,了解脚本的OP指令以及各种签名方式并正确使用他们,是可以避免出现Infrastructure层漏洞的关键。而在这之上发展的2层生态,则应该加强代码审计、交易监控,具备实时攻击反应的安全运维能力。