Browse Source

Merge pull request #19 from jgarzik/headers

Connection, const: add bits necessary for getheaders/headers
patch-2
Stephen Pair 11 years ago
parent
commit
64466512be
  1. 40
      Block.js
  2. 98
      Connection.js
  3. 34
      Transaction.js
  4. 7
      const.js

40
Block.js

@ -48,25 +48,27 @@ function spec(b) {
return buf;
};
Block.prototype.parseHeader = function parseHeader(buf) {
if (buf.length != 80)
throw new VerificationError('Block header length invalid');
var vars = Binary.parse(buf)
.word32lu('version')
.buffer('prev_hash', 32)
.buffer('merkle_root', 32)
.word32lu('timestamp')
.word32lu('bits')
.word32lu('nonce')
.vars;
this.version = vars.version;
this.prev_hash = vars.prev_hash;
this.merkle_root = vars.merkle_root;
this.timestamp = vars.timestamp;
this.bits = vars.bits;
this.nonce = vars.nonce;
Block.prototype.parse = function parse(parser, headerOnly) {
this.version = parser.word32le();
this.prev_hash = parser.buffer(32);
this.merkle_root = parser.buffer(32);
this.timestamp = parser.word32le();
this.bits = parser.word32le();
this.nonce = parser.word32le();
this.txs = [];
this.size = 0;
if (headerOnly)
return;
var txCount = parser.varInt();
for (i = 0; i < txCount; i++) {
var tx = new Transaction();
tx.parse(parser);
this.txs.push(tx);
}
};
Block.prototype.calcHash = function calcHash() {

98
Connection.js

@ -13,6 +13,8 @@ function spec(b) {
var Buffers = b.Buffers || require('buffers');
require('./Buffers.monkey').patch(Buffers);
var noop = function() {};
var Block = require('./Block').class();
var Transaction = require('./Transaction').class();
var util = b.util || require('./util/util');
var Parser = b.Parser || require('./util/BinaryParser').class();
var doubleSha256 = b.doubleSha256 || util.twoSha256;
@ -185,7 +187,7 @@ function spec(b) {
this.sendMessage('version', put.buffer());
};
Connection.prototype.sendGetBlocks = function (starts, stop) {
Connection.prototype.sendGetBlocks = function (starts, stop, wantHeaders) {
var put = new Put();
put.word32le(this.sendVer);
@ -205,7 +207,14 @@ function spec(b) {
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) {
@ -430,32 +439,44 @@ function spec(b) {
}
break;
case 'headers':
data.count = parser.varInt();
data.headers = [];
for (i = 0; i < data.count; i++) {
var header = new Block();
header.parse(parser);
data.headers.push(header);
}
break;
case 'block':
data.version = parser.word32le();
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 block = new Block();
block.parse(parser);
var txCount = parser.varInt();
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 = [];
for (i = 0; i < txCount; i++) {
data.txs.push(Connection.parseTx(parser));
}
data.txs = block.txs;
data.size = payload.length;
break;
case 'tx':
var txData = Connection.parseTx(parser);
var tx = new Transaction();
tx.parse(parser);
return {
command: command,
version: txData.version,
lock_time: txData.lock_time,
ins: txData.ins,
outs: txData.outs
version: tx.version,
lock_time: tx.lock_time,
ins: tx.ins,
outs: tx.outs,
tx: tx,
};
case 'getblocks':
@ -521,47 +542,6 @@ function spec(b) {
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;
};
module.defineClass(spec);

34
Transaction.js

@ -575,6 +575,40 @@ function spec(b) {
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 =
function TransactionInputsCache(tx)

7
const.js

@ -0,0 +1,7 @@
exports.MSG = {
TX: 1,
BLOCK: 2,
FILTERED_BLOCK: 3,
};
Loading…
Cancel
Save