進階
Watch-Only Wallets
深入了解 Bitcoin Core 的 Watch-Only 錢包功能,監控地址而不持有私鑰。
10 分鐘
什麼是 Watch-Only 錢包?
Watch-Only 錢包允許你監控比特幣地址的餘額和交易,而不需要持有私鑰。 這對於冷存儲、多簽錢包監控和會計審計非常有用。
使用場景
冷存儲監控
- • 私鑰離線保存
- • 在線監控餘額
- • 創建未簽名交易
多簽錢包
- • 監控多簽地址
- • 協調簽名流程
- • 審計交易歷史
創建 Watch-Only 錢包
使用描述符(推薦)
# 創建空的描述符錢包(無私鑰)
bitcoin-cli createwallet "watchonly" true true "" false true
# 參數說明:
# "watchonly" - 錢包名稱
# true - disable_private_keys(禁用私鑰)
# true - blank(空白錢包)
# "" - passphrase
# false - avoid_reuse
# true - descriptors(使用描述符)
# 導入公鑰描述符
bitcoin-cli -rpcwallet=watchonly importdescriptors '[
{
"desc": "wpkh([d34db33f/84h/0h/0h]xpub.../0/*)#checksum",
"timestamp": "now",
"range": [0, 999],
"watchonly": true,
"active": true,
"internal": false
},
{
"desc": "wpkh([d34db33f/84h/0h/0h]xpub.../1/*)#checksum",
"timestamp": "now",
"range": [0, 999],
"watchonly": true,
"active": true,
"internal": true
}
]' 導入單個地址(舊版)
# 創建舊版錢包
bitcoin-cli createwallet "watchonly-legacy" true true "" false false
# 導入地址(觸發重新掃描)
bitcoin-cli -rpcwallet=watchonly-legacy importaddress \
"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq" \
"my-cold-storage" \
true
# 導入公鑰
bitcoin-cli -rpcwallet=watchonly-legacy importpubkey \
"02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc" \
"pubkey-label" \
true
# 導入多簽腳本
bitcoin-cli -rpcwallet=watchonly-legacy importmulti '[
{
"scriptPubKey": {"address": "bc1q..."},
"timestamp": 0,
"watchonly": true,
"label": "multisig-watch"
}
]' 錢包操作
# 查看餘額
bitcoin-cli -rpcwallet=watchonly getbalance
# 列出未花費輸出
bitcoin-cli -rpcwallet=watchonly listunspent
# 查看交易歷史
bitcoin-cli -rpcwallet=watchonly listtransactions "*" 10
# 獲取新的接收地址(僅描述符錢包)
bitcoin-cli -rpcwallet=watchonly getnewaddress
# 查看錢包資訊
bitcoin-cli -rpcwallet=watchonly getwalletinfo
# 輸出示例
{
"walletname": "watchonly",
"walletversion": 169900,
"balance": 1.23456789,
"unconfirmed_balance": 0.0,
"immature_balance": 0.0,
"txcount": 42,
"private_keys_enabled": false,
"avoid_reuse": false,
"scanning": false,
"descriptors": true
} 創建未簽名交易
# 使用 PSBT 創建未簽名交易
# 1. 創建 PSBT
bitcoin-cli -rpcwallet=watchonly walletcreatefundedpsbt \
'[]' \
'[{"bc1q...": 0.5}]' \
0 \
'{"changeAddress": "bc1q..."}'
# 輸出
{
"psbt": "cHNidP8BAH...",
"fee": 0.00001410,
"changepos": 1
}
# 2. 分析 PSBT
bitcoin-cli analyzepsbt "cHNidP8BAH..."
# 輸出
{
"inputs": [
{
"has_utxo": true,
"is_final": false,
"next": "signer"
}
],
"estimated_vsize": 141,
"estimated_feerate": 0.00010000,
"fee": 0.00001410,
"next": "signer"
}
# 3. 將 PSBT 傳輸到持有私鑰的設備進行簽名
# (使用 USB、二維碼或其他安全方式) Watch-Only 交易流程:
┌─────────────────────────────────────────────────────────────┐
│ 在線電腦(Watch-Only 錢包) │
│ ├── 監控餘額和交易 │
│ ├── 創建未簽名 PSBT │
│ └── 廣播已簽名交易 │
└───────────────────────┬─────────────────────────────────────┘
│ PSBT
▼
┌─────────────────────────────────────────────────────────────┐
│ 離線設備(硬體錢包/冷存儲) │
│ ├── 持有私鑰 │
│ ├── 簽名 PSBT │
│ └── 返回已簽名 PSBT │
└───────────────────────┬─────────────────────────────────────┘
│ 已簽名 PSBT
▼
┌─────────────────────────────────────────────────────────────┐
│ 在線電腦 │
│ ├── finalizepsbt(完成 PSBT) │
│ └── sendrawtransaction(廣播) │
└─────────────────────────────────────────────────────────────┘ 導入 Extended Public Key
# 從 xpub 創建描述符
# BIP-84 (Native SegWit)
XPUB="xpub6..."
# 外部地址描述符
DESC_EXT="wpkh([$XPUB]/0/*)"
# 內部地址描述符(找零)
DESC_INT="wpkh([$XPUB]/1/*)"
# 獲取校驗和
bitcoin-cli getdescriptorinfo "$DESC_EXT"
# 輸出中包含 "descriptor" 字段帶校驗和
# 導入描述符
bitcoin-cli -rpcwallet=watchonly importdescriptors '[
{
"desc": "wpkh([fingerprint/84h/0h/0h]xpub.../0/*)#checksum",
"timestamp": 0,
"range": 1000,
"watchonly": true,
"active": true,
"internal": false
}
]'
# timestamp=0 表示掃描整個區塊鏈
# 使用具體時間戳可以加快掃描 隱私提示: Extended Public Key 可以派生所有子地址。不要與不信任的人分享 xpub。
重新掃描區塊鏈
# 導入地址時自動重新掃描
# (最後一個參數 true 表示 rescan)
bitcoin-cli -rpcwallet=watchonly importaddress "bc1q..." "label" true
# 手動重新掃描
bitcoin-cli -rpcwallet=watchonly rescanblockchain 700000
# 從特定區塊開始掃描(更快)
bitcoin-cli -rpcwallet=watchonly rescanblockchain 700000 750000
# 查看掃描進度
bitcoin-cli -rpcwallet=watchonly getwalletinfo | jq '.scanning'
# 輸出(掃描中)
{
"duration": 123,
"progress": 0.456
}
# 中止掃描
bitcoin-cli -rpcwallet=watchonly abortrescan 多簽 Watch-Only
# 創建 2-of-3 多簽 watch-only 錢包
# 1. 創建錢包
bitcoin-cli createwallet "multisig-watch" true true "" false true
# 2. 導入多簽描述符
bitcoin-cli -rpcwallet=multisig-watch importdescriptors '[
{
"desc": "wsh(sortedmulti(2,[fp1/48h/0h/0h/2h]xpub1.../*,[fp2/48h/0h/0h/2h]xpub2.../*,[fp3/48h/0h/0h/2h]xpub3.../*))#checksum",
"timestamp": "now",
"range": 100,
"watchonly": true,
"active": true
}
]'
# 3. 獲取多簽地址
bitcoin-cli -rpcwallet=multisig-watch getnewaddress
# 4. 創建 PSBT 給簽名者
bitcoin-cli -rpcwallet=multisig-watch walletcreatefundedpsbt \
'[]' \
'[{"bc1q...": 1.0}]' 硬體錢包整合
# 使用 HWI(Hardware Wallet Interface)
# 1. 安裝 HWI
pip install hwi
# 2. 列出連接的硬體錢包
hwi enumerate
# 3. 獲取 xpub
hwi -d "device_id" getxpub "m/84'/0'/0'"
# 4. 創建 watch-only 錢包並導入
# (使用上述方法)
# 5. 用硬體錢包簽名 PSBT
hwi -d "device_id" signtx "cHNidP8..."
# 6. 完成並廣播
bitcoin-cli finalizepsbt "signed_psbt"
bitcoin-cli sendrawtransaction "hex" 總結
- ✓ 安全監控:監控餘額而不暴露私鑰
- ✓ 描述符支持:使用 xpub 監控完整錢包
- ✓ PSBT 整合:創建未簽名交易用於冷簽名
- ⚠ 隱私:注意保護 xpub 的隱私
已複製連結