BIP-0032 HD Wallet

Posted mutourend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIP-0032 HD Wallet相关的知识,希望对你有一定的参考价值。

1. 引言

HD Wallet:Hierarchical deterministic wallet,可用于:与多个不同的系统部分或完全分享,可为每个系统分别分配具有 可spend 或 不可spend 的能力。
HD Wallet中通常包含的是a single “chain” of keypairs。

1.1 相关定义

Bitcoin中采用secp256k1 curve,其field和curve参数遵循 SEC 2: Recommended Elliptic Curve Domain Parameters 中的推荐值。

变量通常具有如下形式之一:

  • module n n n的整数( n n n为curve的order)
  • 曲线上的point坐标
  • byte sequences

2个coordinate pair 的加法定义为EC group operation。 ∣ ∣ || 表示byte sequence的拼接。

标准转换函数有:

  • p o i n t ( p ) point(p) point(p):返回的为 p ∗ G p*G pG的结果,其中 G G G为曲线的base point, p p p为整数。
  • s e r 32 ( i ) ser_{32}(i) ser32(i):对32位unsigned整数 i i i 序列化为 4-byte sequence,最高有效byte排在最前面。
  • s e r 256 ( p ) ser_{256}(p) ser256(p):将整数 p p p序列化为32-byte sequence,最高有效byte排在最前面。
  • s e r p ( P ) ser_{p}(P) serp(P):将point P = ( x , y ) P=(x,y) P=(x,y)SEC 1: Elliptic Curve Cryptography的压缩格式 序列化为byte sequence: ( 0 x 02  or  0 x 03 ) ∣ ∣ s e r 256 ( x ) (0x02\\ \\text{or}\\ 0x03) || ser_{256}(x) (0x02 or 0x03)ser256(x),即第一个byte为 0 x 02 0x02 0x02还是 0 x 03 0x03 0x03具体取决于 y y y坐标的正负极。
  • p a r s e 256 ( p ) parse_{256}(p) parse256(p):将32-byte sequence解析为256-bit number,最高有效byte排在最前面。

当根据一个parent key 派生出 多个child keys,为了防止单纯依赖于parent key本身,可为public key和private key额外引入256 bit的entropy,额外引入的256 bit称为chain code,与公私钥一样,也为32 byte。

extended private key表示为:

  • ( k , c ) (k,c) (k,c):其中 k k k为正常的私钥, c c c为chain code。

extended public key表示为:

  • ( K , c ) (K,c) (K,c):其中 K = p o i n t ( k ) K=point(k) K=point(k)为正常的公钥, c c c为chain code。

每个extended key有:

  • 2 31 2^{31} 231个normal child keys。其序号为 0 0 0 2 31 − 1 2^{31}-1 2311。通常用 i i i来表示normal child key的序号。
  • 2 31 2^{31} 231个hardened child keys。其序号为 2 31 2^{31} 231 2 32 − 1 2^{32}-1 2321。为了简化,通常用 i H i_H iH数字来表示hardened child key的序号, i H = i + 2 31 i_H=i+2^{31} iH=i+231

2. Child key derivation (CDK)函数

已知:

  • a parent extended key
  • 和 an index i i i i ≥ 2 31 i\\geq 2^{31} i231表示child为hardended key。

可计算出相应的child extended key。

具体的child key派生(CDK)函数有:

  • Private parent key → private child key:根据父私钥,派生子私钥。
  • Public parent key → public child key:根据父公钥,派生子公钥。
  • Private parent key → public child key:根据父私钥,派生子公钥。
  • Public parent key → private child key:无法根据父公钥派生子私钥。

HMAC相关知识可参看:密码学中的MAC(message authentication code)

2.1 Private parent key → private child key

C K D p r i v ( ( k p a r , c p a r ) , i ) → ( k i , c i ) CKD_{priv}((k_{par},c_{par}),i)\\rightarrow (k_i,c_i) CKDpriv((kpar,cpar),i)(ki,ci),可根据parent extend private key计算出child extend private key: