hdkeychain: extend API with ChainCode(), ChildNum()
No way to access them otherwise. Handy for interoperability.
This commit is contained in:
parent
c53e27f6f1
commit
5fadf96a72
2 changed files with 35 additions and 0 deletions
|
@ -191,6 +191,21 @@ func (k *ExtendedKey) ParentFingerprint() uint32 {
|
||||||
return binary.BigEndian.Uint32(k.parentFP)
|
return binary.BigEndian.Uint32(k.parentFP)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainCode returns the chain code part of this extended key.
|
||||||
|
//
|
||||||
|
// It is identical for both public and private extended keys.
|
||||||
|
func (k *ExtendedKey) ChainCode() []byte {
|
||||||
|
return append([]byte{}, k.chainCode...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChildNum returns the index at which the child extended key was derived.
|
||||||
|
//
|
||||||
|
// Extended keys with ChildNum value between 0 and 2^31-1 are normal child
|
||||||
|
// keys, and those with a value between 2^31 and 2^32-1 are hardened keys.
|
||||||
|
func (k *ExtendedKey) ChildNum() uint32 {
|
||||||
|
return k.childNum
|
||||||
|
}
|
||||||
|
|
||||||
// Child returns a derived child extended key at the given index. When this
|
// Child returns a derived child extended key at the given index. When this
|
||||||
// extended key is a private extended key (as determined by the IsPrivate
|
// extended key is a private extended key (as determined by the IsPrivate
|
||||||
// function), a private extended key will be derived. Otherwise, the derived
|
// function), a private extended key will be derived. Otherwise, the derived
|
||||||
|
|
|
@ -562,6 +562,8 @@ func TestExtendedKeyAPI(t *testing.T) {
|
||||||
extKey string
|
extKey string
|
||||||
isPrivate bool
|
isPrivate bool
|
||||||
parentFP uint32
|
parentFP uint32
|
||||||
|
chainCode []byte
|
||||||
|
childNum uint32
|
||||||
privKey string
|
privKey string
|
||||||
privKeyErr error
|
privKeyErr error
|
||||||
pubKey string
|
pubKey string
|
||||||
|
@ -572,6 +574,8 @@ func TestExtendedKeyAPI(t *testing.T) {
|
||||||
extKey: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
|
extKey: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
|
||||||
isPrivate: true,
|
isPrivate: true,
|
||||||
parentFP: 0,
|
parentFP: 0,
|
||||||
|
chainCode: []byte{135, 61, 255, 129, 192, 47, 82, 86, 35, 253, 31, 229, 22, 126, 172, 58, 85, 160, 73, 222, 61, 49, 75, 180, 46, 226, 39, 255, 237, 55, 213, 8},
|
||||||
|
childNum: 0,
|
||||||
privKey: "e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35",
|
privKey: "e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35",
|
||||||
pubKey: "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2",
|
pubKey: "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2",
|
||||||
address: "15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma",
|
address: "15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma",
|
||||||
|
@ -581,6 +585,8 @@ func TestExtendedKeyAPI(t *testing.T) {
|
||||||
extKey: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
|
extKey: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
|
||||||
isPrivate: false,
|
isPrivate: false,
|
||||||
parentFP: 3203769081,
|
parentFP: 3203769081,
|
||||||
|
chainCode: []byte{4, 70, 107, 156, 200, 225, 97, 233, 102, 64, 156, 165, 41, 134, 197, 132, 240, 126, 157, 200, 31, 115, 93, 182, 131, 195, 255, 110, 199, 177, 80, 63},
|
||||||
|
childNum: 2147483650,
|
||||||
privKeyErr: ErrNotPrivExtKey,
|
privKeyErr: ErrNotPrivExtKey,
|
||||||
pubKey: "0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2",
|
pubKey: "0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2",
|
||||||
address: "1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x",
|
address: "1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x",
|
||||||
|
@ -610,6 +616,20 @@ func TestExtendedKeyAPI(t *testing.T) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chainCode := key.ChainCode()
|
||||||
|
if !bytes.Equal(chainCode, test.chainCode) {
|
||||||
|
t.Errorf("ChainCode #%d (%s): want %v, got %v", i,
|
||||||
|
test.name, chainCode, test.chainCode)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
childNum := key.ChildNum()
|
||||||
|
if childNum != test.childNum {
|
||||||
|
t.Errorf("ChildNum #%d (%s): want %d, got %d", i,
|
||||||
|
test.name, childNum, test.childNum)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
serializedKey := key.String()
|
serializedKey := key.String()
|
||||||
if serializedKey != test.extKey {
|
if serializedKey != test.extKey {
|
||||||
t.Errorf("String #%d (%s): mismatched serialized key "+
|
t.Errorf("String #%d (%s): mismatched serialized key "+
|
||||||
|
|
Loading…
Add table
Reference in a new issue