Set coin switching feature to not require lower case. Added documentation for proxy and coin switching

This commit is contained in:
Matt 2014-04-08 12:23:48 -06:00
parent 36e09e497f
commit c3ba819f24
8 changed files with 155 additions and 105 deletions

View File

@ -132,24 +132,73 @@ Explanation for each field:
"enabled": true,
"forks": "auto"
},
/* With this enabled, the master process will start listening on the configured port for
messages from the 'scripts/blockNotify.js' script which your coin daemons can be configured
to run when a new block is available. When a blocknotify message is received, the master
process uses IPC (inter-process communication) to notify each worker process about the
message. Each worker process then sends the message to the appropriate coin pool. See
"Setting up blocknotify" below to set up your daemon to use this feature. */
/* This is the front-end. Its not finished. When it is finished, this comment will say so. */
"website": {
"enabled": true,
"port": 80,
"liveStats": true
},
/* With this enabled, the master process listen on the configured port for messages from the
'scripts/blockNotify.js' script which your coin daemons can be configured to run when a
new block is available. When a blocknotify message is received, the master process uses
IPC (inter-process communication) to notify each thread about the message. Each thread
then sends the message to the appropriate coin pool. See "Setting up blocknotify" below to
set up your daemon to use this feature. */
"blockNotifyListener": {
"enabled": true,
"port": 8117,
"password": "test"
},
/* This is the front-end. Its not finished. When it is finished, this comment will say so. */
"website": {
"enabled": true,
"port": 80,
"liveStats": true
/* With this enabled, the master process will listen on the configured port for messages from
the 'scripts/coinSwitch.js' script which will trigger your proxy pools to switch to the
specified coin (non-case-sensitive). This setting is used in conjuction with the proxy
feature below. */
"coinSwitchListener": {
"enabled": false,
"port": 8118,
"password": "test"
},
/* In a proxy configuration, you can setup ports that accept miners for work based on a
specific algorithm instead of a specific coin. Miners that connect to these ports are
automatically switched a coin determined by the server. The default coin is the first
configured pool for each algorithm and coin switching can be triggered using the
coinSwitch.js script in the scripts folder.
Please note miner address authentication must be disabled when using NOMP in a proxy
configuration and that payout processing is left up to the server administrator. */
"proxy": {
"sha256": {
"enabled": false,
"port": "3333",
"diff": 10,
"varDiff": {
"minDiff": 16, //Minimum difficulty
"maxDiff": 512, //Network difficulty will be used if it is lower than this
"targetTime": 15, //Try to get 1 share per this many seconds
"retargetTime": 90, //Check to see if we should retarget every this many seconds
"variancePercent": 30 //Allow time to very this % from target without retargeting
}
},
"scrypt": {
"enabled": false,
"port": "4444",
"diff": 10,
"varDiff": {
"minDiff": 16, //Minimum difficulty
"maxDiff": 512, //Network difficulty will be used if it is lower than this
"targetTime": 15, //Try to get 1 share per this many seconds
"retargetTime": 90, //Check to see if we should retarget every this many seconds
"variancePercent": 30 //Allow time to very this % from target without retargeting
}
},
"scrypt-n": {
"enabled": false,
"port": "5555"
}
}
}
````

View File

@ -1,21 +1,11 @@
{
"logLevel": "debug",
"clustering": {
"enabled": true,
"forks": "auto"
},
"blockNotifyListener": {
"enabled": false,
"port": 8117,
"password": "test"
},
"redisBlockNotifyListener": {
"enabled" : false,
"redisPort" : 6379,
"redisHost" : "hostname",
"psubscribeKey" : "newblocks:*"
},
"website": {
"enabled": true,
"siteTitle": "Cryppit",
@ -23,45 +13,54 @@
"statUpdateInterval": 1.5,
"hashrateWindow": 300
},
/*
In a proxy configuration, you can setup ports that accept miners for work based on
a specific algorithm instead of a specific coin. Miners that connect to these ports
are automatically switched a coin determined by the server.
The default coin is the first configured pool for each algorithm and coin switching
can be triggered using the coinSwitch.js script in the scripts folder.
"blockNotifyListener": {
"enabled": false,
"port": 8117,
"password": "test"
},
"coinSwitchListener": {
"enabled": false,
"port": 8118,
"password": "test"
},
Please note miner address authentication must be disabled when using NOMP in a proxy
configuration and that payout processing is left up to the server administrator.
*/
"proxy": {
"sha256": {
"enabled": false,
"port": "3333",
"diff": 10,
"diff": 10,
"varDiff": {
"minDiff": 16, //Minimum difficulty
"maxDiff": 512, //Network difficulty will be used if it is lower than this
"targetTime": 15, //Try to get 1 share per this many seconds
"retargetTime": 90, //Check to see if we should retarget every this many seconds
"variancePercent": 30 //Allow time to very this % from target without retargeting
"minDiff": 16,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
},
"scrypt": {
"enabled": false,
"port": "4444",
"diff": 10,
"diff": 10,
"varDiff": {
"minDiff": 16, //Minimum difficulty
"maxDiff": 512, //Network difficulty will be used if it is lower than this
"targetTime": 15, //Try to get 1 share per this many seconds
"retargetTime": 90, //Check to see if we should retarget every this many seconds
"variancePercent": 30 //Allow time to very this % from target without retargeting
"minDiff": 16,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
},
"scrypt-n": {
"enabled": false,
"port": "5555"
}
},
"redisBlockNotifyListener": {
"enabled": false,
"redisPort": 6379,
"redisHost": "hostname",
"psubscribeKey": "newblocks:*"
}
}
}

View File

@ -91,11 +91,11 @@ var buildPoolConfigs = function(){
var coinProfile = JSON.parse(JSON.minify(fs.readFileSync(coinFilePath, {encoding: 'utf8'})));
poolOptions.coin = coinProfile;
configs[poolOptions.coin.name.toLowerCase()] = poolOptions;
configs[poolOptions.coin.name] = poolOptions;
if (!(coinProfile.algorithm in algos)){
logger.error('Master', coinProfile.name, 'Cannot run a pool for unsupported algorithm "' + coinProfile.algorithm + '"');
delete configs[poolOptions.coin.name.toLowerCase()];
delete configs[poolOptions.coin.name];
}
});
@ -210,7 +210,7 @@ var startCoinswitchListener = function(portalConfig){
});
var ipcMessage = {
type:'switch',
coin: message.coin.toLowerCase()
coin: message.coin
};
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send(ipcMessage);

View File

@ -1,5 +1,4 @@
var Stratum = require('stratum-pool');
var Vardiff = require('stratum-pool/lib/varDiff.js');
var redis = require('redis');
var net = require('net');
@ -24,8 +23,15 @@ module.exports = function(logger){
switch(message.type){
case 'blocknotify':
var pool = pools[message.coin.toLowerCase()]
if (pool) pool.processBlockNotify(message.hash)
var messageCoin = message.coin.toLowerCase();
var poolTarget = Object.keys(pools).filter(function(p){
return p.toLowerCase() === messageCoin;
})[0];
if (poolTarget)
pools[poolTarget].processBlockNotify(message.hash);
break;
// IPC message for pool switching
@ -34,13 +40,17 @@ module.exports = function(logger){
var logComponent = 'Switch';
var logSubCat = 'Thread ' + (parseInt(forkId) + 1);
var newCoin = message.coin.toLowerCase();
if (!poolConfigs.hasOwnProperty(newCoin)) {
logger.debug(logSystem, logComponent, logSubCat, 'Switch message to coin that is not recognized: ' + newCoin);
break;
}
var messageCoin = message.coin.toLowerCase();
var newCoin = Object.keys(pools).filter(function(p){
return p.toLowerCase() === messageCoin;
})[0];
var algo = poolConfigs[newCoin].coin.algorithm;
if (!newCoin){
logger.debug(logSystem, logComponent, logSubCat, 'Switch message to coin that is not recognized: ' + messageCoin);
break;
}
var algo = poolConfigs[newCoin].coin.algorithm;
var newPool = pools[newCoin];
var oldCoin = proxySwitch[algo].currentPool;
var oldPool = pools[oldCoin];
@ -168,7 +178,7 @@ module.exports = function(logger){
});
pool.start();
pools[poolOptions.coin.name.toLowerCase()] = pool;
pools[poolOptions.coin.name] = pool;
});
@ -212,7 +222,7 @@ module.exports = function(logger){
port: portalConfig.proxy[algorithm].port,
currentPool: initalPool,
proxy: {}
}
};
// Copy diff and vardiff configuation into pools that match our algorithm so the stratum server can pick them up
@ -221,24 +231,18 @@ module.exports = function(logger){
// routed into instead.
//
if (portalConfig.proxy[algorithm].hasOwnProperty('varDiff')) {
proxySwitch[algorithm].varDiff = new Vardiff(proxySwitch[algorithm].port, portalConfig.proxy[algorithm].varDiff);
proxySwitch[algorithm].diff = portalConfig.proxy[algorithm].diff;
proxySwitch[algorithm].varDiff = new Stratum.varDiff(proxySwitch[algorithm].port, portalConfig.proxy[algorithm].varDiff);
proxySwitch[algorithm].diff = portalConfig.proxy[algorithm].diff;
}
Object.keys(pools).forEach(function (coinName) {
var a = poolConfigs[coinName].coin.algorithm;
var p = pools[coinName];
if (a == algorithm) {
if (a === algorithm) {
p.setVarDiff(proxySwitch[algorithm].port, proxySwitch[algorithm].varDiff);
// Set diff for proxy port by mimicking coin port config and setting it in the pool
// the diff wasn't being picked up by the stratum server for proxy workers and was always using the default of 8
//p.options.ports[proxySwitch[algorithm].port] = {};
//p.options.ports[proxySwitch[algorithm].port].proxy = true;
//p.options.ports[proxySwitch[algorithm].port].diff = proxySwitch[algorithm].diff;
}
});
proxySwitch[algorithm].proxy = net.createServer({allowHalfOpen: true}, function(socket) {
proxySwitch[algorithm].proxy = net.createServer(function(socket) {
var currentPool = proxySwitch[algorithm].currentPool;
var logSubCat = 'Thread ' + (parseInt(forkId) + 1);

View File

@ -18,7 +18,7 @@ module.exports = function(logger, poolConfig){
var internalConfig = poolConfig.shareProcessing.internal;
var redisConfig = internalConfig.redis;
var coin = poolConfig.coin.name.toLowerCase();
var coin = poolConfig.coin.name;
var forkId = process.env.forkId;
var logSystem = 'Pool';

View File

@ -1,5 +1,5 @@
{
"enabled": false,
"enabled": true,
"coin": "litecoin.json",
"address": "n4jSe18kZMCdGcZqaYprShXW6EH1wivUK1",

View File

@ -1,21 +1,20 @@
/*
This script should be hooked to the coin daemon as follow:
litecoind -blocknotify="node /path/to/this/script/blockNotify.js localhost:8117 password litecoin %s"
The above will send tell litecoin to launch this script with those parameters every time a block is found.
This script will then send the blockhash along with other information to a listening tcp socket
*/
This script should be hooked to the coin daemon as follow:
litecoind -blocknotify="node /path/to/this/script/blockNotify.js localhost:8117 password litecoin %s"
The above will send tell litecoin to launch this script with those parameters every time a block is found.
This script will then send the blockhash along with other information to a listening tcp socket
*/
var net = require('net');
var config = process.argv[2];
var parts = config.split(':');
var host = parts[0];
var port = parts[1];
var password = process.argv[3];
var coin = process.argv[4];
var net = require('net');
var config = process.argv[2];
var parts = config.split(':');
var host = parts[0];
var port = parts[1];
var password = process.argv[3];
var coin = process.argv[4];
var blockHash = process.argv[5];
var client = net.connect(port, host, function() {
var client = net.connect(port, host, function () {
console.log('client connected');
client.write(JSON.stringify({
password: password,
@ -24,12 +23,12 @@ var client = net.connect(port, host, function() {
}) + '\n');
});
client.on('data', function(data) {
client.on('data', function (data) {
console.log(data.toString());
//client.end();
});
client.on('end', function() {
client.on('end', function () {
console.log('client disconnected');
//process.exit();
});

View File

@ -1,38 +1,37 @@
/*
This script demonstrates sending a coin switch request and can be invoked from the command line
with:
This script demonstrates sending a coin switch request and can be invoked from the command line
with:
"node coinSwitch.js localhost:8118 password %s"
where <%s> is the name of the coin proxy miners will be switched onto.
where <%s> is the name of the coin proxy miners will be switched onto.
If the coin name is not configured, disabled or matches the existing proxy setting, no action
will be taken by NOMP on receipt of the message.
*/
If the coin name is not configured, disabled or matches the existing proxy setting, no action
will be taken by NOMP on receipt of the message.
*/
var net = require('net');
var config = process.argv[2];
var parts = config.split(':');
var host = parts[0];
var port = parts[1];
var password = process.argv[3];
var coin = process.argv[4];
var blockHash = process.argv[5];
var net = require('net');
var config = process.argv[2];
var parts = config.split(':');
var host = parts[0];
var port = parts[1];
var password = process.argv[3];
var coin = process.argv[4];
var client = net.connect(port, host, function() {
var client = net.connect(port, host, function () {
console.log('client connected');
client.write(JSON.stringify({
password: password,
coin: coin,
coin: coin
}) + '\n');
});
client.on('data', function(data) {
client.on('data', function (data) {
console.log(data.toString());
//client.end();
});
client.on('end', function() {
client.on('end', function () {
console.log('client disconnected');
//process.exit();
});