forked from circlecloud/tera
1
0
Fork 0
tera/src/process/pow-process.ts

206 lines
6.1 KiB
TypeScript

/*
* @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" });
} else {
PROCESS = global.DEBUGPROCESS;
}
var LastAlive = Date.now();
setInterval(CheckAlive, 1000);
var idInterval = undefined;
var Block: any = {};
import { powClient } from '../rpc/client'
powClient.on('message', (msg) => {
LastAlive = Date.now();
switch (msg.cmd) {
case "FastCalcBlock":
FastCalcBlock(msg);
break;
case "Alive":
break;
case "Exit":
PROCESS.exit(0);
}
})
powClient.connect()
function FastCalcBlock(msg) {
var FastBlock = msg;
StartHashPump(FastBlock);
FastBlock.RunCount = 0;
try {
if (CreatePOWVersionX(FastBlock)) {
powClient.send({
cmd: "POW",
BlockNum: FastBlock.BlockNum,
SeqHash: FastBlock.SeqHash,
Hash: FastBlock.Hash,
PowHash: FastBlock.PowHash,
AddrHash: FastBlock.AddrHash,
Num: FastBlock.Num
});
}
} catch (e) {
powClient.emit('web', `FastCalcBlock Error ${e}...`)
global.ToError(e);
}
}
PROCESS.on('message', function(msg) {
LastAlive = Date.now();
switch (msg.cmd) {
case "Alive":
break;
case "Exit":
PROCESS.exit(0);
}
})
// 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)) {
// let msg = {
// cmd: "POW",
// BlockNum: Block.BlockNum,
// SeqHash: Block.SeqHash,
// Hash: Block.Hash,
// PowHash: Block.PowHash,
// AddrHash: Block.AddrHash,
// Num: Block.Num
// }
// powClient.send(msg)
// //process.send(msg);
// }
// } 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,
Num: SetBlock.Num,
};
}
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;
}
if (global.BlockPump.RunCount) {
setTimeout(() => {
powClient.send({ cmd: "HASHRATE", CountNonce: global.BlockPump.RunCount });
}, 1)
}
global.BlockPump.LastNonce = global.BlockPump.LastNonce + global.BlockPump.Num * 100000
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;
}
}
};