跳至主要內容
進階

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
已複製連結
已複製到剪貼簿