
再次爆发的前夕,万字总结比特币新技术发展
2024-04-24 • By okx交易所
原文作者:付少庆,SatoshiLab,万物岛BTC工作室
1. 比特币原有技术的主要探索与冲突比特币的原有技术一直存在大规模应用与比特币应该具有的能力的冲突问题。大规模应用和交易规模是否意味着更复杂的交易指令和更大的交易空间?是否意味着一定要在比特币单一系统上实现所有的功能?在早期,比特币生态技术发展不完善的情况下,这些现象似乎都是比特币本身的问题。随着技术的发展,很多问题会得到更清晰的答案。
在本文中列出一些相关问题,以及对这些问题的产生与解决过程。通过这篇文章,可以看到这些问题与技术之间的关联性,以及比特币主链与相关“测试链”的变化过程。比特币的技术一直被不同的项目与团队在探索中(包括以太坊都是对比特币不完善的一种探索),只是在比特币主网上产生的变化一直不够明显,直到 Taproot 等技术的产生,推动了 Ordinals 协议等协议产生之后,重新进入了一个新的发展高潮。
从整体看这些发展过程与产生的相关技术,我们能够看到他们之间的联系,可以推测出更多发展方向与整体架构。
1.1. 比特币的脚本语言与几次删减指令比特币的编程语言是一种逆波兰范式的脚本语言,没有循环语句和条件控制语句(稍后看 Taproot&TaprootScript 扩充了这块能力)。因此,人们常说:比特币脚本语言不是图灵完备的,这导致比特币脚本语言,有一定的局限性。
当然,由于这些局限性,黑客就没办法使用这种脚本语言写一些死循环(会造成网络瘫痪),或者一些能导致 DOS 攻击的恶意代码,也就避免了比特币网络受到 DOS 攻击。比特币的开发者,也认为核心区块链,不应该具备图灵完整性,来避免一些攻击和网络堵塞。
但是,也正是由于这些局限性,比特币网络,没有办法运行其他复杂的程序了,没办法完成一些“有用”的功能。而后面发展的一些区块链系统,为了解决具体问题,满足用户的需求,直接改变了这点。如,以太坊使用的语言就具备了图灵完备。
比特币脚本指令常见的类型:
关键字:
1.常数。如:OP_ 0 ,OP_FALSE
2.流程控制。如:OP_IF,OP_NOTIF,OP_ELSE,……
3.堆栈。如:OP_TOALTSTACK(把输入压入辅堆栈的项部,从主堆栈删除),……
4.字符串。如:OP_CAT(连接两个字符串,已禁用),OP_SIZE(把栈顶元素的字符串长度压入堆栈(无需弹出元素))
5.位逻辑。如:OP_AND,OP_OR,OP_XOR
6.算术逻辑。如:OP_ 1 ADD(输入值加 1),OP_ 1 SUB(输入值减 1)
7.加密。如:OP_SHA 1 (输入用 SHA-1 算法 HASH.),OP_CHECKSIG()
8.伪关键字
9.保留关键字
比特币脚本指令常见的类型:
脚本:
1.支付到比特币地址的标准交易(pay-to-pubkey-hash)
2.标准比特币产生交易(pay-to-pubkey)
3.可证明的无法花掉/可删除的输出
4.Anyone-Can-Spend 输出
5.猜谜交易
五个标准类型的交易脚本包括:支付到公钥哈希(P2P KH)、支付到公钥、多重签名(限定最多 15 个密钥)、支付到脚本哈希(P 2 SH),以及数据输出(OP_RETURN)。
在网页:https://en.bitcoin.it/wiki/Script中有详细的说明。
删减比特币支持的指令
比特币历史上有多次删减指令的事情发生。下面的图表中,红色部分是已经删减掉的指令。
字符串操作
(3)算术操作
为什么要删减指令?安全性只是一方面的考虑,如果我们用分层设计的思想看待删减指令会理解其合理性,这样做能让底层协议更基础更稳定。也许中本聪一开始就意识到了这个问题,不然不会主动的删减指令。我们常人的思维是建造一个直接满足用户的需求,具有完善指令和系统功能的小系统,而不是一个需要协作的大型协议。
这样也就造成了一种事实,只有比特币适合作为一层网络。我在《比特币价格过高会促生一个新的替代链产生》文章中分析过这种现象,从经济学视角和技术视角分析,有产生比特币替代链的可能性。但从比特币的基本特点和分层设计的角度,几乎只有比特币能够作为一层网络基础设施,即使有替代链也是一个 1.5 层的产物。在一层网络这个层面,真品只有比特币,能有一些替代作用的链最多是 A 货。
1.2. 比特币分叉历史、原因与意义在比特币的发展历史,除了删减指令问题,另一方面是区块大小之争,这经常造成比特币的硬分叉。
BTC 创立之初并没有限制区块大小,以便能够在相同时间处理的交易笔数。但当早期 BTC 价格非常低,恶意交易的成本也非常低,为了解决这一问题,中本聪在 2010年 9 月 12日主持了一次软分叉,添加了区块体积不得超过 1 MB 的限制。中本聪指出但这种限制是临时性的,未来可以以可控和逐步的方式提高区块限制,以便满足扩容的需要。
下图为比特币的分叉历史:
随着比特币的流行,网络交易拥堵和确认时间增长问题愈发严重。2015 年 GavinAndresen和MikeHearn 宣布将在新版 BitcoinXT 中实现 BIP-101 提案,希望将区块上限提高至 8 MB。而 GregMaxell,LukeJr,PieterWuille 等核心开发者则持反对意见,认为这种做法会提高运行全节点的门槛,而且带来不可控的影响。这场争论最终在议题和参与范围均出现了扩大化。
从上面的内容,我们看到中本聪也表达了“区块大小这种限制是临时性的,未来可以以可控和逐步的方式提高区块限制,以便满足扩容的需要。”但什么时候分叉支持更大区块,单独分出一条链支持大区块是否可以解决问题?在不断的争议中,也产生了众多的案例。如,BCH 区块大小是 8 M,后来又增加的 32 M。BSV 区块大小是 128 M。而除了 BCH(和后面的 BSV)以外,这一时期还出现了许多其它 BTC 分叉币,据 BitMEXResearch,仅在 BCH 分叉后的一年内,就出现了至少 50 种新的分叉币。
稍后的内容我们会看到,在比特币主网上面 Segwit 和 Taproot 也在一定程度上将区块的空间从 1 M 提升到了 4 M。
比特币的分叉是一种发展探索,在尝试通过自身的改变来完成对更多需求的支持。其中有用户需求、矿工需求、投资人需求、开发者需求、……。
1.3. 比特币发展中的几个典型探索中本聪离开后,继承人 GavinAndresen 主导建立了 BitcoinCore 和 Bitcoin 基金会。在此期间,针对 BTC 的可拓展性探索一直存在,尤其是在资产发行领域。
ColoredCoins(染色币)
eToro 首席执行官 YoniAssia 在 2012 年 3 月 27 日发表的一篇文章中第一个提出彩色币。这个想法不断发展,在 Bitcointalk 等论坛上,彩色硬币的概念开始形成并获得关注。最终 MeniRosenfeld 于 2012 年 12 月 4 日发布了一份详细介绍彩色货币的白皮书。
染色币的设想是通过给比特币的特定部分添加特殊的标注(即染色),来代表更广泛的资产和价值。染色币在实现上出现了一系列实体,大致分为两类:
1)基于 OP_RETURN:如 FlavienCharlon 在 2013 年提出的 OpenAssets,利用 OP_RETURN(在 Bitcoinv 0.9.0 中被提出,可以用于在 Bitcoin 上存放少量的数据,最初的限制为 40 bytes,后提高至 80 bytes)。操作码存储到脚本中,并通过外界读取的方式来完成“染色”和交易。(这种模式与 Ordinals 依靠外部索引确定资产合法性类似)。
2)基于 OP_RETURN:典型代表是 ChromaWay 在 2014 年提出的 EPOBCProtocol,EPOBC 资产的额外信息存储在比特币交易中的 nSequence 字段,每个 EPOBC 资产的类别和及合法性需要追溯到 genesis 交易来确定。
MasterCoin(OMNI)
JRWillett在 2012 年 1 月 6 日发布了 MasterCoin 的设想,并取名“比特币第二份白皮书”,并在 2013 年 7 月通过 ICO 的方式正式启动项目,最终募集到了 5120 个 BTC(当时价值 50 万美元)。MasterCoin 和 ColoredCoins 区别在于它建立了一个完整的节点层,通过扫描比特币区块来维护状态模型数据库,该数据库驻留在区块链之外的节点中。这种设计可以提供比 ColoredCoins 更复杂的功能,例如创建新的资产、去中心化交易所、自动化价格反馈等。2014 年,Tether 也通过 Mastercoin 协议在比特币上推出了稳定币,即我们熟知的 TetherUSD(OMNI)。
( 3)CounterParty
Counterparty 于 2014 年正式推出。Counterparty 也使用 OP_RETURN 将数据存储至 BTC 网络中。但与染色币不同,资产在 Counterparty 不是以 UTXO 的形式存在,而是通过 OP_RETURN 载入信息来表明资产的转移,当一个资产持有者使用持有地址对歹有特殊数据的交易进行签名后,资产便完成了转移。通过这种方式,Counterparty 可以实现资产的发行、交易以及兼容以太坊智能合约的平台。
除此以外,也有观点认为 Ethereum、Ripple 和 BitShares 也属于更广义的“Bitcoin 2.0 ”。
1.4. 比特币的不完美与分层协议比特币系统的不完善(或局限性)主要表现在几个方面(本文中的不完善是根据以太坊白皮书中的总结,并非是真正的不完善。
1.比特币的账户系统 UTXO
在当前的区块链项目中,主要有两种记录保存方式,一种是账户/余额模型,一种是 UTXO 模型。比特币采用就是 UTXO 模型,以太坊、EOS 等则采用的是账户/余额模型。
在比特币钱包当中,我们通常能够看到账户余额,然而在中本聪设计的比特币系统中,并没有余额这个概念。“比特币余额”是由比特币钱包应用派生出来的产物。UTXO(UnspentTransactionOutputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。
所以现实世界中没有比特币,只有 UTXO。比特币的交易由交易输入和交易输出组成,每一笔交易都要花费(spend)一笔输入,产生一笔输出(output),而其所产生的输出,就是“未花费过的交易输出”,也就是UTXO。
如果要实现智能合约,UTXO 这种账户模型存在非常大的问题。以太坊黄皮书的设计者 GavinWood对 UTXO 的理解十分深刻。 以太坊的最大新功能点是智能合约,因为智能合约的考虑,GavinWood 要基于 UTXO 去实现图灵完备的智能合约是困难的。而账户模型是天然的面向对象的,对每一笔交易,都会在相对应账户上进行记录(nonce++)。为了易于管理账户,而引入了全局状态,每一笔交易都会改变这个全局状态。这和现实世界是相对应的,每一个微小的改变,都会改变这个世界。因此以太坊使用了账户系统,后期的公链基本都是基于各种类型的账户系统实现的。
UTXO 的另一个严重缺陷是,不能为账户的取款额度提供精细的的控制。这点在以太坊的白皮书中有相关的说明。
2.比特币的脚本语言,非图灵完备
尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是比特币的脚本语言,没有循环语句和条件控制语句。因此,我们说:比特币脚本语言不是图灵完备的。这导致比特币脚本语言,有一定的局限性。当然,由于这些局限性,黑客就没办法使用这种脚本语言,写一些死循环(会造成网络瘫痪),或者一些能导致 DOS 攻击的恶意代码,也就避免了比特币网络受到 DOS 攻击。比特币的开发者,也认为核心区块链,不应该具备图灵完整性,来避免一些攻击和网络堵塞。但是,也正是由于这些局限性,比特币网络,没有办法运行它复杂的程序了。不支持循环语句的目的是避免交易确认时出现无限循环。
为了安全性,不支持图灵完备的理由是不充分的。而且非图灵完备的语言所做的事情很有限。
3.比特币的其他不完善,安全性、扩展性
挖矿的中心化问题,比特币挖矿算法基本上是让矿工千万次地轻微改动区块头,直到最终某个节点的改动版本的哈希小于目标值。然而,这种挖矿算法容易被两种形式的中心化攻击。第一种,挖矿生态系统被专门设计的因而在比特币挖矿这一特殊任务上效率提高上千倍的 ASICs(专用集成电路)和电脑芯片控制。这意味着比特币挖矿不再是高度去中心化的和追求平等主义的,而是需要巨额资本的有效参与。第二种,大部分比特币矿工事实上不再在本地完成区块验证;而是依赖中心化的矿池提供区块头。这个问题可以说很严重:当前,排名前三的采矿池间接控制着比特币网络中约 50 %的处理能力。
扩展性问题是比特币的一个重要问题。使用比特币,每小时增长约 1MB。如果比特币网络每秒处理 Visa 的 2000 次交易,则每三秒钟将增长 1MB(每小时 1GB,每年 8TB)。较低的交易次数,也引起比特币社区的争议,大区块链虽然可以提高性能,但问题是中心化风险。
从产品生命周期的角度,比特币一些小的不完善,可以在自身系统中得到改善,改善的方法受到当前系统的限制。但如果可以在一个新系统中解决这些问题,就完全可以不考虑老系统的限制问题。既然要打造一个新的区块链系统,那么设计新系统的时候,这些小的功能完善也一并进行设计与升级改造。
分层设计
分层设计是一种人类处理复杂系统的手段和方法论,通过将系统划分为多个层次结构并定义各层之间的关系和功能,以实现系统的模块化、可维护性和可扩展性,从而提高系统的设计效率和可靠性。
对于一项广泛和庞大的协议体系,使用分层会有明显的好处。这样做使人们容易理解,容易分工实现与容易分模块改进等优点。如计算机网络中的 ISO/OSI 的七层模型设计,但具体的实现中,可以合并一些分层,例如,具体的网络协议 TCP/IP 是四层协议。具体说协议分层的优点:各层次之间是独立的、灵活性好、结构上可分割开、易于实现和维护、能促进标准化工作。
从分层协议的角度看,比特币因为要处于最基础的底层,那么他的 UTXO、非图灵完备、出块时间长、区块容量小、创始人的消失、……,都不是缺点,反而是作为一层网络应该具有的特点。
注释:作者在《一文梳理比特币二层(Layer 2)建设的基础知识体系V1.5 版》对协议分层有更详细的说明。
2. 比特币发展中的重要新技术(区块扩容与能力扩容)
在上一节我们探讨了比特币原有技术的主要冲突和一些探索案例,但很多导致了硬分叉或产生了全新的异构链。在比特币本身这条区块链上,这种探索也产生了很多成果,本质上是区块的扩容与能力的扩容。他们主要表现在以下几个方面。
2.1. OP_RETURNOP_RETURN 的使用
OP_RETURN 是一个脚本操作码,用来终止脚本并返回栈顶的值。这个操作码类似于编程语言中的返回函数。在比特币的历史上,OP_RETURN 操作码的功能被多次修改,现在它主要被用作为在账本上存储数据的一种方法。OP_RETURN 操作码的功能曾在过去发生过重大变化,现在它是一个重要的机制,使用它我们就能在链上存储任意数据。
OP_RETURN 最初是用于提前结束脚本执行的返回操作,执行结果将作为栈顶项目被呈现出来。这个操作码最初有一个容易被利用的漏洞,但中本聪很快修补了该漏洞。
对 OP_RETURN 功能的进一步更改
在 BitcoinCore 的 v 0.9.0 那次升级中,“OP_RETURN输出”脚本被制作成标准输出类型,允许用户将数据附加到“不可花费的交易输出(unspendabletransactionoutput)”上。这类脚本中可用的数据量的上限最初被限制为 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 虽然有一定的功能扩展,但总体来说能力还是有限。于是产生了隔离见证的技术。
Segwit 隔离见证
隔离见证,即 SegregatedWitness(简称 SegWit),由 Pieterwuile(比特币核心开发人员、Blockstream 联合创始人)在 2015 年 12 月首次提出,后来形成了比特币 BIP 141 。隔离见证将比特币区块中交易的数据结构稍加修改,以解决如下问题:
1)transactionmalleability问题。
2)SPV 证明中传输交易的签名成为可选项,能够减少 Merkleproof 传输的数据量。
3)变相增加区块容量。
前两项主要是增加安全性和性能,其中对新技术影响最多的是第三项,变现增加了区块的容量(见下面的概念 Blockweight),从而为比特币的能力扩容打下来基础,以至于后面的 Taproot(隔离见证的第二个版本)的进一步加强。
虽然变现扩大了区块容量,但隔离见证也受到区块大小限制。比特币的区块大小限制为 1 Mbytes,由于 witness 数据不包含在这个限制中,为了防止 witness 数据被滥用,仍然对总的区块大小做了限制。引入了一个新概念叫块重量(Blockweight)
Blockweight=Basesize*3+Totalsize
Basesize 是不包含 witness 数据的块大小
Totalsize 总大小是按BIP 144中所述序列化交易的块大小(以字节为单位),包括基础数据和见证数据。
隔离见证限制 Blockweight