refactor parsing.
This commit is contained in:
parent
f6b42ae5f3
commit
90790ac675
@ -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);
|
||||
};
|
||||
|
||||
|
||||
@ -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);
|
||||
});
|
||||
};
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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);
|
||||
});
|
||||
};
|
||||
|
||||
@ -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
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user