let utils = require('./utils.js'); let async = require('async'); let apiInterfaces = require('./apiInterfaces.js')(config.daemon, config.wallet, config.api); let miningBackends = require('./miningBackends.js'); let lastHash; let POOL_NONCE_SIZE = 16 + 1; // +1 for old XMR/new TRTL bugs let logSystem = 'miningSource'; let blockData = JSON.stringify({ id: "0", jsonrpc: "2.0", method: 'getlastblockheader', params: {} }); require('./exceptionWriter.js')(logSystem); function runInterval () { let miningConfig; try { miningConfig = miningBackends.getActiveMiningBackend(); } catch (e) { log('error', logSystem, 'Invalid mining backend configuration: %s', [e.message]); setTimeout(runInterval, 3000); return; } async.waterfall([ function (callback) { apiInterfaces.jsonHttpRequest(miningConfig.host, miningConfig.port, blockData, function (err, res) { if (err) { log('error', logSystem, '%s error from mining source', [config.coin]); setTimeout(runInterval, 3000); return; } if (res && res.result && res.result.status === "OK" && res.result.hasOwnProperty('block_header')) { let hash = res.result.block_header.hash.toString('hex'); if (!lastHash || lastHash !== hash) { lastHash = hash; log('info', logSystem, '%s found new hash %s via %s', [config.coin, hash, miningConfig.name]); callback(null, true); return; } else if (miningConfig.alwaysPoll || config.daemon.alwaysPoll || false) { callback(null, true); return; } else { callback(true); return; } } else { log('error', logSystem, 'bad response from mining source'); setTimeout(runInterval, 3000); return; } }); }, function (_getbc, callback) { let templateData = JSON.stringify({ id: "0", jsonrpc: "2.0", method: 'getblocktemplate', params: { reserve_size: POOL_NONCE_SIZE, wallet_address: miningBackends.getMiningTemplateAddress(utils.getPoolTemplateAddress()) } }); apiInterfaces.jsonHttpRequest(miningConfig.host, miningConfig.port, templateData, function (err, res) { if (err) { log('error', logSystem, 'Error polling getblocktemplate %j', [err]); callback(null); return; } if (res.error) { log('error', logSystem, 'Error polling getblocktemplate %j', [res.error]); callback(null); return; } if (config.coin == 'talleo' && res.result.height >= 10000 && res.result.num_transactions == 0) { callback(null); return; } process.send({ type: 'BlockTemplate', block: res.result }); callback(null); }); } ], function () { setTimeout(function () { runInterval(); }, config.poolServer.blockRefreshInterval); }); } runInterval();