# Taproot是什么 (比特币升级Taproot)

By [Untitled](https://paragraph.com/@0x27418be5b80285fa27fd75eef87e6877cbb5e53e) · 2024-03-19

---

背景
--

2021年11月14日左右，比特币将迎来自己的的一次重要的软分叉升级 Taproot，超过 90% 的矿工同意了这次升级，因此不太可能会出现 SegWit 升级时出现的社区分叉论战。似乎此次升级并没有引起太多的关注，但是也有不少文章将其称作最重要的升级。

Taproot 升级到底是什么，它是否真的让人激动不已?

Taproot 本身是主根系植物的意思，大概就像下图这样。而 Taproot 提出者GregoryMaxwell 解释道，他希望比特币交易支付的过程中，能够像主根系植物一样，关注大大的 主根(Taproot)，而隐藏那些不必要的细小分支。

什么是 Taproot?
------------

Taproot 由 Bitcoin Core 贡献者 Gregory Maxwell 于 2018 年首次提出。该实现目前尚在开发中。如果没有 Taproot，这些复杂的交易(时间锁、多签)需要多个事务来完成，因此很容易失败。

Taproot 可以让复杂交易(多签、时间锁)像单个比特币交易那样执行，从而增强比特币的隐私性。

Taproot 升级包括三个重要的技术变化(概念)，用来增强比特币的可扩展性、隐私性和灵活性:

*   **P2SH**(译者注：P2SH 并非 Taproot 升级的内容，但可以帮助大家理解 Taproot 的升级用意何在)
    
*   **MAST** (Merkle Abstract Tree)
    
*   **Schnorr** 签名
    

P2SH(Pay-to-ScriptHash)
-----------------------

比特币地址是一个包含字母和数字的字符串。用户可以将其分享给其他人，以便从后者那里接收 BTC。比特币交易主要有两大标准：Pay-to-PubKeyHash (P2PKH) 和 Pay-to-ScriptHash (P2SH)。

在讨论 P2SH (Pay To Script Hash) 和 P2PKH (Pay-To-PubKey Hash) 这两个概念之前，我们首先熟悉一下关于比特币的背景知识：

在比特币网络中，比特币的形式是 UTXO。UTXO 是 Unspent Transaction (TX) Output(未花费交易输出)的缩写，即，比特币交易执行后形成的面额不定的单元。例如，你的比特币钱包里有 10 BTC，你想要转 5 BTC 给朋友。比特币区块链的处理方式与众不同。它会把 10 BTC(全部余额)都花掉，将 5 BTC 转入你朋友的钱包，剩下 5 BTC(10 BTC - 5 BTC = 5 BTC)转入你自己的钱包。这下，你和你的朋友各持有未花费的 5 BTC。

比特币使用脚本(几行代码)来规定花费 BTC/UTXO 的条件。脚本被用作一种锁定机制。

BTC 锁定在脚本中。当脚本返回成功(即条件得到满足)时，BTC 就会解锁。

任何人都可以向任意比特币地址发送 BTC。只有当脚本中定义的某些条件得到满足时，锁定的 BTC 才可以被花费出去。脚本决定了接收方可以如何花费收到的 BTC。发起交易时，发送方会在交易中放入一个叫作 “PubKey Script(又称锁定脚本)”的脚本。接收方(在日后花费时)需要生成一个 “签名脚本(又称解锁脚本)” ，是满足 PubKey 脚本的数据参数的集合。签名脚本在代码中又被叫作 “scriptSig”。

在上述例子中，你在向朋友发送 5 BTC 时，锁定脚本也会包含在这个交易内。如果你的朋友想要花费这些 BTC，必须生成满足锁定脚本中规定条件的解锁脚本。

### Pay-to-PubKeyHash (P2PKH)

Pay-to-PubKeyHash 是一种传统的比特币地址格式。其地址以数字 1 开头。

只有 P2PKH 地址的所有者才能通过提供公钥哈希值和私钥签名来解锁 PubKey 脚本并花费收到的 BTC。私钥是用来证明公钥哈希值的所有权的。

正如我们上文讨论过的那样，脚本定义了特定地址上的 BTC 在什么条件下可以花费。当规定条件得到满足且通过网络验证时，该地址上的 BTC 就会被解锁以供花费。

这一流程是如何运作的?—— 接收方首先生成 PubKey 脚本并将其分享给发送方。发送方在发送 BTC 时将该 PubKey 脚本 添加到交易中。收到 BTC 时，如果接收方想要解锁这些 BTC UTXO，就要提供公钥哈希和私钥签名，并满足 PubKey 脚本中提到的条件。

例如，这些条件可以是：

*   解锁 BTC 至少需要两个签名。
    
*   提供口令(password)才能解锁。
    
*   BTC 需要等待一段时间才能解锁。
    

上述这类情况可以作为解锁 BTC 的条件。

发送比特币时，发送方需要在交易中包含 PubKey 脚本。因此，这会增加交易的体积，产生的交易费比普通交易高出 5 倍左右。

这里，发送方必须承担额外的成本。Pay-to-ScriptHash 可以帮助发送方免去这一额外成本。

### Pay-to-ScriptHash (P2SH)

Pay To Script Hash (P2SH) 可以帮助发送方免去额外的成本，并将这一责任(额外成本)转移到真正需要使用锁定脚本中规定条件的接收方身上。Pay-to-ScriptHash 比特币地址是以数字 3 开头的。

在这个交易标准下，发送方不需要将很长的 PubKey 脚本放到他们的交易中。这里，锁定脚本被替换成了赎回脚本(redeem script)哈希值。赎回脚本哈希值由赎回脚本计算而来。赎回脚本与 PubKey 脚本类似，包含接收方在花费未花费输出之前必须满足的条件。发送方只需在交易中注明赎回脚本的哈希值。赎回脚本哈希可以翻译成标准比特币地址，发送方无需进行任何特殊操作或支付额外费用即可将 BTC 发送到这些地址。

接收方想要解锁这个 P2SH 地址上的 BTC 时，需要生成具有相同哈希值的赎回脚本并将其包含到交易内。因此，接收方用来解锁 UTXO 的交易大小会增加，执行交易的成本也会增加。

例如，Alice 想要发送 10 BTC 给 Bob。Alice 必须将赎回脚本哈希包含到交易内。首先，Bob 先生成一个赎回脚本，然后将赎回脚本的哈希值发送给 Alice，以便 Alice 将该哈希添加到交易内并发起交易。如果 Bob 想要花费该 UTXO，必须生成相同哈希值的解锁脚本，并满足脚本中提到的条件。

别忘了，Alice 只需将赎回脚本的哈希值而非整个脚本添加到交易内。因此，Alice 无需承担额外的费用。

通往不可能三角之路
---------

不论什么样的区块链进行升级，终究解决的都是区块链中的不可能三角问题。区块链世界中的不可能三角理论是由 Vitalik 在一篇名为《On sharding blockchains》的文章中提出的。它是指，一个区块链网络中要同时实现去中心化，安全，性能(效率，扩展性)三个条件是非常困难的，往往现实是我们在提升某两个条件的时候，不得不以牺牲第三个条件为代价。

![](https://storage.googleapis.com/papyrus_images/23728bc2664acb9d78071a73e8c2131071f7f587e175327ee2ac76f535551cf4.jpg)

而此次的 Taproot 升级其实也并未脱离这个大的框架。Taproot 升级主要对应了两个方面。首先的一个目的是进一步提高其匿名性的能力，也就是进一步提升安全性。另一方面则是期望通过改变区块本身的数据结构来提升交易的性能，减少交易中不必要的数据负担。

### 分解 Taproot

Taproot 升级是三个相辅相成的 BIP 的统称，其中包括了 Schnorr 签名(BIP 340)，Taproot(BIP 341)和 TapScript(BIP 342)。

### Schnorr 签名

Schnorr 签名是由德国密码学家 Claus Schnorr 提出的，但是因为专利原因，Schnorr 签名直到 2008 年才可以免费使用，这就使得 2008 年诞生的比特币与之失之交臂(这里指 2008 年发表的原始论文)，采用了 ECDSA 签名。

目前来看，Schnorr 签名几乎是在性能，安全性上全方位超越了 ECDSA 签名，更重要的是，Schnorr 和 ECDSA 采用相同的椭圆曲线算法，所以在升级的问题上更加容易实施。而其中 Schnorr 中最亮眼的部分在于作用于交易输出层面的聚合签名。

在多重签名条件下，我们往往要往交易数据中放入多个签名，尤其是当签名多的时候，这将带来很大的交易费和内存负担。但是利用聚合签名，我们可以把多个签名组合成一个签名，就像下图所示的那样。

![](https://storage.googleapis.com/papyrus_images/0d4749514dffcaeabc6038e8ca295d758454c03dbdbfccf09d413f726eeef440.jpg)

类似的，在 Schnorr 签名下，也可以对公钥进行聚合，这大大的提升了比特币网络在交易时的性能。

而在验证的时候，传统的 ECDSA 只能支持一一验证的方式，但 Schnoor 得益于它的聚合思想，可以在节点上进行批量的验证。

Taproot
-------

我们知道匿名一直是比特币追求的一个重要的安全问题，在地址层面上，虽然比特币地址的伪匿名性一定程度上隔离了物理世界身份和链上世界地址，但是不同的交易，地址的类型却割裂的非常明显。下面的这些地址的交易类型一目了然，这就导致了攻击者对交易进行地址分析的可能。

![](https://storage.googleapis.com/papyrus_images/f56d9d368a4440118b0bade33665569cb114919b7c6a14748afa14b2530164eb.jpg)

而 Taproot 的目标正是提升比特币地址的匿名思想，让所有的地址看起来都一样，你无法从地址分析交易的类型。使用 Taproot 可以合并独立的 P2PKH 和 P2SH，使得彼此无法区分，其负担的交易费却是一样的，而这也正是利用了 Schnorr 的思想。

同时，Taproot 将 Schnorr 用来创建默克尔抽象语法树(MAST，一种将抽象语法树和默克尔树融合的数据结构)。在以前的情况中，假设我们有一笔交易，这笔交易设置的条件是，用户 A 在交易发起的前 30 天可以使用交易，用户 B 在交易发起的 30 天起可以使用交易。最终无论谁使用了交易，用户 A，B 的信息都将被暴露出去，这显然是不必要的。

而在 MAST 中，只有使用了交易的用户会被暴露出去，而另一个用户的信息将被隐藏，这大大保护了用户的隐私问题。

TapScript
---------

BIP 342 是关于 Taproot 脚本实施的具体内容，它增加了一些操作码用于执行，部署 Taproot，Schnorr，软分叉等代码层面的功能，，如 「OP\_CHECKSIGADD」。禁用了「OP\_CHECKMULTISIG」和「OP\_CHECKMULTISIGVERIFY」 这样的低效操作码。修订了「OP\_CHECKSIG」和「OP\_CHECKSIGVERIFY」以便可以提供 Schnorr 的功能。整体上完善了比特币脚本的内容，以便适应 Taproot 升级。

总结
--

总结来看，Taproot 升级确实有一些亮点，但更多的 Taproot 更像是对 SegWit 遗留问题的完善和补充，正如 bip-0341 中摘要所描述的那样：“This document proposes a new SegWit version 1 output type ...”这仅仅是 SegWit 输出层面的一个新的解决思路。

另一个问题是，Taproot 升级是一个软分叉，其中包括 Schnorr 真正的激活也要到明年才开始，所以 Taproot 本身的升级过程也非一朝一夕，如果 P2TR(Taproot 下的地址)未能成为主流，那么 P2TR 显然并未达成其匿名于其他地址的目的。

此外，还有一种声音质疑了 Taproot 实际的效果，其认为 Taproot 会导致地址空间碎片化，使得攻击者更容易分析。

对于普通用户来说，Taproot 的最直观的好处就是降低了交易费用，提升了交易的匿名性和效率。无论如何 Taproot 的升级到底会对比特币带来怎样的影响，是否能达到预期的目标，都只有交给时间来验证了。

---

*Originally published on [Untitled](https://paragraph.com/@0x27418be5b80285fa27fd75eef87e6877cbb5e53e/taproot-taproot)*
