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() 提供了表示任意腳本和地址的能力。 它們主要用於監控目的,因為沒有包含密鑰資訊所以無法簽署交易。 對於需要簽章能力的錢包,應該使用其他包含密鑰的描述符函數。
延伸閱讀: 查看 GitHub 上的完整 BIP-385 文件
已複製連結