From f84ee142c243f513f77e51bb1aec1c5ea74d7401 Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Thu, 29 May 2014 14:46:37 -0600 Subject: [PATCH] Share merging features --- init.js | 20 ++++++++++++++++++++ libs/poolWorker.js | 39 ++++++++++++++++++++++++++++++++++++--- libs/shareProcessor.js | 19 +++++++++++++++++-- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/init.js b/init.js index fc8a81b..582db8c 100644 --- a/init.js +++ b/init.js @@ -82,6 +82,10 @@ if (cluster.isWorker){ case 'profitSwitch': new ProfitSwitch(logger); break; + case 'switchingPaymentProcessor': + var SwitchingPaymentProcessor = require('./libs/switchingPaymentProcessor.js'); + new SwitchingPaymentProcessor(logger); + break; } return; @@ -356,7 +360,21 @@ var processCoinSwitchCommand = function(params, options, reply){ }; +var startSwitchingPaymentProcessor = function(){ + if (!fs.exists('libs/switchingPaymentProcessor.js')) return; + var worker = cluster.fork({ + workerType: 'switchingPaymentProcessor', + pools: JSON.stringify(poolConfigs), + portalConfig: JSON.stringify(portalConfig) + }); + worker.on('exit', function(code, signal){ + logger.error('Master', 'Switching Payment Processor', 'Died, spawning replacement...'); + setTimeout(function(){ + startSwitchingPaymentProcessor(); + }, 2000); + }); +}; var startPaymentProcessor = function(){ @@ -434,6 +452,8 @@ var startProfitSwitch = function(){ startPaymentProcessor(); + startSwitchingPaymentProcessor(); + startWebsite(); startProfitSwitch(); diff --git a/libs/poolWorker.js b/libs/poolWorker.js index d85d016..438a379 100644 --- a/libs/poolWorker.js +++ b/libs/poolWorker.js @@ -4,6 +4,7 @@ var net = require('net'); var MposCompatibility = require('./mposCompatibility.js'); var ShareProcessor = require('./shareProcessor.js'); +var Stratum = require('stratum-pool'); module.exports = function(logger){ @@ -18,6 +19,33 @@ module.exports = function(logger){ var proxySwitch = {}; + var switchingDaemons = (function(){ + var daemons = {}; + + for (var switchName in portalConfig.switching){ + if (!portalConfig.switching[switchName].singleCoinPayout) continue; + var daemonConfig = portalConfig.switching[switchName].singleCoinPayout.daemon; + var daemon = new Stratum.daemon.interface([daemonConfig], function(severity, message){ + logger[severity](logSystem, logComponent, message); + }); + daemons[switchName] = daemon; + } + + return daemons; + })(); + + var singleCoinPayoutPorts = (function(){ + var ports = {}; + for (var switchName in portalConfig.switching){ + if (!portalConfig.switching[switchName].singleCoinPayout) continue; + for (var port in portalConfig.switching[switchName].ports){ + ports[parseInt(port)] = switchName; + } + } + return ports; + })(); + + var redisClient = redis.createClient(portalConfig.redis.port, portalConfig.redis.host); //Handle messages from master process sent via IPC @@ -128,10 +156,13 @@ module.exports = function(logger){ //Functions required for internal payment processing else{ - var shareProcessor = new ShareProcessor(logger, poolOptions); + var shareProcessor = new ShareProcessor(logger, portalConfig, poolOptions, singleCoinPayoutPorts); handlers.auth = function(port, workerName, password, authCallback){ - if (poolOptions.validateWorkerUsername !== true) + + var switchDaemon = switchingDaemons[singleCoinPayoutPorts[port]]; + + if (!switchDaemon && poolOptions.validateWorkerUsername !== true) authCallback(true); else { if (workerName.length === 40) { @@ -144,7 +175,9 @@ module.exports = function(logger){ } } else { - pool.daemon.cmd('validateaddress', [workerName], function (results) { + var daemon = switchDaemon || pool.daemon; + + daemon.cmd('validateaddress', [workerName], function (results) { var isValid = results.filter(function (r) { return r.response.isvalid }).length > 0; diff --git a/libs/shareProcessor.js b/libs/shareProcessor.js index 4495a00..90e1b0b 100644 --- a/libs/shareProcessor.js +++ b/libs/shareProcessor.js @@ -15,7 +15,7 @@ value: a hash with.. -module.exports = function(logger, poolConfig){ +module.exports = function(logger, portalConfig, poolConfig, singleCoinPayoutPorts){ var redisConfig = poolConfig.redis; var coin = poolConfig.coin.name; @@ -68,10 +68,25 @@ module.exports = function(logger, poolConfig){ this.handleShare = function(isValidShare, isValidBlock, shareData){ + + /*var shareKey = (function(){ + var port = shareData.port.toString(); + for (var switchName in portalConfig.switching){ + if (!portalConfig.switching[switchName]['singleCoinPayout']) continue; + var ports = Object.keys(portalConfig.switching[switchName].ports); + if (ports.indexOf(port) !== -1) return switchName; + } + return coin; + })();*/ + + var shareKey = singleCoinPayoutPorts[shareData.port] || coin; + + console.log('share key ' + shareKey); + var redisCommands = []; if (isValidShare){ - redisCommands.push(['hincrbyfloat', coin + ':shares:roundCurrent', shareData.worker, shareData.difficulty]); + redisCommands.push(['hincrbyfloat', shareKey + ':shares:roundCurrent', shareData.worker, shareData.difficulty]); redisCommands.push(['hincrby', coin + ':stats', 'validShares', 1]); } else{