/* * @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 */ import * as fs from 'fs' import * as os from 'os' import { RBTree } from 'bintrees' import * as secp256k1 from 'secp256k1'; import * as ntpClient from 'ntp-client' import * as stun from 'stun' import * as zip from 'zip' import './constant' if (global.USE_PARAM_JS) { var PathParams = global.GetCodePath("../extern-run.js"); if (fs.existsSync(PathParams)) try { require(PathParams); } catch (e) { console.log(e); } } import './log' Number.prototype.toStringZ = function(count) { var strnum = this.toString(); if (strnum.length > count) count = strnum.length; else strnum = "0000000000" + strnum; return strnum.substring(strnum.length - count, strnum.length); }; String.prototype.right = function(count) { if (this.length > count) return this.substr(this.length - count, count); else return this.substr(0, this.length); }; global.RBTree = RBTree; global.ntpClient = ntpClient; global.Stun = stun; global.ZIP = zip; global.secp256k1 = secp256k1; export { RBTree, ntpClient, stun, zip, secp256k1 } require('../HTML/JS/terahashlib.js'); require("./crypto-library"); if (global.USE_PARAM_JS) { var PathParams = global.GetCodePath("../extern-run.js"); if (fs.existsSync(PathParams)) try { require(PathParams); } catch (e) { console.log(e); } } require('../HTML/JS/terahashlib.js'); require("./crypto-library"); import * as BufLib from '../core/buffer' global.BufLib = BufLib; require('../HTML/JS/sha3.js'); require('../HTML/JS/coinlib.js'); global.GetCurrentBlockNumByTime = function GetCurrentBlockNumByTime() { var CurTimeNum = global.GetCurrentTime() - global.FIRST_TIME_BLOCK; var StartBlockNum = Math.trunc((CurTimeNum + global.CONSENSUS_PERIOD_TIME) / global.CONSENSUS_PERIOD_TIME); return StartBlockNum; }; global.DelDir = function(Path) { if (Path.substr(Path.length - 1, 1) === "/") { Path = Path.substr(0, Path.length - 1); } if (fs.existsSync(Path)) { var arr = fs.readdirSync(Path); for (var i = 0; i < arr.length; i++) { var name = Path + "/" + arr[i]; if (fs.statSync(name).isDirectory()) { global.DelDir(name); } else { if (name.right(9) == "const.lst") continue; if (name.right(7) == "log.log") continue; fs.unlinkSync(name); } } } }; global.SliceArr = function(arr, start, end) { var ret = []; for (var i = start; i < end; i++) { ret[i - start] = arr[i]; } return ret; }; var nRand = Math.floor(123 + Math.random() * 1000); function random(max) { return Math.floor(Math.random() * max); }; global.random = random; global.AddrLevelArrFromBegin = function(arr1, arr2) { var Level = 0; for (var i = 0; i < arr1.length; i++) { var a1 = arr1[i]; var a2 = arr2[i]; for (var b = 0; b < 8; b++) { if ((a1 & 128) !== (a2 & 128)) return Level; a1 = a1 << 1; a2 = a2 << 1; Level++; } } return Level; }; global.AddrLevelArr = function(arr1, arr2) { var Level = 0; for (var i = arr1.length - 1; i >= 0; i--) { var a1 = arr1[i]; var a2 = arr2[i]; for (var b = 0; b < 8; b++) { if ((a1 & 1) !== (a2 & 1)) return Level; a1 = a1 >> 1; a2 = a2 >> 1; Level++; } } return Level; }; global.SaveToFile = function(name, buf) { var fs = require('fs'); var file_handle = fs.openSync(name, "w"); fs.writeSync(file_handle, buf, 0, buf.length); fs.closeSync(file_handle); }; global.LoadParams = function(filename, DefaultValue) { try { if (fs.existsSync(filename)) { var Str = fs.readFileSync(filename); if (Str.length > 0) return JSON.parse(Str as any); } } catch (err) { global.TO_ERROR_LOG("MAINLIB", 100, "Error in file:" + filename + "\n" + err); } return DefaultValue; }; global.SaveParams = function(filename, data) { global.SaveToFile(filename, Buffer.from(JSON.stringify(data, undefined, 4))); }; global.StartTime = function() { global.TimeStart = global.GetCurrentTime(); }; global.FinishTime = function(Str) { Str = Str || ""; var TimeFinish = global.GetCurrentTime(); var delta = TimeFinish - global.TimeStart; console.log(Str + " time: " + delta + " ms"); }; global.CompareItemBufFD = function(a, b) { if (a.FD !== b.FD) return a.FD - b.FD; else return a.Position - b.Position; }; global.CompareArr33 = function(a, b) { for (var i = 0; i < 33; i++) { if (a[i] !== b[i]) return a[i] - b[i]; } return 0; }; global.CompareItemHashSimple = function(a, b) { if (a.hash < b.hash) return - 1; else if (a.hash > b.hash) return 1; else return 0; }; global.CompareItemHash = function(a, b) { var hasha = a.hash; var hashb = b.hash; for (var i = 0; i < hasha.length; i++) { if (hasha[i] !== hashb[i]) return hasha[i] - hashb[i]; } return 0; }; global.CompareItemHash32 = function(a, b) { var hasha = a.hash; var hashb = b.hash; for (var i = 0; i < 32; i++) { if (hasha[i] !== hashb[i]) return hasha[i] - hashb[i]; } return 0; }; global.CompareItemHASH32 = function(a, b) { var hasha = a.HASH; var hashb = b.HASH; for (var i = 0; i < 32; i++) { if (hasha[i] !== hashb[i]) return hasha[i] - hashb[i]; } return 0; }; global.CompareItemHash33 = function(a, b) { var hasha = a.hash; var hashb = b.hash; for (var i = 0; i < 33; i++) { if (hasha[i] !== hashb[i]) return hasha[i] - hashb[i]; } return 0; }; global.CompareItemHashPow = function(a, b) { return global.CompareArr(a.HashPow, b.HashPow); }; global.CompareItemTimePow = function(a, b) { if (b.TimePow !== a.TimePow) return b.TimePow - a.TimePow; else return global.CompareArr(a.HashPow, b.HashPow); }; global.LOAD_CONST = function() { var Count = 0; var constants = global.LoadParams(global.GetDataPath("const.lst"), {}); if (constants) { for (var i = 0; i < global.CONST_NAME_ARR.length; i++) { var key = global.CONST_NAME_ARR[i]; if (constants[key] !== undefined) { Count++; global[key] = constants[key]; } } } return Count; }; var WasStartSaveConst = false; function SaveConst() { var constants = {}; for (var i = 0; i < global.CONST_NAME_ARR.length; i++) { var key = global.CONST_NAME_ARR[i]; if (global[key] !== undefined) constants[key] = global[key]; } global.SaveParams(global.GetDataPath("const.lst"), constants); WasStartSaveConst = false; }; global.SAVE_CONST = function(bForce) { if (bForce) { SaveConst(); } else { if (!WasStartSaveConst) setTimeout(SaveConst, 10 * 1000); WasStartSaveConst = true; } }; function CheckGlobalTime() { global.ntpClient.getNetworkTime("ntp1.aliyun.com", 123, function(err, NetTime) { if (err) { global.TO_ERROR_LOG("MAINLIB", 110, err); return; } var curTime = new Date; global.DELTA_CURRENT_TIME = NetTime - (curTime as any); if (isNaN(global.DELTA_CURRENT_TIME) || typeof global.DELTA_CURRENT_TIME !== "number") global.DELTA_CURRENT_TIME = 0; else if (Math.abs(global.DELTA_CURRENT_TIME) > 24 * 3600 * 1000) global.DELTA_CURRENT_TIME = 0; global.ToLog("Get global time: " + NetTime); global.SAVE_CONST(); }); setTimeout(() => { global.DELTA_CURRENT_TIME = global.DELTA_CURRENT_TIME * -1; setTimeout(() => { global.DELTA_CURRENT_TIME = global.DELTA_CURRENT_TIME * -1 // if (!global.CAN_START) { // global.DELTA_CURRENT_TIME = global.DELTA_CURRENT_TIME + 3000; // setTimeout(() => { // global.DELTA_CURRENT_TIME = global.DELTA_CURRENT_TIME - 3000; // }, 3000) // } }, 3000) }, 5000) global.SAVE_CONST(); }; global.CheckGlobalTime = CheckGlobalTime; global.GetDeltaCurrentTime = function() { if (isNaN(global.DELTA_CURRENT_TIME) || typeof global.DELTA_CURRENT_TIME !== "number") global.DELTA_CURRENT_TIME = 0; return global.DELTA_CURRENT_TIME; }; global.GetStrTimeUTC = function(now) { if (!global.GetCurrentTime) return ":::"; if (!now) now = global.GetCurrentTime(); var Str = "" + now.getUTCDate(); Str = Str + "." + (1 + now.getUTCMonth()); Str = Str + "." + now.getUTCFullYear(); Str = Str + " " + now.getUTCHours(); Str = Str + ":" + now.getUTCMinutes(); Str = Str + ":" + now.getUTCSeconds(); return Str; }; global.GetStrOnlyTimeUTC = function(now) { if (!global.GetCurrentTime) return ":::"; if (!now) now = global.GetCurrentTime(); var Str; Str = "" + now.getUTCHours().toStringZ(2); Str = Str + ":" + now.getUTCMinutes().toStringZ(2); Str = Str + ":" + now.getUTCSeconds().toStringZ(2); return Str; }; function GetSecFromStrTime(Str) { var arr = Str.split(":"); var Mult = 3600; var Sum = 0; for (var i = 0; i < arr.length; i++) { Sum += Mult * parseInt(arr[i]); Mult = Mult / 60; } return Sum; }; global.GetSecFromStrTime = GetSecFromStrTime; global.GetCurrentTime = function(Delta_Time) { if (Delta_Time === undefined) Delta_Time = global.GetDeltaCurrentTime(); var curTime: any = new Date; var Time = new Date(curTime - (- Delta_Time)); return Time; }; function DateFromBlock(BlockNum) { var Str; var now = new Date(global.FIRST_TIME_BLOCK + BlockNum * 1000); Str = now.toISOString(); Str = Str.substr(0, Str.indexOf(".")); Str = Str.replace("T", " "); return Str; }; global.DateFromBlock = DateFromBlock; var code_base = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0402\u0403\u201a\u0453\u201e\u2026\u2020\u2021\u20ac\u2030\u0409\u2039\u040a\u040c\u040b\u040f\u0452\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0459\u203a\u045a\u045c\u045b\u045f\xa0\u040e\u045e\u0408\xa4\u0490\xa6\xa7\u0401\xa9\u0404\xab\xac\xad\xae\u0407\xb0\xb1\u0406\u0456\u0491\xb5\xb6\xb7\u0451\u2116\u0454\xbb\u0458\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f'; global.NormalizeName = function(Name) { var Str = ""; for (var i = 0; i < Name.length; i++) { var code = Name.charCodeAt(i); if (code >= 32) Str += code_base.charAt(code - 32); } return Str; }; var glEvalMap = {}; function CreateEval(formula, StrParams) { var Ret = glEvalMap[formula]; if (!Ret) { eval("function M(" + StrParams + "){return " + formula + "}; Ret=M;"); glEvalMap[formula] = Ret; } return Ret; }; global.CreateEval = CreateEval; var CPU_Count = os.cpus().length; function GetCountMiningCPU() { return global.COUNT_MINING_CPU // if (global.COUNT_MINING_CPU) // return global.COUNT_MINING_CPU; // else { // return CPU_Count - 1; // } }; global.GetCountMiningCPU = GetCountMiningCPU; var AddTrMap: any = {}; AddTrMap[- 6] = "Inner node error"; AddTrMap[- 5] = "Bad block num"; AddTrMap[- 4] = "Bad type transaction"; AddTrMap[- 3] = "Bad time"; AddTrMap[- 2] = "Bad PoW"; AddTrMap[- 1] = "Bad length"; AddTrMap[0] = "Not add"; AddTrMap[1] = "OK"; AddTrMap[2] = "Update OK"; AddTrMap[3] = "Was send"; AddTrMap[4] = "Added to timer"; global.AddTrMap = AddTrMap; function GrayConnect() { if (global.NET_WORK_MODE && !global.NET_WORK_MODE.UseDirectIP) return 1; else return 0; }; global.GrayConnect = GrayConnect; var ResConst = global.LOAD_CONST(); if (global.START_SERVER) { if (!ResConst) { CheckGlobalTime(); } else if (global.CHECK_GLOBAL_TIME) { CheckGlobalTime(); } }