node-stratum-pool/jobManager.js
2014-01-06 15:17:35 -05:00

78 lines
2.1 KiB
JavaScript

var events = require('events');
var binpack = require('/usr/lib/node_modules/binpack');
var bignum = require('/usr/lib/node_modules/bignum');
var merkleTree = require('./merkleTree.js');
var coinbase = require('./coinbase.js');
var util = require('./util.js');
var blockTemplate = require('./blockTemplate.js');
/*
For each crypto currency have a templating instance which holds an array of jobs.
jobs all hold slightly modified block templates that all have the same prev hash.
any jobs with outdated prevhash should be purged.
*/
//Unique extranonce per subscriber
var ExtraNonceCounter = function(){
var instanceId = 31;
var counter = instanceId << 27;
var size = 4;
this.next = function(){
var extraNonce = binpack.packUInt32(counter++, 'big');
return extraNonce.toString('hex');
};
this.size = function(){
return size;
};
};
//Unique job per new block template
var JobCounter = function(){
var counter = 0;
this.next = function(){
counter++;
if (counter % 0xffff == 0)
counter = 1;
return counter.toString(16);
};
};
var JobManager = module.exports = function JobManager(options){
//private members
var _this = this;
var jobCounter = new JobCounter();
var jobs = {};
function CheckNewIfNewBlock(blockTemplate){
var newBlock = true;
for(var job in jobs){
if (jobs[job].rpcData.previousblockhash == blockTemplate.rpcData.previousblockhash)
newBlock = false;
}
if (newBlock)
_this.emit('newBlock', blockTemplate);
}
//public members
this.extraNonceCounter = new ExtraNonceCounter();
this.currentJob;
this.newTemplate = function(rpcData){
this.currentJob = new blockTemplate(jobCounter.next(), rpcData, options.address);
jobs[this.currentJob.jobId] = this.currentJob;
CheckNewIfNewBlock(this.currentJob);
};
};
JobManager.prototype.__proto__ = events.EventEmitter.prototype;