refactor parsing.

This commit is contained in:
Christopher Jeffrey 2016-04-29 07:21:21 -07:00
parent f6b42ae5f3
commit 90790ac675
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
8 changed files with 52 additions and 124 deletions

View File

@ -53,13 +53,11 @@ function AbstractBlock(data) {
this.totalTX = data.totalTX || 0; this.totalTX = data.totalTX || 0;
this.height = data.height != null ? data.height : -1; 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.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() { AbstractBlock.prototype.abbr = function abbr() {
if (this._raw)
return this._raw.slice(0, 80);
return bcoin.protocol.framer.blockHeaders(this); return bcoin.protocol.framer.blockHeaders(this);
}; };

View File

@ -1429,15 +1429,15 @@ ChainDB.prototype.getUndoCoins = function getUndoCoins(hash, callback) {
coins = []; coins = [];
p = new BufferReader(data); p = new BufferReader(data);
p.start(); try {
while (p.left()) {
while (p.left()) { coin = Parser.parseCoin(p, false);
coin = new bcoin.coin(Parser.parseCoin(p, false)); coins.push(new bcoin.coin(coin));
coins.push(coin); }
} catch (e) {
return callback(e);
} }
p.end();
return callback(null, coins); return callback(null, coins);
}); });
}; };

View File

@ -41,10 +41,11 @@ var assert = utils.assert;
* @property {Number} nonce * @property {Number} nonce
* @property {Number} totalTX - Transaction count. * @property {Number} totalTX - Transaction count.
* @property {Number} height - Block height (-1 if not present). * @property {Number} height - Block height (-1 if not present).
* @property {Boolean} compact - Always true.
* @property {Number} coinbaseHeight - The coinbase height which * @property {Number} coinbaseHeight - The coinbase height which
* was extracted by the parser (the coinbase is the only * was extracted by the parser (the coinbase is the only
* transaction we parse ahead of time). * 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). * @property {ReversedHash} rhash - Reversed block hash (uint256le).
*/ */
@ -56,10 +57,20 @@ function CompactBlock(data) {
this.compact = true; this.compact = true;
this.coinbaseHeight = data.coinbaseHeight; this.coinbaseHeight = data.coinbaseHeight;
this.raw = data.raw;
} }
utils.inherits(CompactBlock, bcoin.abstractblock); 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. * Verify the block headers.
* @alias verify * @alias verify
@ -89,8 +100,9 @@ CompactBlock.prototype.getCoinbaseHeight = function getCoinbaseHeight() {
*/ */
CompactBlock.prototype.toBlock = function toBlock() { CompactBlock.prototype.toBlock = function toBlock() {
var data = bcoin.protocol.parser.parseBlock(this._raw); var data = bcoin.protocol.parser.parseBlock(this.raw);
delete this._raw; delete this.raw;
assert(!data.raw);
assert(!data._raw); assert(!data._raw);
return new bcoin.block(data); return new bcoin.block(data);
}; };

View File

@ -378,10 +378,8 @@ Input.parseExtended = function parseExtended(data, enc) {
data = new Buffer(data, 'hex'); data = new Buffer(data, 'hex');
p = new BufferReader(data); p = new BufferReader(data);
p.start();
input = bcoin.protocol.parser.parseInput(p); input = bcoin.protocol.parser.parseInput(p);
input.witness = bcoin.protocol.parser.parseWitness(p); input.witness = bcoin.protocol.parser.parseWitness(p);
p.end();
return input; return input;
}; };

View File

@ -933,8 +933,6 @@ Mempool.prototype.getWaiting = function getWaiting(hash, callback) {
p = new BufferReader(buf); p = new BufferReader(buf);
p.start();
try { try {
while (p.left()) while (p.left())
hashes.push(p.readHash('hex')); hashes.push(p.readHash('hex'));
@ -942,8 +940,6 @@ Mempool.prototype.getWaiting = function getWaiting(hash, callback) {
return callback(e); return callback(e);
} }
p.end();
return callback(null, hashes, buf); return callback(null, hashes, buf);
}); });
}; };

View File

@ -167,11 +167,9 @@ Parser.parseMempool = function parseMempool(p) {
Parser.parseSubmitOrder = function parseSubmitOrder(p) { Parser.parseSubmitOrder = function parseSubmitOrder(p) {
var hash, tx; var hash, tx;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
return { return {
hash: p.readHash('hex'), hash: p.readHash('hex'),
tx: Parser.parseTX(p), tx: Parser.parseTX(p)
_size: p.end()
}; };
}; };
@ -194,12 +192,10 @@ Parser.parseCheckOrder = function parseCheckOrder(p) {
Parser.parseReply = function parseReply(p) { Parser.parseReply = function parseReply(p) {
var hash, code, publicKey; var hash, code, publicKey;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
return { return {
hash: p.readHash('hex'), hash: p.readHash('hex'),
code: p.readU32(), code: p.readU32(),
publicKey: p.readVarBytes(), publicKey: p.readVarBytes()
_size: p.end()
}; };
}; };
@ -243,7 +239,6 @@ Parser.parseFilterLoad = function parseFilterLoad(p) {
var filter, n, tweak, update; var filter, n, tweak, update;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
filter = p.readVarBytes(); filter = p.readVarBytes();
n = p.readU32(); n = p.readU32();
@ -256,8 +251,7 @@ Parser.parseFilterLoad = function parseFilterLoad(p) {
filter: filter, filter: filter,
n: n, n: n,
tweak: tweak, tweak: tweak,
update: update, update: update
_size: p.end()
}; };
}; };
@ -269,10 +263,8 @@ Parser.parseFilterLoad = function parseFilterLoad(p) {
Parser.parseFilterAdd = function parseFilterAdd(p) { Parser.parseFilterAdd = function parseFilterAdd(p) {
p = new BufferReader(p); p = new BufferReader(p);
p.start();
return { return {
data: p.readVarBytes(), data: p.readVarBytes()
_size: p.end()
}; };
}; };
@ -367,7 +359,6 @@ Parser.parseGetUTXOs = function parseGetUTXOs(p) {
var mempool, prevout, count, i; var mempool, prevout, count, i;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
mempool = p.readU8() === 1; mempool = p.readU8() === 1;
prevout = []; prevout = [];
@ -382,8 +373,7 @@ Parser.parseGetUTXOs = function parseGetUTXOs(p) {
return { return {
mempool: mempool, mempool: mempool,
prevout: prevout, prevout: prevout
_size: p.end()
}; };
}; };
@ -398,7 +388,6 @@ Parser.parseUTXOs = function parseUTXOs(p) {
var coin, version, height, i, hits, ch, j; var coin, version, height, i, hits, ch, j;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
chainHeight = p.readU32(); chainHeight = p.readU32();
tip = p.readHash('hex'); tip = p.readHash('hex');
@ -430,8 +419,7 @@ Parser.parseUTXOs = function parseUTXOs(p) {
tip: tip, tip: tip,
map: map, map: map,
coins: coins, coins: coins,
hits: hits, hits: hits
_size: p.end()
}; };
}; };
@ -443,11 +431,9 @@ Parser.parseUTXOs = function parseUTXOs(p) {
Parser.parsePing = function parsePing(p) { Parser.parsePing = function parsePing(p) {
p = new BufferReader(p); p = new BufferReader(p);
p.start();
return { return {
nonce: p.readU64(), nonce: p.readU64()
_size: p.end()
}; };
}; };
@ -459,11 +445,9 @@ Parser.parsePing = function parsePing(p) {
Parser.parsePong = function parsePong(p) { Parser.parsePong = function parsePong(p) {
p = new BufferReader(p); p = new BufferReader(p);
p.start();
return { return {
nonce: p.readU64(), nonce: p.readU64()
_size: p.end()
}; };
}; };
@ -477,7 +461,6 @@ Parser.parseVersion = function parseVersion(p) {
var version, services, ts, recv, from, nonce, agent, height, relay; var version, services, ts, recv, from, nonce, agent, height, relay;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.read32(); version = p.read32();
services = p.readU53(); services = p.readU53();
@ -510,8 +493,7 @@ Parser.parseVersion = function parseVersion(p) {
nonce: nonce, nonce: nonce,
agent: agent, agent: agent,
height: height, height: height,
relay: relay, relay: relay
_size: p.end()
}; };
}; };
@ -549,7 +531,6 @@ Parser._parseGetBlocks = function _parseGetBlocks(p) {
var version, count, locator, i, stop; var version, count, locator, i, stop;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); version = p.readU32();
count = p.readVarint(); count = p.readVarint();
@ -566,8 +547,7 @@ Parser._parseGetBlocks = function _parseGetBlocks(p) {
return { return {
version: version, version: version,
locator: locator, locator: locator,
stop: stop, stop: stop
_size: p.end()
}; };
}; };
@ -607,7 +587,6 @@ Parser.parseInv = function parseInv(p) {
var i, count; var i, count;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
count = p.readVarint(); count = p.readVarint();
@ -620,8 +599,6 @@ Parser.parseInv = function parseInv(p) {
}); });
} }
items._size = p.end();
return items; return items;
}; };
@ -636,7 +613,6 @@ Parser.parseMerkleBlock = function parseMerkleBlock(p) {
var i, hashCount, hashes, flags; var i, hashCount, hashes, flags;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); version = p.readU32();
prevBlock = p.readHash('hex'); prevBlock = p.readHash('hex');
@ -664,8 +640,7 @@ Parser.parseMerkleBlock = function parseMerkleBlock(p) {
nonce: nonce, nonce: nonce,
totalTX: totalTX, totalTX: totalTX,
hashes: hashes, hashes: hashes,
flags: flags, flags: flags
_size: p.end()
}; };
}; };
@ -680,7 +655,6 @@ Parser.parseHeaders = function parseHeaders(p) {
var i, count; var i, count;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
count = p.readVarint(); count = p.readVarint();
@ -696,8 +670,6 @@ Parser.parseHeaders = function parseHeaders(p) {
}); });
} }
headers._size = p.end();
return headers; return headers;
}; };
@ -709,7 +681,6 @@ Parser.parseHeaders = function parseHeaders(p) {
Parser.parseBlockHeaders = function parseBlockHeaders(p) { Parser.parseBlockHeaders = function parseBlockHeaders(p) {
p = new BufferReader(p); p = new BufferReader(p);
p.start();
return { return {
version: p.readU32(), // Technically signed version: p.readU32(), // Technically signed
@ -717,8 +688,7 @@ Parser.parseBlockHeaders = function parseBlockHeaders(p) {
merkleRoot: p.readHash('hex'), merkleRoot: p.readHash('hex'),
ts: p.readU32(), ts: p.readU32(),
bits: p.readU32(), bits: p.readU32(),
nonce: p.readU32(), nonce: p.readU32()
_size: p.end()
} }
}; };
@ -734,7 +704,6 @@ Parser.parseBlock = function parseBlock(p) {
var i, totalTX, tx; var i, totalTX, tx;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); // Technically signed version = p.readU32(); // Technically signed
prevBlock = p.readHash('hex'); prevBlock = p.readHash('hex');
@ -749,8 +718,6 @@ Parser.parseBlock = function parseBlock(p) {
txs.push(tx); txs.push(tx);
} }
p.end();
return { return {
version: version, version: version,
prevBlock: prevBlock, prevBlock: prevBlock,
@ -769,12 +736,11 @@ Parser.parseBlock = function parseBlock(p) {
*/ */
Parser.parseBlockCompact = function parseBlockCompact(p) { Parser.parseBlockCompact = function parseBlockCompact(p) {
var version, prevBlock, merkleRoot, ts, bits, nonce; var version, prevBlock, merkleRoot;
var totalTX, height; var ts, bits, nonce, totalTX, height;
var inCount, input, raw; var inCount, input;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); // Technically signed version = p.readU32(); // Technically signed
prevBlock = p.readHash('hex'); prevBlock = p.readHash('hex');
@ -804,10 +770,6 @@ Parser.parseBlockCompact = function parseBlockCompact(p) {
else else
height = -1; height = -1;
raw = p.data;
p.end();
return { return {
version: version, version: version,
prevBlock: prevBlock, prevBlock: prevBlock,
@ -818,8 +780,7 @@ Parser.parseBlockCompact = function parseBlockCompact(p) {
totalTX: totalTX, totalTX: totalTX,
coinbaseHeight: height, coinbaseHeight: height,
txs: [], txs: [],
_raw: raw, raw: p.data
_size: raw.length
}; };
}; };
@ -833,7 +794,6 @@ Parser.parseInput = function parseInput(p) {
var hash, index, script, sequence; var hash, index, script, sequence;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
hash = p.readHash('hex'); hash = p.readHash('hex');
index = p.readU32(); index = p.readU32();
@ -847,8 +807,7 @@ Parser.parseInput = function parseInput(p) {
}, },
coin: null, coin: null,
script: script, script: script,
sequence: sequence, sequence: sequence
_size: p.end()
}; };
}; };
@ -862,15 +821,13 @@ Parser.parseOutput = function parseOutput(p) {
var value, script; var value, script;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
value = p.read64(); value = p.read64();
script = Parser.parseScript(p); script = Parser.parseScript(p);
return { return {
value: value, value: value,
script: script, script: script
_size: p.end()
}; };
}; };
@ -885,7 +842,6 @@ Parser.parseCoin = function parseCoin(p, extended) {
var version, height, value, script, hash, index, coinbase; var version, height, value, script, hash, index, coinbase;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); version = p.readU32();
height = p.readU32(); height = p.readU32();
@ -908,8 +864,7 @@ Parser.parseCoin = function parseCoin(p, extended) {
script: script, script: script,
coinbase: coinbase, coinbase: coinbase,
hash: hash, hash: hash,
index: index, index: index
_size: p.end()
}; };
}; };
@ -929,7 +884,6 @@ Parser.parseTX = function parseTX(p) {
return Parser.parseWitnessTX(p); return Parser.parseWitnessTX(p);
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); // Technically signed version = p.readU32(); // Technically signed
inCount = p.readVarint(); inCount = p.readVarint();
@ -947,8 +901,6 @@ Parser.parseTX = function parseTX(p) {
locktime = p.readU32(); locktime = p.readU32();
p.end();
return { return {
version: version, version: version,
flag: 1, flag: 1,
@ -991,7 +943,6 @@ Parser.parseWitnessTX = function parseWitnessTX(p) {
var version, locktime, i; var version, locktime, i;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); // Technically signed version = p.readU32(); // Technically signed
marker = p.readU8(); marker = p.readU8();
@ -1023,8 +974,6 @@ Parser.parseWitnessTX = function parseWitnessTX(p) {
locktime = p.readU32(); locktime = p.readU32();
p.end();
return { return {
version: version, version: version,
flag: flag, flag: flag,
@ -1044,13 +993,11 @@ Parser.parseScript = function parseScript(p) {
var data; var data;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
data = p.readVarBytes(); data = p.readVarBytes();
return { return {
raw: data, raw: data,
code: bcoin.script.decode(data), code: bcoin.script.decode(data)
_size: p.end()
}; };
}; };
@ -1065,7 +1012,6 @@ Parser.parseWitness = function parseWitness(p) {
var chunkCount, i; var chunkCount, i;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
chunkCount = p.readVarint(); chunkCount = p.readVarint();
@ -1073,8 +1019,7 @@ Parser.parseWitness = function parseWitness(p) {
items.push(p.readVarBytes()); items.push(p.readVarBytes());
return { return {
items: items, items: items
_size: p.end()
}; };
}; };
@ -1088,7 +1033,6 @@ Parser.parseReject = function parseReject(p) {
var message, ccode, reason, data; var message, ccode, reason, data;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
message = p.readVarString('ascii'); message = p.readVarString('ascii');
ccode = p.readU8(); ccode = p.readU8();
@ -1103,8 +1047,7 @@ Parser.parseReject = function parseReject(p) {
message: message, message: message,
ccode: constants.rejectByVal[ccode] || ccode, ccode: constants.rejectByVal[ccode] || ccode,
reason: reason, reason: reason,
data: data, data: data
_size: p.end()
}; };
}; };
@ -1118,7 +1061,6 @@ Parser.parseAddress = function parseAddress(p, full) {
var ts, services, ip, port; var ts, services, ip, port;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
if (full) // only version >= 31402 if (full) // only version >= 31402
ts = p.readU32(); ts = p.readU32();
@ -1140,8 +1082,7 @@ Parser.parseAddress = function parseAddress(p, full) {
witness: (services & constants.services.WITNESS) !== 0, witness: (services & constants.services.WITNESS) !== 0,
ipv6: utils.array2ip(ip, 6), ipv6: utils.array2ip(ip, 6),
ipv4: utils.array2ip(ip, 4), ipv4: utils.array2ip(ip, 4),
port: port, port: port
_size: p.end()
}; };
}; };
@ -1156,15 +1097,12 @@ Parser.parseAddr = function parseAddr(p) {
var i, count; var i, count;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
count = p.readVarint(); count = p.readVarint();
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
addrs.push(Parser.parseAddress(p, true)); addrs.push(Parser.parseAddress(p, true));
addrs._size = p.end();
return addrs; return addrs;
}; };
@ -1188,17 +1126,15 @@ Parser.parseAlert = function parseAlert(p) {
var version, relayUntil, expiration, id, cancel; var version, relayUntil, expiration, id, cancel;
var cancels, count, i, minVer, maxVer, subVers; var cancels, count, i, minVer, maxVer, subVers;
var priority, comment, statusBar, reserved; var priority, comment, statusBar, reserved;
var payload, size; var payload;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
payload = p.readVarBytes(); payload = p.readVarBytes();
signature = p.readVarBytes(); signature = p.readVarBytes();
size = p.end();
p = new BufferReader(payload); p = new BufferReader(payload);
p.start();
version = p.read32(); version = p.read32();
relayUntil = p.read53(); relayUntil = p.read53();
expiration = p.read53(); expiration = p.read53();
@ -1218,7 +1154,6 @@ Parser.parseAlert = function parseAlert(p) {
comment = p.readVarString('ascii'); comment = p.readVarString('ascii');
statusBar = p.readVarString('ascii'); statusBar = p.readVarString('ascii');
reserved = p.readVarString('ascii'); reserved = p.readVarString('ascii');
p.end();
return { return {
version: version, version: version,
@ -1235,8 +1170,7 @@ Parser.parseAlert = function parseAlert(p) {
statusBar: statusBar, statusBar: statusBar,
reserved: reserved, reserved: reserved,
payload: payload, payload: payload,
signature: signature, signature: signature
_size: size
}; };
}; };

View File

@ -1823,7 +1823,6 @@ TX.parseExtended = function parseExtended(buf, saveCoins, enc) {
buf = new Buffer(buf, 'hex'); buf = new Buffer(buf, 'hex');
p = new BufferReader(buf); p = new BufferReader(buf);
p.start();
tx = bcoin.protocol.parser.parseTX(p); tx = bcoin.protocol.parser.parseTX(p);
@ -1859,8 +1858,6 @@ TX.parseExtended = function parseExtended(buf, saveCoins, enc) {
} }
} }
p.end();
return tx; return tx;
}; };

View File

@ -321,15 +321,11 @@ function parseBody(data) {
var p = new BufferReader(data, true); var p = new BufferReader(data, true);
var name, items; var name, items;
p.start();
name = p.readVarString('ascii'); name = p.readVarString('ascii');
items = parseItem(p); items = parseItem(p);
assert(p.readU8() === 0x0a); assert(p.readU8() === 0x0a);
p.end();
return { return {
name: name || null, name: name || null,
items: items items: items