比特币的原有技术一直存在大规模应用与比特币应该具有的能力的冲突问题。大规模应用和交易规模是否意味着更复杂的交易指令和更大的交易空间?是否意味着一定要在比特币单一系统上实现所有的功能?在早期,比特币生态技术发展不完善的情况下,这些现象似乎都是比特币本身的问题。随着技术的发展,很多问题会得到更清晰的答案。
在本文中列出一些相关问题,以及对这些问题的产生与解决过程。通过这篇文章,可以看到这些问题与技术之间的关联性,以及比特币主链与相关「测试链」的变化过程。比特币的技术一直被不同的项目与团队在探索中(包括以太坊都是对比特币不完善的一种探索),只是在比特币主网上产生的变化一直不够明显,直到 Taproot 等技术的产生,推动了 Ordinals 协议等协议产生之后,重新进入了一个新的发展高潮。
从整体看这些发展过程与产生的相关技术,我们能够看到他们之间的联系,可以推测出更多发展方向与整体架构。
比特币的编程语言是一种逆波兰范式的脚本语言,没有循环语句和条件控制语句(稍后看 Taproot&Taproot Script 扩充了这块能力)。因此,人们常说:比特币脚本语言不是图灵完备的,这导致比特币脚本语言,有一定的局限性。
当然,由于这些局限性,黑客就没办法使用这种脚本语言写一些死循环(会造成网络瘫痪),或者一些能导致 DOS 攻击的恶意代码,也就避免了比特币网络受到 DOS 攻击。比特币的开发者,也认为核心区块链,不应该具备图灵完整性,来避免一些攻击和网络堵塞。
但是,也正是由于这些局限性,比特币网络,没有办法运行其他复杂的程序了,没办法完成一些「有用」的功能。而后面发展的一些区块链系统,为了解决具体问题,满足用户的需求,直接改变了这点。如,以太坊使用的语言就具备了图灵完备。
比特币脚本指令常见的类型:
关键字:
常数。 如:OP_ 0 ,OP_FALSE
流程控制。 如: OP_IF,OP_NOTIF,OP_ELSE,……
堆栈。 如:OP_TOALTSTACK(把输入压入辅堆栈的项部,从主堆栈删除),……
字符串。 如:OP_CAT(连接两个字符串,已禁用),OP_SIZE(把栈顶元素的字符串长度压入堆栈(无需弹出元素))
位逻辑。 如:OP_AND,OP_OR,OP_XOR
算术逻辑。 如:OP 1 ADD(输入值加 1),OP 1 SUB(输入值减 1)
加密。如:OP_SHA 1 (输入用 SHA-1 算法 HASH.),OP_CHECKSIG()
伪关键字
保留关键字
比特币脚本指令常见的类型:
脚本:
支付到比特币地址的标准交易(pay-to-pubkey-hash)
标准比特币产生交易(pay-to-pubkey)
可证明的无法花掉 / 可删除的输出
Anyone-Can-Spend 输出
猜谜交易
五个标准类型的交易脚本包括:支付到公钥哈希(P2P KH)、支付到公钥、多重签名(限定最多 15 个密钥)、支付到脚本哈希(P 2 SH),以及数据输出(OP_RETURN)。
在网页:https://en.bitcoin.it/wiki/Script 中有详细的说明。
删减比特币支持的指令
比特币历史上有多次删减指令的事情发生。下面的图表中,红色部分是已经删减掉的指令。
(1)字符串操作
(2)
(3)算术操作
为什么要删减指令?安全性只是一方面的考虑,如果我们用分层设计的思想看待删减指令会理解其合理性,这样做能让底层协议更基础更稳定。也许中本聪一开始就意识到了这个问题,不然不会主动的删减指令。我们常人的思维是建造一个直接满足用户的需求,具有完善指令和系统功能的小系统,而不是一个需要协作的大型协议。
这样也就造成了一种事实,只有比特币适合作为一层网络。我在《比特币价格过高会促生一个新的替代链产生》文章中分析过这种现象,从经济学视角和技术视角分析,有产生比特币替代链的可能性。但从比特币的基本特点和分层设计的角度,几乎只有比特币能够作为一层网络基础设施,即使有替代链也是一个 1.5 层的产物。在一层网络这个层面,真品只有比特币,能有一些替代作用的链最多是 A 货。
在比特币的发展历史,除了删减指令问题,另一方面是区块大小之争,这经常造成比特币的硬分叉。
BTC 创立之初并没有限制区块大小,以便能够在相同时间处理的交易笔数。但当早期 BTC 价格非常低,恶意交易的成本也非常低,为了解决这一问题,中本聪在 2010 年 9 月 12 日主持了一次软分叉,添加了区块体积不得超过 1 MB 的限制。中本聪指出但这种限制是临时性的,未来可以以可控和逐步的方式提高区块限制,以便满足扩容的需要。
下图为比特币的分叉历史:
随着比特币的流行,网络交易拥堵和确认时间增长问题愈发严重。2015 年 Gavin Andresen 和 Mike Hearn 宣布将在新版 BitcoinXT 中实现 BIP-101 提案,希望将区块上限提高至 8 MB。而 Greg Maxell,Luke Jr,Pieter Wuille 等核心开发者则持反对意见,认为这种做法会提高运行全节点的门槛,而且带来不可控的影响。这场争论最终在议题和参与范围均出现了扩大化。
从上面的内容,我们看到中本聪也表达了「区块大小这种限制是临时性的,未来可以以可控和逐步的方式提高区块限制,以便满足扩容的需要。」但什么时候分叉支持更大区块,单独分出一条链支持大区块是否可以解决问题?在不断的争议中,也产生了众多的案例。如,BCH 区块大小是 8 M,后来又增加的 32 M。BSV 区块大小是 128 M。而除了 BCH(和后面的 BSV)以外,这一时期还出现了许多其它 BTC 分叉币,据 BitMEXResearch,仅在 BCH 分叉后的一年内,就出现了至少 50 种新的分叉币。
稍后的内容我们会看到,在比特币主网上面 Segwit 和 Taproot 也在一定程度上将区块的空间从 1 M 提升到了 4 M。
比特币的分叉是一种发展探索,在尝试通过自身的改变来完成对更多需求的支持。其中有用户需求、矿工需求、投资人需求、开发者需求、……。
中本聪离开后,继承人 Gavin Andresen 主导建立了 Bitcoin Core 和 Bitcoin 基金会。在此期间,针对 BTC 的可拓展性探索一直存在,尤其是在资产发行领域。
(1)Colored Coins(染色币)
eToro 首席执行官 Yoni Assia 在 2012 年 3 月 27 日发表的一篇文章中第一个提出彩色币。这个想法不断发展,在 Bitcointalk 等论坛上,彩色硬币的概念开始形成并获得关注。最终 Meni Rosenfeld 于 2012 年 12 月 4 日发布了一份详细介绍彩色货币的白皮书。
染色币的设想是通过给比特币的特定部分添加特殊的标注(即染色),来代表更广泛的资产和价值。染色币在实现上出现了一系列实体,大致分为两类:
1)基于 OP_RETURN:如 Flavien Charlon 在 2013 年提出的 Open Assets,利用 OP_RETURN(在 Bitcoin v 0.9.0 中被提出,可以用于在 Bitcoin 上存放少量的数据,最初的限制为 40 bytes,后提高至 80 bytes)。操作码存储到脚本中,并通过外界读取的方式来完成「染色」和交易。(这种模式与 Ordinals 依靠外部索引确定资产合法性类似)。
2)基于 OP_RETURN:典型代表是 ChromaWay 在 2014 年提出的 EPOBC Protocol,EPOBC 资产的额外信息存储在比特币交易中的 nSequence 字段,每个 EPOBC 资产的类别和及合法性需要追溯到 genesis 交易来确定。
(2)MasterCoin(OMNI)
JR Willett 在 2012 年 1 月 6 日发布了 MasterCoin 的设想,并取名「比特币第二份白皮书」,并在 2013 年 7 月通过 ICO 的方式正式启动项目,最终募集到了 5120 个 BTC(当时价值 50 万美元)。MasterCoin 和 Colored Coins 区别在于它建立了一个完整的节点层,通过扫描比特币区块来维护状态模型数据库,该数据库驻留在区块链之外的节点中。这种设计可以提供比 Colored Coins 更复杂的功能,例如创建新的资产、去中心化交易所、自动化价格反馈等。2014 年,Tether 也通过 Mastercoin 协议在比特币上推出了稳定币,即我们熟知的 Tether USD (OMNI)。
( 3)CounterParty
Counterparty 于 2014 年正式推出。Counterparty 也使用 OP_RETURN 将数据存储至 BTC 网络中。但与染色币不同,资产在 Counterparty 不是以 UTXO 的形式存在,而是通过 OP_RETURN 载入信息来表明资产的转移,当一个资产持有者使用持有地址对歹有特殊数据的交易进行签名后,资产便完成了转移。通过这种方式,Counterparty 可以实现资产的发行、交易以及兼容以太坊智能合约的平台。
除此以外,也有观点认为 Ethereum、Ripple 和 BitShares 也属于更广义的「Bitcoin 2.0」。
比特币系统的不完善(或局限性)主要表现在几个方面(本文中的不完善是根据以太坊白皮书中的总结,并非是真正的不完善。
在当前的区块链项目中,主要有两种记录保存方式,一种是账户 / 余额模型,一种是 UTXO 模型。比特币采用就是 UTXO 模型,以太坊、EOS 等则采用的是账户 / 余额模型。
在比特币钱包当中,我们通常能够看到账户余额,然而在中本聪设计的比特币系统中,并没有余额这个概念。「比特币余额」是由比特币钱包应用派生出来的产物。UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。
所以现实世界中没有比特币,只有 UTXO。比特币的交易由交易输入和交易输出组成,每一笔交易都要花费(spend)一笔输入,产生一笔输出(output),而其所产生的输出,就是「未花费过的交易输出」,也就是 UTXO。
如果要实现智能合约,UTXO 这种账户模型存在非常大的问题。以太坊黄皮书的设计者 Gavin Wood 对 UTXO 的理解十分深刻。 以太坊的最大新功能点是智能合约,因为智能合约的考虑,Gavin Wood 要基于 UTXO 去实现图灵完备的智能合约是困难的。而账户模型是天然的面向对象的,对每一笔交易,都会在相对应账户上进行记录(nonce++)。为了易于管理账户,而引入了全局状态,每一笔交易都会改变这个全局状态。这和现实世界是相对应的,每一个微小的改变,都会改变这个世界。因此以太坊使用了账户系统,后期的公链基本都是基于各种类型的账户系统实现的。
UTXO 的另一个严重缺陷是,不能为账户的取款额度提供精细的的控制。这点在以太坊的白皮书中有相关的说明。
尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是比特币的脚本语言,没有循环语句和条件控制语句。因此,我们说:比特币脚本语言不是图灵完备的。这导致比特币脚本语言,有一定的局限性。当然,由于这些局限性,黑客就没办法使用这种脚本语言,写一些死循环(会造成网络瘫痪),或者一些能导致 DOS 攻击的恶意代码,也就避免了比特币网络受到 DOS 攻击。比特币的开发者,也认为核心区块链,不应该具备图灵完整性,来避免一些攻击和网络堵塞。但是,也正是由于这些局限性,比特币网络,没有办法运行它复杂的程序了。不支持循环语句的目的是避免交易确认时出现无限循环。
为了安全性,不支持图灵完备的理由是不充分的。而且非图灵完备的语言所做的事情很有限。
挖矿的中心化问题,比特币挖矿算法基本上是让矿工千万次地轻微改动区块头,直到最终某个节点的改动版本的哈希小于目标值。然而,这种挖矿算法容易被两种形式的中心化攻击。第一种,挖矿生态系统被专门设计的因而在比特币挖矿这一特殊任务上效率提高上千倍的 ASICs(专用集成电路)和电脑芯片控制。这意味着比特币挖矿不再是高度去中心化的和追求平等主义的,而是需要巨额资本的有效参与。第二种,大部分比特币矿工事实上不再在本地完成区块验证;而是依赖中心化的矿池提供区块头。这个问题可以说很严重:当前,排名前三的采矿池间接控制着比特币网络中约 50 %的处理能力。
扩展性问题是比特币的一个重要问题。使用比特币,每小时增长约 1 MB。如果比特币网络每秒处理 Visa 的 2000 次交易,则每三秒钟将增长 1 MB(每小时 1 GB,每年 8 TB)。较低的交易次数,也引起比特币社区的争议,大区块链虽然可以提高性能,但问题是中心化风险。
从产品生命周期的角度,比特币一些小的不完善,可以在自身系统中得到改善,改善的方法受到当前系统的限制。但如果可以在一个新系统中解决这些问题,就完全可以不考虑老系统的限制问题。既然要打造一个新的区块链系统,那么设计新系统的时候,这些小的功能完善也一并进行设计与升级改造。
分层设计
分层设计是一种人类处理复杂系统的手段和方法论,通过将系统划分为多个层次结构并定义各层之间的关系和功能,以实现系统的模块化、可维护性和可扩展性,从而提高系统的设计效率和可靠性。
对于一项广泛和庞大的协议体系,使用分层会有明显的好处。这样做使人们容易理解,容易分工实现与容易分模块改进等优点。如计算机网络中的 ISO/OSI 的七层模型设计,但具体的实现中,可以合并一些分层,例如,具体的网络协议 TCP/IP 是四层协议。具体说协议分层的优点:各层次之间是独立的、灵活性好、结构上可分割开、易于实现和维护、能促进标准化工作。
从分层协议的角度看,比特币因为要处于最基础的底层,那么他的 UTXO、非图灵完备、出块时间长、区块容量小、创始人的消失、……,都不是缺点,反而是作为一层网络应该具有的特点。
注释:作者在《一文梳理比特币二层(Layer 2)建设的基础知识体系 V1.5 版》对协议分层有更详细的说明。
在上一节我们探讨了比特币原有技术的主要冲突和一些探索案例,但很多导致了硬分叉或产生了全新的异构链。在比特币本身这条区块链上,这种探索也产生了很多成果,本质上是区块的扩容与能力的扩容。他们主要表现在以下几个方面。
比特币的开发者一直想扩展比特币的能力,表现在几个方面:
(1)OP_RETURN 的使用
OP_RETURN 是一个脚本操作码,用来终止脚本并返回栈顶的值。这个操作码类似于编程语言中的返回函数。在比特币的历史上,OP_RETURN 操作码的功能被多次修改,现在它主要被用作为在账本上存储数据的一种方法。OP_RETURN 操作码的功能曾在过去发生过重大变化,现在它是一个重要的机制,使用它我们就能在链上存储任意数据。
OP_RETURN 最初是用于提前结束脚本执行的返回操作,执行结果将作为栈顶项目被呈现出来。这个操作码最初有一个容易被利用的漏洞,但中本聪很快修补了该漏洞。
对 OP_RETURN 功能的进一步更改
在 Bitcoin Core 的 v 0.9.0 那次升级中,「OP_RETURN 输出」脚本被制作成标准输出类型,允许用户将数据附加到「不可花费的交易输出(unspendable transaction output)」上。这类脚本中可用的数据量的上限最初被限制为 40 字节,然后提升至 80 字节。
将数据存储在区块链上:
将 OP_RETURN 改为始终返回 false 造成了有趣的结果。由于在 OP_RETURN 之后不会评估任何操作码或数据,因此网络用户开始使用此操作码来存储任意格式的数据。
在比特币现金(BCH)的时期,即 2017 年 8 月 1 日 -2018 年 11 月 15 日,能够附加到 OP_RETURN 输出的数据长度被扩展到 220 字节,更大的数据能够促进区块链上创新的应用,例如在区块链社交媒体上发布内容等。
在 BSV 上, 220 字节的限制依然被保留了一小段时间。随后,在 2019 年 1 月,由于 OP_RETURN 操作码以节点不验证任何后续操作码的方式终止脚本,所以节点也不会检查脚本是否在 520 字节的最大脚本大小限制内。由此一来,网络上的节点运营商决定将最大交易体积提高到 100 KB,从而赋予开发者有更多应用创新的自由,让新的应用可以将更大、更复杂的数据放入比特币账本。那时有一个应用例子,有人将将整个网站都放入了 BSV 帐本中。
OP_RETURN 虽然有一定的功能扩展,但总体来说能力还是有限。于是产生了隔离见证的技术。
(2)Segwit 隔离见证
隔离见证,即 Segregated Witness(简称 SegWit),由 Pieter wuile(比特币核心开发人员、Blockstream 联合创始人)在 2015 年 12 月首次提出,后来形成了比特币 BIP 141 。隔离见证将比特币区块中交易的数据结构稍加修改,以解决如下问题:
1)transaction malleability 问题。
2)SPV 证明中传输交易的签名成为可选项,能够减少 Merkle proof 传输的数据量。
3)变相增加区块容量。
前两项主要是增加安全性和性能,其中对新技术影响最多的是第三项,变现增加了区块的容量(见下面的概念 Block weight),从而为比特币的能力扩容打下来基础,以至于后面的 Taproot(隔离见证的第二个版本)的进一步加强。
虽然变现扩大了区块容量,但隔离见证也受到区块大小限制。比特币的区块大小限制为 1 M bytes,由于 witness 数据不包含在这个限制中,为了防止 witness 数据被滥用,仍然对总的区块大小做了限制。引入了一个新概念叫块重量(Block weight)
Block weight = Base size * 3 + Total size
Base size 是不包含 witness 数据的块大小
Total size 总大小是按 BIP 144 中所述序列化交易的块大小(以字节为单位),包括基础数据和见证数据。
隔离见证限制 Block weight <= 4 M。
隔离见证还在技术上使得比特币的扩容可以使用闪电网络,这里不详细介绍这部分的内容。
(3)Taproot 隔离见证 V2 版本
如果直接使用 Taproot 这个单词,很多人以为是一个新概念,但如果告诉你这是隔离见证的第二个版本,大部分人都会明白其中的关联性。与 Taproot 相关的 BIP 是 340 , 341 , 342 ,他们的名称是:BIP 340 (Schnorr Signatures for secp 256 k 1),BIP 341 (Taproot: SegWit version 1 spending rules),BIP 342 (Validation of Taproot Scripts)。
2021 年 11 月,Taproot 以软分叉的形式正式生效。此次升级由 BIP 340、BIP 341 和 BIP 342 组合。其中 BIP 340 引入了可以同时验证多个交易的 Schnorr 签名,取代了椭圆曲线数字签名算法(ECDSA),再一次扩大了网络容量并加快了批量交易的处理速度,为部署复杂的智能合约提供了可能性;BIP 341 实现了默克尔化抽象语法树(MAST)来优化区块链上的交易数据存储;BIP 342 (Tapscript)采用比特币的脚本编码语言扩充的比特币原生脚步能力的不足。
由隔离见证 Segwit 与 Taproot 的空间扩大,导致了 Schnorr、MAST 树和 Taproot Scripts 的产生,他们要完成的使命是比特币主网的功能扩大。
通过 2.1 节,我们看到了比特币在扩容和扩能上面的不断探索,直到产生了 Taproot 技术,以及相关的几个重要技术 Schnorr、MAST、Taproot Scripts,比特币的能力格局才真正被打开。
(1)Schnorr 签名
Taproot 的发展,在扩充能力的同时,对签名算法有了一定的要求,于是 Schnorr 签名开始出现,并用来替代椭圆曲线数字签名算法(ECDSA)。Schnorr 签名是一种数字签名方案,可以高效且安全地对交易和消息进行签名。它最早由克劳斯·施诺尔(Claus Schnorr)在 1991 年的一篇论文中描述。Schnorr 因其简单性、可证明的安全性和线性性而受到赞誉。
Schnorr 签名的优势:
1)Schnorr 签名具有多种优势,包括高效性、增强的隐私性,同时保留了 ECDSA 的所有功能和安全假设。Schnorr 签名可以实现较小的签名大小、更快的验证时间,并且对某些类型的攻击具有改进的抵抗能力。
2)Schnorr 签名最显著的优势是密钥聚合(key aggregation),将多个签名聚合为一个签名,该签名对其密钥的总和有效。换句话说,Schnorr 使得多个合作方能够生成一个对他们的公钥总和有效的签名。签名聚合使得多个签名者的签名可以合并为一个单一的签名。
密钥聚合能够降低交易费用并提高底层可扩展性,因为来自多签名设置的电子签名在区块中占用的空间与来自单方交易的签名相同。Schnorr 的这个特性可以用于减小多重签名支付和其他与多重签名相关的交易的大小,例如,闪电网络通道交易。
3)Schnorr 签名的另一个重要特性是不可篡改性。
4)Schnorr 还提供了很多隐私优势。它可以让多重签名方案与传统的单一公钥无法从外部区分,Schnorr 使得观察者在链上活动中更难区分多重签名的支出和单一签名的支出。此外,在 n-of-m 多重签名设置中,Schnorr 使得外部观察者更难通过查看链上信息来确定哪些参与者在交易中签名,哪些没有签名。
Schnorr 签名被实现在 BIP-340 中,作为 Taproot 软分叉升级的一部分,并于 2021 年 11 月 14 日在区块高度 709, 632 上激活。Schnorr 使 BTC 的数字签名更快、更安全、更易处理。值得注意的是,Schnorr 签名与 BTC 的密码学算法向后兼容,这样就可以通过软分叉升级引入它们。
(2)MAST 抽象语法树
MAST 在中英文中的缩写说明有一点点歧义。BIP 官方(BIP 114)和一些文章使用 MAST 的缩写为: Merklized Abstract Syntax Tree(默克尔抽象语法树)。其它一些资料使用 Merklized Alternative Script Trees (MAST)翻译成中文 Merklized 替代脚本树 (MAST)。在《Mastering Bitcoin》这本图书中,和一篇文章都是这个缩写说明:https://cointelegraph.com/learn/a-beginners-guide-to-the-bitcoin-taproot-upgrade。
默克尔抽象语法树和 Merklized 替代脚本树 (MAST)从作用上看起来相同。从翻译的角度,我个人感觉保持比特币官方 BIP 协议中的用法。
MAST 背后的概念来自于两种概念, 抽象语义树和默克尔树。
抽象语义树(AST) 属于计算机科学中的编译原理和形式语言学的知识领域。抽象语义树是编译过程中的一个中间表示形式,用于表示源代码的语义结构。它将源代码转换为一种树形结构,其中每个节点代表一个语义单元,而边表示它们之间的关系。抽象语义树在编译器的词法分析和语法分析阶段起到重要作用,帮助编译器理解源代码的含义并进行后续的优化和生成目标代码的过程。通俗说抽象语义树(AST) 是一种通过将一个程序分割成独立的小块来描述程序的方法,这样会让程序变得更容易分析和优化。为了生成一个 AST,需要把所有的方程与其前提用箭头连接起来,直至所有的前提都被找出。下图即是一段脚本的 AST。
另一方面,默克尔树则可用来验证某个元素是否是属于某个集合,且无需知晓整个集合的全貌。举个例子,比特币的简易支付验证钱包(SPV wallet)就使用默克尔树来验证某笔交易是否存在于某个区块中,这样无需下载完整的区块,可以节省带宽。
要生成一棵默克尔树,先要把每个元素都各自哈希一次,生成各自唯一的标识符;然后这些标识符配对之后再次哈希,生成这一对标识符的标识符;如此不断重复,直至只剩下一个标识符,称为「默克尔根」,它就是一个短小精悍、但是标记了整个集合的标识符了。
在验证某个元素属不属于某个集合时,拥有整个集合的人可以向你提供从那个元素到默克尔根路径上的所有标识符。这样就能证明,这个元素确实在这个集合内。
简而言之,AST 背后的技术让你可以把一个程序分成多个小块,而默克尔树让我们可以验证这些小块确实是一个完整程序的一部分,且不必暴露整个程序。这就是 MAST 的基本原理,可以让花费者用一个默克尔证明来替换在单次交易中没有用到的条件,优点是:减少交易体积、提高隐私性,并支持更大的合约。
具体的 MAST 树在网上有很多案例,懂得程序开发的人员,梳理一个 MAST 的流程就可以清楚相关的逻辑。
既然有了 MAST 抽象语法树,那么就需要扩展比特币原生语法的能力,于是 Taproot Scripts 就产生了。
(3)Taproot Scripts
在 BIP 342 协议中入 Tapscript 脚本,Taprootscript 是原始比特币脚本的升级版,也可以被称为一种语言,但它实际上是带有命令的操作码的集合,这些命令为另两个 BIP 的实施助力。Taprootscript 还取消了 10000 字节的脚本大小上限,为在比特币网络创建智能合约提供了更好的环境。(该升级也为后来 Oridnals 的诞生埋下基础,因为 Ordinals 协议就是利用的 Taproot 的 script-path spend scripts 脚本来实现的附加数据)。详细资料可以查阅官方网址:
https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki
当前 TaprootScript 的能力还没有被充分发挥,后期的更多建设会体现出其威力。例如,比特币一层网络与二层网络的连接技术,应该更多的使用 Taproot、MAST 与 TaprootScripits。
在比特币的生态有了 Segwit、Taproot、Schnorr、MAST、Taproot Scripts,这些基础的工具,新的应用就开始产生了。开始阶段的应用是那些轻量级,简单的应用。
(1)Ordinals 序数协议、铭文、BRC 20
Ordinals 协议的诞生与 sat 的概念高度相关,协议提出序数(Ordinals)和铭文(Incriptions)的概念。序数(Ordinals)指为比特币网络上的每个 Satoshi( 聪 )按照开采顺序分配一个数字的编号方案。协议中,无论 sat 在不同的钱包之间如何转移,其序数标识都保持不变。运行 Rodarmor 开源软件 ORD 的比特币全节点可以跟踪这些带编号的聪。这为人们提供了一个精确跟踪每个聪,并进行独立验证的机制。
铭文(Inscriptions)是通过在聪上刻录信息。通过结合 SegWit 和 Taproot,Ordinals 协议可以在比特币区块上为每个聪刻录一个小于 4 MB 的文件,也就是铭文。铭文可以包含各种形式的信息,如文字、图片、视频等。下图是样例铭文截图。
简单来说,序数的编号方案为每个聪提供了唯一的可追溯的编号,使聪拥有了非同质化的特点。铭文可以在序数上添加不可分割的数据信息,类似于在一张白纸上进行艺术创作。两者结合,让比特币拥有了新的 NFT 标准。Ordinals 的本质其实很简单,它更像是一个 NFT 协议,只不过与 ETH 或是其他公链的 NFT 元数据(MetaData)大多存储于 IPFS 或是中心化服务器不同,Ordinals 的元数据嵌入到了交易的见证字段(Witness Data),像是被「铭刻」到某个特定的聪上一样这也是铭文这个词的来源。
BRC-20 :受 Ordinals 协议启发,Twitter 用户@domodata 于 2023 年 3 月 8 日创建比特币实验性的可替代代币标准 BRC-20 。Ordinals 协议通过给每个聪赋予不同的「属性」来创造 BTC 网络 NFT,BRC-20 则通过给定一个统一的「格式」以及「属性」来创 BTC 上的 FT,也就是同质化代币。
BRC-20 通过 Ordinals 协议将一段 JSON 文本写入 BTC 铭文来部署代币合约、铸币和转移代币(Depoly、Mint、Transfer),部署的关键在于代币名称、总供应量、单次最大铸造量等。对于转账或买入 / 卖出的交易,会刻有额外的 NFT 来跟踪链下余额。「先到先得」的铸币机制,带来了公平的发行与参与机会;同时由于 BTC 生态基础设施相对不完善,有一定的学习门槛,低流动性使得 BRC-20 代币能够轻易被拉升,ordi,sats,rats 等 BRC 20 代币开启了一波造富的神话。
(2)其他协议 -Atomicals,ARC 20
Atomicals 协议的诞生颇有戏剧性,创始人 Arthur 在 Ordinals 协议刚发布时,想在它之上开发一个 DID 项目,但在开发过程中,他发现 Ordinals 协议有很多局限性,不利于支持他想实现的一些特性。于是, 2023 年 5 月 29 日,Arthur 在推特上发布了第一条关于 Atomicals 协议构思的推文,经过几个月的开发后,Atomicals 协议于 2023 年 9 月 17 日上线。后来,Atomicals 协议衍生出 Dmint、Bitwork、ARC-20、RNS 等四大概念,未来还将推出 AVM 和拆分方案。
类似 Ordinals 与 BRC 20 ,在 Atomicals 上面部署同质化代币就形成了 ARC 20 。对于 ARC 20 感兴趣的读者,可以进一步阅读。
https://docs.atomicals.xyz/arc20-tokens
(3)其他协议 -Rune
随着发展,作为 Ordinals 的创始人 Casey Rodarmor 发表文章指出:BRC-20 代币具有「UTXO 扩散的不良后果」,并建议将 Runes 作为基于 UTXO 的替代方案。现有的各类协议,普遍存在着协议实施复杂、用户体验差、垃圾未花费交易输出(UTXO)、操作需要原生代币等问题。
Runes 的转移使用 OP_RETURN,协议消息中的第一个数据输出被解码为一个整数序列,这些整数被解释为(ID,OUTPUT,AMOUNT)元组序列。如果解码后的整数个数不是三的倍数,则该协议消息消息无效。ID 是要进行转账的 Token ID、OUTPUT 是要分配给的输出索引(即分配给第几个输出)、AMOUNT 是要分配的运行量。处理完所有元组分配后,任何未分配的 Runes Token 都将分配给第一个非 OP_RETURN 输出,其余的可以通过将 Runes 协议分配给包含协议消息的 OP_RETURN 输出来刻录 Runes Token。
Runes 的发行:基于 UTXO 的同质代币追踪。如果协议消息有第二次数据推送,则为发行交易。第二次数据推送被解码为两个整数,SYMBOL,DECIMALS。如果还有其他剩余整数,则协议消息无效。SYMBOL 是一个基本 26 位可读符号,类似于 Ordinals 名称中使用的符号,目前唯一有效的字符是 A 到 Z。DECIMALS 是显示发行 Runes 时应使用的小数点后的位数。如果 SYMBOL 尚未分配,则该 Runes Token 将被分配一个 ID 值(从 1 开始)。如果 SYMBOL 已经被分配,或者是 BITCOIN、BTC 或 XBT,则不会创建新的符文。这是 Runes 协议的特殊之处。它没有将余额记录链接到钱包地址,而是将记录放在 UTXO 本身中。
新的 Runes Token 从发行交易开始,指定供应量、符号和小数位数,并将该供应量分配给特定的 UTXO。UTXO 中可以包含任意数量的符文代币,无论其大小如何。UTXO 仅用于跟踪余额。然后,传输函数使用该 UTXO,将其分割成多个任意大小的新 UTXO,包含不同数量的符文,将记录发送给其他人。相对于 BRC-20 ,Runes 减少了一层服务器共识,变得更加简单,同时不依赖链下数据,没有原生代币,非常适合比特币的原生 UTXO 模型。
(4)其他协议 -BTC stamps,SRC 20 ,SRC 721
比特币 Stamps 系统由 Mike In Space 于 2023 年 3 月发布,最初是 Counterparty 上的一个概念验证项目(一个自 2014 年以来就存在的比特币 L2)。由于其底层协议的更新,Stamps 已完全转向比特币,去年夏天,现在被称为 SRC-20 。创始人 Mike 最初将 Stamps 设想为铸造永久性比特币 NFT 的一种方式。然而,该协议已经扩展到复制 BRC-20 ,这是一种批量可替代代币,自 Casey Rodarmor 于 2023 年 1 月推出 Ordinals 以来,由于铭文热潮的兴起,这种代币在比特币上蓬勃发展。
Stamps 和 Ordinals 之间的主要区别在于架构。这是因为 Stamps 将它们的元数据存储在多重签名未花费交易输出(UTXO)中,而 Ordinals 则将它们的元数据存储在比特币交易的「见证」部分中。这种设计上的区别显现出了开发者的取舍。就是说,Stamps 的 UTXO 方法使它们不可修剪,因此看起来是永久性的,尽管它们的制造成本比 Ordinals 铸造更昂贵。相反,Ordinals 使用见证数据的方式最终使它们可被修剪,它们的制造成本比 Stamps 更低。
因此,虽然 Ordinals 可能为当今加密领域的 NFT 提供最佳的持久性成本比(也可以在以太坊上获得链上 NFT,但它们的构建成本相对比 Ordinals 更高),但 Stamps 目前似乎提供了最佳的直接永久性保证。
在 BTC stamps 产生后,开始产生了 SRC 20 与 SRC 721 ,原理与 BRC 20 相似。BRC-20 是建立在 Ordinals 协议上的,而 SRC-20 是建立在 BTC STAMPS 上的。感兴趣的读者,可以进一步阅读 SRC 20 与 SRC 721 相关文档。
https://docs.openstamp.io/introduction/src20-protocol
https://docs.openstamp.io/introduction/src721-protocol
介绍至此,比特币在一层网络上的重要新技术都已经介绍。在之后的扩容与扩能方面,开始借助比特币的上层设施,如比特币的 Layer 2 或借助闪电网络等实现的更高层,如 RGB。这方面的文章建议阅读《一文梳理比特币二层(Layer 2)建设的基础知识体系 V1.5 版》和《从状态机的角度观察比特币二层,可以看到未来 Web3.0 应用的架构和建设路径》,或者其他关于比特币二层建设或架构设计方面的文章。
通过第二节的内容,我们看到比特币生态的技术发展已经为更大规模的应用打下了基础。但因为发展需要一个过程,和部分相关技术的不成熟,使得当前流行的应用与最终的常见应用还有比较大的区别。
从前面两节我们可以看到,比特币技术的发展本质上是区块的扩容与能力的扩容。
在区块扩容上,隔离见证导致了事实上的区块扩容,虽然有各种提议可以裁剪掉见证部分,但这种事情发生的概率不大,尤其是见证部分被赋予了更多含义之后。
在扩充能力上,Taproot、Schnorr、MAST、Taproot Scripts,等技术赋予了比特币更多的能力。尤其是 MAST+Taproot Scripts 会扩充比特币原生脚本语言的能力,加上其他几项技术会扩展比特币语言处理复杂场景的能力。但这些能力扩容也会加大比特币开发和理解的难度,毕竟这些 Scripts 开发不是高级语言。并且这部分的能力扩充,会滞后于用户对于区块容量扩充的理解与学习速度。
因为使用区块扩容简单,使用能力扩容复杂,这就是首先会产生用户将那些小图片 NFT 写入比特币主网,和产生了 BRC 20 等应用的原因。当前比特币主网上的多种应用几乎都是在探索区块扩容后的应用。一小部分应用开始能力扩容的探索,例如,BEVM 的一层和二层连接有一定的代表性,较多的使用了上述基本元素构建的功能。其 Shnorr 签名 +MAST 合约 + 比特币轻节点网络的 BTC L2 解决方案,是一个很好的学习连接一层与二层的案例。未来会有更丰富的能力扩充的案例产生。
能力扩充的边界应该在哪里?我们可以从分层设计的角度来评判,如果这些能力扩充更多的是作为比特币一层与二层的连接技术,那么就不应该将能力扩充变得过于复杂。但基于我们人类丰富的创造力和资产发行与管理的强大吸引力,一些团队或个人会探索出更多的能力扩充场景的案例。
区块链技术产生的最直接原因是数字货币,所以发行资产、管理资产等应用是比特币或区块链领域的一个最直接需求。不管是从彩色币的探索到 BRC 20 ,ARC 20 等应用,还是以太坊上面的 ICO,IDO 等应用,都是在探索资产发行。像 Uniswap,Lending,AMM,都是资产管理的应用,这部分应用在以太坊等网络上已经得到成熟发展,随着比特币生态技术的发展,这些资产管理应用会转移到比特币生态,更多的应该是在比特币二层上面进行。
在满足了发行资产、管理资产等需求,才会有精力和时间去发展属于 Web3.0 时代(也可以称为价值时代)的大规模应用。未来 Web3.0 时代大规模应用的系统架构,我在《从状态机的角度观察比特币二层,可以看到未来 Web3.0 应用的架构和建设路径》有相关的描述。
建设的路径是不断满足需求的过程,可以分为短期、中期、长期三个阶段。短期是通过比特币主网上面的新技术产生的应用和基于链的二层建设的简单阶段,产生的应用完成主要的能力扩充,满足各种金融应用。中期基于链的二层建设的中后期与基于分布式系统的二层建设,满足各种金融应用与信任应用。长期是基于比特币生态的大规模建设完成真正的 Web3.0 时代的建设。
比特币的原有技术一直存在大规模应用与比特币应该具有的能力的冲突问题。大规模应用和交易规模是否意味着更复杂的交易指令和更大的交易空间?是否意味着一定要在比特币单一系统上实现所有的功能?在早期,比特币生态技术发展不完善的情况下,这些现象似乎都是比特币本身的问题。随着技术的发展,很多问题会得到更清晰的答案。
在本文中列出一些相关问题,以及对这些问题的产生与解决过程。通过这篇文章,可以看到这些问题与技术之间的关联性,以及比特币主链与相关「测试链」的变化过程。比特币的技术一直被不同的项目与团队在探索中(包括以太坊都是对比特币不完善的一种探索),只是在比特币主网上产生的变化一直不够明显,直到 Taproot 等技术的产生,推动了 Ordinals 协议等协议产生之后,重新进入了一个新的发展高潮。
从整体看这些发展过程与产生的相关技术,我们能够看到他们之间的联系,可以推测出更多发展方向与整体架构。
比特币的编程语言是一种逆波兰范式的脚本语言,没有循环语句和条件控制语句(稍后看 Taproot&Taproot Script 扩充了这块能力)。因此,人们常说:比特币脚本语言不是图灵完备的,这导致比特币脚本语言,有一定的局限性。
当然,由于这些局限性,黑客就没办法使用这种脚本语言写一些死循环(会造成网络瘫痪),或者一些能导致 DOS 攻击的恶意代码,也就避免了比特币网络受到 DOS 攻击。比特币的开发者,也认为核心区块链,不应该具备图灵完整性,来避免一些攻击和网络堵塞。
但是,也正是由于这些局限性,比特币网络,没有办法运行其他复杂的程序了,没办法完成一些「有用」的功能。而后面发展的一些区块链系统,为了解决具体问题,满足用户的需求,直接改变了这点。如,以太坊使用的语言就具备了图灵完备。
比特币脚本指令常见的类型:
关键字:
常数。 如:OP_ 0 ,OP_FALSE
流程控制。 如: OP_IF,OP_NOTIF,OP_ELSE,……
堆栈。 如:OP_TOALTSTACK(把输入压入辅堆栈的项部,从主堆栈删除),……
字符串。 如:OP_CAT(连接两个字符串,已禁用),OP_SIZE(把栈顶元素的字符串长度压入堆栈(无需弹出元素))
位逻辑。 如:OP_AND,OP_OR,OP_XOR
算术逻辑。 如:OP 1 ADD(输入值加 1),OP 1 SUB(输入值减 1)
加密。如:OP_SHA 1 (输入用 SHA-1 算法 HASH.),OP_CHECKSIG()
伪关键字
保留关键字
比特币脚本指令常见的类型:
脚本:
支付到比特币地址的标准交易(pay-to-pubkey-hash)
标准比特币产生交易(pay-to-pubkey)
可证明的无法花掉 / 可删除的输出
Anyone-Can-Spend 输出
猜谜交易
五个标准类型的交易脚本包括:支付到公钥哈希(P2P KH)、支付到公钥、多重签名(限定最多 15 个密钥)、支付到脚本哈希(P 2 SH),以及数据输出(OP_RETURN)。
在网页:https://en.bitcoin.it/wiki/Script 中有详细的说明。
删减比特币支持的指令
比特币历史上有多次删减指令的事情发生。下面的图表中,红色部分是已经删减掉的指令。
(1)字符串操作
(2)
(3)算术操作
为什么要删减指令?安全性只是一方面的考虑,如果我们用分层设计的思想看待删减指令会理解其合理性,这样做能让底层协议更基础更稳定。也许中本聪一开始就意识到了这个问题,不然不会主动的删减指令。我们常人的思维是建造一个直接满足用户的需求,具有完善指令和系统功能的小系统,而不是一个需要协作的大型协议。
这样也就造成了一种事实,只有比特币适合作为一层网络。我在《比特币价格过高会促生一个新的替代链产生》文章中分析过这种现象,从经济学视角和技术视角分析,有产生比特币替代链的可能性。但从比特币的基本特点和分层设计的角度,几乎只有比特币能够作为一层网络基础设施,即使有替代链也是一个 1.5 层的产物。在一层网络这个层面,真品只有比特币,能有一些替代作用的链最多是 A 货。
在比特币的发展历史,除了删减指令问题,另一方面是区块大小之争,这经常造成比特币的硬分叉。
BTC 创立之初并没有限制区块大小,以便能够在相同时间处理的交易笔数。但当早期 BTC 价格非常低,恶意交易的成本也非常低,为了解决这一问题,中本聪在 2010 年 9 月 12 日主持了一次软分叉,添加了区块体积不得超过 1 MB 的限制。中本聪指出但这种限制是临时性的,未来可以以可控和逐步的方式提高区块限制,以便满足扩容的需要。
下图为比特币的分叉历史:
随着比特币的流行,网络交易拥堵和确认时间增长问题愈发严重。2015 年 Gavin Andresen 和 Mike Hearn 宣布将在新版 BitcoinXT 中实现 BIP-101 提案,希望将区块上限提高至 8 MB。而 Greg Maxell,Luke Jr,Pieter Wuille 等核心开发者则持反对意见,认为这种做法会提高运行全节点的门槛,而且带来不可控的影响。这场争论最终在议题和参与范围均出现了扩大化。
从上面的内容,我们看到中本聪也表达了「区块大小这种限制是临时性的,未来可以以可控和逐步的方式提高区块限制,以便满足扩容的需要。」但什么时候分叉支持更大区块,单独分出一条链支持大区块是否可以解决问题?在不断的争议中,也产生了众多的案例。如,BCH 区块大小是 8 M,后来又增加的 32 M。BSV 区块大小是 128 M。而除了 BCH(和后面的 BSV)以外,这一时期还出现了许多其它 BTC 分叉币,据 BitMEXResearch,仅在 BCH 分叉后的一年内,就出现了至少 50 种新的分叉币。
稍后的内容我们会看到,在比特币主网上面 Segwit 和 Taproot 也在一定程度上将区块的空间从 1 M 提升到了 4 M。
比特币的分叉是一种发展探索,在尝试通过自身的改变来完成对更多需求的支持。其中有用户需求、矿工需求、投资人需求、开发者需求、……。
中本聪离开后,继承人 Gavin Andresen 主导建立了 Bitcoin Core 和 Bitcoin 基金会。在此期间,针对 BTC 的可拓展性探索一直存在,尤其是在资产发行领域。
(1)Colored Coins(染色币)
eToro 首席执行官 Yoni Assia 在 2012 年 3 月 27 日发表的一篇文章中第一个提出彩色币。这个想法不断发展,在 Bitcointalk 等论坛上,彩色硬币的概念开始形成并获得关注。最终 Meni Rosenfeld 于 2012 年 12 月 4 日发布了一份详细介绍彩色货币的白皮书。
染色币的设想是通过给比特币的特定部分添加特殊的标注(即染色),来代表更广泛的资产和价值。染色币在实现上出现了一系列实体,大致分为两类:
1)基于 OP_RETURN:如 Flavien Charlon 在 2013 年提出的 Open Assets,利用 OP_RETURN(在 Bitcoin v 0.9.0 中被提出,可以用于在 Bitcoin 上存放少量的数据,最初的限制为 40 bytes,后提高至 80 bytes)。操作码存储到脚本中,并通过外界读取的方式来完成「染色」和交易。(这种模式与 Ordinals 依靠外部索引确定资产合法性类似)。
2)基于 OP_RETURN:典型代表是 ChromaWay 在 2014 年提出的 EPOBC Protocol,EPOBC 资产的额外信息存储在比特币交易中的 nSequence 字段,每个 EPOBC 资产的类别和及合法性需要追溯到 genesis 交易来确定。
(2)MasterCoin(OMNI)
JR Willett 在 2012 年 1 月 6 日发布了 MasterCoin 的设想,并取名「比特币第二份白皮书」,并在 2013 年 7 月通过 ICO 的方式正式启动项目,最终募集到了 5120 个 BTC(当时价值 50 万美元)。MasterCoin 和 Colored Coins 区别在于它建立了一个完整的节点层,通过扫描比特币区块来维护状态模型数据库,该数据库驻留在区块链之外的节点中。这种设计可以提供比 Colored Coins 更复杂的功能,例如创建新的资产、去中心化交易所、自动化价格反馈等。2014 年,Tether 也通过 Mastercoin 协议在比特币上推出了稳定币,即我们熟知的 Tether USD (OMNI)。
( 3)CounterParty
Counterparty 于 2014 年正式推出。Counterparty 也使用 OP_RETURN 将数据存储至 BTC 网络中。但与染色币不同,资产在 Counterparty 不是以 UTXO 的形式存在,而是通过 OP_RETURN 载入信息来表明资产的转移,当一个资产持有者使用持有地址对歹有特殊数据的交易进行签名后,资产便完成了转移。通过这种方式,Counterparty 可以实现资产的发行、交易以及兼容以太坊智能合约的平台。
除此以外,也有观点认为 Ethereum、Ripple 和 BitShares 也属于更广义的「Bitcoin 2.0」。
比特币系统的不完善(或局限性)主要表现在几个方面(本文中的不完善是根据以太坊白皮书中的总结,并非是真正的不完善。
在当前的区块链项目中,主要有两种记录保存方式,一种是账户 / 余额模型,一种是 UTXO 模型。比特币采用就是 UTXO 模型,以太坊、EOS 等则采用的是账户 / 余额模型。
在比特币钱包当中,我们通常能够看到账户余额,然而在中本聪设计的比特币系统中,并没有余额这个概念。「比特币余额」是由比特币钱包应用派生出来的产物。UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。
所以现实世界中没有比特币,只有 UTXO。比特币的交易由交易输入和交易输出组成,每一笔交易都要花费(spend)一笔输入,产生一笔输出(output),而其所产生的输出,就是「未花费过的交易输出」,也就是 UTXO。
如果要实现智能合约,UTXO 这种账户模型存在非常大的问题。以太坊黄皮书的设计者 Gavin Wood 对 UTXO 的理解十分深刻。 以太坊的最大新功能点是智能合约,因为智能合约的考虑,Gavin Wood 要基于 UTXO 去实现图灵完备的智能合约是困难的。而账户模型是天然的面向对象的,对每一笔交易,都会在相对应账户上进行记录(nonce++)。为了易于管理账户,而引入了全局状态,每一笔交易都会改变这个全局状态。这和现实世界是相对应的,每一个微小的改变,都会改变这个世界。因此以太坊使用了账户系统,后期的公链基本都是基于各种类型的账户系统实现的。
UTXO 的另一个严重缺陷是,不能为账户的取款额度提供精细的的控制。这点在以太坊的白皮书中有相关的说明。
尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是比特币的脚本语言,没有循环语句和条件控制语句。因此,我们说:比特币脚本语言不是图灵完备的。这导致比特币脚本语言,有一定的局限性。当然,由于这些局限性,黑客就没办法使用这种脚本语言,写一些死循环(会造成网络瘫痪),或者一些能导致 DOS 攻击的恶意代码,也就避免了比特币网络受到 DOS 攻击。比特币的开发者,也认为核心区块链,不应该具备图灵完整性,来避免一些攻击和网络堵塞。但是,也正是由于这些局限性,比特币网络,没有办法运行它复杂的程序了。不支持循环语句的目的是避免交易确认时出现无限循环。
为了安全性,不支持图灵完备的理由是不充分的。而且非图灵完备的语言所做的事情很有限。
挖矿的中心化问题,比特币挖矿算法基本上是让矿工千万次地轻微改动区块头,直到最终某个节点的改动版本的哈希小于目标值。然而,这种挖矿算法容易被两种形式的中心化攻击。第一种,挖矿生态系统被专门设计的因而在比特币挖矿这一特殊任务上效率提高上千倍的 ASICs(专用集成电路)和电脑芯片控制。这意味着比特币挖矿不再是高度去中心化的和追求平等主义的,而是需要巨额资本的有效参与。第二种,大部分比特币矿工事实上不再在本地完成区块验证;而是依赖中心化的矿池提供区块头。这个问题可以说很严重:当前,排名前三的采矿池间接控制着比特币网络中约 50 %的处理能力。
扩展性问题是比特币的一个重要问题。使用比特币,每小时增长约 1 MB。如果比特币网络每秒处理 Visa 的 2000 次交易,则每三秒钟将增长 1 MB(每小时 1 GB,每年 8 TB)。较低的交易次数,也引起比特币社区的争议,大区块链虽然可以提高性能,但问题是中心化风险。
从产品生命周期的角度,比特币一些小的不完善,可以在自身系统中得到改善,改善的方法受到当前系统的限制。但如果可以在一个新系统中解决这些问题,就完全可以不考虑老系统的限制问题。既然要打造一个新的区块链系统,那么设计新系统的时候,这些小的功能完善也一并进行设计与升级改造。
分层设计
分层设计是一种人类处理复杂系统的手段和方法论,通过将系统划分为多个层次结构并定义各层之间的关系和功能,以实现系统的模块化、可维护性和可扩展性,从而提高系统的设计效率和可靠性。
对于一项广泛和庞大的协议体系,使用分层会有明显的好处。这样做使人们容易理解,容易分工实现与容易分模块改进等优点。如计算机网络中的 ISO/OSI 的七层模型设计,但具体的实现中,可以合并一些分层,例如,具体的网络协议 TCP/IP 是四层协议。具体说协议分层的优点:各层次之间是独立的、灵活性好、结构上可分割开、易于实现和维护、能促进标准化工作。
从分层协议的角度看,比特币因为要处于最基础的底层,那么他的 UTXO、非图灵完备、出块时间长、区块容量小、创始人的消失、……,都不是缺点,反而是作为一层网络应该具有的特点。
注释:作者在《一文梳理比特币二层(Layer 2)建设的基础知识体系 V1.5 版》对协议分层有更详细的说明。
在上一节我们探讨了比特币原有技术的主要冲突和一些探索案例,但很多导致了硬分叉或产生了全新的异构链。在比特币本身这条区块链上,这种探索也产生了很多成果,本质上是区块的扩容与能力的扩容。他们主要表现在以下几个方面。
比特币的开发者一直想扩展比特币的能力,表现在几个方面:
(1)OP_RETURN 的使用
OP_RETURN 是一个脚本操作码,用来终止脚本并返回栈顶的值。这个操作码类似于编程语言中的返回函数。在比特币的历史上,OP_RETURN 操作码的功能被多次修改,现在它主要被用作为在账本上存储数据的一种方法。OP_RETURN 操作码的功能曾在过去发生过重大变化,现在它是一个重要的机制,使用它我们就能在链上存储任意数据。
OP_RETURN 最初是用于提前结束脚本执行的返回操作,执行结果将作为栈顶项目被呈现出来。这个操作码最初有一个容易被利用的漏洞,但中本聪很快修补了该漏洞。
对 OP_RETURN 功能的进一步更改
在 Bitcoin Core 的 v 0.9.0 那次升级中,「OP_RETURN 输出」脚本被制作成标准输出类型,允许用户将数据附加到「不可花费的交易输出(unspendable transaction output)」上。这类脚本中可用的数据量的上限最初被限制为 40 字节,然后提升至 80 字节。
将数据存储在区块链上:
将 OP_RETURN 改为始终返回 false 造成了有趣的结果。由于在 OP_RETURN 之后不会评估任何操作码或数据,因此网络用户开始使用此操作码来存储任意格式的数据。
在比特币现金(BCH)的时期,即 2017 年 8 月 1 日 -2018 年 11 月 15 日,能够附加到 OP_RETURN 输出的数据长度被扩展到 220 字节,更大的数据能够促进区块链上创新的应用,例如在区块链社交媒体上发布内容等。
在 BSV 上, 220 字节的限制依然被保留了一小段时间。随后,在 2019 年 1 月,由于 OP_RETURN 操作码以节点不验证任何后续操作码的方式终止脚本,所以节点也不会检查脚本是否在 520 字节的最大脚本大小限制内。由此一来,网络上的节点运营商决定将最大交易体积提高到 100 KB,从而赋予开发者有更多应用创新的自由,让新的应用可以将更大、更复杂的数据放入比特币账本。那时有一个应用例子,有人将将整个网站都放入了 BSV 帐本中。
OP_RETURN 虽然有一定的功能扩展,但总体来说能力还是有限。于是产生了隔离见证的技术。
(2)Segwit 隔离见证
隔离见证,即 Segregated Witness(简称 SegWit),由 Pieter wuile(比特币核心开发人员、Blockstream 联合创始人)在 2015 年 12 月首次提出,后来形成了比特币 BIP 141 。隔离见证将比特币区块中交易的数据结构稍加修改,以解决如下问题:
1)transaction malleability 问题。
2)SPV 证明中传输交易的签名成为可选项,能够减少 Merkle proof 传输的数据量。
3)变相增加区块容量。
前两项主要是增加安全性和性能,其中对新技术影响最多的是第三项,变现增加了区块的容量(见下面的概念 Block weight),从而为比特币的能力扩容打下来基础,以至于后面的 Taproot(隔离见证的第二个版本)的进一步加强。
虽然变现扩大了区块容量,但隔离见证也受到区块大小限制。比特币的区块大小限制为 1 M bytes,由于 witness 数据不包含在这个限制中,为了防止 witness 数据被滥用,仍然对总的区块大小做了限制。引入了一个新概念叫块重量(Block weight)
Block weight = Base size * 3 + Total size
Base size 是不包含 witness 数据的块大小
Total size 总大小是按 BIP 144 中所述序列化交易的块大小(以字节为单位),包括基础数据和见证数据。
隔离见证限制 Block weight <= 4 M。
隔离见证还在技术上使得比特币的扩容可以使用闪电网络,这里不详细介绍这部分的内容。
(3)Taproot 隔离见证 V2 版本
如果直接使用 Taproot 这个单词,很多人以为是一个新概念,但如果告诉你这是隔离见证的第二个版本,大部分人都会明白其中的关联性。与 Taproot 相关的 BIP 是 340 , 341 , 342 ,他们的名称是:BIP 340 (Schnorr Signatures for secp 256 k 1),BIP 341 (Taproot: SegWit version 1 spending rules),BIP 342 (Validation of Taproot Scripts)。
2021 年 11 月,Taproot 以软分叉的形式正式生效。此次升级由 BIP 340、BIP 341 和 BIP 342 组合。其中 BIP 340 引入了可以同时验证多个交易的 Schnorr 签名,取代了椭圆曲线数字签名算法(ECDSA),再一次扩大了网络容量并加快了批量交易的处理速度,为部署复杂的智能合约提供了可能性;BIP 341 实现了默克尔化抽象语法树(MAST)来优化区块链上的交易数据存储;BIP 342 (Tapscript)采用比特币的脚本编码语言扩充的比特币原生脚步能力的不足。
由隔离见证 Segwit 与 Taproot 的空间扩大,导致了 Schnorr、MAST 树和 Taproot Scripts 的产生,他们要完成的使命是比特币主网的功能扩大。
通过 2.1 节,我们看到了比特币在扩容和扩能上面的不断探索,直到产生了 Taproot 技术,以及相关的几个重要技术 Schnorr、MAST、Taproot Scripts,比特币的能力格局才真正被打开。
(1)Schnorr 签名
Taproot 的发展,在扩充能力的同时,对签名算法有了一定的要求,于是 Schnorr 签名开始出现,并用来替代椭圆曲线数字签名算法(ECDSA)。Schnorr 签名是一种数字签名方案,可以高效且安全地对交易和消息进行签名。它最早由克劳斯·施诺尔(Claus Schnorr)在 1991 年的一篇论文中描述。Schnorr 因其简单性、可证明的安全性和线性性而受到赞誉。
Schnorr 签名的优势:
1)Schnorr 签名具有多种优势,包括高效性、增强的隐私性,同时保留了 ECDSA 的所有功能和安全假设。Schnorr 签名可以实现较小的签名大小、更快的验证时间,并且对某些类型的攻击具有改进的抵抗能力。
2)Schnorr 签名最显著的优势是密钥聚合(key aggregation),将多个签名聚合为一个签名,该签名对其密钥的总和有效。换句话说,Schnorr 使得多个合作方能够生成一个对他们的公钥总和有效的签名。签名聚合使得多个签名者的签名可以合并为一个单一的签名。
密钥聚合能够降低交易费用并提高底层可扩展性,因为来自多签名设置的电子签名在区块中占用的空间与来自单方交易的签名相同。Schnorr 的这个特性可以用于减小多重签名支付和其他与多重签名相关的交易的大小,例如,闪电网络通道交易。
3)Schnorr 签名的另一个重要特性是不可篡改性。
4)Schnorr 还提供了很多隐私优势。它可以让多重签名方案与传统的单一公钥无法从外部区分,Schnorr 使得观察者在链上活动中更难区分多重签名的支出和单一签名的支出。此外,在 n-of-m 多重签名设置中,Schnorr 使得外部观察者更难通过查看链上信息来确定哪些参与者在交易中签名,哪些没有签名。
Schnorr 签名被实现在 BIP-340 中,作为 Taproot 软分叉升级的一部分,并于 2021 年 11 月 14 日在区块高度 709, 632 上激活。Schnorr 使 BTC 的数字签名更快、更安全、更易处理。值得注意的是,Schnorr 签名与 BTC 的密码学算法向后兼容,这样就可以通过软分叉升级引入它们。
(2)MAST 抽象语法树
MAST 在中英文中的缩写说明有一点点歧义。BIP 官方(BIP 114)和一些文章使用 MAST 的缩写为: Merklized Abstract Syntax Tree(默克尔抽象语法树)。其它一些资料使用 Merklized Alternative Script Trees (MAST)翻译成中文 Merklized 替代脚本树 (MAST)。在《Mastering Bitcoin》这本图书中,和一篇文章都是这个缩写说明:https://cointelegraph.com/learn/a-beginners-guide-to-the-bitcoin-taproot-upgrade。
默克尔抽象语法树和 Merklized 替代脚本树 (MAST)从作用上看起来相同。从翻译的角度,我个人感觉保持比特币官方 BIP 协议中的用法。
MAST 背后的概念来自于两种概念, 抽象语义树和默克尔树。
抽象语义树(AST) 属于计算机科学中的编译原理和形式语言学的知识领域。抽象语义树是编译过程中的一个中间表示形式,用于表示源代码的语义结构。它将源代码转换为一种树形结构,其中每个节点代表一个语义单元,而边表示它们之间的关系。抽象语义树在编译器的词法分析和语法分析阶段起到重要作用,帮助编译器理解源代码的含义并进行后续的优化和生成目标代码的过程。通俗说抽象语义树(AST) 是一种通过将一个程序分割成独立的小块来描述程序的方法,这样会让程序变得更容易分析和优化。为了生成一个 AST,需要把所有的方程与其前提用箭头连接起来,直至所有的前提都被找出。下图即是一段脚本的 AST。
另一方面,默克尔树则可用来验证某个元素是否是属于某个集合,且无需知晓整个集合的全貌。举个例子,比特币的简易支付验证钱包(SPV wallet)就使用默克尔树来验证某笔交易是否存在于某个区块中,这样无需下载完整的区块,可以节省带宽。
要生成一棵默克尔树,先要把每个元素都各自哈希一次,生成各自唯一的标识符;然后这些标识符配对之后再次哈希,生成这一对标识符的标识符;如此不断重复,直至只剩下一个标识符,称为「默克尔根」,它就是一个短小精悍、但是标记了整个集合的标识符了。
在验证某个元素属不属于某个集合时,拥有整个集合的人可以向你提供从那个元素到默克尔根路径上的所有标识符。这样就能证明,这个元素确实在这个集合内。
简而言之,AST 背后的技术让你可以把一个程序分成多个小块,而默克尔树让我们可以验证这些小块确实是一个完整程序的一部分,且不必暴露整个程序。这就是 MAST 的基本原理,可以让花费者用一个默克尔证明来替换在单次交易中没有用到的条件,优点是:减少交易体积、提高隐私性,并支持更大的合约。
具体的 MAST 树在网上有很多案例,懂得程序开发的人员,梳理一个 MAST 的流程就可以清楚相关的逻辑。
既然有了 MAST 抽象语法树,那么就需要扩展比特币原生语法的能力,于是 Taproot Scripts 就产生了。
(3)Taproot Scripts
在 BIP 342 协议中入 Tapscript 脚本,Taprootscript 是原始比特币脚本的升级版,也可以被称为一种语言,但它实际上是带有命令的操作码的集合,这些命令为另两个 BIP 的实施助力。Taprootscript 还取消了 10000 字节的脚本大小上限,为在比特币网络创建智能合约提供了更好的环境。(该升级也为后来 Oridnals 的诞生埋下基础,因为 Ordinals 协议就是利用的 Taproot 的 script-path spend scripts 脚本来实现的附加数据)。详细资料可以查阅官方网址:
https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki
当前 TaprootScript 的能力还没有被充分发挥,后期的更多建设会体现出其威力。例如,比特币一层网络与二层网络的连接技术,应该更多的使用 Taproot、MAST 与 TaprootScripits。
在比特币的生态有了 Segwit、Taproot、Schnorr、MAST、Taproot Scripts,这些基础的工具,新的应用就开始产生了。开始阶段的应用是那些轻量级,简单的应用。
(1)Ordinals 序数协议、铭文、BRC 20
Ordinals 协议的诞生与 sat 的概念高度相关,协议提出序数(Ordinals)和铭文(Incriptions)的概念。序数(Ordinals)指为比特币网络上的每个 Satoshi( 聪 )按照开采顺序分配一个数字的编号方案。协议中,无论 sat 在不同的钱包之间如何转移,其序数标识都保持不变。运行 Rodarmor 开源软件 ORD 的比特币全节点可以跟踪这些带编号的聪。这为人们提供了一个精确跟踪每个聪,并进行独立验证的机制。
铭文(Inscriptions)是通过在聪上刻录信息。通过结合 SegWit 和 Taproot,Ordinals 协议可以在比特币区块上为每个聪刻录一个小于 4 MB 的文件,也就是铭文。铭文可以包含各种形式的信息,如文字、图片、视频等。下图是样例铭文截图。
简单来说,序数的编号方案为每个聪提供了唯一的可追溯的编号,使聪拥有了非同质化的特点。铭文可以在序数上添加不可分割的数据信息,类似于在一张白纸上进行艺术创作。两者结合,让比特币拥有了新的 NFT 标准。Ordinals 的本质其实很简单,它更像是一个 NFT 协议,只不过与 ETH 或是其他公链的 NFT 元数据(MetaData)大多存储于 IPFS 或是中心化服务器不同,Ordinals 的元数据嵌入到了交易的见证字段(Witness Data),像是被「铭刻」到某个特定的聪上一样这也是铭文这个词的来源。
BRC-20 :受 Ordinals 协议启发,Twitter 用户@domodata 于 2023 年 3 月 8 日创建比特币实验性的可替代代币标准 BRC-20 。Ordinals 协议通过给每个聪赋予不同的「属性」来创造 BTC 网络 NFT,BRC-20 则通过给定一个统一的「格式」以及「属性」来创 BTC 上的 FT,也就是同质化代币。
BRC-20 通过 Ordinals 协议将一段 JSON 文本写入 BTC 铭文来部署代币合约、铸币和转移代币(Depoly、Mint、Transfer),部署的关键在于代币名称、总供应量、单次最大铸造量等。对于转账或买入 / 卖出的交易,会刻有额外的 NFT 来跟踪链下余额。「先到先得」的铸币机制,带来了公平的发行与参与机会;同时由于 BTC 生态基础设施相对不完善,有一定的学习门槛,低流动性使得 BRC-20 代币能够轻易被拉升,ordi,sats,rats 等 BRC 20 代币开启了一波造富的神话。
(2)其他协议 -Atomicals,ARC 20
Atomicals 协议的诞生颇有戏剧性,创始人 Arthur 在 Ordinals 协议刚发布时,想在它之上开发一个 DID 项目,但在开发过程中,他发现 Ordinals 协议有很多局限性,不利于支持他想实现的一些特性。于是, 2023 年 5 月 29 日,Arthur 在推特上发布了第一条关于 Atomicals 协议构思的推文,经过几个月的开发后,Atomicals 协议于 2023 年 9 月 17 日上线。后来,Atomicals 协议衍生出 Dmint、Bitwork、ARC-20、RNS 等四大概念,未来还将推出 AVM 和拆分方案。
类似 Ordinals 与 BRC 20 ,在 Atomicals 上面部署同质化代币就形成了 ARC 20 。对于 ARC 20 感兴趣的读者,可以进一步阅读。
https://docs.atomicals.xyz/arc20-tokens
(3)其他协议 -Rune
随着发展,作为 Ordinals 的创始人 Casey Rodarmor 发表文章指出:BRC-20 代币具有「UTXO 扩散的不良后果」,并建议将 Runes 作为基于 UTXO 的替代方案。现有的各类协议,普遍存在着协议实施复杂、用户体验差、垃圾未花费交易输出(UTXO)、操作需要原生代币等问题。
Runes 的转移使用 OP_RETURN,协议消息中的第一个数据输出被解码为一个整数序列,这些整数被解释为(ID,OUTPUT,AMOUNT)元组序列。如果解码后的整数个数不是三的倍数,则该协议消息消息无效。ID 是要进行转账的 Token ID、OUTPUT 是要分配给的输出索引(即分配给第几个输出)、AMOUNT 是要分配的运行量。处理完所有元组分配后,任何未分配的 Runes Token 都将分配给第一个非 OP_RETURN 输出,其余的可以通过将 Runes 协议分配给包含协议消息的 OP_RETURN 输出来刻录 Runes Token。
Runes 的发行:基于 UTXO 的同质代币追踪。如果协议消息有第二次数据推送,则为发行交易。第二次数据推送被解码为两个整数,SYMBOL,DECIMALS。如果还有其他剩余整数,则协议消息无效。SYMBOL 是一个基本 26 位可读符号,类似于 Ordinals 名称中使用的符号,目前唯一有效的字符是 A 到 Z。DECIMALS 是显示发行 Runes 时应使用的小数点后的位数。如果 SYMBOL 尚未分配,则该 Runes Token 将被分配一个 ID 值(从 1 开始)。如果 SYMBOL 已经被分配,或者是 BITCOIN、BTC 或 XBT,则不会创建新的符文。这是 Runes 协议的特殊之处。它没有将余额记录链接到钱包地址,而是将记录放在 UTXO 本身中。
新的 Runes Token 从发行交易开始,指定供应量、符号和小数位数,并将该供应量分配给特定的 UTXO。UTXO 中可以包含任意数量的符文代币,无论其大小如何。UTXO 仅用于跟踪余额。然后,传输函数使用该 UTXO,将其分割成多个任意大小的新 UTXO,包含不同数量的符文,将记录发送给其他人。相对于 BRC-20 ,Runes 减少了一层服务器共识,变得更加简单,同时不依赖链下数据,没有原生代币,非常适合比特币的原生 UTXO 模型。
(4)其他协议 -BTC stamps,SRC 20 ,SRC 721
比特币 Stamps 系统由 Mike In Space 于 2023 年 3 月发布,最初是 Counterparty 上的一个概念验证项目(一个自 2014 年以来就存在的比特币 L2)。由于其底层协议的更新,Stamps 已完全转向比特币,去年夏天,现在被称为 SRC-20 。创始人 Mike 最初将 Stamps 设想为铸造永久性比特币 NFT 的一种方式。然而,该协议已经扩展到复制 BRC-20 ,这是一种批量可替代代币,自 Casey Rodarmor 于 2023 年 1 月推出 Ordinals 以来,由于铭文热潮的兴起,这种代币在比特币上蓬勃发展。
Stamps 和 Ordinals 之间的主要区别在于架构。这是因为 Stamps 将它们的元数据存储在多重签名未花费交易输出(UTXO)中,而 Ordinals 则将它们的元数据存储在比特币交易的「见证」部分中。这种设计上的区别显现出了开发者的取舍。就是说,Stamps 的 UTXO 方法使它们不可修剪,因此看起来是永久性的,尽管它们的制造成本比 Ordinals 铸造更昂贵。相反,Ordinals 使用见证数据的方式最终使它们可被修剪,它们的制造成本比 Stamps 更低。
因此,虽然 Ordinals 可能为当今加密领域的 NFT 提供最佳的持久性成本比(也可以在以太坊上获得链上 NFT,但它们的构建成本相对比 Ordinals 更高),但 Stamps 目前似乎提供了最佳的直接永久性保证。
在 BTC stamps 产生后,开始产生了 SRC 20 与 SRC 721 ,原理与 BRC 20 相似。BRC-20 是建立在 Ordinals 协议上的,而 SRC-20 是建立在 BTC STAMPS 上的。感兴趣的读者,可以进一步阅读 SRC 20 与 SRC 721 相关文档。
https://docs.openstamp.io/introduction/src20-protocol
https://docs.openstamp.io/introduction/src721-protocol
介绍至此,比特币在一层网络上的重要新技术都已经介绍。在之后的扩容与扩能方面,开始借助比特币的上层设施,如比特币的 Layer 2 或借助闪电网络等实现的更高层,如 RGB。这方面的文章建议阅读《一文梳理比特币二层(Layer 2)建设的基础知识体系 V1.5 版》和《从状态机的角度观察比特币二层,可以看到未来 Web3.0 应用的架构和建设路径》,或者其他关于比特币二层建设或架构设计方面的文章。
通过第二节的内容,我们看到比特币生态的技术发展已经为更大规模的应用打下了基础。但因为发展需要一个过程,和部分相关技术的不成熟,使得当前流行的应用与最终的常见应用还有比较大的区别。
从前面两节我们可以看到,比特币技术的发展本质上是区块的扩容与能力的扩容。
在区块扩容上,隔离见证导致了事实上的区块扩容,虽然有各种提议可以裁剪掉见证部分,但这种事情发生的概率不大,尤其是见证部分被赋予了更多含义之后。
在扩充能力上,Taproot、Schnorr、MAST、Taproot Scripts,等技术赋予了比特币更多的能力。尤其是 MAST+Taproot Scripts 会扩充比特币原生脚本语言的能力,加上其他几项技术会扩展比特币语言处理复杂场景的能力。但这些能力扩容也会加大比特币开发和理解的难度,毕竟这些 Scripts 开发不是高级语言。并且这部分的能力扩充,会滞后于用户对于区块容量扩充的理解与学习速度。
因为使用区块扩容简单,使用能力扩容复杂,这就是首先会产生用户将那些小图片 NFT 写入比特币主网,和产生了 BRC 20 等应用的原因。当前比特币主网上的多种应用几乎都是在探索区块扩容后的应用。一小部分应用开始能力扩容的探索,例如,BEVM 的一层和二层连接有一定的代表性,较多的使用了上述基本元素构建的功能。其 Shnorr 签名 +MAST 合约 + 比特币轻节点网络的 BTC L2 解决方案,是一个很好的学习连接一层与二层的案例。未来会有更丰富的能力扩充的案例产生。
能力扩充的边界应该在哪里?我们可以从分层设计的角度来评判,如果这些能力扩充更多的是作为比特币一层与二层的连接技术,那么就不应该将能力扩充变得过于复杂。但基于我们人类丰富的创造力和资产发行与管理的强大吸引力,一些团队或个人会探索出更多的能力扩充场景的案例。
区块链技术产生的最直接原因是数字货币,所以发行资产、管理资产等应用是比特币或区块链领域的一个最直接需求。不管是从彩色币的探索到 BRC 20 ,ARC 20 等应用,还是以太坊上面的 ICO,IDO 等应用,都是在探索资产发行。像 Uniswap,Lending,AMM,都是资产管理的应用,这部分应用在以太坊等网络上已经得到成熟发展,随着比特币生态技术的发展,这些资产管理应用会转移到比特币生态,更多的应该是在比特币二层上面进行。
在满足了发行资产、管理资产等需求,才会有精力和时间去发展属于 Web3.0 时代(也可以称为价值时代)的大规模应用。未来 Web3.0 时代大规模应用的系统架构,我在《从状态机的角度观察比特币二层,可以看到未来 Web3.0 应用的架构和建设路径》有相关的描述。
建设的路径是不断满足需求的过程,可以分为短期、中期、长期三个阶段。短期是通过比特币主网上面的新技术产生的应用和基于链的二层建设的简单阶段,产生的应用完成主要的能力扩充,满足各种金融应用。中期基于链的二层建设的中后期与基于分布式系统的二层建设,满足各种金融应用与信任应用。长期是基于比特币生态的大规模建设完成真正的 Web3.0 时代的建设。