跳至主要內容
Informational Final

BIP-384: 組合描述符

定義 combo() 描述符函數,自動生成多種腳本類型以提高相容性。

Pieter Wuille, Andrew Chow 2021年6月27日
BIP 編號

384

類型

Informational

狀態

Final

創建日期

2021-06-27

摘要

BIP-384 定義了 combo() 描述符函數。 它是一個便利函數,自動為給定的密鑰生成所有可能的標準輸出類型, 主要用於導入可能使用任何類型輸出的舊密鑰。

格式

語法:combo(KEY)

等同於同時導入:
• pk(KEY)           — P2PK(如果 KEY 是非壓縮公鑰則只有這個)
• pkh(KEY)          — P2PKH
• wpkh(KEY)         — P2WPKH(僅壓縮公鑰)
• sh(wpkh(KEY))     — P2SH-P2WPKH(僅壓縮公鑰)

展開規則

壓縮公鑰

當 KEY 是壓縮公鑰(33 bytes,02 或 03 開頭):

combo(02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5)

展開為:
1. pk(02c6047f...)         // 裸公鑰
2. pkh(02c6047f...)        // P2PKH(1... 地址)
3. wpkh(02c6047f...)       // P2WPKH(bc1q... 地址)
4. sh(wpkh(02c6047f...))   // P2SH-P2WPKH(3... 地址)

共 4 種輸出類型

非壓縮公鑰

當 KEY 是非壓縮公鑰(65 bytes,04 開頭):

combo(04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5...)

展開為:
1. pk(04c6047f...)         // 裸公鑰
2. pkh(04c6047f...)        // P2PKH

共 2 種輸出類型

注意:SegWit 要求壓縮公鑰,所以 wpkh 和 sh(wpkh) 不包含

使用場景

導入舊密鑰

當你有一個舊的私鑰(WIF 格式)但不確定它被用於哪種地址類型時, 使用 combo() 可以監控所有可能的地址。

資金恢復

嘗試恢復不知道使用了哪種腳本類型的資金時, combo() 確保不會遺漏任何可能的輸出。

區塊鏈掃描

區塊瀏覽器或分析工具可能使用 combo() 來追蹤 與特定公鑰相關的所有可能輸出。

範例

# 導入一個舊的 WIF 私鑰
$ bitcoin-cli importdescriptors '[{
  "desc": "combo(L1a2b3c4...)#checksum",
  "timestamp": 0,
  "label": "舊錢包密鑰"
}]'

# 這會監控該密鑰的所有可能地址類型

# 導入 xpub 的組合描述符
$ bitcoin-cli importdescriptors '[{
  "desc": "combo([d34db33f/44h/0h/0h]xpub.../0/*)#checksum",
  "timestamp": "now",
  "range": [0, 999]
}]'

# 這會為每個派生的公鑰監控所有輸出類型

限制與注意事項

不建議用於新錢包

  • 效率問題:combo() 會創建多個輸出監控,增加資源使用。
  • 不夠精確:新錢包應該使用明確的描述符(如 wpkh)。
  • 隱私考量:將所有地址類型關聯到同一密鑰可能降低隱私。
  • 不含 Taproot:combo() 不包含 tr(),Taproot 需要單獨處理。

與其他描述符比較

場景 推薦描述符
新建 SegWit 錢包 wpkh()
新建 Taproot 錢包 tr()
導入已知類型的舊錢包 pkh() 或 wpkh()
導入未知類型的舊密鑰 combo()

總結

BIP-384 定義的 combo() 是一個便利工具,用於處理不確定腳本類型的舊密鑰。 它自動展開為所有可能的標準輸出類型,確保不會遺漏任何資金。 但對於新錢包,應該使用更精確的描述符如 wpkh() 或 tr()。

已複製連結
已複製到剪貼簿