Document serialization of BIP32key
This commit is contained in:
parent
29ebd4edc5
commit
e08533ff7a
1 changed files with 43 additions and 11 deletions
54
src/bip32.js
54
src/bip32.js
|
@ -4,6 +4,7 @@ var util = require('./util'),
|
||||||
ECKey = require('./eckey').ECKey,
|
ECKey = require('./eckey').ECKey,
|
||||||
ECPubKey = require('./eckey').ECPubKey,
|
ECPubKey = require('./eckey').ECPubKey,
|
||||||
base58 = require('./base58'),
|
base58 = require('./base58'),
|
||||||
|
assert = require('assert'),
|
||||||
Crypto = require('./crypto-js/crypto');
|
Crypto = require('./crypto-js/crypto');
|
||||||
|
|
||||||
var BIP32key = function(opts) {
|
var BIP32key = function(opts) {
|
||||||
|
@ -51,17 +52,48 @@ BIP32key.deserialize = function(str) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
BIP32key.prototype.serialize = function() {
|
BIP32key.prototype.serialize = function(enc) {
|
||||||
var bytes = this.vbytes.concat(
|
var bytes = []
|
||||||
[this.depth],
|
|
||||||
this.fingerprint,
|
// 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; testnet: 0x043587CF public, 0x04358394 private)
|
||||||
util.numToBytes(this.i,4).reverse(),
|
bytes = bytes.concat(this.vbytes)
|
||||||
this.chaincode,
|
assert.equal(bytes.length, 4)
|
||||||
this.type == 'priv' ? [0].concat(this.key.export('bytes').slice(0,32))
|
|
||||||
: this.key.export('bytes'))
|
// 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, ....
|
||||||
var checksum = Crypto.SHA256(Crypto.SHA256(bytes,{asBytes: true}), {asBytes: true})
|
bytes = bytes.concat([this.depth])
|
||||||
.slice(0,4)
|
assert.equal(bytes.length, 4 + 1)
|
||||||
return base58.encode(bytes.concat(checksum))
|
|
||||||
|
// 4 bytes: the fingerprint of the parent's key (0x00000000 if master key)
|
||||||
|
bytes = bytes.concat(this.fingerprint)
|
||||||
|
assert.equal(bytes.length, 4 + 1 + 4)
|
||||||
|
|
||||||
|
// 4 bytes: child number. This is the number i in xi = xpar/i,
|
||||||
|
// with xi the key being serialized. This is encoded in MSB order. (0x00000000 if master key)
|
||||||
|
bytes = bytes.concat(util.numToBytes(this.i, 4).reverse())
|
||||||
|
assert.equal(bytes.length, 4 + 1 + 4 + 4)
|
||||||
|
|
||||||
|
// 32 bytes: the chain code
|
||||||
|
bytes = bytes.concat(this.chaincode)
|
||||||
|
assert.equal(bytes.length, 4 + 1 + 4 + 4 + 32)
|
||||||
|
|
||||||
|
// 33 bytes: the public key or private key data
|
||||||
|
// (0x02 + X or 0x03 + X for public keys, 0x00 + k for private keys)
|
||||||
|
if (this.type == 'priv') {
|
||||||
|
bytes.push(0)
|
||||||
|
bytes = bytes.concat(this.key.toBytes().slice(0, 32))
|
||||||
|
} else {
|
||||||
|
bytes = bytes.concat(this.key.toBytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.equal(bytes.length, 78)
|
||||||
|
|
||||||
|
if (enc == 'bytes') return bytes
|
||||||
|
if (enc == 'hex') return conv.bytesToHex(bytes)
|
||||||
|
|
||||||
|
var checksum = Crypto.SHA256(Crypto.SHA256(bytes, {asBytes: true}), { asBytes: true }).slice(0,4)
|
||||||
|
bytes = bytes.concat(checksum)
|
||||||
|
|
||||||
|
return base58.encode(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
BIP32key.prototype.ckd = function(i) {
|
BIP32key.prototype.ckd = function(i) {
|
||||||
|
|
Loading…
Reference in a new issue