diff --git a/lib/net/packets.js b/lib/net/packets.js index d88a8bcd..2f3c5028 100644 --- a/lib/net/packets.js +++ b/lib/net/packets.js @@ -83,6 +83,51 @@ function Packet() {} Packet.prototype.type = -1; Packet.prototype.cmd = ''; +/** + * Get serialization size. + * @returns {Number} + */ + +Packet.prototype.getSize = function getSize() { + return 0; +}; + +/** + * Serialize packet to writer. + * @param {BufferWriter} bw + */ + +Packet.prototype.toWriter = function toWriter(bw) { + return bw; +}; + +/** + * Serialize packet. + * @returns {Buffer} + */ + +Packet.prototype.toRaw = function toRaw() { + return DUMMY; +}; + +/** + * Inject properties from buffer reader. + * @param {BufferReader} br + */ + +Packet.prototype.fromReader = function fromReader(br) { + return this; +}; + +/** + * Inject properties from serialized data. + * @param {Buffer} data + */ + +Packet.prototype.fromRaw = function fromRaw(data) { + return this; +}; + /** * Version Packet * @constructor @@ -199,14 +244,11 @@ VersionPacket.prototype.getSize = function getSize() { }; /** - * Serialize version packet. - * @returns {Buffer} + * Write version packet to buffer writer. + * @param {BufferWriter} bw */ -VersionPacket.prototype.toRaw = function toRaw() { - var size = this.getSize(); - var bw = new StaticWriter(size); - +VersionPacket.prototype.toWriter = function toWriter(bw) { bw.write32(this.version); bw.writeU64(this.services); bw.write64(this.ts); @@ -216,8 +258,17 @@ VersionPacket.prototype.toRaw = function toRaw() { bw.writeVarString(this.agent, 'ascii'); bw.write32(this.height); bw.writeU8(this.relay ? 1 : 0); + return bw; +}; - return bw.render(); +/** + * Serialize version packet. + * @returns {Buffer} + */ + +VersionPacket.prototype.toRaw = function toRaw() { + var size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); }; /** @@ -276,14 +327,12 @@ VersionPacket.prototype.hasCompact = function hasCompact() { }; /** - * Inject properties from serialized data. + * Inject properties from buffer reader. * @private - * @param {Buffer} data + * @param {BufferReader} br */ -VersionPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - +VersionPacket.prototype.fromReader = function fromReader(br) { this.version = br.read32(); this.services = br.readU53(); this.ts = br.read53(); @@ -308,11 +357,34 @@ VersionPacket.prototype.fromRaw = function fromRaw(data) { assert(this.version >= 0, 'Version is negative.'); assert(this.ts >= 0, 'Timestamp is negative.'); - // assert(this.height >= 0, 'Height is negative.'); + + // No idea why so many peers do this. + if (this.height < 0) + this.height = 0; return this; }; +/** + * Instantiate version packet from buffer reader. + * @param {BufferReader} br + * @returns {VersionPacket} + */ + +VersionPacket.fromReader = function fromReader(br) { + return new VersionPacket().fromReader(br); +}; + +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +VersionPacket.prototype.fromRaw = function fromRaw(data) { + return this.fromReader(new BufferReader(data)); +}; + /** * Instantiate version packet from serialized data. * @param {Buffer} data @@ -339,35 +411,19 @@ function VerackPacket() { Packet.call(this); } +util.inherits(VerackPacket, Packet); + VerackPacket.prototype.cmd = 'verack'; VerackPacket.prototype.type = exports.types.VERACK; /** - * Get serialization size. - * @returns {Number} + * Instantiate verack packet from serialized data. + * @param {BufferReader} br + * @returns {VerackPacket} */ -VerackPacket.prototype.getSize = function getSize() { - return 0; -}; - -/** - * Serialize verack packet. - * @returns {Buffer} - */ - -VerackPacket.prototype.toRaw = function toRaw() { - return DUMMY; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -VerackPacket.prototype.fromRaw = function fromRaw(data) { - return this; +VerackPacket.fromReader = function fromReader(br) { + return new VerackPacket().fromReader(br); }; /** @@ -421,12 +477,30 @@ PingPacket.prototype.getSize = function getSize() { PingPacket.prototype.toRaw = function toRaw() { var size = this.getSize(); - var bw = new StaticWriter(size); + return this.toWriter(new StaticWriter(size)).render(); +}; +/** + * Serialize ping packet to writer. + * @param {BufferWriter} bw + */ + +PingPacket.prototype.toWriter = function toWriter(bw) { if (this.nonce) bw.writeBytes(this.nonce); + return bw; +}; - return bw.render(); +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +PingPacket.prototype.fromReader = function fromReader(br) { + if (br.left() >= 8) + this.nonce = br.readBytes(8); + return this; }; /** @@ -436,10 +510,17 @@ PingPacket.prototype.toRaw = function toRaw() { */ PingPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - if (br.left() >= 8) - this.nonce = br.readBytes(8); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate ping packet from serialized data. + * @param {BufferReader} br + * @returns {PingPacket} + */ + +PingPacket.fromReader = function fromReader(br) { + return new PingPacket().fromRaw(br); }; /** @@ -486,15 +567,34 @@ PongPacket.prototype.getSize = function getSize() { return 8; }; +/** + * Serialize pong packet to writer. + * @param {BufferWriter} bw + */ + +PongPacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.nonce); + return bw; +}; + /** * Serialize pong packet. * @returns {Buffer} */ PongPacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(8); - bw.writeBytes(this.nonce); - return bw.render(); + return this.toWriter(new StaticWriter(8)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +PongPacket.prototype.fromReader = function fromReader(br) { + this.nonce = br.readBytes(8); + return this; }; /** @@ -504,9 +604,17 @@ PongPacket.prototype.toRaw = function toRaw() { */ PongPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.nonce = br.readBytes(8); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate pong packet from buffer reader. + * @param {BufferReader} br + * @returns {VerackPacket} + */ + +PongPacket.fromReader = function fromReader(br) { + return new PongPacket().fromReader(br); }; /** @@ -568,7 +676,7 @@ function AlertPacket(options) { this.reserved = ''; this.signature = null; - this._payload = null; + this.payload = null; this._hash = null; if (options) @@ -659,10 +767,10 @@ AlertPacket.prototype.hash = function hash(enc) { */ AlertPacket.prototype.toPayload = function toPayload() { - if (!this._payload) - this._payload = this.framePayload(); + if (!this.payload) + this.payload = this.framePayload(); - return this._payload; + return this.payload; }; /** @@ -790,10 +898,10 @@ AlertPacket.prototype.framePayload = function framePayload() { AlertPacket.prototype.fromReader = function fromReader(br) { var i, count; - this._payload = br.readVarBytes(); + this.payload = br.readVarBytes(); this.signature = br.readVarBytes(); - br = new BufferReader(this._payload); + br = new BufferReader(this.payload); this.version = br.read32(); this.relayUntil = br.read53(); @@ -872,31 +980,13 @@ GetAddrPacket.prototype.cmd = 'getaddr'; GetAddrPacket.prototype.type = exports.types.GETADDR; /** - * Get serialization size. - * @returns {Number} + * Instantiate getaddr packet from buffer reader. + * @param {BufferReader} br + * @returns {GetAddrPacket} */ -GetAddrPacket.prototype.getSize = function getSize() { - return 0; -}; - -/** - * Serialize getaddr packet. - * @returns {Buffer} - */ - -GetAddrPacket.prototype.toRaw = function toRaw() { - return DUMMY; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -GetAddrPacket.prototype.fromRaw = function fromRaw(data) { - return this; +GetAddrPacket.fromReader = function fromReader(br) { + return new GetAddrPacket().fromReader(br); }; /** @@ -946,6 +1036,24 @@ AddrPacket.prototype.getSize = function getSize() { return size; }; +/** + * Serialize addr packet to writer. + * @param {BufferWriter} bw + */ + +AddrPacket.prototype.toWriter = function toWriter(bw) { + var i, item; + + bw.writeVarint(this.items.length); + + for (i = 0; i < this.items.length; i++) { + item = this.items[i]; + item.toWriter(bw, true); + } + + return bw; +}; + /** * Serialize addr packet. * @returns {Buffer} @@ -953,15 +1061,7 @@ AddrPacket.prototype.getSize = function getSize() { AddrPacket.prototype.toRaw = function toRaw() { var size = this.getSize(); - var bw = new StaticWriter(size); - var i; - - bw.writeVarint(this.items.length); - - for (i = 0; i < this.items.length; i++) - this.items[i].toWriter(bw, true); - - return bw.render(); + return this.toWriter(new StaticWriter(size)).render(); }; /** @@ -982,6 +1082,16 @@ AddrPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate addr packet from Buffer reader. + * @param {BufferReader} br + * @returns {AddrPacket} + */ + +AddrPacket.fromReader = function fromReader(br) { + return new AddrPacket().fromReader(br); +}; + /** * Instantiate addr packet from serialized data. * @param {Buffer} data @@ -1029,6 +1139,24 @@ InvPacket.prototype.getSize = function getSize() { return size; }; +/** + * Serialize inv packet to writer. + * @param {Buffer} bw + */ + +InvPacket.prototype.toWriter = function toWriter(bw) { + var i, item; + + bw.writeVarint(this.items.length); + + for (i = 0; i < this.items.length; i++) { + item = this.items[i]; + item.toWriter(bw); + } + + return bw; +}; + /** * Serialize inv packet. * @returns {Buffer} @@ -1036,15 +1164,24 @@ InvPacket.prototype.getSize = function getSize() { InvPacket.prototype.toRaw = function toRaw() { var size = this.getSize(); - var bw = new StaticWriter(size); - var i; + return this.toWriter(new StaticWriter(size)).render(); +}; - bw.writeVarint(this.items.length); +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ - for (i = 0; i < this.items.length; i++) - this.items[i].toWriter(bw); +InvPacket.prototype.fromReader = function fromReader(br) { + var i, count; - return bw.render(); + count = br.readVarint(); + + for (i = 0; i < count; i++) + this.items.push(InvItem.fromReader(br)); + + return this; }; /** @@ -1054,15 +1191,17 @@ InvPacket.prototype.toRaw = function toRaw() { */ InvPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - var i, count; + return this.fromReader(new BufferReader(data)); +}; - count = br.readVarint(); +/** + * Instantiate inv packet from buffer reader. + * @param {BufferReader} br + * @returns {InvPacket} + */ - for (i = 0; i < count; i++) - this.items.push(InvItem.fromReader(br)); - - return this; +InvPacket.fromReader = function fromReader(br) { + return new InvPacket().fromRaw(br); }; /** @@ -1098,6 +1237,16 @@ util.inherits(GetDataPacket, InvPacket); GetDataPacket.prototype.cmd = 'getdata'; GetDataPacket.prototype.type = exports.types.GETDATA; +/** + * Instantiate getdata packet from buffer reader. + * @param {BufferReader} br + * @returns {GetDataPacket} + */ + +GetDataPacket.fromReader = function fromReader(br) { + return new GetDataPacket().fromReader(br); +}; + /** * Instantiate getdata packet from serialized data. * @param {Buffer} data @@ -1131,6 +1280,16 @@ util.inherits(NotFoundPacket, InvPacket); NotFoundPacket.prototype.cmd = 'notfound'; NotFoundPacket.prototype.type = exports.types.NOTFOUND; +/** + * Instantiate notfound packet from buffer reader. + * @param {BufferReader} br + * @returns {NotFoundPacket} + */ + +NotFoundPacket.fromReader = function fromReader(br) { + return new NotFoundPacket().fromReader(br); +}; + /** * Instantiate notfound packet from serialized data. * @param {Buffer} data @@ -1185,13 +1344,11 @@ GetBlocksPacket.prototype.getSize = function getSize() { }; /** - * Serialize getblocks packet. - * @returns {Buffer} + * Serialize getblocks packet to writer. + * @param {BufferWriter} bw */ -GetBlocksPacket.prototype.toRaw = function toRaw() { - var size = this.getSize(); - var bw = new StaticWriter(size); +GetBlocksPacket.prototype.toWriter = function toWriter(bw) { var i; bw.writeU32(this.version); @@ -1202,17 +1359,26 @@ GetBlocksPacket.prototype.toRaw = function toRaw() { bw.writeHash(this.stop || constants.ZERO_HASH); - return bw.render(); + return bw; }; /** - * Inject properties from serialized data. - * @private - * @param {Buffer} data + * Serialize getblocks packet. + * @returns {Buffer} */ -GetBlocksPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); +GetBlocksPacket.prototype.toRaw = function toRaw() { + var size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +GetBlocksPacket.prototype.fromReader = function fromReader(br) { var i, count; this.version = br.readU32(); @@ -1230,6 +1396,16 @@ GetBlocksPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +GetBlocksPacket.prototype.fromRaw = function fromRaw(data) { + return this.fromReader(new BufferReader(data)); +}; + /** * Instantiate getblocks packet from serialized data. * @param {Buffer} data @@ -1264,6 +1440,16 @@ util.inherits(GetHeadersPacket, GetBlocksPacket); GetHeadersPacket.prototype.cmd = 'getheaders'; GetHeadersPacket.prototype.type = exports.types.GETHEADERS; +/** + * Instantiate getheaders packet from buffer reader. + * @param {BufferReader} br + * @returns {GetHeadersPacket} + */ + +GetHeadersPacket.fromReader = function fromReader(br) { + return new GetHeadersPacket().fromReader(br); +}; + /** * Instantiate getheaders packet from serialized data. * @param {Buffer} data @@ -1318,6 +1504,24 @@ HeadersPacket.prototype.getSize = function getSize() { return size; }; +/** + * Serialize headers packet to writer. + * @param {BufferWriter} bw + */ + +HeadersPacket.prototype.toWriter = function toWriter(bw) { + var i, item; + + bw.writeVarint(this.items.length); + + for (i = 0; i < this.items.length; i++) { + item = this.items[i]; + item.toWriter(bw); + } + + return bw; +}; + /** * Serialize headers packet. * @returns {Buffer} @@ -1325,15 +1529,23 @@ HeadersPacket.prototype.getSize = function getSize() { HeadersPacket.prototype.toRaw = function toRaw() { var size = this.getSize(); - var bw = new StaticWriter(size); + return this.toWriter(new StaticWriter(size)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +HeadersPacket.prototype.fromReader = function fromReader(br) { + var count = br.readVarint(); var i; - bw.writeVarint(this.items.length); + for (i = 0; i < count; i++) + this.items.push(Headers.fromReader(br)); - for (i = 0; i < this.items.length; i++) - this.items[i].toWriter(bw); - - return bw.render(); + return this; }; /** @@ -1343,15 +1555,7 @@ HeadersPacket.prototype.toRaw = function toRaw() { */ HeadersPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - var i, count; - - count = br.readVarint(); - - for (i = 0; i < count; i++) - this.items.push(Headers.fromReader(br)); - - return this; + return this.fromReader(new BufferReader(data)); }; /** @@ -1386,31 +1590,13 @@ SendHeadersPacket.prototype.cmd = 'sendheaders'; SendHeadersPacket.prototype.type = exports.types.SENDHEADERS; /** - * Get serialization size. - * @returns {Number} + * Instantiate sendheaders packet from buffer reader. + * @param {BufferReader} br + * @returns {SendHeadersPacket} */ -SendHeadersPacket.prototype.getSize = function getSize() { - return 0; -}; - -/** - * Serialize sendheaders packet. - * @returns {Buffer} - */ - -SendHeadersPacket.prototype.toRaw = function toRaw() { - return DUMMY; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -SendHeadersPacket.prototype.fromRaw = function fromRaw(data) { - return this; +SendHeadersPacket.fromReader = function fromReader(br) { + return new SendHeadersPacket().fromReader(br); }; /** @@ -1462,6 +1648,17 @@ BlockPacket.prototype.getSize = function getSize() { return this.block.getBaseSize(); }; +/** + * Serialize block packet to writer. + * @param {BufferWriter} bw + */ + +BlockPacket.prototype.toWriter = function toWriter(bw) { + if (this.witness) + return this.block.toWriter(bw); + return this.block.toNormalWriter(bw); +}; + /** * Serialize block packet. * @returns {Buffer} @@ -1473,6 +1670,17 @@ BlockPacket.prototype.toRaw = function toRaw() { return this.block.toNormal(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +BlockPacket.prototype.fromReader = function fromReader(br) { + this.block.fromReader(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -1484,6 +1692,16 @@ BlockPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate block packet from buffer reader. + * @param {BufferReader} br + * @returns {BlockPacket} + */ + +BlockPacket.fromReader = function fromReader(br) { + return new BlockPacket().fromReader(br); +}; + /** * Instantiate block packet from serialized data. * @param {Buffer} data @@ -1533,6 +1751,17 @@ TXPacket.prototype.getSize = function getSize() { return this.tx.getBaseSize(); }; +/** + * Serialize tx packet to writer. + * @param {BufferWriter} bw + */ + +TXPacket.prototype.toWriter = function toWriter(bw) { + if (this.witness) + return this.tx.toWriter(bw); + return this.tx.toNormalWriter(bw); +}; + /** * Serialize tx packet. * @returns {Buffer} @@ -1544,6 +1773,17 @@ TXPacket.prototype.toRaw = function toRaw() { return this.tx.toNormal(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +TXPacket.prototype.fromReader = function fromReader(br) { + this.tx.fromRaw(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -1555,6 +1795,16 @@ TXPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate tx packet from buffer reader. + * @param {BufferReader} br + * @returns {TXPacket} + */ + +TXPacket.fromReader = function fromReader(br) { + return new TXPacket().fromReader(br); +}; + /** * Instantiate tx packet from serialized data. * @param {Buffer} data @@ -1659,14 +1909,11 @@ RejectPacket.prototype.getSize = function getSize() { }; /** - * Serialize reject packet. - * @returns {Buffer} + * Serialize reject packet to writer. + * @param {BufferWriter} bw */ -RejectPacket.prototype.toRaw = function toRaw() { - var size = this.getSize(); - var bw = new StaticWriter(size); - +RejectPacket.prototype.toWriter = function toWriter(bw) { assert(this.message.length <= 12); assert(this.reason.length <= 111); @@ -1677,18 +1924,26 @@ RejectPacket.prototype.toRaw = function toRaw() { if (this.data) bw.writeHash(this.data); - return bw.render(); + return bw; }; /** - * Inject properties from serialized data. - * @private - * @param {Buffer} data + * Serialize reject packet. + * @returns {Buffer} */ -RejectPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); +RejectPacket.prototype.toRaw = function toRaw() { + var size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); +}; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +RejectPacket.prototype.fromReader = function fromReader(br) { this.message = br.readVarString('ascii', 12); this.code = br.readU8(); this.reason = br.readVarString('ascii', 111); @@ -1701,6 +1956,26 @@ RejectPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +RejectPacket.prototype.fromRaw = function fromRaw(data) { + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate reject packet from buffer reader. + * @param {BufferReader} br + * @returns {RejectPacket} + */ + +RejectPacket.fromReader = function fromReader(br) { + return new RejectPacket().fromReader(br); +}; + /** * Instantiate reject packet from serialized data. * @param {Buffer} data @@ -1800,31 +2075,13 @@ MempoolPacket.prototype.cmd = 'mempool'; MempoolPacket.prototype.type = exports.types.MEMPOOL; /** - * Get serialization size. - * @returns {Number} + * Instantiate mempool packet from buffer reader. + * @param {BufferReader} br + * @returns {VerackPacket} */ -MempoolPacket.prototype.getSize = function getSize() { - return 0; -}; - -/** - * Serialize mempool packet. - * @returns {Buffer} - */ - -MempoolPacket.prototype.toRaw = function toRaw() { - return DUMMY; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -MempoolPacket.prototype.fromRaw = function fromRaw(data) { - return this; +MempoolPacket.fromReader = function fromReader(br) { + return new MempoolPacket().fromReader(br); }; /** @@ -1870,6 +2127,15 @@ FilterLoadPacket.prototype.getSize = function getSize() { return this.filter.getSize(); }; +/** + * Serialize filterload packet to writer. + * @param {BufferWriter} bw + */ + +FilterLoadPacket.prototype.toWriter = function toWriter(bw) { + return this.filter.toWriter(bw); +}; + /** * Serialize filterload packet. * @returns {Buffer} @@ -1879,6 +2145,17 @@ FilterLoadPacket.prototype.toRaw = function toRaw() { return this.filter.toRaw(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +FilterLoadPacket.prototype.fromReader = function fromReader(br) { + this.filter.fromReader(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -1890,6 +2167,16 @@ FilterLoadPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate filterload packet from buffer reader. + * @param {BufferReader} br + * @returns {FilterLoadPacket} + */ + +FilterLoadPacket.fromReader = function fromReader(br) { + return new FilterLoadPacket().fromReader(br); +}; + /** * Instantiate filterload packet from serialized data. * @param {Buffer} data @@ -1949,6 +2236,16 @@ FilterAddPacket.prototype.getSize = function getSize() { return encoding.sizeVarBytes(this.data); }; +/** + * Serialize filteradd packet to writer. + * @returns {BufferWriter} bw + */ + +FilterAddPacket.prototype.toWriter = function toWriter(bw) { + bw.writeVarBytes(this.data); + return bw; +}; + /** * Serialize filteradd packet. * @returns {Buffer} @@ -1956,9 +2253,18 @@ FilterAddPacket.prototype.getSize = function getSize() { FilterAddPacket.prototype.toRaw = function toRaw() { var size = this.getSize(); - var bw = new StaticWriter(size); - bw.writeVarBytes(this.data); - return bw.render(); + return this.toWriter(new StaticWriter(size)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +FilterAddPacket.prototype.fromReader = function fromReader(br) { + this.data = br.readVarBytes(); + return this; }; /** @@ -1968,9 +2274,7 @@ FilterAddPacket.prototype.toRaw = function toRaw() { */ FilterAddPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.data = br.readVarBytes(); - return this; + return this.fromReader(new BufferReader(data)); }; /** @@ -2004,34 +2308,6 @@ util.inherits(FilterClearPacket, Packet); FilterClearPacket.prototype.cmd = 'filterclear'; FilterClearPacket.prototype.type = exports.types.FILTERCLEAR; -/** - * Get serialization size. - * @returns {Number} - */ - -FilterClearPacket.prototype.getSize = function getSize() { - return 0; -}; - -/** - * Serialize filterclear packet. - * @returns {Buffer} - */ - -FilterClearPacket.prototype.toRaw = function toRaw() { - return DUMMY; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -FilterClearPacket.prototype.fromRaw = function fromRaw(data) { - return this; -}; - /** * Instantiate filterclear packet from serialized data. * @param {Buffer} data @@ -2076,6 +2352,15 @@ MerkleBlockPacket.prototype.getSize = function getSize() { return this.block.getSize(); }; +/** + * Serialize merkleblock packet to writer. + * @param {BufferWriter} bw + */ + +MerkleBlockPacket.prototype.toWriter = function toWriter(bw) { + return this.block.toWriter(bw); +}; + /** * Serialize merkleblock packet. * @returns {Buffer} @@ -2085,6 +2370,17 @@ MerkleBlockPacket.prototype.toRaw = function toRaw() { return this.block.toRaw(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +MerkleBlockPacket.prototype.fromReader = function fromReader(br) { + this.block.fromReader(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -2147,6 +2443,25 @@ GetUTXOsPacket.prototype.getSize = function getSize() { return size; }; +/** + * Serialize getutxos packet to writer. + * @param {BufferWriter} bw + */ + +GetUTXOsPacket.prototype.toWriter = function toWriter(bw) { + var i, prevout; + + bw.writeU8(this.mempool ? 1 : 0); + bw.writeVarint(this.prevout.length); + + for (i = 0; i < this.prevout.length; i++) { + prevout = this.prevout[i]; + prevout.toWriter(bw); + } + + return bw; +}; + /** * Serialize getutxos packet. * @returns {Buffer} @@ -2154,26 +2469,16 @@ GetUTXOsPacket.prototype.getSize = function getSize() { GetUTXOsPacket.prototype.toRaw = function toRaw() { var size = this.getSize(); - var bw = new StaticWriter(size); - var i; - - bw.writeU8(this.mempool ? 1 : 0); - bw.writeVarint(this.prevout.length); - - for (i = 0; i < this.prevout.length; i++) - this.prevout[i].toWriter(bw); - - return bw.render(); + return this.toWriter(new StaticWriter(size)).render(); }; /** - * Inject properties from serialized data. + * Inject properties from buffer reader. * @private - * @param {Buffer} data + * @param {BufferReader} br */ -GetUTXOsPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); +GetUTXOsPacket.prototype.fromReader = function fromReader(br) { var i, count; this.mempool = br.readU8() === 1; @@ -2186,6 +2491,26 @@ GetUTXOsPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +GetUTXOsPacket.prototype.fromRaw = function fromRaw(data) { + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate getutxos packet from buffer reader. + * @param {BufferReader} br + * @returns {GetBlocksPacket} + */ + +GetUTXOsPacket.fromReader = function fromReader(br) { + return new GetUTXOsPacket().fromReader(br); +}; + /** * Instantiate getutxos packet from serialized data. * @param {Buffer} data @@ -2292,13 +2617,11 @@ UTXOsPacket.prototype.getSize = function getSize() { }; /** - * Serialize utxos packet. - * @returns {Buffer} + * Serialize utxos packet to writer. + * @param {BufferWriter} bw */ -UTXOsPacket.prototype.toRaw = function toRaw() { - var size = this.getSize(); - var bw = new StaticWriter(size); +UTXOsPacket.prototype.toWriter = function toWriter(bw) { var map = new Buffer((this.hits.length + 7) / 8 | 0); var i, bit, oct, coin, height; @@ -2326,17 +2649,26 @@ UTXOsPacket.prototype.toRaw = function toRaw() { bw.writeVarBytes(coin.script.toRaw()); } - return bw.render(); + return bw; }; /** - * Inject properties from serialized data. - * @private - * @param {Buffer} data + * Serialize utxos packet. + * @returns {Buffer} */ -UTXOsPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); +UTXOsPacket.prototype.toRaw = function toRaw() { + var size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +UTXOsPacket.prototype.fromReader = function fromReader(br) { var i, bit, oct, coin, output; var version, height, map, count; @@ -2373,6 +2705,26 @@ UTXOsPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +UTXOsPacket.prototype.fromRaw = function fromRaw(data) { + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate utxos packet from buffer reader. + * @param {BufferReader} br + * @returns {UTXOsPacket} + */ + +UTXOsPacket.fromReader = function fromReader(br) { + return new UTXOsPacket().fromReader(br); +}; + /** * Instantiate utxos packet from serialized data. * @param {Buffer} data @@ -2405,31 +2757,13 @@ HaveWitnessPacket.prototype.cmd = 'havewitness'; HaveWitnessPacket.prototype.type = exports.types.HAVEWITNESS; /** - * Get serialization size. - * @returns {Number} + * Instantiate havewitness packet from buffer reader. + * @param {BufferReader} br + * @returns {HaveWitnessPacket} */ -HaveWitnessPacket.prototype.getSize = function getSize() { - return 0; -}; - -/** - * Serialize havewitness packet. - * @returns {Buffer} - */ - -HaveWitnessPacket.prototype.toRaw = function toRaw() { - return DUMMY; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -HaveWitnessPacket.prototype.fromRaw = function fromRaw(data) { - return this; +HaveWitnessPacket.fromReader = function fromReader(br) { + return new HaveWitnessPacket().fromReader(br); }; /** @@ -2476,15 +2810,34 @@ FeeFilterPacket.prototype.getSize = function getSize() { return 8; }; +/** + * Serialize feefilter packet to writer. + * @param {BufferWriter} bw + */ + +FeeFilterPacket.prototype.toWriter = function toWriter(bw) { + bw.write64(this.rate); + return bw; +}; + /** * Serialize feefilter packet. * @returns {Buffer} */ FeeFilterPacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(8); - bw.write64(this.rate); - return bw.render(); + return this.toWriter(new StaticWriter(8)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +FeeFilterPacket.prototype.fromReader = function fromReader(br) { + this.rate = br.read64(); + return this; }; /** @@ -2494,9 +2847,17 @@ FeeFilterPacket.prototype.toRaw = function toRaw() { */ FeeFilterPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.rate = br.read64(); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate feefilter packet from buffer reader. + * @param {BufferReader} br + * @returns {FeeFilterPacket} + */ + +FeeFilterPacket.fromReader = function fromReader(br) { + return new FeeFilterPacket().fromReader(br); }; /** @@ -2546,16 +2907,36 @@ SendCmpctPacket.prototype.getSize = function getSize() { return 9; }; +/** + * Serialize sendcmpct packet to writer. + * @param {BufferWriter} bw + */ + +SendCmpctPacket.prototype.toWriter = function toWriter(bw) { + bw.writeU8(this.mode); + bw.writeU64(this.version); + return bw; +}; + /** * Serialize sendcmpct packet. * @returns {Buffer} */ SendCmpctPacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(9); - bw.writeU8(this.mode); - bw.writeU64(this.version); - return bw.render(); + return this.toWriter(new StaticWriter(9)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +SendCmpctPacket.prototype.fromReader = function fromReader(br) { + this.mode = br.readU8(); + this.version = br.readU53(); + return this; }; /** @@ -2565,10 +2946,27 @@ SendCmpctPacket.prototype.toRaw = function toRaw() { */ SendCmpctPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.mode = br.readU8(); - this.version = br.readU53(); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate sendcmpct packet from buffer reader. + * @param {BufferReader} br + * @returns {SendCmpctPacket} + */ + +SendCmpctPacket.fromReader = function fromReader(br) { + return new SendCmpctPacket().fromReader(br); +}; + +/** + * Instantiate sendcmpct packet from buffer reader. + * @param {BufferReader} br + * @returns {SendCmpctPacket} + */ + +SendCmpctPacket.fromReader = function fromReader(br) { + return new SendCmpctPacket().fromReader(br); }; /** @@ -2620,6 +3018,17 @@ CmpctBlockPacket.prototype.getSize = function getSize() { return this.block.getSize(false); }; +/** + * Serialize cmpctblock packet to writer. + * @param {BufferWriter} bw + */ + +CmpctBlockPacket.prototype.toWriter = function toWriter(bw) { + if (this.witness) + return this.block.toWriter(bw); + return this.block.toNormalWriter(bw); +}; + /** * Serialize cmpctblock packet. * @returns {Buffer} @@ -2631,6 +3040,17 @@ CmpctBlockPacket.prototype.toRaw = function toRaw() { return this.block.toNormal(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +CmpctBlockPacket.prototype.fromReader = function fromReader(br) { + this.block.fromReader(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -2642,6 +3062,16 @@ CmpctBlockPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate cmpctblock packet from buffer reader. + * @param {BufferReader} br + * @returns {CmpctBlockPacket} + */ + +CmpctBlockPacket.fromReader = function fromReader(br) { + return new CmpctBlockPacket().fromRaw(br); +}; + /** * Instantiate cmpctblock packet from serialized data. * @param {Buffer} data @@ -2686,6 +3116,15 @@ GetBlockTxnPacket.prototype.getSize = function getSize() { return this.request.getSize(); }; +/** + * Serialize getblocktxn packet to writer. + * @param {BufferWriter} bw + */ + +GetBlockTxnPacket.prototype.toWriter = function toWriter(bw) { + return this.request.toWriter(bw); +}; + /** * Serialize getblocktxn packet. * @returns {Buffer} @@ -2695,6 +3134,17 @@ GetBlockTxnPacket.prototype.toRaw = function toRaw() { return this.request.toRaw(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +GetBlockTxnPacket.prototype.fromReader = function fromReader(br) { + this.request.fromReader(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -2706,6 +3156,16 @@ GetBlockTxnPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate getblocktxn packet from buffer reader. + * @param {BufferReader} br + * @returns {GetBlockTxnPacket} + */ + +GetBlockTxnPacket.fromReader = function fromReader(br) { + return new GetBlockTxnPacket().fromReader(br); +}; + /** * Instantiate getblocktxn packet from serialized data. * @param {Buffer} data @@ -2755,6 +3215,17 @@ BlockTxnPacket.prototype.getSize = function getSize() { return this.response.getSize(false); }; +/** + * Serialize blocktxn packet to writer. + * @param {BufferWriter} bw + */ + +BlockTxnPacket.prototype.toWriter = function toWriter(bw) { + if (this.witness) + return this.response.toWriter(bw); + return this.response.toNormalWriter(bw); +}; + /** * Serialize blocktxn packet. * @returns {Buffer} @@ -2766,6 +3237,17 @@ BlockTxnPacket.prototype.toRaw = function toRaw() { return this.response.toNormal(); }; +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +BlockTxnPacket.prototype.fromReader = function fromReader(br) { + this.response.fromReader(br); + return this; +}; + /** * Inject properties from serialized data. * @private @@ -2777,6 +3259,16 @@ BlockTxnPacket.prototype.fromRaw = function fromRaw(data) { return this; }; +/** + * Instantiate blocktxn packet from buffer reader. + * @param {BufferReader} br + * @returns {BlockTxnPacket} + */ + +BlockTxnPacket.fromReader = function fromReader(br) { + return new BlockTxnPacket().fromReader(br); +}; + /** * Instantiate blocktxn packet from serialized data. * @param {Buffer} data @@ -2824,16 +3316,36 @@ EncinitPacket.prototype.getSize = function getSize() { return 34; }; +/** + * Serialize encinit packet to writer. + * @param {BufferWriter} bw + */ + +EncinitPacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.publicKey); + bw.writeU8(this.cipher); + return bw; +}; + /** * Serialize encinit packet. * @returns {Buffer} */ EncinitPacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(34); - bw.writeBytes(this.publicKey); - bw.writeU8(this.cipher); - return bw.render(); + return this.toWriter(new StaticWriter(34)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +EncinitPacket.prototype.fromReader = function fromReader(br) { + this.publicKey = br.readBytes(33); + this.cipher = br.readU8(); + return this; }; /** @@ -2843,10 +3355,17 @@ EncinitPacket.prototype.toRaw = function toRaw() { */ EncinitPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.publicKey = br.readBytes(33); - this.cipher = br.readU8(); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate getblocks packet from buffer reader. + * @param {BufferReader} br + * @returns {EncinitPacket} + */ + +EncinitPacket.fromReader = function fromReader(br) { + return new EncinitPacket().fromReader(br); }; /** @@ -2893,15 +3412,34 @@ EncackPacket.prototype.getSize = function getSize() { return 33; }; +/** + * Serialize encack packet to writer. + * @param {BufferWriter} bw + */ + +EncackPacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.publicKey); + return bw; +}; + /** * Serialize encack packet. * @returns {Buffer} */ EncackPacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(33); - bw.writeBytes(this.publicKey); - return bw.render(); + return this.publicKey; +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +EncackPacket.prototype.fromReader = function fromReader(br) { + this.publicKey = br.readBytes(33); + return this; }; /** @@ -2911,9 +3449,17 @@ EncackPacket.prototype.toRaw = function toRaw() { */ EncackPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.publicKey = br.readBytes(33); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate encack packet from buffer reader. + * @param {BufferReader} br + * @returns {EncackPacket} + */ + +EncackPacket.fromReader = function fromReader(br) { + return new EncackPacket().fromReader(br); }; /** @@ -2960,15 +3506,34 @@ EncackPacket.prototype.getSize = function getSize() { return 32; }; +/** + * Serialize authchallenge packet to writer. + * @param {BufferWriter} bw + */ + +AuthChallengePacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.hash); + return bw; +}; + /** * Serialize authchallenge packet. * @returns {Buffer} */ AuthChallengePacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(32); - bw.writeBytes(this.hash); - return bw.render(); + return this.hash; +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +AuthChallengePacket.prototype.fromReader = function fromReader(br) { + this.hash = br.readHash(); + return this; }; /** @@ -2978,9 +3543,17 @@ AuthChallengePacket.prototype.toRaw = function toRaw() { */ AuthChallengePacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.hash = br.readHash(); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate authchallenge packet from buffer reader. + * @param {BufferReader} br + * @returns {AuthChallengePacket} + */ + +AuthChallengePacket.fromReader = function fromReader(br) { + return new AuthChallengePacket().fromReader(br); }; /** @@ -3027,15 +3600,34 @@ AuthReplyPacket.prototype.getSize = function getSize() { return 64; }; +/** + * Serialize authreply packet to writer. + * @param {BufferWriter} bw + */ + +AuthReplyPacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.signature); + return bw; +}; + /** * Serialize authreply packet. * @returns {Buffer} */ AuthReplyPacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(64); - bw.writeBytes(this.signature); - return bw.render(); + return this.signature; +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +AuthReplyPacket.prototype.fromReader = function fromReader(br) { + this.signature = br.readBytes(64); + return this; }; /** @@ -3045,9 +3637,17 @@ AuthReplyPacket.prototype.toRaw = function toRaw() { */ AuthReplyPacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.signature = br.readBytes(64); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate authreply packet from buffer reader. + * @param {BufferReader} br + * @returns {AuthReplyPacket} + */ + +AuthReplyPacket.fromReader = function fromReader(br) { + return new AuthReplyPacket().fromReader(br); }; /** @@ -3094,15 +3694,34 @@ AuthProposePacket.prototype.getSize = function getSize() { return 32; }; +/** + * Serialize authpropose packet to writer. + * @param {BufferWriter} bw + */ + +AuthProposePacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.hash); + return bw; +}; + /** * Serialize authpropose packet. * @returns {Buffer} */ AuthProposePacket.prototype.toRaw = function toRaw() { - var bw = new StaticWriter(32); - bw.writeBytes(this.hash); - return bw.render(); + return this.hash; +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +AuthProposePacket.prototype.fromReader = function fromReader(br) { + this.hash = br.readHash(); + return this; }; /** @@ -3112,9 +3731,17 @@ AuthProposePacket.prototype.toRaw = function toRaw() { */ AuthProposePacket.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); - this.hash = br.readHash(); - return this; + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate authpropose packet from buffer reader. + * @param {BufferReader} br + * @returns {AuthProposePacket} + */ + +AuthProposePacket.fromReader = function fromReader(br) { + return new AuthProposePacket().fromReader(br); }; /** @@ -3163,6 +3790,16 @@ UnknownPacket.prototype.getSize = function getSize() { return this.data.length; }; +/** + * Serialize unknown packet to writer. + * @param {BufferWriter} bw + */ + +UnknownPacket.prototype.toWriter = function toWriter(bw) { + bw.writeBytes(this.data); + return bw; +}; + /** * Serialize unknown packet. * @returns {Buffer} diff --git a/lib/primitives/mtx.js b/lib/primitives/mtx.js index 46753421..fab2e7d1 100644 --- a/lib/primitives/mtx.js +++ b/lib/primitives/mtx.js @@ -1321,7 +1321,7 @@ MTX.prototype.inspect = function inspect() { */ MTX.prototype.format = function format() { - return TX.prototype.inspect.call(this, this.view); + return TX.prototype.format.call(this, this.view); }; /** diff --git a/lib/utils/bloom.js b/lib/utils/bloom.js index 57f6fecc..194f71cc 100644 --- a/lib/utils/bloom.js +++ b/lib/utils/bloom.js @@ -188,16 +188,37 @@ Bloom.prototype.getSize = function getSize() { * @returns {Buffer} */ -Bloom.prototype.toRaw = function toRaw() { - var size = this.getSize(); - var bw = new StaticWriter(size); - +Bloom.prototype.toWriter = function toWriter(bw) { bw.writeVarBytes(this.filter); bw.writeU32(this.n); bw.writeU32(this.tweak); bw.writeU8(this.update); + return bw; +}; - return bw.render(); +/** + * Serialize bloom filter. + * @returns {Buffer} + */ + +Bloom.prototype.toRaw = function toRaw() { + var size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + */ + +Bloom.prototype.fromReader = function fromReader(br) { + this.filter = br.readVarBytes(); + this.n = br.readU32(); + this.tweak = br.readU32(); + this.update = br.readU8(); + assert(constants.filterFlagsByVal[this.update] != null, 'Bad filter flag.'); + return this; }; /** @@ -207,16 +228,17 @@ Bloom.prototype.toRaw = function toRaw() { */ Bloom.prototype.fromRaw = function fromRaw(data) { - var br = new BufferReader(data); + return this.fromReader(new BufferReader(data)); +}; - this.filter = br.readVarBytes(); - this.n = br.readU32(); - this.tweak = br.readU32(); - this.update = br.readU8(); +/** + * Instantiate bloom filter from buffer reader. + * @param {BufferReader} br + * @returns {Bloom} + */ - assert(constants.filterFlagsByVal[this.update] != null, 'Bad filter flag.'); - - return this; +Bloom.fromReader = function fromReader(br) { + return new Bloom().fromReader(br); }; /** diff --git a/lib/wallet/wallet.js b/lib/wallet/wallet.js index 01744d73..6958754d 100644 --- a/lib/wallet/wallet.js +++ b/lib/wallet/wallet.js @@ -2577,9 +2577,7 @@ Wallet.prototype.toRaw = function toRaw() { Wallet.prototype.fromRaw = function fromRaw(data) { var br = new BufferReader(data); - var network; - - network = Network.fromMagic(br.readU32()); + var network = Network.fromMagic(br.readU32()); this.wid = br.readU32(); this.id = br.readVarString('ascii');