From 90790ac67539bc2bf470b00a76a4ef4eca33d895 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 29 Apr 2016 07:21:21 -0700 Subject: [PATCH] refactor parsing. --- lib/bcoin/abstractblock.js | 13 ++-- lib/bcoin/chaindb.js | 14 ++--- lib/bcoin/compactblock.js | 18 +++++- lib/bcoin/input.js | 2 - lib/bcoin/mempool.js | 4 -- lib/bcoin/protocol/parser.js | 118 ++++++++--------------------------- lib/bcoin/tx.js | 3 - lib/bcoin/workers.js | 4 -- 8 files changed, 52 insertions(+), 124 deletions(-) diff --git a/lib/bcoin/abstractblock.js b/lib/bcoin/abstractblock.js index 880cb656..310579b9 100644 --- a/lib/bcoin/abstractblock.js +++ b/lib/bcoin/abstractblock.js @@ -53,13 +53,11 @@ function AbstractBlock(data) { this.totalTX = data.totalTX || 0; this.height = data.height != null ? data.height : -1; - this._raw = data._raw || null; - this._size = data._size || 0; - - this.valid = null; - this._hash = null; - this.txs = null; + this.valid = null; + + this._hash = null; + this._size = data._size || 0; } /** @@ -81,9 +79,6 @@ AbstractBlock.prototype.hash = function hash(enc) { */ AbstractBlock.prototype.abbr = function abbr() { - if (this._raw) - return this._raw.slice(0, 80); - return bcoin.protocol.framer.blockHeaders(this); }; diff --git a/lib/bcoin/chaindb.js b/lib/bcoin/chaindb.js index 1536ab15..5fc077d9 100644 --- a/lib/bcoin/chaindb.js +++ b/lib/bcoin/chaindb.js @@ -1429,15 +1429,15 @@ ChainDB.prototype.getUndoCoins = function getUndoCoins(hash, callback) { coins = []; p = new BufferReader(data); - p.start(); - - while (p.left()) { - coin = new bcoin.coin(Parser.parseCoin(p, false)); - coins.push(coin); + try { + while (p.left()) { + coin = Parser.parseCoin(p, false); + coins.push(new bcoin.coin(coin)); + } + } catch (e) { + return callback(e); } - p.end(); - return callback(null, coins); }); }; diff --git a/lib/bcoin/compactblock.js b/lib/bcoin/compactblock.js index 7a53aead..68115426 100644 --- a/lib/bcoin/compactblock.js +++ b/lib/bcoin/compactblock.js @@ -41,10 +41,11 @@ var assert = utils.assert; * @property {Number} nonce * @property {Number} totalTX - Transaction count. * @property {Number} height - Block height (-1 if not present). + * @property {Boolean} compact - Always true. * @property {Number} coinbaseHeight - The coinbase height which * was extracted by the parser (the coinbase is the only * transaction we parse ahead of time). - * @property {Buffer} _raw - The raw block data. + * @property {Buffer} raw - The raw block data. * @property {ReversedHash} rhash - Reversed block hash (uint256le). */ @@ -56,10 +57,20 @@ function CompactBlock(data) { this.compact = true; this.coinbaseHeight = data.coinbaseHeight; + this.raw = data.raw; } utils.inherits(CompactBlock, bcoin.abstractblock); +/** + * Get the full block size. + * @returns {Number} + */ + +CompactBlock.prototype.getSize = function getSize() { + return this.raw.length; +}; + /** * Verify the block headers. * @alias verify @@ -89,8 +100,9 @@ CompactBlock.prototype.getCoinbaseHeight = function getCoinbaseHeight() { */ CompactBlock.prototype.toBlock = function toBlock() { - var data = bcoin.protocol.parser.parseBlock(this._raw); - delete this._raw; + var data = bcoin.protocol.parser.parseBlock(this.raw); + delete this.raw; + assert(!data.raw); assert(!data._raw); return new bcoin.block(data); }; diff --git a/lib/bcoin/input.js b/lib/bcoin/input.js index 972eab4e..9ba33c20 100644 --- a/lib/bcoin/input.js +++ b/lib/bcoin/input.js @@ -378,10 +378,8 @@ Input.parseExtended = function parseExtended(data, enc) { data = new Buffer(data, 'hex'); p = new BufferReader(data); - p.start(); input = bcoin.protocol.parser.parseInput(p); input.witness = bcoin.protocol.parser.parseWitness(p); - p.end(); return input; }; diff --git a/lib/bcoin/mempool.js b/lib/bcoin/mempool.js index c6065448..58582527 100644 --- a/lib/bcoin/mempool.js +++ b/lib/bcoin/mempool.js @@ -933,8 +933,6 @@ Mempool.prototype.getWaiting = function getWaiting(hash, callback) { p = new BufferReader(buf); - p.start(); - try { while (p.left()) hashes.push(p.readHash('hex')); @@ -942,8 +940,6 @@ Mempool.prototype.getWaiting = function getWaiting(hash, callback) { return callback(e); } - p.end(); - return callback(null, hashes, buf); }); }; diff --git a/lib/bcoin/protocol/parser.js b/lib/bcoin/protocol/parser.js index e62e935b..a07f1b8b 100644 --- a/lib/bcoin/protocol/parser.js +++ b/lib/bcoin/protocol/parser.js @@ -167,11 +167,9 @@ Parser.parseMempool = function parseMempool(p) { Parser.parseSubmitOrder = function parseSubmitOrder(p) { var hash, tx; p = new BufferReader(p); - p.start(); return { hash: p.readHash('hex'), - tx: Parser.parseTX(p), - _size: p.end() + tx: Parser.parseTX(p) }; }; @@ -194,12 +192,10 @@ Parser.parseCheckOrder = function parseCheckOrder(p) { Parser.parseReply = function parseReply(p) { var hash, code, publicKey; p = new BufferReader(p); - p.start(); return { hash: p.readHash('hex'), code: p.readU32(), - publicKey: p.readVarBytes(), - _size: p.end() + publicKey: p.readVarBytes() }; }; @@ -243,7 +239,6 @@ Parser.parseFilterLoad = function parseFilterLoad(p) { var filter, n, tweak, update; p = new BufferReader(p); - p.start(); filter = p.readVarBytes(); n = p.readU32(); @@ -256,8 +251,7 @@ Parser.parseFilterLoad = function parseFilterLoad(p) { filter: filter, n: n, tweak: tweak, - update: update, - _size: p.end() + update: update }; }; @@ -269,10 +263,8 @@ Parser.parseFilterLoad = function parseFilterLoad(p) { Parser.parseFilterAdd = function parseFilterAdd(p) { p = new BufferReader(p); - p.start(); return { - data: p.readVarBytes(), - _size: p.end() + data: p.readVarBytes() }; }; @@ -367,7 +359,6 @@ Parser.parseGetUTXOs = function parseGetUTXOs(p) { var mempool, prevout, count, i; p = new BufferReader(p); - p.start(); mempool = p.readU8() === 1; prevout = []; @@ -382,8 +373,7 @@ Parser.parseGetUTXOs = function parseGetUTXOs(p) { return { mempool: mempool, - prevout: prevout, - _size: p.end() + prevout: prevout }; }; @@ -398,7 +388,6 @@ Parser.parseUTXOs = function parseUTXOs(p) { var coin, version, height, i, hits, ch, j; p = new BufferReader(p); - p.start(); chainHeight = p.readU32(); tip = p.readHash('hex'); @@ -430,8 +419,7 @@ Parser.parseUTXOs = function parseUTXOs(p) { tip: tip, map: map, coins: coins, - hits: hits, - _size: p.end() + hits: hits }; }; @@ -443,11 +431,9 @@ Parser.parseUTXOs = function parseUTXOs(p) { Parser.parsePing = function parsePing(p) { p = new BufferReader(p); - p.start(); return { - nonce: p.readU64(), - _size: p.end() + nonce: p.readU64() }; }; @@ -459,11 +445,9 @@ Parser.parsePing = function parsePing(p) { Parser.parsePong = function parsePong(p) { p = new BufferReader(p); - p.start(); return { - nonce: p.readU64(), - _size: p.end() + nonce: p.readU64() }; }; @@ -477,7 +461,6 @@ Parser.parseVersion = function parseVersion(p) { var version, services, ts, recv, from, nonce, agent, height, relay; p = new BufferReader(p); - p.start(); version = p.read32(); services = p.readU53(); @@ -510,8 +493,7 @@ Parser.parseVersion = function parseVersion(p) { nonce: nonce, agent: agent, height: height, - relay: relay, - _size: p.end() + relay: relay }; }; @@ -549,7 +531,6 @@ Parser._parseGetBlocks = function _parseGetBlocks(p) { var version, count, locator, i, stop; p = new BufferReader(p); - p.start(); version = p.readU32(); count = p.readVarint(); @@ -566,8 +547,7 @@ Parser._parseGetBlocks = function _parseGetBlocks(p) { return { version: version, locator: locator, - stop: stop, - _size: p.end() + stop: stop }; }; @@ -607,7 +587,6 @@ Parser.parseInv = function parseInv(p) { var i, count; p = new BufferReader(p); - p.start(); count = p.readVarint(); @@ -620,8 +599,6 @@ Parser.parseInv = function parseInv(p) { }); } - items._size = p.end(); - return items; }; @@ -636,7 +613,6 @@ Parser.parseMerkleBlock = function parseMerkleBlock(p) { var i, hashCount, hashes, flags; p = new BufferReader(p); - p.start(); version = p.readU32(); prevBlock = p.readHash('hex'); @@ -664,8 +640,7 @@ Parser.parseMerkleBlock = function parseMerkleBlock(p) { nonce: nonce, totalTX: totalTX, hashes: hashes, - flags: flags, - _size: p.end() + flags: flags }; }; @@ -680,7 +655,6 @@ Parser.parseHeaders = function parseHeaders(p) { var i, count; p = new BufferReader(p); - p.start(); count = p.readVarint(); @@ -696,8 +670,6 @@ Parser.parseHeaders = function parseHeaders(p) { }); } - headers._size = p.end(); - return headers; }; @@ -709,7 +681,6 @@ Parser.parseHeaders = function parseHeaders(p) { Parser.parseBlockHeaders = function parseBlockHeaders(p) { p = new BufferReader(p); - p.start(); return { version: p.readU32(), // Technically signed @@ -717,8 +688,7 @@ Parser.parseBlockHeaders = function parseBlockHeaders(p) { merkleRoot: p.readHash('hex'), ts: p.readU32(), bits: p.readU32(), - nonce: p.readU32(), - _size: p.end() + nonce: p.readU32() } }; @@ -734,7 +704,6 @@ Parser.parseBlock = function parseBlock(p) { var i, totalTX, tx; p = new BufferReader(p); - p.start(); version = p.readU32(); // Technically signed prevBlock = p.readHash('hex'); @@ -749,8 +718,6 @@ Parser.parseBlock = function parseBlock(p) { txs.push(tx); } - p.end(); - return { version: version, prevBlock: prevBlock, @@ -769,12 +736,11 @@ Parser.parseBlock = function parseBlock(p) { */ Parser.parseBlockCompact = function parseBlockCompact(p) { - var version, prevBlock, merkleRoot, ts, bits, nonce; - var totalTX, height; - var inCount, input, raw; + var version, prevBlock, merkleRoot; + var ts, bits, nonce, totalTX, height; + var inCount, input; p = new BufferReader(p); - p.start(); version = p.readU32(); // Technically signed prevBlock = p.readHash('hex'); @@ -804,10 +770,6 @@ Parser.parseBlockCompact = function parseBlockCompact(p) { else height = -1; - raw = p.data; - - p.end(); - return { version: version, prevBlock: prevBlock, @@ -818,8 +780,7 @@ Parser.parseBlockCompact = function parseBlockCompact(p) { totalTX: totalTX, coinbaseHeight: height, txs: [], - _raw: raw, - _size: raw.length + raw: p.data }; }; @@ -833,7 +794,6 @@ Parser.parseInput = function parseInput(p) { var hash, index, script, sequence; p = new BufferReader(p); - p.start(); hash = p.readHash('hex'); index = p.readU32(); @@ -847,8 +807,7 @@ Parser.parseInput = function parseInput(p) { }, coin: null, script: script, - sequence: sequence, - _size: p.end() + sequence: sequence }; }; @@ -862,15 +821,13 @@ Parser.parseOutput = function parseOutput(p) { var value, script; p = new BufferReader(p); - p.start(); value = p.read64(); script = Parser.parseScript(p); return { value: value, - script: script, - _size: p.end() + script: script }; }; @@ -885,7 +842,6 @@ Parser.parseCoin = function parseCoin(p, extended) { var version, height, value, script, hash, index, coinbase; p = new BufferReader(p); - p.start(); version = p.readU32(); height = p.readU32(); @@ -908,8 +864,7 @@ Parser.parseCoin = function parseCoin(p, extended) { script: script, coinbase: coinbase, hash: hash, - index: index, - _size: p.end() + index: index }; }; @@ -929,7 +884,6 @@ Parser.parseTX = function parseTX(p) { return Parser.parseWitnessTX(p); p = new BufferReader(p); - p.start(); version = p.readU32(); // Technically signed inCount = p.readVarint(); @@ -947,8 +901,6 @@ Parser.parseTX = function parseTX(p) { locktime = p.readU32(); - p.end(); - return { version: version, flag: 1, @@ -991,7 +943,6 @@ Parser.parseWitnessTX = function parseWitnessTX(p) { var version, locktime, i; p = new BufferReader(p); - p.start(); version = p.readU32(); // Technically signed marker = p.readU8(); @@ -1023,8 +974,6 @@ Parser.parseWitnessTX = function parseWitnessTX(p) { locktime = p.readU32(); - p.end(); - return { version: version, flag: flag, @@ -1044,13 +993,11 @@ Parser.parseScript = function parseScript(p) { var data; p = new BufferReader(p); - p.start(); data = p.readVarBytes(); return { raw: data, - code: bcoin.script.decode(data), - _size: p.end() + code: bcoin.script.decode(data) }; }; @@ -1065,7 +1012,6 @@ Parser.parseWitness = function parseWitness(p) { var chunkCount, i; p = new BufferReader(p); - p.start(); chunkCount = p.readVarint(); @@ -1073,8 +1019,7 @@ Parser.parseWitness = function parseWitness(p) { items.push(p.readVarBytes()); return { - items: items, - _size: p.end() + items: items }; }; @@ -1088,7 +1033,6 @@ Parser.parseReject = function parseReject(p) { var message, ccode, reason, data; p = new BufferReader(p); - p.start(); message = p.readVarString('ascii'); ccode = p.readU8(); @@ -1103,8 +1047,7 @@ Parser.parseReject = function parseReject(p) { message: message, ccode: constants.rejectByVal[ccode] || ccode, reason: reason, - data: data, - _size: p.end() + data: data }; }; @@ -1118,7 +1061,6 @@ Parser.parseAddress = function parseAddress(p, full) { var ts, services, ip, port; p = new BufferReader(p); - p.start(); if (full) // only version >= 31402 ts = p.readU32(); @@ -1140,8 +1082,7 @@ Parser.parseAddress = function parseAddress(p, full) { witness: (services & constants.services.WITNESS) !== 0, ipv6: utils.array2ip(ip, 6), ipv4: utils.array2ip(ip, 4), - port: port, - _size: p.end() + port: port }; }; @@ -1156,15 +1097,12 @@ Parser.parseAddr = function parseAddr(p) { var i, count; p = new BufferReader(p); - p.start(); count = p.readVarint(); for (i = 0; i < count; i++) addrs.push(Parser.parseAddress(p, true)); - addrs._size = p.end(); - return addrs; }; @@ -1188,17 +1126,15 @@ Parser.parseAlert = function parseAlert(p) { var version, relayUntil, expiration, id, cancel; var cancels, count, i, minVer, maxVer, subVers; var priority, comment, statusBar, reserved; - var payload, size; + var payload; p = new BufferReader(p); - p.start(); payload = p.readVarBytes(); signature = p.readVarBytes(); - size = p.end(); p = new BufferReader(payload); - p.start(); + version = p.read32(); relayUntil = p.read53(); expiration = p.read53(); @@ -1218,7 +1154,6 @@ Parser.parseAlert = function parseAlert(p) { comment = p.readVarString('ascii'); statusBar = p.readVarString('ascii'); reserved = p.readVarString('ascii'); - p.end(); return { version: version, @@ -1235,8 +1170,7 @@ Parser.parseAlert = function parseAlert(p) { statusBar: statusBar, reserved: reserved, payload: payload, - signature: signature, - _size: size + signature: signature }; }; diff --git a/lib/bcoin/tx.js b/lib/bcoin/tx.js index a16b3d31..cfcdab7d 100644 --- a/lib/bcoin/tx.js +++ b/lib/bcoin/tx.js @@ -1823,7 +1823,6 @@ TX.parseExtended = function parseExtended(buf, saveCoins, enc) { buf = new Buffer(buf, 'hex'); p = new BufferReader(buf); - p.start(); tx = bcoin.protocol.parser.parseTX(p); @@ -1859,8 +1858,6 @@ TX.parseExtended = function parseExtended(buf, saveCoins, enc) { } } - p.end(); - return tx; }; diff --git a/lib/bcoin/workers.js b/lib/bcoin/workers.js index 9f457b9d..ec074f63 100644 --- a/lib/bcoin/workers.js +++ b/lib/bcoin/workers.js @@ -321,15 +321,11 @@ function parseBody(data) { var p = new BufferReader(data, true); var name, items; - p.start(); - name = p.readVarString('ascii'); items = parseItem(p); assert(p.readU8() === 0x0a); - p.end(); - return { name: name || null, items: items