跳至主要內容
Informational Final

BIP-385: 原始描述符

定義 raw() 和 addr() 描述符函數,用於表示任意腳本和地址。

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

385

類型

Informational

狀態

Final

創建日期

2021-06-27

摘要

BIP-385 定義了兩個特殊的描述符函數: raw() 用於表示任意的原始腳本, addr() 用於直接指定地址。 這些函數用於處理非標準腳本或已知地址的監控。

raw() — 原始腳本

格式

語法:raw(HEX_SCRIPT)

參數:
• HEX_SCRIPT = 輸出腳本的十六進位表示

範例:
raw(76a914bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe88ac)

這是一個 P2PKH 腳本:
76        OP_DUP
a9        OP_HASH160
14        OP_PUSHBYTES_20
bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe  (公鑰哈希)
88        OP_EQUALVERIFY
ac        OP_CHECKSIG

使用場景

非標準腳本

描述無法用其他描述符函數表達的自定義腳本, 如帶有特殊條件的時間鎖或複雜的條件腳本。

OP_RETURN 輸出

監控包含數據的 OP_RETURN 輸出(雖然這些是不可花費的)。

歷史腳本

表示區塊鏈早期使用的非標準腳本類型。

範例:OP_RETURN

監控包含 "Hello" 的 OP_RETURN:

raw(6a0548656c6c6f)

解析:
6a        OP_RETURN
05        OP_PUSHBYTES_5
48656c6c6f  "Hello" 的 hex 編碼

注意:OP_RETURN 輸出不可花費,僅用於監控

addr() — 地址描述符

格式

語法:addr(ADDRESS)

參數:
• ADDRESS = 任何有效的比特幣地址

範例:
addr(1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2)  // P2PKH
addr(3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy)  // P2SH
addr(bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4)  // P2WPKH
addr(bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0)  // P2TR

內部轉換

addr() 會自動轉換為對應的腳本:

addr(1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2)
  → 解碼 Base58Check
  → 提取公鑰哈希
  → 構建 P2PKH 腳本
  → 等同於 raw(76a914bef5a2f9...88ac)

addr(bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4)
  → 解碼 Bech32
  → 提取見證程序
  → 構建 P2WPKH 腳本
  → 等同於 raw(0014751e76e8199196d454941c45d1b3a323f1433bd6)

使用場景

監控已知地址

當你只知道地址(而非公鑰或私鑰)時, 可以使用 addr() 來監控該地址的交易。

Watch-Only 錢包

創建只讀錢包來追蹤特定地址, 無需擁有對應的私鑰。

支付驗證

商家監控收款地址,確認客戶支付。

限制

重要限制

  • 不可簽章:raw() 和 addr() 描述符無法用於簽署交易, 因為它們不包含密鑰資訊。
  • 不可派生:不支援範圍派生(沒有 /0/* 這樣的路徑)。
  • 單一輸出:每個 raw() 或 addr() 只對應一個特定輸出。
  • 無來源資訊:不支援 [fingerprint/path] 來源標記。

比較

特性 raw() addr()
輸入格式 十六進位腳本 地址字串
適用腳本 任意腳本 有地址的標準腳本
可讀性
OP_RETURN 支援 不支援
簽章能力 不可 不可

Bitcoin Core 範例

# 導入地址用於監控
$ bitcoin-cli importdescriptors '[{
  "desc": "addr(bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4)#checksum",
  "timestamp": "now",
  "watchonly": true,
  "label": "監控地址"
}]'

# 導入原始腳本
$ bitcoin-cli importdescriptors '[{
  "desc": "raw(76a914bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe88ac)#checksum",
  "timestamp": "now",
  "watchonly": true
}]'

# 獲取描述符資訊
$ bitcoin-cli getdescriptorinfo "addr(1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2)"
{
  "descriptor": "addr(1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2)#...",
  "isrange": false,
  "issolvable": false,
  "hasprivatekeys": false
}

總結

BIP-385 定義的 raw() 和 addr() 提供了表示任意腳本和地址的能力。 它們主要用於監控目的,因為沒有包含密鑰資訊所以無法簽署交易。 對於需要簽章能力的錢包,應該使用其他包含密鑰的描述符函數。

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