進階
Wallet Types
深入了解 Bitcoin Core 的錢包類型,比較 Legacy 錢包和 Descriptor 錢包的特性。
10 分鐘
錢包類型概覽
Bitcoin Core 支持兩種錢包類型:Legacy 錢包(舊式)和 Descriptor 錢包(新式)。 從 v0.21.0 開始,Descriptor 錢包成為預設選項,提供更好的備份、恢復和多簽支持。
錢包演進
| 版本 | 變更 |
|---|---|
| v0.13.0 | 引入 HD 錢包 |
| v0.17.0 | 引入描述符概念 |
| v0.21.0 | Descriptor 錢包成為預設 |
| v23.0 | Legacy 錢包創建被棄用 |
| v26.0+ | 計劃移除 Legacy 錢包支持 |
Legacy 錢包
Legacy 錢包特性:
存儲格式:
├── Berkeley DB(BDB)格式
├── 單一 wallet.dat 文件
└── 複雜的內部結構
密鑰管理:
├── 預生成密鑰池(keypool)
├── HD 密鑰派生(可選)
├── 隱式腳本類型推導
└── 手動導入密鑰/腳本
地址類型支持:
├── P2PKH(1...)
├── P2SH-P2WPKH(3...)
└── P2WPKH(bc1q...) # 創建 Legacy 錢包(已棄用)
bitcoin-cli -named createwallet \
wallet_name="legacy-wallet" \
descriptors=false
# 查看錢包類型
bitcoin-cli getwalletinfo | jq '.format, .descriptors'
# Legacy 錢包備份
bitcoin-cli backupwallet "/path/to/backup.dat"
# 導出私鑰(需要解鎖)
bitcoin-cli dumpprivkey "地址"
# 導入私鑰
bitcoin-cli importprivkey "私鑰" "標籤" true 注意: Legacy 錢包正在被逐步淘汰。新項目應使用 Descriptor 錢包。
Descriptor 錢包
Descriptor 錢包特性:
存儲格式:
├── SQLite 數據庫
├── 結構化存儲
└── 更可靠的事務處理
密鑰管理:
├── 輸出描述符定義地址
├── 明確的腳本類型
├── 支持複雜腳本
└── 更好的多簽支持
地址類型支持:
├── 所有 Legacy 類型
├── P2TR(bc1p...)Taproot
└── 任意複雜腳本 # 創建 Descriptor 錢包(預設)
bitcoin-cli createwallet "my-wallet"
# 或明確指定
bitcoin-cli -named createwallet \
wallet_name="descriptor-wallet" \
descriptors=true
# 查看錢包描述符
bitcoin-cli listdescriptors
# 輸出示例
{
"wallet_name": "my-wallet",
"descriptors": [
{
"desc": "wpkh([fingerprint/84'/0'/0']xpub.../0/*)#checksum",
"timestamp": 1640000000,
"active": true,
"internal": false,
"range": [0, 999]
},
{
"desc": "wpkh([fingerprint/84'/0'/0']xpub.../1/*)#checksum",
"timestamp": 1640000000,
"active": true,
"internal": true, # 找零地址
"range": [0, 999]
}
]
} 比較
| 特性 | Legacy | Descriptor |
|---|---|---|
| 存儲格式 | Berkeley DB | SQLite |
| Taproot 支持 | 有限 | 完整 |
| 備份方式 | 文件複製 | 描述符導出 |
| 恢復難度 | 複雜 | 簡單 |
| 多簽支持 | 基本 | 完整 |
| 腳本靈活性 | 有限 | 高 |
| 未來支持 | 將移除 | 長期 |
Descriptor 備份
# 導出所有描述符(包含私鑰)
bitcoin-cli listdescriptors true > wallet_backup.json
# 輸出包含 xprv(私鑰)
{
"descriptors": [
{
"desc": "wpkh([fp/84'/0'/0']xprv.../0/*)#checksum",
...
}
]
}
# 創建新錢包並導入
bitcoin-cli createwallet "restored" true true "" false true
bitcoin-cli -rpcwallet=restored importdescriptors '[
{
"desc": "wpkh([fp/84h/0h/0h]xprv.../0/*)#checksum",
"timestamp": "now",
"active": true,
"internal": false
},
{
"desc": "wpkh([fp/84h/0h/0h]xprv.../1/*)#checksum",
"timestamp": "now",
"active": true,
"internal": true
}
]' 優勢: 描述符備份是純文本,可以輕鬆驗證、複製和在任何支持描述符的錢包中恢復。
錢包遷移
# 從 Legacy 遷移到 Descriptor(v24.0+)
bitcoin-cli migratewallet
# 遷移過程:
# 1. 創建備份
# 2. 轉換密鑰為描述符
# 3. 創建新的 SQLite 錢包
# 4. 遷移所有數據
# 遷移結果
{
"wallet_name": "migrated_wallet",
"backup_path": "/path/to/backup"
}
# 手動遷移步驟
# 1. 備份原錢包
bitcoin-cli -rpcwallet=legacy backupwallet "/backup/legacy.dat"
# 2. 導出所有私鑰
bitcoin-cli -rpcwallet=legacy dumpwallet "/backup/keys.txt"
# 3. 創建新描述符錢包
bitcoin-cli createwallet "new-wallet"
# 4. 導入描述符
bitcoin-cli -rpcwallet=new-wallet importdescriptors '[...]' 創建選項
# createwallet 完整參數
bitcoin-cli -named createwallet \
wallet_name="my-wallet" \ # 錢包名稱
disable_private_keys=false \ # 禁用私鑰(watch-only)
blank=false \ # 空白錢包(無密鑰)
passphrase="" \ # 加密密碼
avoid_reuse=false \ # 避免地址重用
descriptors=true \ # 使用描述符
load_on_startup=true \ # 啟動時載入
external_signer="" # 外部簽名器
# 常見組合
# 標準熱錢包
bitcoin-cli createwallet "hot-wallet"
# 加密熱錢包
bitcoin-cli -named createwallet wallet_name="encrypted" passphrase="secret"
# Watch-only 錢包
bitcoin-cli -named createwallet \
wallet_name="watch" \
disable_private_keys=true
# 硬件錢包整合
bitcoin-cli -named createwallet \
wallet_name="hww" \
disable_private_keys=true \
blank=true 預設描述符
Descriptor 錢包預設生成的描述符:
BIP-86 (Taproot) - 預設
├── tr([fp/86'/0'/0']xpub.../0/*) - 外部
└── tr([fp/86'/0'/0']xpub.../1/*) - 內部
BIP-84 (Native SegWit)
├── wpkh([fp/84'/0'/0']xpub.../0/*) - 外部
└── wpkh([fp/84'/0'/0']xpub.../1/*) - 內部
BIP-49 (Nested SegWit)
├── sh(wpkh([fp/49'/0'/0']xpub.../0/*)) - 外部
└── sh(wpkh([fp/49'/0'/0']xpub.../1/*)) - 內部
BIP-44 (Legacy)
├── pkh([fp/44'/0'/0']xpub.../0/*) - 外部
└── pkh([fp/44'/0'/0']xpub.../1/*) - 內部
v24.0+ 預設只創建 Taproot 描述符
較早版本創建多種類型 最佳實踐
推薦做法
- • 新錢包使用 Descriptor 類型
- • 定期導出描述符備份
- • 使用密碼加密錢包
- • 遷移舊 Legacy 錢包
- • 測試備份恢復流程
注意事項
- • Legacy 錢包將被棄用
- • 遷移前務必備份
- • 私鑰備份需安全存儲
- • 確認備份包含所有描述符
總結
- ✓ Descriptor:新標準,使用 SQLite 和描述符
- ✓ 更好備份:描述符可以完整描述錢包
- ✓ Taproot:完整支持 BIP-86
- ⚠ 遷移:建議將 Legacy 錢包遷移到 Descriptor
已複製連結