z-nomp/libs/shareProcessor.js

81 lines
2.8 KiB
JavaScript
Raw Normal View History

var redis = require('redis');
var Stratum = require('stratum-pool');
/*
This module deals with handling shares when in internal payment processing mode. It connects to a redis
database and inserts shares with the database structure of:
key: coin_name + ':' + block_height
value: a hash with..
key:
*/
module.exports = function(logger, poolConfig){
2014-03-03 12:51:11 -08:00
var internalConfig = poolConfig.shareProcessing.internal;
var redisConfig = internalConfig.redis;
var coin = poolConfig.coin.name;
2014-03-03 12:51:11 -08:00
var connection;
2014-03-04 12:24:02 -08:00
function connect(){
var reconnectTimeout;
connection = redis.createClient(redisConfig.port, redisConfig.host);
connection.on('ready', function(){
clearTimeout(reconnectTimeout);
logger.debug('redis', 'Successfully connected to redis database');
});
connection.on('error', function(err){
logger.error('redis', 'Redis client had an error: ' + JSON.stringify(err))
});
connection.on('end', function(){
logger.error('redis', 'Connection to redis database as been ended');
logger.warning('redis', 'Trying reconnection in 3 seconds...');
reconnectTimeout = setTimeout(function(){
connect();
}, 3000);
2014-03-04 12:24:02 -08:00
});
}
connect();
2014-03-03 12:51:11 -08:00
2014-03-12 23:37:27 -07:00
this.handleShare = function(isValidShare, isValidBlock, shareData){
2014-03-04 12:24:02 -08:00
if (!isValidShare) return;
2014-03-03 12:51:11 -08:00
/*use http://redis.io/commands/zrangebyscore to store shares with timestamps
so we can use the min-max to get shares from the last x minutes to determine hash rate :)
also use a hash like coin_stats:{ invalidShares, validShares, invalidBlocks, validBlocks, etc }
for more efficient stats
*/
2014-03-12 23:37:27 -07:00
//store share diff, worker, and unique value with a score that is the timestamp
//unique value ensures it doesnt overwrite an existing entry
//the timestamp as score lets us query shares from last X minutes to generate hashrate for each worker and pool
connection.zadd(coin + '_hashrate', Date.now() / 1000 | 0, shareData.difficulty + ':' + shareData.worker + ':' + Math.random());
2014-03-11 18:56:19 -07:00
connection.hincrby([coin + '_shares:roundCurrent', shareData.worker, shareData.difficulty], function(error, result){
2014-03-04 12:24:02 -08:00
if (error)
logger.error('redis', 'Could not store worker share')
2014-03-04 12:24:02 -08:00
});
2014-03-03 12:51:11 -08:00
2014-03-07 14:04:14 -08:00
if (isValidBlock){
2014-03-11 18:56:19 -07:00
connection.rename(coin + '_shares:roundCurrent', coin + '_shares:round' + shareData.height, function(result){
2014-03-11 12:12:46 -07:00
console.log('rename result: ' + result);
});
connection.sadd([coin + '_blocks', shareData.tx + ':' + shareData.height + ':' + shareData.reward], function(error, result){
2014-03-07 14:04:14 -08:00
if (error)
logger.error('redis', 'Could not store block data');
});
}
};
};