more parsing.

This commit is contained in:
Christopher Jeffrey 2016-03-15 15:18:16 -07:00
parent f5142046a9
commit 836a2357d6

View File

@ -154,23 +154,21 @@ Parser.prototype.parsePayload = function parsePayload(cmd, p) {
Parser.parsePing = function parsePing(p) { Parser.parsePing = function parsePing(p) {
p = new BufferReader(p); p = new BufferReader(p);
p.start();
if (p.left() < 8)
throw new Error('pong packet is too small');
return { return {
nonce: p.readU64() nonce: p.readU64(),
_size: p.end()
}; };
}; };
Parser.parsePong = function parsePong(p) { Parser.parsePong = function parsePong(p) {
p = new BufferReader(p); p = new BufferReader(p);
p.start();
if (p.left() < 8)
throw new Error('ping packet is too small');
return { return {
nonce: p.readU64() nonce: p.readU64(),
_size: p.end()
}; };
}; };
@ -178,29 +176,17 @@ 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.readU32(); version = p.read32();
services = p.readU64(); services = p.readU64();
// Timestamp
ts = p.read64(); ts = p.read64();
// Our address (recv)
recv = Parser.parseAddress(p, false); recv = Parser.parseAddress(p, false);
// Their Address (from)
from = Parser.parseAddress(p, false); from = Parser.parseAddress(p, false);
// Nonce, very dramatic
nonce = p.readU64(); nonce = p.readU64();
// User agent length
agent = p.readVarString('ascii'); agent = p.readVarString('ascii');
height = p.read32();
// Start height
height = p.readU32();
// Relay
try { try {
relay = p.readU8() === 1; relay = p.readU8() === 1;
} catch (e) { } catch (e) {
@ -216,9 +202,13 @@ Parser.parseVersion = function parseVersion(p) {
try { try {
services = services.toNumber(); services = services.toNumber();
} catch (e) { } catch (e) {
services = 1; services = 0;
} }
assert(version >= 0, 'Version is negative.');
assert(ts >= 0, 'Timestamp is negative.');
assert(height >= 0, 'Height is negative.');
return { return {
version: version, version: version,
services: services, services: services,
@ -232,7 +222,8 @@ Parser.parseVersion = function parseVersion(p) {
nonce: nonce, nonce: nonce,
agent: agent, agent: agent,
height: height, height: height,
relay: relay relay: relay,
_size: p.end()
}; };
}; };
@ -241,6 +232,7 @@ Parser.parseInvList = function parseInvList(p) {
var i, count; var i, count;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
count = p.readUIntv(); count = p.readUIntv();
@ -251,6 +243,8 @@ Parser.parseInvList = function parseInvList(p) {
}); });
} }
items._size = p.end();
return items; return items;
}; };
@ -297,6 +291,7 @@ Parser.parseHeaders = function parseHeaders(p) {
var i, count; var i, count;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
count = p.readUIntv(); count = p.readUIntv();
@ -312,6 +307,8 @@ Parser.parseHeaders = function parseHeaders(p) {
}); });
} }
headers._size = p.end();
return headers; return headers;
}; };
@ -346,8 +343,8 @@ Parser.parseBlock = function parseBlock(p) {
bits: bits, bits: bits,
nonce: nonce, nonce: nonce,
txs: txs, txs: txs,
_size: p.end(), _witnessSize: witnessSize,
_witnessSize: witnessSize _size: p.end()
}; };
}; };
@ -413,13 +410,13 @@ Parser.parseInput = function parseInput(p) {
sequence = p.readU32(); sequence = p.readU32();
return { return {
_size: p.end(),
prevout: { prevout: {
hash: hash, hash: hash,
index: index index: index
}, },
script: script, script: script,
sequence: sequence sequence: sequence,
_size: p.end()
}; };
}; };
@ -433,9 +430,9 @@ Parser.parseOutput = function parseOutput(p) {
script = new bcoin.script(p.readVarBytes()); script = new bcoin.script(p.readVarBytes());
return { return {
_size: p.end(),
value: value, value: value,
script: script script: script,
_size: p.end()
}; };
}; };
@ -443,6 +440,7 @@ Parser.parseCoin = function parseCoin(p, extended) {
var version, height, value, script, hash, index, spent; var version, height, value, script, hash, index, spent;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
version = p.readU32(); version = p.readU32();
height = p.readU32(); height = p.readU32();
@ -471,7 +469,8 @@ Parser.parseCoin = function parseCoin(p, extended) {
script: script, script: script,
hash: hash, hash: hash,
index: index, index: index,
spent: spent spent: spent,
_size: p.end()
}; };
}; };
@ -593,8 +592,8 @@ Parser.parseWitnessTX = function parseWitnessTX(p) {
locktime: locktime, locktime: locktime,
// _raw: raw, // _raw: raw,
// _size: raw.length, // _size: raw.length,
_size: p.end(), _witnessSize: witnessSize + 2,
_witnessSize: witnessSize + 2 _size: p.end()
}; };
}; };
@ -611,8 +610,8 @@ Parser.parseWitness = function parseWitness(p) {
witness.push(p.readVarBytes()); witness.push(p.readVarBytes());
return { return {
_size: p.end(), witness: new bcoin.script.witness(witness),
witness: new bcoin.script.witness(witness) _size: p.end()
}; };
}; };
@ -620,6 +619,7 @@ 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();
@ -630,7 +630,8 @@ 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()
}; };
}; };
@ -638,6 +639,7 @@ 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) { if (full) {
ts = p.readU32(); ts = p.readU32();
@ -666,7 +668,8 @@ 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()
}; };
}; };
@ -675,12 +678,15 @@ Parser.parseAddr = function parseAddr(p) {
var i, count; var i, count;
p = new BufferReader(p); p = new BufferReader(p);
p.start();
count = p.readUIntv(); count = p.readUIntv();
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;
}; };