Merge pull request #19 from jgarzik/headers
Connection, const: add bits necessary for getheaders/headers
This commit is contained in:
commit
64466512be
36
Block.js
36
Block.js
|
@ -48,25 +48,27 @@ function spec(b) {
|
||||||
return buf;
|
return buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
Block.prototype.parseHeader = function parseHeader(buf) {
|
Block.prototype.parse = function parse(parser, headerOnly) {
|
||||||
if (buf.length != 80)
|
this.version = parser.word32le();
|
||||||
throw new VerificationError('Block header length invalid');
|
this.prev_hash = parser.buffer(32);
|
||||||
|
this.merkle_root = parser.buffer(32);
|
||||||
|
this.timestamp = parser.word32le();
|
||||||
|
this.bits = parser.word32le();
|
||||||
|
this.nonce = parser.word32le();
|
||||||
|
|
||||||
var vars = Binary.parse(buf)
|
this.txs = [];
|
||||||
.word32lu('version')
|
this.size = 0;
|
||||||
.buffer('prev_hash', 32)
|
|
||||||
.buffer('merkle_root', 32)
|
|
||||||
.word32lu('timestamp')
|
|
||||||
.word32lu('bits')
|
|
||||||
.word32lu('nonce')
|
|
||||||
.vars;
|
|
||||||
|
|
||||||
this.version = vars.version;
|
if (headerOnly)
|
||||||
this.prev_hash = vars.prev_hash;
|
return;
|
||||||
this.merkle_root = vars.merkle_root;
|
|
||||||
this.timestamp = vars.timestamp;
|
var txCount = parser.varInt();
|
||||||
this.bits = vars.bits;
|
|
||||||
this.nonce = vars.nonce;
|
for (i = 0; i < txCount; i++) {
|
||||||
|
var tx = new Transaction();
|
||||||
|
tx.parse(parser);
|
||||||
|
this.txs.push(tx);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Block.prototype.calcHash = function calcHash() {
|
Block.prototype.calcHash = function calcHash() {
|
||||||
|
|
100
Connection.js
100
Connection.js
|
@ -13,6 +13,8 @@ function spec(b) {
|
||||||
var Buffers = b.Buffers || require('buffers');
|
var Buffers = b.Buffers || require('buffers');
|
||||||
require('./Buffers.monkey').patch(Buffers);
|
require('./Buffers.monkey').patch(Buffers);
|
||||||
var noop = function() {};
|
var noop = function() {};
|
||||||
|
var Block = require('./Block').class();
|
||||||
|
var Transaction = require('./Transaction').class();
|
||||||
var util = b.util || require('./util/util');
|
var util = b.util || require('./util/util');
|
||||||
var Parser = b.Parser || require('./util/BinaryParser').class();
|
var Parser = b.Parser || require('./util/BinaryParser').class();
|
||||||
var doubleSha256 = b.doubleSha256 || util.twoSha256;
|
var doubleSha256 = b.doubleSha256 || util.twoSha256;
|
||||||
|
@ -185,7 +187,7 @@ function spec(b) {
|
||||||
this.sendMessage('version', put.buffer());
|
this.sendMessage('version', put.buffer());
|
||||||
};
|
};
|
||||||
|
|
||||||
Connection.prototype.sendGetBlocks = function (starts, stop) {
|
Connection.prototype.sendGetBlocks = function (starts, stop, wantHeaders) {
|
||||||
var put = new Put();
|
var put = new Put();
|
||||||
put.word32le(this.sendVer);
|
put.word32le(this.sendVer);
|
||||||
|
|
||||||
|
@ -205,7 +207,14 @@ function spec(b) {
|
||||||
|
|
||||||
put.put(stopBuffer);
|
put.put(stopBuffer);
|
||||||
|
|
||||||
this.sendMessage('getblocks', put.buffer());
|
var command = 'getblocks';
|
||||||
|
if (wantHeaders)
|
||||||
|
command = 'getheaders';
|
||||||
|
this.sendMessage(command, put.buffer());
|
||||||
|
};
|
||||||
|
|
||||||
|
Connection.prototype.sendGetHeaders = function(starts, stop) {
|
||||||
|
this.sendGetBlocks(starts, stop, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
Connection.prototype.sendGetData = function (invs) {
|
Connection.prototype.sendGetData = function (invs) {
|
||||||
|
@ -430,32 +439,44 @@ function spec(b) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'block':
|
case 'headers':
|
||||||
data.version = parser.word32le();
|
data.count = parser.varInt();
|
||||||
data.prev_hash = parser.buffer(32);
|
|
||||||
data.merkle_root = parser.buffer(32);
|
|
||||||
data.timestamp = parser.word32le();
|
|
||||||
data.bits = parser.word32le();
|
|
||||||
data.nonce = parser.word32le();
|
|
||||||
|
|
||||||
var txCount = parser.varInt();
|
data.headers = [];
|
||||||
|
for (i = 0; i < data.count; i++) {
|
||||||
data.txs = [];
|
var header = new Block();
|
||||||
for (i = 0; i < txCount; i++) {
|
header.parse(parser);
|
||||||
data.txs.push(Connection.parseTx(parser));
|
data.headers.push(header);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'block':
|
||||||
|
var block = new Block();
|
||||||
|
block.parse(parser);
|
||||||
|
|
||||||
|
data.block = block;
|
||||||
|
data.version = block.version;
|
||||||
|
data.prev_hash = block.prev_hash;
|
||||||
|
data.merkle_root = block.merkle_root;
|
||||||
|
data.timestamp = block.timestamp;
|
||||||
|
data.bits = block.bits;
|
||||||
|
data.nonce = block.nonce;
|
||||||
|
|
||||||
|
data.txs = block.txs;
|
||||||
|
|
||||||
data.size = payload.length;
|
data.size = payload.length;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'tx':
|
case 'tx':
|
||||||
var txData = Connection.parseTx(parser);
|
var tx = new Transaction();
|
||||||
|
tx.parse(parser);
|
||||||
return {
|
return {
|
||||||
command: command,
|
command: command,
|
||||||
version: txData.version,
|
version: tx.version,
|
||||||
lock_time: txData.lock_time,
|
lock_time: tx.lock_time,
|
||||||
ins: txData.ins,
|
ins: tx.ins,
|
||||||
outs: txData.outs
|
outs: tx.outs,
|
||||||
|
tx: tx,
|
||||||
};
|
};
|
||||||
|
|
||||||
case 'getblocks':
|
case 'getblocks':
|
||||||
|
@ -521,47 +542,6 @@ function spec(b) {
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
Connection.parseTx = function (parser) {
|
|
||||||
if (Buffer.isBuffer(parser)) {
|
|
||||||
parser = new Parser(parser);
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = {}, i, sLen, startPos = parser.pos;
|
|
||||||
|
|
||||||
data.version = parser.word32le();
|
|
||||||
|
|
||||||
var txinCount = parser.varInt();
|
|
||||||
|
|
||||||
data.ins = [];
|
|
||||||
for (j = 0; j < txinCount; j++) {
|
|
||||||
var txin = {};
|
|
||||||
txin.o = parser.buffer(36); // outpoint
|
|
||||||
sLen = parser.varInt(); // script_len
|
|
||||||
txin.s = parser.buffer(sLen); // script
|
|
||||||
txin.q = parser.word32le(); // sequence
|
|
||||||
data.ins.push(txin);
|
|
||||||
}
|
|
||||||
|
|
||||||
var txoutCount = parser.varInt();
|
|
||||||
|
|
||||||
data.outs = [];
|
|
||||||
for (j = 0; j < txoutCount; j++) {
|
|
||||||
var txout = {};
|
|
||||||
txout.v = parser.buffer(8); // value
|
|
||||||
sLen = parser.varInt(); // script_len
|
|
||||||
txout.s = parser.buffer(sLen); // script
|
|
||||||
data.outs.push(txout);
|
|
||||||
}
|
|
||||||
|
|
||||||
data.lock_time = parser.word32le();
|
|
||||||
|
|
||||||
var endPos = parser.pos;
|
|
||||||
|
|
||||||
data.buffer = parser.subject.slice(startPos, endPos);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
return Connection;
|
return Connection;
|
||||||
};
|
};
|
||||||
module.defineClass(spec);
|
module.defineClass(spec);
|
||||||
|
|
|
@ -575,6 +575,40 @@ function spec(b) {
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Transaction.prototype.parse = function (parser) {
|
||||||
|
if (Buffer.isBuffer(parser)) {
|
||||||
|
parser = new Parser(parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
var i, sLen, startPos = parser.pos;
|
||||||
|
|
||||||
|
this.version = parser.word32le();
|
||||||
|
|
||||||
|
var txinCount = parser.varInt();
|
||||||
|
|
||||||
|
this.ins = [];
|
||||||
|
for (j = 0; j < txinCount; j++) {
|
||||||
|
var txin = new TransactionIn();
|
||||||
|
txin.o = parser.buffer(36); // outpoint
|
||||||
|
sLen = parser.varInt(); // script_len
|
||||||
|
txin.s = parser.buffer(sLen); // script
|
||||||
|
txin.q = parser.word32le(); // sequence
|
||||||
|
this.ins.push(txin);
|
||||||
|
}
|
||||||
|
|
||||||
|
var txoutCount = parser.varInt();
|
||||||
|
|
||||||
|
this.outs = [];
|
||||||
|
for (j = 0; j < txoutCount; j++) {
|
||||||
|
var txout = new TransactionOut();
|
||||||
|
txout.v = parser.buffer(8); // value
|
||||||
|
sLen = parser.varInt(); // script_len
|
||||||
|
txout.s = parser.buffer(sLen); // script
|
||||||
|
this.outs.push(txout);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lock_time = parser.word32le();
|
||||||
|
};
|
||||||
|
|
||||||
var TransactionInputsCache = exports.TransactionInputsCache =
|
var TransactionInputsCache = exports.TransactionInputsCache =
|
||||||
function TransactionInputsCache(tx)
|
function TransactionInputsCache(tx)
|
||||||
|
|
Loading…
Reference in New Issue