From 96cfc412a844e1d926276537e26813bde15910a8 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 19 Feb 2014 15:53:36 -0700 Subject: [PATCH 1/3] Added random or configurable instance ID --- lib/jobManager.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/jobManager.js b/lib/jobManager.js index 26ad9d7..48da15a 100644 --- a/lib/jobManager.js +++ b/lib/jobManager.js @@ -1,4 +1,5 @@ var events = require('events'); +var crypto = require('crypto'); var bignum = require('bignum'); @@ -14,18 +15,17 @@ var blockTemplate = require('./blockTemplate.js'); //Unique extranonce per subscriber -var ExtraNonceCounter = function(){ - var instanceId = 31; +var ExtraNonceCounter = function(configInstanceId){ + + var instanceId = configInstanceId || crypto.randomBytes(4).readUInt32LE(0); var counter = instanceId << 27; - var size = util.packUInt32BE(counter).length; this.next = function(){ - var extraNonce = util.packUInt32BE(counter++); + var extraNonce = util.packUInt32BE(Math.abs(counter++)); return extraNonce.toString('hex'); }; - this.size = function(){ - return size; - }; + + this.size = 4; //bytes }; //Unique job per new block template @@ -126,7 +126,7 @@ var JobManager = module.exports = function JobManager(options){ //public members - this.extraNonceCounter = new ExtraNonceCounter(); + this.extraNonceCounter = new ExtraNonceCounter(options.instanceId); this.extraNoncePlaceholder = new Buffer('f000000ff111111f', 'hex'); this.extraNonce2Size = this.extraNoncePlaceholder.length - this.extraNonceCounter.size(); From 9d8255a620b23024564c2549697b991c898f2684 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 19 Feb 2014 16:07:25 -0700 Subject: [PATCH 2/3] Vardiff perfect fix --- lib/pool.js | 2 +- lib/stratum.js | 9 +++++---- lib/varDiff.js | 10 +++++----- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/pool.js b/lib/pool.js index d9909e2..db8fe8e 100644 --- a/lib/pool.js +++ b/lib/pool.js @@ -284,7 +284,7 @@ var pool = module.exports = function pool(options, authorizeFn){ }).on('submit', function(params, resultCallback){ var result =_this.jobManager.processShare( params.jobId, - client.difficulty, + client.currentDifficulty, client.extraNonce1, params.extraNonce2, params.nTime, diff --git a/lib/stratum.js b/lib/stratum.js index 1138ce1..81cc447 100644 --- a/lib/stratum.js +++ b/lib/stratum.js @@ -139,9 +139,9 @@ var StratumClient = function(options){ }); } ); - if (_this.lastEmittedDiff !== _this.difficulty){ - _this.lastEmittedDiff = _this.difficulty - _this.emit('difficultyChanged', _this.difficulty); + if (_this.lastEmittedDiff !== _this.currentDifficulty){ + _this.lastEmittedDiff = _this.currentDifficulty + _this.emit('difficultyChanged', _this.currentDifficulty); } } @@ -207,7 +207,7 @@ var StratumClient = function(options){ } if (difficulty !== this.difficulty) { - this.difficulty = difficulty; + _this.latestDifficulty = difficulty; sendJson({ id : null, method: "mining.set_difficulty", @@ -226,6 +226,7 @@ var StratumClient = function(options){ method: "mining.notify", params: jobParams }); + _this.currentDifficulty = _this.latestDifficulty }; }; StratumClient.prototype.__proto__ = events.EventEmitter.prototype; diff --git a/lib/varDiff.js b/lib/varDiff.js index 494a3ef..415705e 100644 --- a/lib/varDiff.js +++ b/lib/varDiff.js @@ -78,7 +78,7 @@ var varDiff = module.exports = function varDiff(options, poolDifficulty){ lastRtc = ts - options.retargetTime / 2; lastTs = ts; timeBuffer = new RingBuffer(bufferSize); - console.log(bufferSize+ ' first time share vardiff curdiff: '+client.difficulty); + console.log(bufferSize+ ' first time share vardiff curdiff: '+client.currentDifficulty); return; } var sinceLast = ts - lastTs; @@ -97,10 +97,10 @@ var varDiff = module.exports = function varDiff(options, poolDifficulty){ var ddiff; - if (avg > tMax && client.difficulty > options.minDifficulty) { + if (avg > tMax && client.currentDifficulty > options.minDifficulty) { ddiff = 0.5; - if (ddiff * client.difficulty < options.minDifficulty) { - ddiff = options.minDifficulty / client.difficulty; + if (ddiff * client.currentDifficulty < options.minDifficulty) { + ddiff = options.minDifficulty / client.currentDifficulty; } } else if (avg < tMin) { ddiff = 2; @@ -119,7 +119,7 @@ var varDiff = module.exports = function varDiff(options, poolDifficulty){ return; } - var newDiff = client.difficulty * ddiff; + var newDiff = client.currentDifficulty * ddiff; timeBuffer.clear(); //console.log('sending new difficutly ' + newDiff); From 25df42692c773fc82d1aaa2926d34637f7b57a7d Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 19 Feb 2014 16:32:38 -0700 Subject: [PATCH 3/3] Uses pendingDifficulty --- lib/jobManager.js | 2 +- lib/pool.js | 2 +- lib/stratum.js | 20 ++++++++++++++------ lib/varDiff.js | 10 +++++----- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/jobManager.js b/lib/jobManager.js index 48da15a..e3df88f 100644 --- a/lib/jobManager.js +++ b/lib/jobManager.js @@ -181,7 +181,7 @@ var JobManager = module.exports = function JobManager(options){ } var nTimeInt = parseInt(nTime, 16); - if (nTimeInt < job.rpcData.curtime || nTime > submitTime + 7200) { + if (nTimeInt < job.rpcData.curtime || nTimeInt > submitTime + 7200) { return shareError([20, 'ntime out of range']); } diff --git a/lib/pool.js b/lib/pool.js index db8fe8e..d9909e2 100644 --- a/lib/pool.js +++ b/lib/pool.js @@ -284,7 +284,7 @@ var pool = module.exports = function pool(options, authorizeFn){ }).on('submit', function(params, resultCallback){ var result =_this.jobManager.processShare( params.jobId, - client.currentDifficulty, + client.difficulty, client.extraNonce1, params.extraNonce2, params.nTime, diff --git a/lib/stratum.js b/lib/stratum.js index 81cc447..8496aa6 100644 --- a/lib/stratum.js +++ b/lib/stratum.js @@ -200,33 +200,41 @@ var StratumClient = function(options){ * IF the given difficulty is valid and new it'll send it to the client. * returns boolean **/ - this.sendDifficulty = function(difficulty){ + this.sendDifficulty = function(difficulty, sendImmediately){ if (typeof(difficulty) != 'number') { console.error('[StratumClient.sendDifficulty] given difficulty parameter is not a number: ['+difficulty+']'); return false; } - if (difficulty !== this.difficulty) { - _this.latestDifficulty = difficulty; + if (difficulty === this.difficulty) + return false; + + if (sendImmediately){ + _this.pendingDifficulty = null; + _this.difficulty = difficulty; sendJson({ id : null, method: "mining.set_difficulty", params: [difficulty]//[512], }); return true; - } else { - return false; + } + else{ + _this.pendingDifficulty = difficulty; } }; this.sendMiningJob = function(jobParams){ + if (_this.pendingDifficulty){ + _this.sendDifficulty(_this.pendingDifficulty, true); + } sendJson({ id : null, method: "mining.notify", params: jobParams }); - _this.currentDifficulty = _this.latestDifficulty + }; }; StratumClient.prototype.__proto__ = events.EventEmitter.prototype; diff --git a/lib/varDiff.js b/lib/varDiff.js index 415705e..494a3ef 100644 --- a/lib/varDiff.js +++ b/lib/varDiff.js @@ -78,7 +78,7 @@ var varDiff = module.exports = function varDiff(options, poolDifficulty){ lastRtc = ts - options.retargetTime / 2; lastTs = ts; timeBuffer = new RingBuffer(bufferSize); - console.log(bufferSize+ ' first time share vardiff curdiff: '+client.currentDifficulty); + console.log(bufferSize+ ' first time share vardiff curdiff: '+client.difficulty); return; } var sinceLast = ts - lastTs; @@ -97,10 +97,10 @@ var varDiff = module.exports = function varDiff(options, poolDifficulty){ var ddiff; - if (avg > tMax && client.currentDifficulty > options.minDifficulty) { + if (avg > tMax && client.difficulty > options.minDifficulty) { ddiff = 0.5; - if (ddiff * client.currentDifficulty < options.minDifficulty) { - ddiff = options.minDifficulty / client.currentDifficulty; + if (ddiff * client.difficulty < options.minDifficulty) { + ddiff = options.minDifficulty / client.difficulty; } } else if (avg < tMin) { ddiff = 2; @@ -119,7 +119,7 @@ var varDiff = module.exports = function varDiff(options, poolDifficulty){ return; } - var newDiff = client.currentDifficulty * ddiff; + var newDiff = client.difficulty * ddiff; timeBuffer.clear(); //console.log('sending new difficutly ' + newDiff);