mirror of https://github.com/BTCPrivate/z-nomp.git
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
427043b282
|
@ -170,7 +170,7 @@ Inside the `config_example.json` file, ensure the default configuration will wor
|
||||||
Explanation for each field:
|
Explanation for each field:
|
||||||
````javascript
|
````javascript
|
||||||
{
|
{
|
||||||
/* Specifies the level of log output verbosity. Anything more severy than the level specified
|
/* Specifies the level of log output verbosity. Anything more severe than the level specified
|
||||||
will also be logged. */
|
will also be logged. */
|
||||||
"logLevel": "debug", //or "warning", "error"
|
"logLevel": "debug", //or "warning", "error"
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ value: a hash with..
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = function(logger, poolConfig){
|
module.exports = function(logger, poolConfig){
|
||||||
|
|
||||||
var redisConfig = poolConfig.redis;
|
var redisConfig = poolConfig.redis;
|
||||||
|
@ -38,6 +39,31 @@ module.exports = function(logger, poolConfig){
|
||||||
logger.error(logSystem, logComponent, logSubCat, 'Connection to redis database as been ended');
|
logger.error(logSystem, logComponent, logSubCat, 'Connection to redis database as been ended');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connection.info(function(error, response){
|
||||||
|
if (error){
|
||||||
|
logger.error(logSystem, logComponent, logSubCat, 'Redis version check failed');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var parts = response.split('\r\n');
|
||||||
|
var version;
|
||||||
|
var versionString;
|
||||||
|
for (var i = 0; i < parts.length; i++){
|
||||||
|
if (parts[i].indexOf(':') !== -1){
|
||||||
|
var valParts = parts[i].split(':');
|
||||||
|
if (valParts[0] === 'redis_version'){
|
||||||
|
versionString = valParts[1];
|
||||||
|
version = parseFloat(versionString);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!version){
|
||||||
|
logger.error(logSystem, logComponent, logSubCat, 'Could not detect redis version - but be super old or broken');
|
||||||
|
}
|
||||||
|
else if (version < 2.6){
|
||||||
|
logger.error(logSystem, logComponent, logSubCat, "You're using redis version " + versionString + " the minimum required version is 2.6. Follow the damn usage instructions...");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
this.handleShare = function(isValidShare, isValidBlock, shareData){
|
this.handleShare = function(isValidShare, isValidBlock, shareData){
|
||||||
|
@ -47,17 +73,16 @@ module.exports = function(logger, poolConfig){
|
||||||
if (isValidShare){
|
if (isValidShare){
|
||||||
redisCommands.push(['hincrbyfloat', coin + ':shares:roundCurrent', shareData.worker, shareData.difficulty]);
|
redisCommands.push(['hincrbyfloat', coin + ':shares:roundCurrent', shareData.worker, shareData.difficulty]);
|
||||||
redisCommands.push(['hincrby', coin + ':stats', 'validShares', 1]);
|
redisCommands.push(['hincrby', coin + ':stats', 'validShares', 1]);
|
||||||
|
|
||||||
/* Stores share diff, worker, and unique value with a score that is the timestamp. Unique value ensures it
|
|
||||||
doesn't overwrite an existing entry, and timestamp as score lets us query shares from last X minutes to
|
|
||||||
generate hashrate for each worker and pool. */
|
|
||||||
var dateNow = Date.now();
|
|
||||||
var hashrateData = [shareData.difficulty, shareData.worker, dateNow];
|
|
||||||
redisCommands.push(['zadd', coin + ':hashrate', dateNow / 1000 | 0, hashrateData.join(':')]);
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
redisCommands.push(['hincrby', coin + ':stats', 'invalidShares', 1]);
|
redisCommands.push(['hincrby', coin + ':stats', 'invalidShares', 1]);
|
||||||
}
|
}
|
||||||
|
/* Stores share diff, worker, and unique value with a score that is the timestamp. Unique value ensures it
|
||||||
|
doesn't overwrite an existing entry, and timestamp as score lets us query shares from last X minutes to
|
||||||
|
generate hashrate for each worker and pool. */
|
||||||
|
var dateNow = Date.now();
|
||||||
|
var hashrateData = [ isValidShare ? shareData.difficulty : -shareData.difficulty, shareData.worker, dateNow];
|
||||||
|
redisCommands.push(['zadd', coin + ':hashrate', dateNow / 1000 | 0, hashrateData.join(':')]);
|
||||||
|
|
||||||
if (isValidBlock){
|
if (isValidBlock){
|
||||||
redisCommands.push(['rename', coin + ':shares:roundCurrent', coin + ':shares:round' + shareData.height]);
|
redisCommands.push(['rename', coin + ':shares:roundCurrent', coin + ':shares:round' + shareData.height]);
|
||||||
|
|
|
@ -182,12 +182,28 @@ module.exports = function(logger, portalConfig, poolConfigs){
|
||||||
coinStats.hashrates.forEach(function(ins){
|
coinStats.hashrates.forEach(function(ins){
|
||||||
var parts = ins.split(':');
|
var parts = ins.split(':');
|
||||||
var workerShares = parseFloat(parts[0]);
|
var workerShares = parseFloat(parts[0]);
|
||||||
coinStats.shares += workerShares;
|
|
||||||
var worker = parts[1];
|
var worker = parts[1];
|
||||||
if (worker in coinStats.workers)
|
if (workerShares > 0) {
|
||||||
coinStats.workers[worker] += workerShares;
|
coinStats.shares += workerShares;
|
||||||
else
|
if (worker in coinStats.workers)
|
||||||
coinStats.workers[worker] = workerShares;
|
coinStats.workers[worker].shares += workerShares;
|
||||||
|
else
|
||||||
|
coinStats.workers[worker] = {
|
||||||
|
shares: workerShares,
|
||||||
|
invalidshares: 0,
|
||||||
|
hashrateString: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (worker in coinStats.workers)
|
||||||
|
coinStats.workers[worker].invalidshares -= workerShares; // workerShares is negative number!
|
||||||
|
else
|
||||||
|
coinStats.workers[worker] = {
|
||||||
|
shares: 0,
|
||||||
|
invalidshares: -workerShares,
|
||||||
|
hashrateString: null
|
||||||
|
};
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var shareMultiplier = Math.pow(2, 32) / algos[coinStats.algorithm].multiplier;
|
var shareMultiplier = Math.pow(2, 32) / algos[coinStats.algorithm].multiplier;
|
||||||
|
@ -208,6 +224,10 @@ module.exports = function(logger, portalConfig, poolConfigs){
|
||||||
portalStats.algos[algo].hashrate += coinStats.hashrate;
|
portalStats.algos[algo].hashrate += coinStats.hashrate;
|
||||||
portalStats.algos[algo].workers += Object.keys(coinStats.workers).length;
|
portalStats.algos[algo].workers += Object.keys(coinStats.workers).length;
|
||||||
|
|
||||||
|
for (var worker in coinStats.workers) {
|
||||||
|
coinStats.workers[worker].hashrateString = _this.getReadableHashRateString(shareMultiplier * coinStats.workers[worker].shares / portalConfig.website.stats.hashrateWindow);
|
||||||
|
}
|
||||||
|
|
||||||
delete coinStats.hashrates;
|
delete coinStats.hashrates;
|
||||||
delete coinStats.shares;
|
delete coinStats.shares;
|
||||||
coinStats.hashrateString = _this.getReadableHashRateString(coinStats.hashrate);
|
coinStats.hashrateString = _this.getReadableHashRateString(coinStats.hashrate);
|
||||||
|
|
|
@ -38,6 +38,7 @@ module.exports = function(logger){
|
||||||
'getting_started.html': 'getting_started',
|
'getting_started.html': 'getting_started',
|
||||||
'stats.html': 'stats',
|
'stats.html': 'stats',
|
||||||
'tbs.html': 'tbs',
|
'tbs.html': 'tbs',
|
||||||
|
'workers.html': 'workers',
|
||||||
'api.html': 'api',
|
'api.html': 'api',
|
||||||
'admin.html': 'admin',
|
'admin.html': 'admin',
|
||||||
'mining_key.html': 'mining_key'
|
'mining_key.html': 'mining_key'
|
||||||
|
@ -240,7 +241,7 @@ module.exports = function(logger){
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/key.html', function(reg, res, next){
|
app.get('/key.html', function(req, res, next){
|
||||||
res.end(keyScriptProcessed);
|
res.end(keyScriptProcessed);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,12 @@
|
||||||
Tab Stats
|
Tab Stats
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="{{? it.selected === 'workers' }}pure-menu-selected{{?}}">
|
||||||
|
<a class="hot-swapper" href="/workers">
|
||||||
|
<i class="fa fa-cogs"></i>
|
||||||
|
Workers Stats
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li class="{{? it.selected === 'api' }}pure-menu-selected{{?}}">
|
<li class="{{? it.selected === 'api' }}pure-menu-selected{{?}}">
|
||||||
<a class="hot-swapper" href="/api">
|
<a class="hot-swapper" href="/api">
|
||||||
<i class="fa fa-code"></i>
|
<i class="fa fa-code"></i>
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
<style>
|
||||||
|
|
||||||
|
#topCharts {
|
||||||
|
padding: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#topCharts > div > div > svg {
|
||||||
|
display: block;
|
||||||
|
height: 280px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartWrapper {
|
||||||
|
border: solid 1px #c7c7c7;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 5px;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartLabel {
|
||||||
|
font-size: 1.2em;
|
||||||
|
text-align: center;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartHolder {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="topCharts">
|
||||||
|
|
||||||
|
{{ for(var pool in it.stats.pools) { }}
|
||||||
|
|
||||||
|
<div class="chartWrapper">
|
||||||
|
<div class="chartLabel">{{=it.stats.pools[pool].name}}</div>
|
||||||
|
<div class="chartHolder">
|
||||||
|
<table class="pure-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Address</th>
|
||||||
|
<th>Shares</th>
|
||||||
|
<th>Invalid shares</th>
|
||||||
|
<th>Efficiency</th>
|
||||||
|
<th>Hashrate</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{{ for(var worker in it.stats.pools[pool].workers) { }}
|
||||||
|
{{var workerstat = it.stats.pools[pool].workers[worker];}}
|
||||||
|
<tr class="pure-table-odd">
|
||||||
|
<td>{{=worker}}</td>
|
||||||
|
<td>{{=Math.floor(workerstat.shares)}}</td>
|
||||||
|
<td>{{=Math.floor(workerstat.invalidshares)}}</td>
|
||||||
|
<td>{{? workerstat.shares > 0}} {{=Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100}}% {{??}} 0% {{?}}</td>
|
||||||
|
<td>{{=workerstat.hashrateString}}</td>
|
||||||
|
</tr>
|
||||||
|
{{ } }}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ } }}
|
Loading…
Reference in New Issue