硬核 | 比特币2020年或迎来最大升级 什么是Tapscript? 一文读懂

近期推出硬核(Hardcore)栏目,为读者提供热门项目介绍或者深度解读。

尽管3月12日比特币大跌,让币圈人士很是受伤。但作为一名投资人还是应该多关注技术进展,毕竟技术进步是比特币的价值根源。正如2017年的“隔离见证”见证了2017年的比特币大牛市,希望比特币新的技术突破能带领比特币走出泥沼。

正如我们在“”中所说,比特币在2020年值得关注的一个进展就是Schnorr/Taproot/Tapscript软分叉,计划的这次分叉将包含三个比特币改进协议BIP 340、341和342。我们将对这三个BIP进行系列解读,上两期硬核(Hardcore)解读了和。

本期聚焦Tapscript。看什么是Tapscript协议以及如何激活比特币改进协议(或BIP),enjoy it


Tapscript(BIP 342)

本次升级提案的第三部分BIP 342描述的是Schnorr和Taproot的补充升级,称为Tapscript。如我们在Schnorr/Taproot/Tapscript的第一篇文章中所述,比特币脚本用于决定比特币的花费策略。

BIP 342改进了签名的哈希算法,因此我们可以验证taproot脚本,从而引入灵活性,添加了新的操作码以增强比特币的智能合约功能,并且还更改了对资源要求的一些限制。

什么是操作码(Opcodes)?

操作码(Opcodes)是操作码(operation codes)的缩写,基本上是脚本语句或命令。这些命令可以返回“ TRUE”或“ FALSE”,用于发送/接收交易。

例如,脚本指令指定了解锁脚本所需的签名数量。它们还指示了交易的比特币数量以及收款人地址。

操作码可用于删除堆栈中的项目并执行计算,然后将结果添加回堆栈中。请记住,作为基于堆栈的编程语言,脚本指令是按照从堆栈顶部到底部的顺序执行的。

什么是Tapscript?

作为比特币编程语言(脚本)的升级版,Tapscript更容易添加新功能,且提供基于Schnorr签名的批量验证(batch verifiability)。

什么是批量验证?讲过。

Tapscript还补充了BIP 341(Taproot)中提出的对比特币脚本结构的改进,该结构需要更改某些操作码,而BIP 342则涉及需要进行的更改。

理解Tapscript的另一种方法是考虑Taproot的Merkle树,其中每个叶子(leaf)都是一个脚本,可称之为叶子版本,类似于SegWit的脚本版本控制。

但是不同之处在于,脚本不会在付款时显示,而只会在花费时显示。不同的叶子可以具有不同的版本,其中仅显示实际使用的叶子。Tapscript是Taproot下版本0的叶版本。

Tapscript与传统和SegWit的比特币脚本共享大多数操作,但有一些区别:

  • 签名操作码验证Schnorr签名(而不是ECDSA签名)。

  • 多签操作码OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY被操作码OP_CHECKSIGADD代替,允许使用Schnorr进行签名批量验证。

由于签名验证是比特币脚本中最耗费CPU的操作,因此这些操作码对实现与基于Schnorr的多重签名方案相关的效率提升至关重要。

当前,用于2-of-3的多重签名交易的脚本如下所示:

2 <公钥A> <公钥B> <公钥C> 3 CHECKMULTISIG

使用Taproot/Tapscript,可以以批量验证的方式创建相同的多重签名策略,其脚本是:

<A pubkey> OP_CHECKSIG <B pubkey> OP_CSADD <C pubkey> OP_CHECKSIGADD OP_2 OP_EQUAL

  • 许多操作码被重新定义为OP_SUCCESS操作码,它无条件使整个脚本有效,以简化软分叉升级。

与现在正使用的机制OP_NOP相比,新操作码OP_SUCCESS的引入更容易验证。

以前无法使用的操作码通常返回“FALSE”状态,Tapscript会将它们返回“TRUE”状态。只要脚本中存在这些操作码,你就可以无条件地使用它,而实际的好处是可以将操作码重新定义为任意值,并且不需要向后兼容。

这种用新的操作码扩展脚本的新机制,比现有的见证版本控制机制更易于协调和使用。后果是,它有望为将来比特币脚本添加更多有用的操作码开辟道路。

现有的NOP操作码可能是专门为了具有升级机制而添加的,以便我们可以轻松地向比特币脚本语言添加新的操作码。

但到目前为止,它们仅用于CHECKLOCKTIMEVERIFY和CHECKSEQUENCEVERIFY。为了与软叉兼容,这些NOP只能执行以下两项操作之一:1)中止或2)根本不执行任何操作。

由于它们重新定义了NOP,目前CHECKLOCKTIMEVERIFY和CHECKSEQUENCEVERIFY两操作码无法以任何方式修改堆栈。结果是,它们不会从堆栈中弹出参数,而你总是需要在后面跟一个OP_DROPafter。

操作码不执行任何操作(即NOP),Tapscript是一种解决方案,它引入了一个新的操作码OP_SUCCESS,它“返回TRUE”。这些操作码只有在被使用时才被用到,并且直到它们在网络上定义了锁定的语义后才被使用。

结果是,禁用和从未定义的操作码编号将变为“return TRUE”。随后,可以将这些操作码重新定义为任何内容,因为所有内容是软分叉的,与“return TRUE”兼容。

  • 签名哈希(SIGHASH)的计算方式不同于旧脚本或BIP143 v0隔离见证中的计算方式。

什么是签名哈希?简而言之,签名哈希是比特币签名的标志,用于指示对交易的哪些部分进行签名。

使用scriptsigs,签名可以证明你有权花费某些比特币。这些签名以某种方式构造,签名后附加了一个字节,用于指定以哪种方式对交易进行签名。因此已经有一些SIGHASH被部署和实施。

最常用的是SIGHASH_ALL,其中除scriptsigs之外的所有内容均被签名。而当仅对当前输入进行签名并且交易中的所有其他内容均不视为签名的一部分时,将使用诸如SIGHASH_ANYONECANPAY,承诺(commitment)不包括在内。

对于这些SIGHASH类型,已经提出了许多改进建议,比如你只想在交易的某些方面签名,以及可以指定在花费比特币时对什么条件感兴趣(不感兴趣)的条件。SIGHASH已经提出了许多有关如何执行此操作的标志,包括SIGHASH_NOINPUT。

它的工作方式是屏蔽交易的不同部分。SIGHASH_NOINPUT背后的想法是,你不在乎提供的是什么特定输入,你不在乎为交易提供输入的交易ID是什么,但你在乎的是金额。在SegWit之前,这是在2015年提出的可延展性修复程序,它本身就是可延展性修复的。因为围绕SIGHASH_NOINPUT的担忧和风险,社区没有将其合并到比特币协议中(但是SegWit的引入重新打开了此升级的大门)。

SIGHASH_NOINPUT的主要好处是,它极大地简化了诸如闪电网络等支付渠道。一个关于改变闪电工作方式的提议是eltoo,当有人试图作弊时,对其进行处罚时,它通过传输已失效的先前状态从而不必再关闭通道,简化通道使用。

这需要更改比特币脚本。尤其是,更改涉及将签名应用于交易(即Sighash系统)的方式,这使用户可以重新平衡到其他输入。

尽管对现有的某些Sighash类型进行了一些调整,但是Schnorr/Taproot/Tapscript提案所提供的功能与BIP 118即SIGHASH_NOINPUT完全不相似(已经有很多关于使其安全的各种方法的讨论)。

Tapscript并未包括SIGHASH_NOINPUT,而是提供了几种灵活性机制(比如带标签的公共密钥),这些机制将允许在不增加成本的情况下开放此功能。这种机制将使以后的软分叉很容易使用新的Sighash类型,或其他更改来扩展签名检查操作码。

使用Tapscript,以你不知道的字节开头的公钥会自动生效。因此,可以引入新型的签名方案和新的Sighash方案,而无需为每种方案添加新的Checkig操作码。像SIGHASH_NOINPUT这样的功能,可以作为新的公共密钥版本不增加成本地包含在内。

  • Tapscript还更改了资源限制。

例如,今天的比特币脚本有10000字节的脚本大小限制,该限制将被删除。它还消除了操作码数量的限制。

由于签名哈希中没有直接包含scriptCode(仅通过可预先计算的tapleaf哈希间接包含),因此签名检查所花费的CPU时间不再与所执行脚本的大小成比例。

在Tapscript中,签名操作码的数量不会计入BIP141或旧的sigop限制。旧的sigop限制使在创建区块中选择交易很繁琐,因为它是一个随着权重附加的约束。相反,Tapscript签名操作码的数量受见证人权重的限制。

Tapscript与BIP 340/341一起扩大了比特币可能的有趣应用的数量,例如特殊的Taproot合约。特殊的Taproot合约允许执行更复杂的多方合约,并为基于比特币的分散式自治组织(DAO)开辟了可能性。

在比特币上激活BIP 340–342

如何将升级添加进比特币协议?

提交BIP后,将编写代码以匹配规范,然后将其作为拉取请求(pull request)提交。此阶段之后,用户和开发人员对拉取请求进行投票。即使将其合并,用户也可以通过运行新代码(或不运行并坚持使用旧代码)进行实际投票。

Schnorr/Taproot/Tapscript升级目前处于社区反馈阶段(如下图所示)。下一步是处理代码,获取对比特币的拉取请求,并准备好测试网络。

尽管下图表明进展是线性发生的,但是在社区反馈和协议实施阶段之间可能会有一些反馈循环(例如,当规范转换为工作代码时,提案可能会进行进一步的更改)。

BIP如何进入比特币协议中概览

从2017年的SegWit升级可以看出,BIP 9的使用(需要95%的矿工表示已做好激活准备)可能导致社区不同参与者、开发人员/用户与矿工之间进行拔河比赛。

一些人认为,比特币矿工可能将BIP 9用作强大的工具,并根据自己的利益打造协议。例如,SegWit无法通过BIP 9激活,而是转向了由shaolinfry创建的变体,即用户激活的软叉或BIP 148。

为了激活BIP 340–342,比特币开发人员Matt Carallo借鉴了SegWit升级的经验教训,提出了“大共识清理”作为一种可能的方法。该提议结合了BIP 8和BIP 9的理想特性,看起来像这样:

1、激活方法最初以类似于标准的BIP 9的方式部署(通常在一年的时间范围内需要95%的矿工准备就绪),

2、如果此途径激活失败,则需要六个月的时间来让社区讨论未激活升级的原因,

3、用户可以选择两年激活期的BIP 8部署。

这种激活方法试图在遵循社区意愿的基础上进行平衡,但同时又要使激活期足够长,以确保比特币协议的更改不会成为负面先例。

时间是不确定的,因为不知道将这些建议转换为工作代码时是否会发生意外的问题。到2020年末或许更晚,我们才能看到BIP 340-342的激活。

Schnorr/Taproot/Tapscript可以说是比特币迄今为止最重大的变化,它可以改善扩展性,提高隐私性和智能合约功能。以SegWit采用作为标准,尽管至少要花两年甚至两年以上的时间才能看到它们的广泛采用,但比特币的收益将是深远的。


延伸阅读:

最新评论

暂无评论