大概看了一下,产生了一个疑问: 公钥是由私钥经过ECDSA算法生成的, 在HD钱包中, 可以由父公钥生成子公钥, 父私钥生成子私钥, 那么子公钥和子私钥能是一对吗, 即ECDSA(子私钥)是否等于子公钥, 看了一下比特币官方开发者文档 ,里面有一个公式,说的应该就是这个问题:
point( (parent_private_key + i) % p ) == parent_public_key + point(i)
下面是具体的hd钱包生成算法,自己也是一边看一边理解,所以还没翻译完, 希望后续自己能坚持补充完吧。
1. 使用随机数生成器生成一个字节序列作为种子S, 长度为128bits至512bits, 建议256bits.
// GenSeed returns a random seed with a length measured in bytes.
// The length must be at least 128.
func GenSeed(length int) ([]byte, error) {
b := make([]byte, length)
if length < 128 {
return b, errors.New("length must be at least 128 bits")
}
_, err := rand.Read(b)
return b, err
}
2. 计算 I = HMAC-SHA512(key="Bitcoin seed", Data=S), 结果为64bytes的字节序列, 使用左边32bytes即I(L)作为主密钥, 右边32bytes即I(R)作为链码.
key := []byte("Bitcoin seed")
mac := hmac.New(sha512.New, key)
mac.Write(seed)
I := mac.Sum(nil)
secret := I[:len(I)/2]
chain_code := I[len(I)/2:]
网友评论