|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: 'Taproot 完整指南:從 Schnorr 簽名到實際應用' |
| 4 | +date: 2025-01-15 |
| 5 | +categories: |
| 6 | +- bitcoin |
| 7 | +- taproot |
| 8 | +description: 深入解析比特幣 2021 年最重要的升級 Taproot,包括 Schnorr 簽名、MAST、Tapscript 的技術原理與實際應用。 |
| 9 | +image: /img/taproot-guide.svg |
| 10 | +published: true |
| 11 | +hero_image: /img/hero.png |
| 12 | +tags: |
| 13 | +- bitcoin |
| 14 | +- taproot |
| 15 | +- schnorr |
| 16 | +- bip340 |
| 17 | +- bip341 |
| 18 | +- bip342 |
| 19 | +--- |
| 20 | + |
| 21 | +## 前言 |
| 22 | + |
| 23 | +2021 年 11 月 14 日,比特幣在區塊高度 709,632 啟用了 Taproot 升級。這是自 2017 年 SegWit 以來最重要的協議更新,由三個緊密相關的 BIP 組成: |
| 24 | + |
| 25 | +- **BIP 340**: Schnorr Signatures for secp256k1 |
| 26 | +- **BIP 341**: Taproot: SegWit version 1 spending rules |
| 27 | +- **BIP 342**: Validation of Taproot Scripts (Tapscript) |
| 28 | + |
| 29 | +本文將深入解析這次升級的技術細節、帶來的改進,以及對比特幣生態系統的長期影響。 |
| 30 | + |
| 31 | +--- |
| 32 | + |
| 33 | +## 一、Schnorr 簽名 (BIP 340) |
| 34 | + |
| 35 | +### 為什麼需要新的簽名方案? |
| 36 | + |
| 37 | +比特幣原本使用 ECDSA(橢圓曲線數位簽名演算法)。雖然 ECDSA 已被證明安全,但 Schnorr 簽名方案具有幾個重要優勢: |
| 38 | + |
| 39 | +| 特性 | ECDSA | Schnorr | |
| 40 | +|------|-------|---------| |
| 41 | +| 簽名大小 | 70-72 bytes | 64 bytes | |
| 42 | +| 批量驗證 | 不支援 | 支援 | |
| 43 | +| 簽名聚合 | 不支援 | 原生支援 | |
| 44 | +| 數學證明 | 較複雜 | 更簡潔 | |
| 45 | + |
| 46 | +### Schnorr 簽名原理 |
| 47 | + |
| 48 | +Schnorr 簽名基於離散對數問題的困難性。給定: |
| 49 | +- 私鑰 `x` |
| 50 | +- 公鑰 `P = x * G`(G 為生成點) |
| 51 | +- 訊息 `m` |
| 52 | + |
| 53 | +簽名過程: |
| 54 | +1. 選擇隨機數 `k`,計算 `R = k * G` |
| 55 | +2. 計算挑戰值 `e = H(R || P || m)` |
| 56 | +3. 計算簽名 `s = k + e * x` |
| 57 | +4. 簽名為 `(R, s)` |
| 58 | + |
| 59 | +驗證過程: |
| 60 | +- 檢查 `s * G == R + e * P` |
| 61 | + |
| 62 | +### 簽名聚合的威力 |
| 63 | + |
| 64 | +Schnorr 簽名的線性特性允許多個簽名被聚合成單一簽名: |
| 65 | + |
| 66 | +``` |
| 67 | +# 三個簽名者的公鑰 |
| 68 | +P1, P2, P3 |
| 69 | +
|
| 70 | +# 聚合公鑰 |
| 71 | +P = P1 + P2 + P3 |
| 72 | +
|
| 73 | +# 聚合簽名看起來與單一簽名完全相同 |
| 74 | +``` |
| 75 | + |
| 76 | +這意味著: |
| 77 | +- **2-of-3 多簽**在鏈上看起來與**單簽**完全一樣 |
| 78 | +- **更低的手續費**(更小的交易體積) |
| 79 | +- **更好的隱私**(無法區分多簽和單簽) |
| 80 | + |
| 81 | +### MuSig2 協議 |
| 82 | + |
| 83 | +MuSig2 (BIP 327) 是實現多方 Schnorr 簽名的標準協議: |
| 84 | + |
| 85 | +1. **密鑰聚合階段**:所有參與者的公鑰被聚合 |
| 86 | +2. **Nonce 交換**:兩輪通訊交換隨機數 |
| 87 | +3. **簽名生成**:每個參與者產生部分簽名 |
| 88 | +4. **簽名聚合**:部分簽名被合併為最終簽名 |
| 89 | + |
| 90 | +--- |
| 91 | + |
| 92 | +## 二、Taproot 輸出 (BIP 341) |
| 93 | + |
| 94 | +### 新的地址格式 |
| 95 | + |
| 96 | +Taproot 引入了 SegWit v1 輸出,使用新的地址格式: |
| 97 | + |
| 98 | +| 版本 | 地址前綴 | 範例 | |
| 99 | +|------|---------|------| |
| 100 | +| Legacy | 1... | 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2 | |
| 101 | +| P2SH | 3... | 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy | |
| 102 | +| SegWit v0 | bc1q... | bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq | |
| 103 | +| **Taproot** | **bc1p...** | **bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297** | |
| 104 | + |
| 105 | +### 兩種花費路徑 |
| 106 | + |
| 107 | +Taproot 輸出可以通過兩種方式花費: |
| 108 | + |
| 109 | +#### Key Path(密鑰路徑) |
| 110 | + |
| 111 | +最簡單高效的方式,直接用聚合公鑰簽名: |
| 112 | + |
| 113 | +``` |
| 114 | +witness: <signature> |
| 115 | +scriptPubKey: OP_1 <32-byte-pubkey> |
| 116 | +``` |
| 117 | + |
| 118 | +- 看起來像普通的單簽交易 |
| 119 | +- 最小的交易體積 |
| 120 | +- 最高的隱私性 |
| 121 | + |
| 122 | +#### Script Path(腳本路徑) |
| 123 | + |
| 124 | +當需要使用複雜腳本條件時: |
| 125 | + |
| 126 | +``` |
| 127 | +witness: <script-input> <script> <control-block> |
| 128 | +``` |
| 129 | + |
| 130 | +- 只需揭示被執行的腳本 |
| 131 | +- 其他腳本分支保持隱藏 |
| 132 | +- 使用 Merkle 證明驗證 |
| 133 | + |
| 134 | +### MAST(默克爾化替代腳本樹) |
| 135 | + |
| 136 | +MAST 允許將多個腳本條件組織成 Merkle 樹: |
| 137 | + |
| 138 | +``` |
| 139 | + Root |
| 140 | + / \ |
| 141 | + H1 H2 |
| 142 | + / \ / \ |
| 143 | + S1 S2 S3 S4 |
| 144 | +``` |
| 145 | + |
| 146 | +**優勢:** |
| 147 | +- 只揭示使用的腳本分支 |
| 148 | +- 未使用的條件完全隱藏 |
| 149 | +- 支援大量複雜條件 |
| 150 | + |
| 151 | +**實際應用範例:** |
| 152 | + |
| 153 | +假設一個資金需要滿足以下任一條件: |
| 154 | +1. Alice 和 Bob 共同簽名(正常情況) |
| 155 | +2. Alice 單獨簽名 + 1週時間鎖(Bob 失聯) |
| 156 | +3. Bob 單獨簽名 + 1個月時間鎖(Alice 失聯) |
| 157 | +4. 受託人簽名 + 6個月時間鎖(雙方失聯) |
| 158 | + |
| 159 | +在 Taproot 之前,所有這些條件都必須公開。使用 MAST 後: |
| 160 | +- 正常情況下使用 Key Path,看起來像普通交易 |
| 161 | +- 只有需要使用備用條件時才揭示該分支 |
| 162 | + |
| 163 | +--- |
| 164 | + |
| 165 | +## 三、Tapscript (BIP 342) |
| 166 | + |
| 167 | +### 腳本語言更新 |
| 168 | + |
| 169 | +Tapscript 對比特幣腳本做了以下改進: |
| 170 | + |
| 171 | +#### 新操作碼 |
| 172 | + |
| 173 | +**OP_CHECKSIGADD**:支援批量簽名驗證 |
| 174 | + |
| 175 | +``` |
| 176 | +# 舊的多簽方式(OP_CHECKMULTISIG) |
| 177 | +OP_2 <pubkey1> <pubkey2> <pubkey3> OP_3 OP_CHECKMULTISIG |
| 178 | +
|
| 179 | +# 新的方式(更高效) |
| 180 | +<pubkey1> OP_CHECKSIG |
| 181 | +<pubkey2> OP_CHECKSIGADD |
| 182 | +<pubkey3> OP_CHECKSIGADD |
| 183 | +OP_2 OP_EQUAL |
| 184 | +``` |
| 185 | + |
| 186 | +#### 移除的限制 |
| 187 | + |
| 188 | +- 移除了腳本大小限制(原本 10,000 bytes) |
| 189 | +- 移除了操作碼數量限制(原本 201 個) |
| 190 | +- 簽名必須非空(防止簽名可塑性) |
| 191 | + |
| 192 | +#### 升級友好設計 |
| 193 | + |
| 194 | +Tapscript 使用 **OP_SUCCESS** 操作碼保留未來升級空間: |
| 195 | + |
| 196 | +``` |
| 197 | +# 目前未定義的操作碼被視為 OP_SUCCESS |
| 198 | +# 未來可以賦予新功能而不需硬分叉 |
| 199 | +``` |
| 200 | + |
| 201 | +--- |
| 202 | + |
| 203 | +## 四、實際應用場景 |
| 204 | + |
| 205 | +### 1. 更便宜的多簽 |
| 206 | + |
| 207 | +**傳統 2-of-3 多簽:** |
| 208 | +- 輸入大小:約 297 bytes |
| 209 | +- 所有公鑰都暴露 |
| 210 | + |
| 211 | +**Taproot 2-of-3:** |
| 212 | +- Key Path 輸入大小:約 57 bytes(節省 80%+) |
| 213 | +- 看起來與單簽完全相同 |
| 214 | + |
| 215 | +### 2. 閃電網路改進 |
| 216 | + |
| 217 | +#### 更隱私的通道 |
| 218 | + |
| 219 | +Taproot 使閃電網路通道在鏈上更難識別: |
| 220 | +- 開通道交易看起來像普通交易 |
| 221 | +- 協作關閉也是普通交易 |
| 222 | +- 只有非協作關閉才會揭示腳本 |
| 223 | + |
| 224 | +#### PTLC(點時間鎖合約) |
| 225 | + |
| 226 | +用 Adaptor Signatures 替代 HTLC: |
| 227 | + |
| 228 | +| 特性 | HTLC | PTLC | |
| 229 | +|------|------|------| |
| 230 | +| 鏈接性 | 同一支付路徑可被關聯 | 每一跳都不同 | |
| 231 | +| 鏈上足跡 | 暴露哈希值 | 普通簽名 | |
| 232 | +| 隱私 | 較差 | 更好 | |
| 233 | + |
| 234 | +### 3. DLC(離散對數合約) |
| 235 | + |
| 236 | +Taproot 讓 DLC 更實用: |
| 237 | +- 所有可能結果都隱藏在 MAST 中 |
| 238 | +- 正常結算看起來像普通交易 |
| 239 | +- 大幅降低鏈上足跡 |
| 240 | + |
| 241 | +### 4. Vault(金庫) |
| 242 | + |
| 243 | +使用 Taproot 實現更安全的冷儲存: |
| 244 | + |
| 245 | +``` |
| 246 | +Key Path: 延遲 + 冷錢包簽名 |
| 247 | +Script Path: |
| 248 | + - 分支1: 熱錢包 + 24小時延遲 |
| 249 | + - 分支2: 恢復密鑰 + 1週延遲 |
| 250 | +``` |
| 251 | + |
| 252 | +--- |
| 253 | + |
| 254 | +## 五、開發者資源 |
| 255 | + |
| 256 | +### 錢包支援狀態(2025年) |
| 257 | + |
| 258 | +| 錢包 | Taproot 支援 | 發送 | 接收 | |
| 259 | +|------|-------------|------|------| |
| 260 | +| Bitcoin Core | 完整 | ✅ | ✅ | |
| 261 | +| Sparrow | 完整 | ✅ | ✅ | |
| 262 | +| Blue Wallet | 部分 | ✅ | ✅ | |
| 263 | +| Ledger | 完整 | ✅ | ✅ | |
| 264 | +| Trezor | 完整 | ✅ | ✅ | |
| 265 | +| Coldcard | 完整 | ✅ | ✅ | |
| 266 | + |
| 267 | +### 開發工具 |
| 268 | + |
| 269 | +- **[bitcoin-s](https://bitcoin-s.org/)** - Scala 實現 |
| 270 | +- **[rust-bitcoin](https://github.com/rust-bitcoin/rust-bitcoin)** - Rust 實現 |
| 271 | +- **[bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib)** - JavaScript 實現 |
| 272 | +- **[BDK](https://bitcoindevkit.org/)** - Bitcoin Dev Kit |
| 273 | + |
| 274 | +### 學習資源 |
| 275 | + |
| 276 | +- **[BIP 340](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki)** - Schnorr 規範 |
| 277 | +- **[BIP 341](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki)** - Taproot 規範 |
| 278 | +- **[BIP 342](https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki)** - Tapscript 規範 |
| 279 | +- **[Bitcoin Optech Taproot](https://bitcoinops.org/en/topics/taproot/)** - 技術追蹤 |
| 280 | + |
| 281 | +--- |
| 282 | + |
| 283 | +## 六、採用現況與未來展望 |
| 284 | + |
| 285 | +### 採用數據(2024年底) |
| 286 | + |
| 287 | +根據鏈上數據: |
| 288 | +- Taproot 輸出佔總 UTXO 約 5-8% |
| 289 | +- 新交易中約 15-20% 使用 Taproot |
| 290 | +- 主要交易所已支援存提款 |
| 291 | + |
| 292 | +### 未來發展 |
| 293 | + |
| 294 | +#### Cross-Input Signature Aggregation (CISA) |
| 295 | + |
| 296 | +允許交易中所有輸入共享單一簽名: |
| 297 | +- 進一步減少交易大小 |
| 298 | +- 更低的手續費 |
| 299 | +- 需要額外的軟分叉 |
| 300 | + |
| 301 | +#### OP_CAT 復活 |
| 302 | + |
| 303 | +如果啟用,可實現: |
| 304 | +- 更靈活的 covenant |
| 305 | +- 鏈上驗證能力增強 |
| 306 | +- 新的 Layer 2 可能性 |
| 307 | + |
| 308 | +--- |
| 309 | + |
| 310 | +## 結論 |
| 311 | + |
| 312 | +Taproot 是比特幣協議的重大進步,帶來了: |
| 313 | + |
| 314 | +1. **更好的隱私** - 多簽和複雜腳本在鏈上不可區分 |
| 315 | +2. **更高的效率** - 更小的交易體積,更低的費用 |
| 316 | +3. **更強的可擴展性** - 為閃電網路和其他 Layer 2 提供更好的基礎 |
| 317 | +4. **更靈活的腳本** - MAST 和 Tapscript 開啟新的應用可能 |
| 318 | + |
| 319 | +隨著錢包和服務的持續採用,Taproot 的優勢將越來越明顯。建議所有比特幣用戶和開發者儘快遷移到 Taproot 地址。 |
| 320 | + |
| 321 | +--- |
| 322 | + |
| 323 | +## 參考資料 |
| 324 | + |
| 325 | +- [Bitcoin Optech: Preparing for Taproot](https://bitcoinops.org/en/preparing-for-taproot/) |
| 326 | +- [Taproot Workshop](https://github.com/bitcoinops/taproot-workshop) |
| 327 | +- [Pieter Wuille's Taproot Presentation](https://www.youtube.com/watch?v=KLNH0ttpdFg) |
| 328 | +- [Jimmy Song: Taproot Explained](https://programmingblockchain.com/) |
0 commit comments