2019-07-10 04:01:15 +00:00
|
|
|
/*
|
|
|
|
* @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
|
|
|
|
require("../core/library")
|
|
|
|
require("../core/crypto-library")
|
|
|
|
require("../core/terahashmining");
|
|
|
|
var PROCESS = process;
|
|
|
|
process.send && !global.DEBUGPROCESS ? process.send({ cmd: "online", message: "OK" }) : PROCESS = global.DEBUGPROCESS;
|
|
|
|
var LastAlive = Date.now();
|
|
|
|
setInterval(CheckAlive, 1e3);
|
|
|
|
var idInterval = void 0, Block: any = {};
|
|
|
|
|
|
|
|
function CheckAlive() {
|
|
|
|
if (!global.NOALIVE) {
|
|
|
|
var e = Date.now() - LastAlive;
|
|
|
|
Math.abs(e) > global.CHECK_STOP_CHILD_PROCESS && PROCESS.exit(0);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function CalcPOWHash() {
|
|
|
|
if (Block.SeqHash) {
|
|
|
|
if ((new Date as any) - Block.Time > Block.Period)
|
|
|
|
return clearInterval(idInterval), void (idInterval = void 0);
|
|
|
|
try {
|
|
|
|
global.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) {
|
2019-07-10 07:59:04 +00:00
|
|
|
global.ToError(e);
|
2019-07-10 04:01:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
PROCESS.on("message", function(e) {
|
|
|
|
if (LastAlive = Date.now(), "FastCalcBlock" === e.cmd) {
|
|
|
|
var o = e;
|
|
|
|
StartHashPump(o), o.RunCount = 0;
|
|
|
|
try {
|
|
|
|
global.CreatePOWVersionX(o) && process.send({
|
|
|
|
cmd: "POW", BlockNum: o.BlockNum, SeqHash: o.SeqHash, Hash: o.Hash, PowHash: o.PowHash, AddrHash: o.AddrHash,
|
|
|
|
Num: o.Num
|
|
|
|
});
|
|
|
|
}
|
|
|
|
catch (e) {
|
2019-07-10 07:59:04 +00:00
|
|
|
global.ToError(e);
|
2019-07-10 04:01:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if ("SetBlock" === e.cmd) {
|
|
|
|
var a = 1e6 * (1 + e.Num);
|
|
|
|
Block.HashCount && process.send({ cmd: "HASHRATE", CountNonce: Block.HashCount, Hash: Block.Hash }), Block.HashCount = 0, (Block = e).Time = Date.now(),
|
|
|
|
Block.LastNonce = a, Block.Period = global.CONSENSUS_PERIOD_TIME * Block.Percent / 100, 0 < Block.Period && 0 < Block.RunPeriod && (CalcPOWHash(),
|
|
|
|
void 0 !== idInterval && clearInterval(idInterval), idInterval = setInterval(CalcPOWHash, Block.RunPeriod));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
"Alive" === e.cmd || "Exit" === e.cmd && PROCESS.exit(0);
|
|
|
|
});
|
|
|
|
var idIntervalPump = global.BlockPump = void 0;
|
|
|
|
|
|
|
|
function StartHashPump(e) {
|
|
|
|
(!global.BlockPump || global.BlockPump.BlockNum < e.BlockNum || global.BlockPump.MinerID !== e.MinerID || global.BlockPump.Percent !== e.Percent) && (global.BlockPump = {
|
|
|
|
BlockNum: e.BlockNum,
|
|
|
|
RunCount: e.RunCount, MinerID: e.MinerID, Percent: e.Percent, LastNonce: 0
|
|
|
|
}), idIntervalPump || (idIntervalPump = setInterval(PumpHash,
|
|
|
|
global.POWRunPeriod));
|
|
|
|
};
|
|
|
|
var StartTime = 1, EndTime = 0;
|
|
|
|
|
|
|
|
function PumpHash() {
|
|
|
|
if (global.BlockPump) {
|
|
|
|
var e = Date.now();
|
|
|
|
if (EndTime < StartTime) {
|
2019-07-10 07:59:04 +00:00
|
|
|
if (100 * (e - StartTime) / global.CONSENSUS_PERIOD_TIME >= global.BlockPump.Percent)
|
2019-07-10 04:01:15 +00:00
|
|
|
return void (EndTime = e);
|
2019-07-10 07:59:04 +00:00
|
|
|
global.CreatePOWVersionX(global.BlockPump, 1);
|
2019-07-10 04:01:15 +00:00
|
|
|
}
|
|
|
|
else {
|
2019-07-10 07:59:04 +00:00
|
|
|
100 * (e - EndTime) / global.CONSENSUS_PERIOD_TIME > 100 - global.BlockPump.Percent && (StartTime = e);
|
2019-07-10 04:01:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|