⚡ Tóm tắt — Đọc trong 60 giây
HD Wallet: 1 seed → hàng triệu địa chỉ, xác định và có thể phục hồi
HD Wallet (Hierarchical Deterministic Wallet) là loại ví tạo ra toàn bộ key theo cấu trúc cây phân cấp từ một seed duy nhất. Không phải random từng key rời rạc — mà mọi private key, public key, address đều có thể tái tạo lại hoàn toàn chỉ từ seed phrase ban đầu.
Ba chuẩn BIP phối hợp với nhau: BIP-39 chuẩn hóa cách tạo seed phrase (12/24 từ từ entropy), BIP-32 định nghĩa cách derive key theo cây phân cấp từ master seed, BIP-44 thêm cấu trúc path chuẩn cho đa coin và đa account.
BIP-39
Seed phrase
Entropy → 12/24 từ → Master seed
BIP-32
Key tree
Master seed → cây phân cấp không giới hạn
BIP-44
Đa coin
m/44'/coin'/account'/change/index
Xác định
Deterministic
Cùng seed = cùng keys mọi lần
Trước HD Wallet, ví crypto (đặc biệt là Bitcoin Core thời đầu) tạo ra các private key hoàn toàn ngẫu nhiên và độc lập với nhau. Mỗi lần cần địa chỉ mới, ví tạo 1 random key mới. Điều này dẫn đến một vấn đề nghiêm trọng: bạn phải backup toàn bộ ví thường xuyên. Nếu bạn tạo 100 địa chỉ nhận tiền và backup ví ngày hôm qua, địa chỉ thứ 101 tạo hôm nay sẽ không có trong backup đó.
Ngoài ra, quản lý nhiều key rời rạc cực kỳ phức tạp về mặt operational. Muốn xem balance trên nhiều device? Phải copy tất cả keys. Muốn generate addresses mà không expose private keys (watch-only wallet)? Không thể làm được với random keys.
HD Wallet giải quyết như thế nào?
Hierarchical Deterministic (HD) Wallet — đề xuất trong BIP-32 năm 2012 bởi Pieter Wuille — giải quyết triệt để bằng cách tạo ra một seed duy nhất, từ đó derive ra toàn bộ keys theo cấu trúc cây (tree) có thứ tự. Cùng một seed luôn tạo ra cùng một bộ keys, theo đúng thứ tự đó — mọi lần, mọi thiết bị, mọi phần mềm. Đây là tính chất deterministic.
Kết quả: chỉ cần backup 1 seed phrase một lần duy nhất là bạn có thể recover toàn bộ ví với tất cả địa chỉ đã từng tạo ra — kể cả địa chỉ tạo 5 năm sau ngày backup.
✅
Lợi ích cốt lõi của HD Wallet
Backup một lần duy nhất (seed phrase) → recover mọi thứ. Tạo unlimited địa chỉ mới mà không cần backup lại. Generate public keys mà không cần private keys (watch-only). Tổ chức keys theo cấu trúc account rõ ràng.
BIP-32 (Bitcoin Improvement Proposal 32) là đặc tả kỹ thuật cốt lõi định nghĩa cách derive key theo cấu trúc cây từ một master seed. Toàn bộ hệ sinh thái ví crypto hiện đại xây dựng trên BIP-32.
Extended Keys — Private và Public
BIP-32 giới thiệu khái niệm extended key — một loại key đặc biệt bao gồm: (1) key thông thường (256-bit private key hoặc compressed public key), và (2) chain code thêm 256 bits entropy. Extended key được ký hiệu là xprv (extended private) hoặc xpub (extended public).
Chain code là ingredient bí mật giúp derive child keys — nếu không có chain code, bạn không thể derive child keys ngay cả khi có private key gốc. Đây là tính năng bảo mật quan trọng.
Child Key Derivation Function (CKD)
Hàm CKD nhận vào parent extended key + index và output ra child extended key. Index là số nguyên từ 0 đến 2³²-1. Đây là điều cho phép mỗi parent key có thể tạo ra hơn 4 tỷ child keys.
BIP-32 — Cây phân cấp HD Wallet
Master Seed (512 bits)
│ HMAC-SHA512
▼
Master Private Key (xprv) + Master Chain Code
│
├── Account 0 (m/44'/60'/0')
│ ├── External chain (m/44'/60'/0'/0)
│ │ ├── Address 0 (m/44'/60'/0'/0/0)
│ │ ├── Address 1 (m/44'/60'/0'/0/1)
│ │ └── Address N ...
│ └── Internal chain (m/44'/60'/0'/1)
│ └── Change addresses...
└── Account 1 (m/44'/60'/1')
└── ... (tương tự)
Cách tính Child Key
Quá trình derive child private key từ parent:
// Non-hardened child derivation
// Input: parent extended private key (kpar, cpar), index i
I = HMAC_SHA512(
Key: cpar, // parent chain code
Data: point(kpar) + ser32(i) // parent pubkey + index
)
// Tách I thành 2 phần 256-bit:
IL = I[0:32] // left 32 bytes
IR = I[32:64] // right 32 bytes → child chain code
// Child private key:
ki = (parse256(IL) + kpar) mod n
// n = order of secp256k1 curve
// Hardened: dùng private key thay vì public key làm input
I = HMAC_SHA512(Key: cpar, Data: 0x00 + ser256(kpar) + ser32(i))
Derivation path là chuỗi ký hiệu mô tả đường đi từ master key xuống một child key cụ thể trong cây HD Wallet. Path giúp xác định duy nhất bất kỳ key nào trong cây hàng triệu keys.
Cú pháp của Derivation Path
m / purpose' / coin_type' / account' / change / address_index
Ví dụ: m/44'/60'/0'/0/0
│ │ │ │ │ └── address index 0 (non-hardened)
│ │ │ │ └────── change: 0=external, 1=internal
│ │ │ └────────── account 0 (hardened, dấu ')
│ │ └─────────────── coin type 60 = Ethereum
│ └──────────────────── purpose 44 = BIP-44
└──────────────────────────── m = master key (root)
// Dấu ' (apostrophe) = hardened derivation (index + 2^31)
// 44' thực ra là index 2147483692 (44 + 2147483648)
Các Component
- m: Master key — điểm gốc của cây
- purpose: Số BIP đang dùng. BIP-44 dùng 44', BIP-49 dùng 49' (P2SH-P2WPKH), BIP-84 dùng 84' (native bech32)
- coin_type: Số định danh blockchain theo SLIP-44. Bitcoin = 0, Ethereum = 60, Solana = 501, BNB = 714
- account: Cho phép phân tách accounts trong cùng 1 ví — giống folder riêng biệt
- change: 0 = external (địa chỉ nhận public), 1 = internal (change addresses, Bitcoin)
- address_index: Số thứ tự địa chỉ, bắt đầu từ 0
⚠️
Quan trọng khi import seed
Nhiều ví dùng path khác nhau cho cùng một blockchain. Ledger Live cho ETH dùng
m/44'/60'/0'/0/0, nhưng một số ví cũ dùng
m/44'/60'/0'. Khi import seed vào ví mới, nếu không thấy balance, hãy thử các path khác nhau.
BIP-39 giải quyết một vấn đề thực tế: Master seed 512-bit là chuỗi bytes hoàn toàn không thể nhớ hay viết tay một cách đáng tin cậy. BIP-39 chuyển entropy thành chuỗi 12 hoặc 24 từ tiếng Anh thông dụng — dễ viết, dễ đọc, có thể kiểm tra lỗi chính tả.
Quy trình tạo Mnemonic
BIP-39 — Từ Entropy đến Seed
1. Tạo Entropy
128 bits (12 từ) hoặc 256 bits (24 từ) random
▼
2. Thêm Checksum
SHA256(entropy)[0:ENT/32] bits đầu
128-bit entropy → 4 bits checksum → 132 bits total
▼
3. Chia thành Groups 11 bits
132 bits ÷ 11 = 12 từ (mỗi nhóm 11 bits = index 0–2047)
▼
4. Tra Wordlist
2048 từ chuẩn BIP-39 (word[0]=abandon, word[2047]=zoo)
▼
5. PBKDF2 → Master Seed
PBKDF2(mnemonic + "mnemonic" + passphrase, 2048 rounds, 512 bits)
→ 512-bit master seed (input cho BIP-32)
Wordlist BIP-39
BIP-39 định nghĩa wordlist gồm 2048 từ tiếng Anh được chọn kỹ theo các tiêu chí: không có từ nào là prefix của từ khác trong list (4 ký tự đầu xác định duy nhất), tránh từ dễ nhầm lẫn khi viết tay (b/d, n/m), độ phổ biến cao. Ngoài tiếng Anh, BIP-39 còn có wordlist cho tiếng Nhật, Trung, Hàn, Tây Ban Nha, Pháp và một số ngôn ngữ khác.
ℹ️
BIP-39 vs Raw Seed
BIP-39 chỉ là một cách tạo seed phrase dễ nhớ. Có ví dùng cách khác (Electrum dùng wordlist riêng, Monero có cú pháp khác). Seed phrase BIP-39 và Electrum
không hoán đổi được — cùng từ nhưng khác cách derive ra master seed.
BIP-44 xây dựng trên BIP-32 và BIP-39, thêm vào một quy ước cấu trúc path chuẩn để đảm bảo khả năng tương thích giữa các ví khác nhau. Trước BIP-44, mỗi ví dùng path riêng — dẫn đến tình trạng seed phrase của ví này không recover được đúng địa chỉ trong ví kia.
Coin Type Registry (SLIP-44)
BIP-44 kết hợp với SLIP-44 (chuẩn đăng ký coin type) để mỗi blockchain có một số định danh duy nhất trong derivation path:
| Blockchain |
Coin Type |
Path chuẩn |
Ví dụ address index 0 |
| Bitcoin | 0 | m/44'/0'/0'/0/0 | 1A1zP1... |
| Ethereum | 60 | m/44'/60'/0'/0/0 | 0x742d3... |
| Solana | 501 | m/44'/501'/0'/0' | HN7cA... |
| BNB Chain | 60 hoặc 714 | m/44'/60'/0'/0/0 | 0x742d3... (EVM) |
| Polygon | 60 (EVM) | m/44'/60'/0'/0/0 | 0x742d3... (EVM) |
| Cosmos | 118 | m/44'/118'/0'/0/0 | cosmos1... |
| Litecoin | 2 | m/44'/2'/0'/0/0 | LXN... |
| Cardano | 1815 | m/1852'/1815'/0'/0/0 | addr1... |
💡
Tại sao ETH và BSC cùng path?
BNB Smart Chain (BSC) dùng EVM — Ethereum Virtual Machine — nên tương thích hoàn toàn với path ETH
m/44'/60'/0'/0/0. Địa chỉ BSC và ETH của bạn thực ra
giống nhau (cùng 0x...), chỉ khác ở chainID khi ký giao dịch. Trust Wallet có thể dùng coin_type 714 cho BNB native tùy cấu hình.
So sánh ba BIP
| BIP | Năm | Vai trò | Input | Output |
| BIP-39 | 2013 | Human-readable seed | Entropy (128/256 bits) | 12/24 từ → 512-bit seed |
| BIP-32 | 2012 | Key tree derivation | 512-bit seed + path | Extended key (xprv/xpub) |
| BIP-44 | 2014 | Path convention | BIP-32 tree | Cấu trúc path chuẩn multi-coin |
Sau khi có 512-bit master seed từ BIP-39, BIP-32 derive ra Master Private Key và Master Chain Code bằng HMAC-SHA512 với key cố định "Bitcoin seed". Từ đây, cây phân cấp bắt đầu.
Public Key Derivation — Xpub
Một tính năng cực kỳ quan trọng của BIP-32: bạn có thể derive extended public key (xpub) mà không cần biết private key. Từ xpub của một account, có thể generate toàn bộ địa chỉ nhận tiền — mà không bao giờ expose private key. Đây là cơ sở của watch-only wallets và cold storage setups.
// Python snippet minh họa child key derivation (simplified)
import hashlib, hmac, struct
def derive_child_public(parent_xpub: bytes, index: int) -> bytes:
"""Non-hardened child public key derivation"""
parent_pubkey = parent_xpub[45:78] # compressed pubkey
chain_code = parent_xpub[13:45] # chain code
# HMAC-SHA512
data = parent_pubkey + struct.pack(">I", index)
I = hmac.new(chain_code, data, hashlib.sha512).digest()
IL, IR = I[:32], I[32:] # left = tweak, right = child chain code
# Child public key = parent_pubkey + IL * G (point addition)
child_pubkey = point_add(parent_pubkey, scalar_mult(IL))
return child_pubkey, IR # (child_pubkey, child_chain_code)
# Ví dụ: derive ETH address 0
# path: m/44'/60'/0'/0/0
xpub_account0 = "xpub6C..." # account-level xpub
address_0_pubkey, _ = derive_child_public(xpub_account0, 0) # index 0
Gap Limit
Ví HD Wallet thường dùng gap limit (thường là 20) khi scan blockchain để tìm lại addresses đã dùng. Ví sẽ derive địa chỉ liên tiếp (index 0, 1, 2...) và dừng lại khi gặp 20 địa chỉ liên tiếp không có transaction. Nếu bạn skip địa chỉ hoặc generate hơn 20 địa chỉ trước khi dùng, ví có thể không thấy hết — cần tăng gap limit trong settings.
Đây là một trong những phần kỹ thuật quan trọng nhất của BIP-32 mà nhiều người dùng ví bỏ qua.
Vấn đề với Non-Hardened Derivation
Với non-hardened derivation, tồn tại một điểm yếu nghiêm trọng: nếu attacker biết cả parent extended public key (xpub) và bất kỳ child private key nào, họ có thể tính ngược ra parent private key. Điều này là do child key = f(parent pubkey, chain code, index), và từ đó có thể suy ngược.
🚨
Attack scenario: Non-hardened leak
Kịch bản nguy hiểm: Bạn share xpub của account-level để dùng watch-only wallet. Đồng thời, 1 trong những child private keys bị lộ (malware, phishing). Attacker có xpub + child private key → có thể tính được parent private key → compromise toàn bộ account.
Hardened Derivation Giải Quyết Thế Nào
Hardened derivation (index ≥ 2³¹, ký hiệu bằng dấu ') dùng parent private key thay vì parent public key làm input cho HMAC. Kết quả: không thể derive hardened child public key từ parent public key — và không thể đảo ngược từ child key về parent. Biết parent xpub không giúp được gì.
| Thuộc tính | Non-Hardened | Hardened |
| Index range | 0 đến 2³¹-1 | 2³¹ đến 2³²-1 (dùng i') |
| Input HMAC | Parent public key | Parent private key |
| Derive xpub từ parent xpub? | Có thể | Không thể |
| Watch-only support? | Có | Không |
| Độ bảo mật | Thấp hơn | Cao hơn |
| Dùng ở level nào? | change, address_index | purpose', coin_type', account' |
BIP-44 thiết kế hợp lý: các level cao (purpose, coin_type, account) dùng hardened để cô lập accounts với nhau. Các level thấp (change, address_index) dùng non-hardened để hỗ trợ generate addresses từ xpub mà không cần private key.
Hiểu HD Wallet giúp giải thích nhiều hiện tượng thực tế mà người dùng hay gặp nhưng không biết tại sao.
1 Seed → Nhiều Blockchain
Khi bạn import cùng một seed phrase vào MetaMask và Trust Wallet, cả hai đều generate ra cùng địa chỉ ETH (vì dùng cùng path m/44'/60'/0'/0/0). Nhưng Trust Wallet cũng generate địa chỉ BTC, SOL, Cosmos... từ cùng seed đó, mỗi chain theo path riêng của nó. Một seed, nhiều cây key song song, mỗi cây cho một blockchain.
Hardware Wallet và xpub
Ledger và Trezor sử dụng HD Wallet theo chuẩn BIP-32/39/44. Khi bạn kết nối với Ledger Live, ví export account-level xpub cho mỗi coin — Ledger Live dùng xpub này để generate và scan địa chỉ, tính balance, mà không bao giờ trực tiếp access private keys. Private keys luôn ở trong chip Secure Element của thiết bị.
MultiSig và xpub Coordination
Gnosis Safe và các multisig wallets sử dụng xpub từ nhiều participants để coordinate. Mỗi signer export xpub của mình, multisig wallet combine chúng để generate receive addresses chung — không ai trong nhóm cần tiết lộ private key trong quá trình setup.
🔑
Key insight
HD Wallet là foundation cho toàn bộ UX ví crypto hiện đại.
Passphrase BIP-39 (từ thứ 25) thêm một lớp bảo mật: cùng seed phrase + passphrase khác nhau → master seed hoàn toàn khác → ví hoàn toàn khác. Đây là tính năng plausible deniability: một seed phrase có thể tạo ra nhiều "ví ẩn" tùy passphrase.
Liên quan đến Bài Viết Khác
Để hiểu sâu hơn về nền tảng key management: xem Seed Phrase Là Gì để hiểu BIP-39 entropy và bảo quản, hoặc Private Key Là Gì để hiểu ECDSA và secp256k1. Cho custody nâng cao, MPC Wallet là bước tiếp theo tự nhiên từ HD Wallet.
Derivation path của ETH trên Ledger là gì?
+
Ledger dùng m/44'/60'/0'/0/0 cho Ethereum theo chuẩn BIP-44. Trong đó: 44' = BIP-44 purpose, 60' = ETH coin type, 0' = account 0, 0 = external chain, 0 = address index 0. MetaMask cũng dùng path này theo mặc định. Một số ví cũ dùng m/44'/60'/0'/0 (không có account level) nên có thể ra địa chỉ khác — đây là lý do cần chú ý khi import seed vào ví mới.
Tại sao MetaMask và Trust Wallet dùng cùng seed vẫn ra địa chỉ khác nhau?
+
Do dùng khác derivation path cho một số chain cụ thể. MetaMask dùng m/44'/60'/0'/0/0 cho ETH. Trust Wallet cũng dùng path này cho ETH nhưng có thể dùng path khác cho một số non-EVM chain. Một số ví cũ không hoàn toàn theo BIP-44 cũng gây ra sự khác biệt. Để recover đúng địa chỉ, luôn cần biết cả seed phrase VÀ derivation path ví gốc đã dùng.
Có thể recover ví chỉ từ private key mà không có seed không?
+
Có — nhưng chỉ recover được đúng 1 địa chỉ gắn với private key đó. HD Wallet tạo ra cây phân cấp gồm hàng triệu địa chỉ từ 1 seed. Nếu chỉ có private key của một địa chỉ, bạn không thể derive ra các địa chỉ khác trong cùng ví, và cũng không thể biết seed phrase gốc. Đây là lý do seed phrase quan trọng hơn private key riêng lẻ khi muốn backup toàn bộ ví.
Hardened derivation là gì và khi nào cần dùng?
+
Hardened derivation (dùng dấu ' trong path, ví dụ 44') tạo child key độc lập hoàn toàn với parent public key. Với non-hardened derivation, biết parent public key + child private key có thể suy ra parent private key — rất nguy hiểm. Hardened derivation dùng cho account level (m/44'/60'/0') để đảm bảo compromise một account không ảnh hưởng accounts khác. External/change/address indexes thường dùng non-hardened để có thể derive public keys mà không cần private key (dùng cho watch-only wallets).
Tài Liệu Tham Khảo
- BIP-32: Hierarchical Deterministic Wallets — Pieter Wuille
- BIP-39: Mnemonic code for generating deterministic keys
- BIP-44: Multi-Account Hierarchy for Deterministic Wallets
- SLIP-44: Registered coin types for BIP-44
- Ethereum 201: HD Wallets — wolovim
- Ethers.js v6 — HDNodeWallet documentation
- BIP39 Mnemonic Code Converter — Ian Coleman (tool)
- Learn Me A Bitcoin — HD Wallets technical explanation
- HD Wallets and Derivation Paths Explained — MyEtherWallet