錢包的 根私鑰 vs 子私鑰

Date
Sep 25, 2024
Property
Medium
Created by
Status
In progress
Tags
crypto
wallet
在區塊鏈錢包的生成中,根私鑰(Root Private Key)派生私鑰(Derived Private Key) 是基於分層確定性錢包(Hierarchical Deterministic Wallet, HD Wallet)標準(如 BIP-32)的兩個重要概念。

根私鑰(Root Private Key)

概念

  • 根私鑰是 HD 錢包的起點,是基於種子(Seed)生成的。
  • 它是一個固定長度的私鑰,可以通過分層派生生成多個子私鑰。

作用

  • 根私鑰作為整個錢包的核心,派生出所有的子私鑰和地址。
  • 一個根私鑰對應整個錢包,所有子私鑰都可以通過根私鑰重新生成。

子私鑰(派生私鑰,Derived Private Key)

概念

  • 子私鑰是通過根私鑰和特定路徑(如 BIP-44)派生出的私鑰。
  • 子私鑰可以對應一個地址,每個地址有自己唯一的子私鑰。

作用

  • 子私鑰用於控制單個地址資產的所有權。
  • HD 錢包中的每個地址都由唯一的子私鑰生成。

根私鑰和派生私鑰的關係

  1. 根私鑰 → 派生私鑰
      • 根私鑰是生成派生私鑰的起點。
      • 通過不同的路徑(如 m/44'/195'/0'/0/0),可以派生出多個子私鑰。
  1. 不可逆性
      • 根私鑰可以派生子私鑰,但子私鑰無法反推出根私鑰。
  1. 路徑的影響
      • 不同的派生路徑對應不同的子私鑰,即使使用相同的根私鑰,改變路徑也會生成不同的子私鑰。

BIP-32 分層結構

BIP-32 定義了分層確定性錢包的結構,使用路徑來派生私鑰。

路徑結構

典型的路徑格式為:m / purpose' / coin_type' / account' / change / address_index
路徑部分
含義
示例
m
根密鑰(根私鑰)
m
purpose'
用途(如 BIP-44 標準)
44'
coin_type'
幣種代碼
195'(TRON)
account'
賬戶號
0'
change
是否為找零地址
0(非找零地址)
address_index
地址索引
0(第一個地址)

實際示例

import * as bip39 from 'bip39'; import { BIP32Factory } from 'bip32'; import * as tinysecp from 'tiny-secp256k1'; import { Buffer } from 'buffer'; // 初始化 BIP32 工廠 const bip32 = BIP32Factory(tinysecp); // 定義 BIP-44 路徑 const BIP44_PATH = "m/44'/195'/0'/0"; // 助記詞生成私鑰和地址 (async () => { // 1. 生成助記詞 const mnemonic = bip39.generateMnemonic(); console.log('助記詞:', mnemonic); // 2. 助記詞轉種子 const seed = await bip39.mnemonicToSeed(mnemonic); console.log('種子 (Hex):', seed.toString('hex')); // 3. 種子生成根私鑰 const root = bip32.fromSeed(seed); console.log('根私鑰 (Hex):', root.privateKey!.toString('hex')); // 4. 派生第一個子私鑰(地址索引 0) const child0 = root.derivePath(`${BIP44_PATH}/0`); console.log('子私鑰 (索引 0):', child0.privateKey!.toString('hex')); // 5. 派生第二個子私鑰(地址索引 1) const child1 = root.derivePath(`${BIP44_PATH}/1`); console.log('子私鑰 (索引 1):', child1.privateKey!.toString('hex')); })();
 
執行後的輸出可能是:
助記詞: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about 種子 (Hex): 5eb00bbddcf069084889a8ab9155568165f5c89f59db4c9a2d9aaae24f087f94a1e897b8c82e9dfed715a2e13f8f8f071d6b4fd07c46c11a6b227d1ddfac8f21 根私鑰 (Hex): 0c28fca386c7a2279b89cdb245631b75ecb241ce39169778d3efcdc3c9f05db3 子私鑰 (索引 0): 6d8b7dff9e75c5d10a756846b2fa5aa3e85a38c9c20b8e6c7e0c96b19c4ba1d6 子私鑰 (索引 1): 3e3c547c87b6c5098cc8cc89a3f09b847bcc7f120d3adfd1b7055b1c4d2ddf80
 

根私鑰與派生私鑰的關鍵

  • 根私鑰唯一性
    • 根私鑰是基於種子生成的,同一種子永遠對應同一根私鑰。
  • 路徑決定子私鑰
    • 不同的派生路徑會生成不同的子私鑰。
  • 安全性
    • 根私鑰是整個錢包的核心,應妥善保管。
    • 子私鑰控制單個地址的資產,如果某個子私鑰丟失,只會影響對應的地址。
  • 不可逆性
    • 無法通過子私鑰推導出根私鑰,這是基於單向加密的安全設計
 

根私鑰與子私鑰的應用場景

  • 根私鑰:恢復整個錢包(包括所有地址和私鑰)。
  • 子私鑰:控制單個地址的資產,適合分帳或多地址管理。