From 663e62639d3e2732b8a0c852da816b5499033aed Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Sat, 28 May 2016 21:31:47 -0700 Subject: [PATCH] ser --- lib/bcoin/hd.js | 32 +++++++++++++---- lib/bcoin/wallet.js | 83 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 6 deletions(-) diff --git a/lib/bcoin/hd.js b/lib/bcoin/hd.js index e7538c51..716c339b 100644 --- a/lib/bcoin/hd.js +++ b/lib/bcoin/hd.js @@ -860,7 +860,10 @@ HDPrivateKey.generate = function generate(options, network) { */ HDPrivateKey.parseBase58 = function parseBase58(xkey) { - var raw = utils.fromBase58(xkey); + return HDPrivateKey.parseRaw(utils.fromBase58(xkey)); +}; + +HDPrivateKey.parseRaw = function parseRaw(raw) { var p = new BufferReader(raw, true); var data = {}; var i, type, prefix; @@ -896,7 +899,11 @@ HDPrivateKey.parseBase58 = function parseBase58(xkey) { */ HDPrivateKey.prototype.toBase58 = function toBase58(network) { - var p = new BufferWriter(); + return utils.toBase58(this.toRaw(network)); +}; + +HDPrivateKey.prototype.toRaw = function toRaw(network, writer) { + var p = new BufferWriter(writer); if (!network) network = this.network; @@ -912,7 +919,10 @@ HDPrivateKey.prototype.toBase58 = function toBase58(network) { p.writeBytes(this.privateKey); p.writeChecksum(); - return utils.toBase58(p.render()); + if (!writer) + p = p.render(); + + return p; }; /** @@ -1309,7 +1319,10 @@ HDPublicKey.isExtended = function isExtended(data) { */ HDPublicKey.parseBase58 = function parseBase58(xkey) { - var raw = utils.fromBase58(xkey); + return HDPublicKey.parseRaw(utils.fromBase58(xkey)); +}; + +HDPublicKey.parseRaw = function parseRaw(raw) { var p = new BufferReader(raw, true); var data = {}; var i, type, prefix; @@ -1344,7 +1357,11 @@ HDPublicKey.parseBase58 = function parseBase58(xkey) { */ HDPublicKey.prototype.toBase58 = function toBase58(network) { - var p = new BufferWriter(); + return utils.toBase58(this.toRaw(network)); +}; + +HDPublicKey.prototype.toRaw = function toRaw(network, writer) { + var p = new BufferWriter(writer); if (!network) network = this.network; @@ -1359,7 +1376,10 @@ HDPublicKey.prototype.toBase58 = function toBase58(network) { p.writeBytes(this.publicKey); p.writeChecksum(); - return utils.toBase58(p.render()); + if (!writer) + p = p.render(); + + return p; }; /** diff --git a/lib/bcoin/wallet.js b/lib/bcoin/wallet.js index 704998ec..873f56db 100644 --- a/lib/bcoin/wallet.js +++ b/lib/bcoin/wallet.js @@ -1572,6 +1572,89 @@ Wallet.prototype.toJSON = function toJSON() { }; }; +Wallet.prototype.toRaw = function toRaw(writer) { + var p = new BufferWriter(writer); + var i; + + p.writeU32(this.network.magic); + p.writeVarString(this.id, 'ascii'); + p.writeU8(this.type === 'pubkeyhash' ? 0 : 1); + p.writeU8(this.m); + p.writeU8(this.n); + p.writeU8(this.witness ? 1 : 0); + p.writeU8(this.derivation === 'bip44' ? 44 : 45); + p.writeU8(this.copayBIP45 ? 1 : 0); + p.writeU32(this.accountIndex); + p.writeU32(this.receiveDepth); + p.writeU32(this.changeDepth); + p.writeVarBytes(this.master.toRaw()); + p.writeBytes(this.accountKey.toRaw()); // 82 bytes + p.writeVarint(this.keys.length); + + for (i = 0; i < this.keys.length; i++) + p.writeBytes(this.keys[i].toRaw()); + + if (!writer) + p = p.render(); + + return p; +}; + +Wallet.fromRaw = function fromRaw(data) { + return new Wallet(Wallet.parseRaw(data)); +}; + +Wallet.parseRaw = function parseRaw(data) { + var networks = bcoin.protocol.network; + var p = new BufferReader(data); + var magic = p.readU32(); + var id = this.readVarString('ascii'); + var type = p.readU8() === 0 ? 'pubkeyhash' : 'multisig'; + var m = p.readU8(); + var n = p.readU8(); + var witness = p.readU8() === 1; + var derivation = p.readU8() === 44 ? 'bip44' : 'bip45'; + var copayBIP45 = p.readU8() === 1; + var accountIndex = p.readU32(); + var receiveDepth = p.readU32(); + var changeDepth = p.readU32(); + var master = MasterKey.fromRaw(p.readVarBytes()); + var accountKey = bcoin.hd.PublicKey.fromRaw(p.readBytes(82)); + var count = p.readVarint(); + var keys = []; + var i, type, network; + + for (i = 0; i < count; i++) + keys.push(bcoin.hd.PublicKey.fromRaw(p.readBytes(82))); + + for (i = 0; i < networks.types.length; i++) { + type = networks.types[i]; + if (magic === networks[type].magic) { + network = type; + break; + } + } + + assert(network, 'Network not found.'); + + return { + network: network, + id: id, + type: type, + m: m, + n: n, + witness: witness, + derivation: derivation, + copayBIP45: copayBIP45, + accountIndex: accountIndex, + receiveDepth: receiveDepth, + changeDepth: changeDepth, + master: master, + accountKey: accountKey, + keys: keys + }; +}; + /** * Handle a deserialized JSON wallet object. * @returns {Object} A "naked" wallet (a