金鑰、錢包與帳戶抽象化

BIP-32

BIP-32 是定義「階層式確定性錢包究竟如何算出整棵金鑰樹」的比特幣改進提案。它正是「一顆種子救回一切」這個親民概念背後的精確配方。雖然源於比特幣,同一套演算法在以太坊與其他大多數 secp256k1 鏈上原封不動地沿用,這正是為何單一助記詞能驅動多種幣別。

其運作如下。錢包以固定的金鑰字串「Bitcoin seed」對種子計算 HMAC-SHA512;輸出的 64 位元組切成兩半,左半成為主私鑰,右半稱為鏈碼(chain code)——一段額外的熵,用以阻止某把子金鑰洩漏出它的兄弟金鑰。要衍生第 i 號子金鑰,錢包再次執行 HMAC-SHA512,這次以父鏈碼為金鑰,對「父金鑰素材串接 i」進行計算。該輸出的左半(對曲線階 n 取模後)加上父私鑰,得到子私鑰;右半則成為子金鑰自己的鏈碼。如此遞迴便長出整棵樹。

一個核心的設計抉擇是索引在 2^31 處的門檻。低於它的索引屬「非強化」,會把父公鑰餵入 HMAC,這帶來一個強大的副作用:公鑰加鏈碼(即擴展公鑰)能在毫無私鑰在場的情況下衍生出所有非強化子公鑰。2^31 及以上的索引屬「強化」,改餵父私鑰,切斷那條公鑰衍生鏈。這個取捨真實且攸關安全:非強化分支讓唯讀地址生成成為可能,但若任何一把非強化子私鑰連同父擴展公鑰一併外洩,父私鑰便能被反推出來——因此帳戶層級的邊界一律採用強化衍生。

// hardened child (i >= 2^31): parent PRIVATE key feeds the HMAC
I = HMAC-SHA512(key = c_par, data = 0x00 || ser256(k_par) || ser32(i))
// normal child (i < 2^31): parent PUBLIC key feeds the HMAC
I = HMAC-SHA512(key = c_par, data = serP(point(k_par)) || ser32(i))
IL = I[0..32]; IR = I[32..64]
k_i = (parse256(IL) + k_par) mod n   // child private key
c_i = IR                              // child chain code

BIP-32 子金鑰衍生:強化與非強化的唯一差別,在於被雜湊的是私鑰還是公鑰。

BIP-32 對「該用哪些路徑」隻字未提——那是 BIP-44 的職責。BIP-32 只規範把父金鑰加索引變成子金鑰的數學運算。

又称
hierarchical deterministic keys階層式確定性金鑰