diff --git a/config_example.json b/config_example.json index 4763ad2..944b8f8 100644 --- a/config_example.json +++ b/config_example.json @@ -57,6 +57,10 @@ "invalidPercent": 25, "checkThreshold": 30 }, + "fixedDiff": { + "enabled": true, + "addressSeparator": "." + }, "slushMining": { "enabled": false, "weight": 300, diff --git a/lib/pool.js b/lib/pool.js index 2b0ae2f..2976f8e 100644 --- a/lib/pool.js +++ b/lib/pool.js @@ -56,7 +56,9 @@ setInterval(function(){ var now = Date.now() / 1000 | 0; for (var minerId in connectedMiners){ var miner = connectedMiners[minerId]; - miner.retarget(now); + if(!miner.noRetarget) { + miner.retarget(now); + } } }, config.poolServer.varDiff.retargetTime * 1000); @@ -200,12 +202,13 @@ var VarDiff = (function(){ }; })(); -function Miner(id, login, pass, ip, startingDiff, pushMessage){ +function Miner(id, login, pass, ip, startingDiff, noRetarget, pushMessage){ this.id = id; this.login = login; this.pass = pass; this.ip = ip; this.pushMessage = pushMessage; + this.noRetarget = noRetarget; this.heartbeat(); this.difficulty = startingDiff; this.validJobs = []; @@ -358,7 +361,7 @@ function recordShareData(miner, job, shareDiff, blockCandidate, hashHex, shareTy var dateNowSeconds = dateNow / 1000 | 0; //Weighting older shares lower than newer ones to prevent pool hopping - if (config.poolServer.slushMining.enabled) { + if (config.poolServer.slushMining.enabled) { if (lastChecked + config.poolServer.slushMining.lastBlockCheckRate <= dateNowSeconds || lastChecked == 0) { redisClient.hget(config.coin + ':stats', 'lastBlockFound', function(error, result) { if (error) { @@ -369,7 +372,7 @@ function recordShareData(miner, job, shareDiff, blockCandidate, hashHex, shareTy lastChecked = dateNowSeconds; }); } - + job.score = job.difficulty * Math.pow(Math.E, ((dateNowSeconds - scoreTime) / config.poolServer.slushMining.weight)); //Score Calculation log('info', logSystem, 'Submitted score ' + job.score + ' with difficulty ' + job.difficulty + ' and the time ' + scoreTime); } @@ -495,23 +498,42 @@ function handleMinerMethod(method, params, ip, portData, sendReply, pushMessage) switch(method){ case 'login': - if (!params.login){ + var login = params.login; + if (!login){ sendReply('missing login'); return; } - if (!utils.isValidAddress(params.login, config.poolServer.poolAddress[0])){ + if (!utils.isValidAddress(login, config.poolServer.poolAddress[0])){ sendReply('invalid address used for login'); return; } + + var difficulty = portData.difficulty; + var noRetarget = portData.noRetarget; + if(config.poolServer.fixedDiff.enabled) { + var fixedDiffCharPos = login.indexOf(config.poolServer.fixedDiff.addressSeparator); + if(fixedDiffCharPos != -1) { + noRetarget = true; + difficulty = parseInt(login.substr(fixedDiffCharPos + 1)) || portData.difficulty; + if(!difficulty || difficulty < config.poolServer.varDiff.minDiff) { + difficulty = config.poolServer.varDiff.minDiff; + noRetarget = portData.noRetarget; + } + + login = login.substr(0, fixedDiffCharPos); + log('info', logSystem, 'Miner difficulty fixed to %s', [difficulty]); + } + } + var minerId = utils.uid(); - miner = new Miner(minerId, params.login, params.pass, ip, portData.difficulty, pushMessage); + miner = new Miner(minerId, login, params.pass, ip, difficulty, noRetarget, pushMessage); connectedMiners[minerId] = miner; sendReply(null, { id: minerId, job: miner.getJob(), status: 'OK' }); - log('info', logSystem, 'Miner connected %s@%s', [params.login, miner.ip]); + log('info', logSystem, 'Miner connected %s@%s', [login, miner.ip]); break; case 'getjob': if (!miner){