/* * @project: TERA * @version: Development (beta) * @license: MIT (not for evil) * @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com] * Web: https://terafoundation.org * Twitter: https://twitter.com/terafoundation * Telegram: https://t.me/terafoundation */ global.PROCESS_NAME = "POW"; global.POWPROCESS = 1; import "../core/library" import "../core/crypto-library" import { CreatePOWVersionX } from "../core/terahashmining" var PROCESS = process; if (process.send && !global.DEBUGPROCESS) { process.send({ cmd: "online", message: "OK" }); global.ToLogClient = function(Str, StrKey, bFinal) { process.send({ cmd: "ToLogClient", Str: "" + Str, StrKey: StrKey, bFinal: bFinal }); }; } else { PROCESS = global.DEBUGPROCESS; } var LastAlive = Date.now(); setInterval(CheckAlive, 1000); var idInterval = undefined; var Block: any = {}; PROCESS.on('message', function(msg) { LastAlive = Date.now(); if (msg.cmd === "FastCalcBlock") { var FastBlock = msg; StartHashPump(FastBlock); FastBlock.RunCount = 0; try { if (CreatePOWVersionX(FastBlock)) process.send({ cmd: "POW", BlockNum: FastBlock.BlockNum, SeqHash: FastBlock.SeqHash, Hash: FastBlock.Hash, PowHash: FastBlock.PowHash, AddrHash: FastBlock.AddrHash, Num: FastBlock.Num }); } catch (e) { global.ToError(e); } } else if (msg.cmd === "SetBlock") { var StartNonce = 1000000 * (1 + msg.Num); if (Block.HashCount) { process.send({ cmd: "HASHRATE", CountNonce: Block.HashCount, Hash: Block.Hash }); } Block.HashCount = 0; Block = msg; Block.Time = Date.now(); Block.LastNonce = StartNonce; Block.Period = global.CONSENSUS_PERIOD_TIME * Block.Percent / 100; if (Block.Period > 0 && Block.RunPeriod > 0) { CalcPOWHash(); if (idInterval !== undefined) { clearInterval(idInterval); } idInterval = setInterval(CalcPOWHash, Block.RunPeriod); } } else if (msg.cmd === "Alive") { } else if (msg.cmd === "Exit") { PROCESS.exit(0); } }); function CheckAlive() { if (global.NOALIVE) return; var Delta = Date.now() - LastAlive; if (Math.abs(Delta) > global.CHECK_STOP_CHILD_PROCESS) { PROCESS.exit(0); return; } }; function CalcPOWHash() { if (!Block.SeqHash) return; if ((new Date() as any) - Block.Time > Block.Period) { clearInterval(idInterval); idInterval = undefined; return; } try { if (CreatePOWVersionX(Block)) process.send({ cmd: "POW", BlockNum: Block.BlockNum, SeqHash: Block.SeqHash, Hash: Block.Hash, PowHash: Block.PowHash, AddrHash: Block.AddrHash, Num: Block.Num }); } catch (e) { global.ToError(e); } }; global.BlockPump = undefined; var idIntervalPump = undefined; function StartHashPump(SetBlock) { if (!global.BlockPump || global.BlockPump.BlockNum < SetBlock.BlockNum || global.BlockPump.MinerID !== SetBlock.MinerID || global.BlockPump.Percent !== SetBlock.Percent) { global.BlockPump = { BlockNum: SetBlock.BlockNum, RunCount: SetBlock.RunCount, MinerID: SetBlock.MinerID, Percent: SetBlock.Percent, LastNonce: 0, }; } if (!idIntervalPump) { idIntervalPump = setInterval(PumpHash, global.POWRunPeriod); } }; var StartTime = 1; var EndTime = 0; function PumpHash() { if (!global.BlockPump) return; var CurTime = Date.now(); if (StartTime > EndTime) { var Delta = CurTime - StartTime; var PeriodPercent = 100 * Delta / global.CONSENSUS_PERIOD_TIME; if (PeriodPercent >= global.BlockPump.Percent) { EndTime = CurTime; return; } CreatePOWVersionX(global.BlockPump, 1); } else { var Delta = CurTime - EndTime; var PeriodPercent = 100 * Delta / global.CONSENSUS_PERIOD_TIME; if (PeriodPercent > 100 - global.BlockPump.Percent) { StartTime = CurTime; } } };