Bitcoin重大升级(Tapscript [BIP342],Taproot [BIP341],Schnorr签名 [BIP340])
今天给大家介绍一下关于Bitcoin提出的改进方案(BIP),比特币改进提案(BIP)是改变比特币的正式提案。比特币作为一个软件,一直在升级,需要修复漏洞、提高算法效率、简化代码、而且必须保持与其他软件的兼容性,因此会添加新功能。本篇文章针对BIP340-341引入了一些新功能进行介绍。
比特币如何进行交易的
例如我们生活常见的像是银行卡、支付宝或者微信等平台都是存在个人账户的,我们所有的交易的输入输出都是围绕在这个账户,当然在加密货币领域也有许多,比如基于Account模型的以太坊等。
对于比特币来说,中本聪在设计时考虑到隐私性的问题,使用了基于未花费输出(UTXO)模型,每一笔交易由输入和输出交易组成。当你进行比特币转账时,你花费的是UTXO,这时需要通过加密签名证明你对UTXO的所有权。当你针对UTXO交易的输出包含两个元素:比特币数量和锁定脚本(或scriptPubKey),该脚本通过限定花费某些输出的条件来锁定比特币数量。锁定脚本会将输出锁定在特定的比特币地址,该地址将比特币的所有权转让给新的所有者。
而新的所有者通过提供解锁脚本(或scriptSig)以及与其私钥相关联的签名来解锁输出,然后花费这些比特币。解锁脚本是下一笔交易输入的一部分。为了确保你不会花费你不拥有的UTXO,比特币客户端通过执行脚本来确认交易。每个输入中的解锁脚本与相应的锁定脚本一起执行,以查看是否满足花费条件。全节点跟踪并验证全部UTXO集,从而确保每个人只能花费他们自己拥有的比特币。
举例说明:
下图是Alice想付给Bob 1个BTC,为此,她使用Bob的公共地址创建了一笔交易。为了转移比特币,Alice提供了她的数字签名(由私钥和交易数据历史产生),以证明她在UTXO集中拥有至少1个BTC,同时没有泄露她的私钥。
作为交易的一部分,只有Bob可以解锁锁定脚本。交易转账后,UTXO便被转移,并将其添加到比特币区块链中。通过提供签名,Bob可以解锁锁定脚本scriptPubKey,并且可以将UTXO用作下一笔交易的输入。
比特币常见交易形式
1.P2PKH
Pay-to-Public-Key-Hash (P2PKH) 是一种ScriptPubKey,它将比特币锁定到公钥的哈希值。P2PKH 交易是使用 P2PKH ScriptPubKey 锁定输入的交易。公钥哈希也称为地址,P2PKH 是目前最常见的脚本类型。P2PKH 类似于 P2PK 交易,除了比特币锁定到公钥的哈希值而不是公钥本身。
2.P2SH
Pay-to-Script-Hash (P2SH) 是一种ScriptPubKey,它允许根据在交易中指定哈希的脚本来支出比特币。P2SH 交易是使用 P2SH ScriptPubKey 锁定输入的交易。
01 Schnorr签名 [BIP340]
1.什么是Schnorr签名?
正如前面关于比特币交易如何工作的部分所述,脚本语言控制着比特币的花费,并使用数字签名来转移比特币的所有权。比特币使用椭圆曲线数字签名算法(ECDSA)来验证加密签名(该算法不原生支持多签交易的,导致了2012年P2SH交易的标准化)。简而言之,Schnorr签名方案是一种更有效的签名方案。该签名方案是由Claus-Peter Schnorr在1989年开发的。
Schnorr建立在“ 隔离见证”之上,该见证于2017年8月在比特币上激活,以解决可延展性( malleability)问题。SegWit将所有脚本和签名数据移至“见证”部分。见证是交易的一部分,作为一个单独结构,不再包含在输入列表中。
2.密钥聚合
上图可以反应密钥如何聚合,原始的ECDSA需要对每一笔交易分别签名,而对于Schnorr签名是线性的,意味可以对对公钥进行加法(或减法),等同于对应的签名的加法或减法。而ECDSA并不具有这个特性,加或减ECDSA的数字签名是没有意义的。
下面的方程式通过Schnorr的线性特性说明了如何聚合。除了参与者之外,没有人知道在公共密钥/签名后面有三个人。
简单来说,就是一笔交易中多个签名可以组合成一个,它通过将公钥和签名组成成“阀值公钥”和“阀值签名”,让其交易看上去跟普通交易没有区别。“阀值公钥”可以让参与者的公钥叠加在一起,而“阀值签名”可以让参与者的签名组合起来,根据约定条件进行支付。Schnorr签名算法可以使得多重签名更高效,同时由于其看上去跟普通交易一样,因此,也提升了隐私性。
3.Schnorr签名和ECDSA签名对比
Schnorr签名数据比现有的ECDSA签名数据小11%,现有签名每个交易占用70-72个字节。由于Schnorr签名在交易中/在区块链上占据的空间较小(它们固定为64个字节),因此可以实现较小的交易数据和较低的费用。
Schnorr签名,所有输入仅需要一个组合签名,因为不同的签名是聚合在一起的。把交易包含在一个签名,可以使交易具有更大容量。多签交易的较小交易数据可降低费用。使用密钥聚合,我们不必检查每个单独的输入,验证速度更快。使用ECDSA的紧凑型多重签名也比较难以生成,因为它们使用DER(专有编码规则)进行编码,而Schnorr签名以更节省空间的方式进行编码。
ECDSA和Schnorr数字签名方案都依赖于离散对数问题。但Schnorr的好处是,与ECDSA相比,它使用的假设更少,并且有形式化的证明其是安全的。ECDSA缺乏正式的安全证明,并且依靠额外的假设来保证这一目标。因此,Schnorr是供密码学家使用的更清晰的框架。Schnorr至少比ECDSA安全,如果不是更安全的话。
02 Taproot [BIP341]
1.什么是Taproot?
Taproot提出扩展了Schnorr的功能,以实现更大的扩展性、效率和支付隐私性。正如我们在上面所解释的那样,Schnorr使比特币多签名交易看起来像是区块链上的标准交易,当与Schnorr结合使用时,Taproot(BIP 341)将进一步扩大交易的隐私性。在彻底了解Taproot之前我们要先了解什么是Merkelized抽象语法树(MAST)。
2.Merkelized抽象语法树(MAST)
MAST是默克尔化抽象语法树(Merkelised Abstract Syntax Trees)的简称,最初由比特币开发者Johnson Lau博士于2016年提出。MAST使用新的见证程序,并使用Merkle树编码脚本中独立的分支。Merkle树是一种数据结构,树这一术语用于描述分支结构。它通常把图表顶部称为根,而图表底部称为叶,如下图所示。
Merkle树是通过分别哈希每个脚本以获得简短的唯一标识符而创建的。然后,将这些标识符中的每一个与另一个标识符配对并再次进行哈希处理,从而生成另一个简短的唯一标识符。这是一个交互过程,一直持续到只有一个标识符。在上图中称为Merkle根 ,可以在仅几个字节的数据中唯一标识整个集合。我们可以将Merkle根视为比特币的密码箱。与支付到脚本哈希(P2SH)相比,MAST允许在Merkle树中构造多个支出条件。仅显示满足的条件,其中使用Merkle根和路径来验证条件是否位于Merkle树中,同时将其余树隐藏起来。
MAST的独特优势在于,如果揭示了Merkle树中的任何数据,则可以使用Merkle根和一些其他数据(称为Merkle路径)来验证该特定数据是否包含在Merkle树中。树的其余部分(以及其他条件)仍保持散列和隐藏状态。这意味着,如果所有参与者都同意,则仅需要透露所满足的条件。有复杂交易任务的用户可以创建较小的交易,而带有大量亚脚本(sub-script)的更复杂的合约的效率收益则更大。与使用任何其他当前机制相比,MAST使得更多的条件分支成为可能。这打开了对更高级的智能合约的支持,而不必向比特币节点没有额外费用。
3.Taproot改进MAST
Taproot是最初由Greg Maxwell,Peter Wuille和Andrew Poelstra提出的比特币提案。后来,IRC和bitcoin-dev邮件列表上的十个主要贡献者都接受了它。Schnorr增加了一个新的签名类型,Taproot在此基础上又推出了一个新的交易输出类型以及确定支付条件的新方法。
Taproot具有自己的Merkle树版本,称为脚本树(script tree)。参与者可以选择以下使用:1)作为常规签名的公钥,2)与脚本一起使用。首先,是默认的支出路径,在此路径上无法区分单方或多方公钥。对于替代的支出途径,除非我们支出,否则不会显示隐藏的脚本。可以将不同的脚本组织到Merkle树中,也可以通过显示其中一个子句来使用输出。如果我们使用主支出脚本花费交易,则只需提供Merkle证明,该证明由主支出脚本和替代支出脚本的哈希组成,足以证明主支出脚本在脚本树中。
Taproot使用MAST结构将条件隐藏在Merkle根下面。Merkle根本身会被密钥承诺(key commitment)隐藏起来,并可以通过密钥直接花费。只有一个密钥进入区块链,没有人能看到存在的其他条件。与Schnorr结合使用时,Tastroot输出隐藏了MAST结构。在Merkle树的顶部,有一个用于发布单个公钥和签名的选项。实际上,这使P2PKH和P2SH交易看起来相同。
通过MAST,可以对脚本中的操作进行编码,提升可编程性,当BTC交易发生时,只需要提供其分支运算并将分支哈希连接到固定大小的默克尔根上,从而减少交易数据,提升区块空间。而且MAST可以根据交易不同设置不同的条件,也就是实现智能合约功能。而且MAST结构可以使交易数据显著降低,但是随着脚步数量的增加,MAST结构的交易数据是对数增长不是线性增长,大大降低了数据大小。
4.Taproot亮点:扩容
扩容两个字,总能在最近的公链竞争中听到。扩容的好处是,交易速度更快,GAS费用更低,这对比特币来说当然非常的重要。最初开发的时候,项目方的梦想是让比特币成为全球货币。不过,一个交易确认那么慢的东西,根本吸引不了大批的人去使用。所以,为了让比特币有支付属性,扩容升级是必须的。
在Taproot新方案中,Schnorr签名为比特币减少容量带来了技术支持。具体来看,Schnorr签名通过把多个公钥设计成一个签名,从而减少空间。数据来看,在字节占比上,Schnorr上的公钥占了32个字节,比原方法节约了1个字节。在签名长度上,Schnorr的长度是65个字节,比原方法节约了6-7个字节。Taproot就是通过这些小空间的节约给比特币的使用者节约了确认交易所需的时间和费用。
进一步来说,这次升级是Layer2扩展解决方案的进步,因为Taproot允许改进Layer2网络,例如位于比特币之上的闪电网络。Taproot将通过用点时间锁定合约(PLTC)替换哈希时间锁定合约(HTLC)来升级闪电网络功能。闪电网络是一种面向商业的服务,允许各方更快速、更便宜地进行比特币交易。使用PTLC意味着支付将使用常规公钥进行路由,提供类似于为多重签名钱包设计的隐私功能。PTLC还可以启用区块链托管条件,并改进预言机的使用,以促进支付的便利性。
03 Tapscript [BIP342]
1.什么是Tapscript?
Tapscript是Schnorr和Taproot的补充升级。作为比特币编程语言(脚本)的升级版,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进行签名批量验证。
当前,用于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”状态。只要脚本中存在这些操作码,你就可以无条件地使用它,而实际的好处是可以将操作码重新定义为任意值,并且不需要向后兼容。这种用新的操作码扩展脚本的新机制,比现有的见证版本控制机制更易于协调和使用。后果是,它有望为将来比特币脚本添加更多有用的操作码开辟道路。
由于还在学习当中,这里提供给大家官方介绍链接(https://bitcoinops.org/en/topics/tapscript/),希望共同学习交流!
总结
简而言之,Schnorr对可扩展性和交易隐私(而不是交易链接隐私)具有多个意义。效率的提高开放了更复杂的多重签名交易的使用,从而允许非常大的M-of-n方案和更高级的合同。与Taproot和Tapscript结合使用,Schnorr大大拓展了比特币的隐私性和可扩展性。
Taproot(BIP 341)提高了比特币脚本功能的隐私性、效率以及灵活性,使开发人员可以编写复杂的脚本,同时最大程度地减少对链上的影响。
在扩容方面,可节省复杂交易大量的交易费用,因为数据密集型脚本不再需要支付比标准的“支付到公钥哈希”交易更高的费用。网络上的交易越复杂,效率上的收益就越大。
在隐私方面,BIP 341旨在最大程度地减少链上交易透露出的关于交易输出花费条件的信息。大多数使用Taproot的应用程序都可以使用基于密钥的支出路径,该路径是私有的,并且可以推广到m-of-n多重签名策略。
Tapscript主要是比特币脚本的升级!
参考
- 比特币opcode:https://en.bitcoin.it/wiki/Script
- Tapscript [BIP342]:https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki
- Taproot [BIP341]:https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki
- Schnorr签名[BIP340]:https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki