Sat Jul 13 09:15:47 CST 2019 Source Update...

This commit is contained in:
2019-07-13 09:15:47 +08:00
parent 750a54c15f
commit b415da0a52
21 changed files with 1515 additions and 3682 deletions

View File

@@ -8,9 +8,37 @@
* Telegram: https://t.me/terafoundation
*/
global.PERIOD_GET_BLOCK = 300, global.COUNT_HISTORY_BLOCKS_FOR_LOAD = 600, global.COUNT_BLOCKS_FOR_CHECK_POW = 50, global.MAX_DELTA_COUNT_SUM_FOR_LOAD = 10,
global.MAX_COUNT_CHAIN_LOAD = 120, global.PACKET_ALIVE_PERIOD = 4 * CONSENSUS_PERIOD_TIME, global.PACKET_ALIVE_PERIOD_NEXT_NODE = PACKET_ALIVE_PERIOD / 2,
global.MAX_BLOCK_SEND = 8, global.COUNT_TASK_FOR_NODE = 10, global.FORMAT_BLOCK_TRANSFER = "{ BlockNum:uint, TreeHash:hash, arrContent:[tr], }",
global.WRK_BLOCK_TRANSFER = {}, global.MAX_ACCOUNTS_TRANSFER = 1024, global.MAX_SMARTS_TRANSFER = 10, global.TEST_NETWORK && (global.MAX_ACCOUNTS_TRANSFER = 128,
global.MAX_SMARTS_TRANSFER = 10), global.FORMAT_REST_TRANSFER = "{ Result:uint, Version:uint, Arr:[arr200], ProofHash:hash, ProofArrL:<hash>, ProofArrR:<hash>, }",
global.FORMAT_SMART_TRANSFER = "{ Result:uint, Arr:[tr], }";
global.PERIOD_GET_BLOCK = 300;
global.COUNT_HISTORY_BLOCKS_FOR_LOAD = 600;
global.COUNT_BLOCKS_FOR_CHECK_POW = 50;
global.MAX_DELTA_COUNT_SUM_FOR_LOAD = 10;
global.MAX_COUNT_CHAIN_LOAD = 120;
global.PACKET_ALIVE_PERIOD = 4 * CONSENSUS_PERIOD_TIME;
global.PACKET_ALIVE_PERIOD_NEXT_NODE = PACKET_ALIVE_PERIOD / 2;
global.MAX_BLOCK_SEND = 8;
global.COUNT_TASK_FOR_NODE = 10;
global.FORMAT_BLOCK_TRANSFER = "{\
BlockNum:uint,\
TreeHash:hash,\
arrContent:[tr],\
}";
global.WRK_BLOCK_TRANSFER = {};
global.MAX_ACCOUNTS_TRANSFER = 1024;
global.MAX_SMARTS_TRANSFER = 10;
if(global.TEST_NETWORK)
{
global.MAX_ACCOUNTS_TRANSFER = 128;
global.MAX_SMARTS_TRANSFER = 10;
}
global.FORMAT_REST_TRANSFER = "{\
Result:uint,\
Version:uint,\
Arr:[arr200],\
ProofHash:hash,\
ProofArrL:<hash>,\
ProofArrR:<hash>,\
}";
global.FORMAT_SMART_TRANSFER = "{\
Result:uint,\
Arr:[tr],\
}";

View File

@@ -133,7 +133,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
var PrevHash = CalcHashFromArray(arr, true);
return PrevHash;
}
StartSyncBlockchain(Node, bSilent, bCheckPoint)
StartSyncBlockchain(Node, bSilent, bCheckPoint, PrevStartedBlockNum)
{
this.FREE_ALL_MEM_CHAINS()
if(global.NO_HISTORY_MODE)
@@ -149,9 +149,24 @@ module.exports = class CBlock extends require("./rest-loader.js")
this.RelayMode = false
if(!bSilent)
this.RelayMode = true
var StartBlockNum;
if(PrevStartedBlockNum)
{
var DeltaNum = Math.floor(1.2 * (this.BlockNumDB - PrevStartedBlockNum));
if(DeltaNum < 1000)
DeltaNum = 1000
StartBlockNum = this.BlockNumDB - DeltaNum
if(StartBlockNum <= 0)
StartBlockNum = 15
ToLog("Current DeltaNum=" + DeltaNum + " StartBlockNum=" + StartBlockNum, 2)
}
else
{
StartBlockNum = this.BlockNumDB
}
this.LoadHistoryMode = true
this.LoadHistoryMessage = !bSilent
this.LoadHistoryContext = {PrevBlockNum: - 1, Node:Node, BlockNum:this.BlockNumDB, MapSend:{}, Foward:1, Pause:0, DeltaBlockNum:10,
this.LoadHistoryContext = {PrevBlockNum: - 1, Node:Node, BlockNum:StartBlockNum, MapSend:{}, Foward:1, Pause:0, DeltaBlockNum:10,
StartTimeHistory:Date.now(), MaxTimeOut:30 * 1000}
if(!bSilent && !bCheckPoint && REST_START_COUNT)
{
@@ -184,7 +199,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
if(DeltaTime > Context.MaxTimeOut)
{
ToLog("DETECT TIMEOUT LOAD")
this.StartSyncBlockchain()
this.StartSyncBlockchain(undefined, undefined, undefined, Context.BlockNum)
return ;
}
}
@@ -543,6 +558,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
{
if(!Context.WasLoadNum)
{
ToLog("Not found: " + Context.BlockNum + " from node:" + NodeName(Info.Node), 2)
Context.BlockNum = Math.floor(Context.BlockNum - Context.DeltaBlockNum)
Context.DeltaBlockNum = Context.DeltaBlockNum * 1.2
if(Context.BlockNum < BLOCK_PROCESSING_LENGTH2)

View File

@@ -8,357 +8,665 @@
* Telegram: https://t.me/terafoundation
*/
module.exports.GetNewBuffer = GetNewBuffer;
module.exports.GetReadBuffer = GetReadBuffer;
module.exports.alloc = GetNewBuffer;
module.exports.from = GetReadBuffer;
module.exports.Write = Write;
module.exports.Read = Read;
module.exports.GetObjectFromBuffer = GetObjectFromBuffer;
module.exports.GetBufferFromObject = GetBufferFromObject;
function Write(e,r,t,n,l)
function Write(buf,data,StringFormat,ParamValue,WorkStruct)
{
if(!(e.len >= e.length))
if(buf.len >= buf.length)
{
if("number" == typeof t)
throw ToLogTrace("ERRR StringFormat "), "ERR!!";
var a = t;
if("buffer" === a.substr(0, 6) && 6 < a.length)
n = parseInt(a.substr(6)), a = "buffer";
return ;
}
if(typeof StringFormat === "number")
{
ToLogTrace("ERRR StringFormat ");
throw "ERR!!";
}
else
{
var format = StringFormat;
if(format.substr(0, 6) === "buffer" && format.length > 6)
{
ParamValue = parseInt(format.substr(6));
format = "buffer";
}
else
if("arr" === a.substr(0, 3) && 3 < a.length)
n = parseInt(a.substr(3)), a = "arr";
if(format.substr(0, 3) === "arr" && format.length > 3)
{
ParamValue = parseInt(format.substr(3));
format = "arr";
}
else
if("str" === a.substr(0, 3) && 3 < a.length)
if(format.substr(0, 3) === "str" && format.length > 3)
{
var i = parseInt(a.substr(3));
return r && e.write(r, e.len, i), void (e.len += i);
var length = parseInt(format.substr(3));
if(data)
buf.write(data, buf.len, length);
buf.len += length;
return ;
}
switch(a)
switch(format)
{
case "str":
var f = toUTF8Array(r);
65535 < (i = f.length) && (i = 0), e[e.len] = 255 & i, e[e.len + 1] = i >>> 8 & 255, e.len += 2;
for(var s = 0; s < i; s++)
e[e.len + s] = f[s];
e.len += i;
break;
{
var arr = toUTF8Array(data);
var length = arr.length;
if(length > 65535)
length = 0;
buf[buf.len] = length & 255;
buf[buf.len + 1] = (length >>> 8) & 255;
buf.len += 2;
for(var i = 0; i < length; i++)
{
buf[buf.len + i] = arr[i];
}
buf.len += length;
break;
}
case "byte":
r < 0 && (r = 0), e[e.len] = r, e.len += 1;
break;
{
if(data < 0)
data = 0;
buf[buf.len] = data;
buf.len += 1;
break;
}
case "double":
e.writeDoubleLE(r, e.len, 8), e.len += 8;
break;
{
buf.writeDoubleLE(data, buf.len, 8);
buf.len += 8;
break;
}
case "uint":
r < 0 && (r = 0), 0xffffffffffff <= r && (r = 0), e.writeUIntLE(r, e.len, 6), e.len += 6;
break;
{
if(data < 0)
data = 0;
if(data >= 281474976710655)
data = 0;
buf.writeUIntLE(data, buf.len, 6);
buf.len += 6;
break;
}
case "uint16":
r < 0 && (r = 0), e[e.len] = 255 & r, e[e.len + 1] = r >>> 8 & 255, e.len += 2;
break;
{
if(data < 0)
data = 0;
buf[buf.len] = data & 255;
buf[buf.len + 1] = (data >>> 8) & 255;
buf.len += 2;
break;
}
case "uint32":
r < 0 && (r = 0), e.writeUInt32LE(r, e.len, 4), e.len += 4;
break;
{
if(data < 0)
data = 0;
buf.writeUInt32LE(data, buf.len, 4);
buf.len += 4;
break;
}
case "time":
var u = r.valueOf();
e.writeUIntLE(u, e.len, 6), e.len += 6;
break;
{
var Time = data.valueOf();
buf.writeUIntLE(Time, buf.len, 6);
buf.len += 6;
break;
}
case "addres":
case "hash":
i = r ? Math.min(32, r.length) : 0;
for(s = 0; s < i; s++)
e[e.len + s] = r[s];
e.len += 32;
break;
case "buffer":
i = void 0 === n ? r.length : Math.min(n, r.length);
for(s = 0; s < i; s++)
e[e.len + s] = r[s];
e.len += n;
break;
case "arr":
i = r ? Math.min(n, r.length) : 0;
for(s = 0; s < i; s++)
e[e.len + s] = r[s];
e.len += n;
break;
case "tr":
i = r.length;
MAX_TRANSACTION_SIZE > MAX_TRANSACTION_SIZE && (i = MAX_TRANSACTION_SIZE), e[e.len] = 255 & i, e[e.len + 1] = i >>> 8 & 255,
e.len += 2;
for(s = 0; s < i; s++)
e[e.len + s] = r[s];
e.len += i;
break;
case "data":
i = r.length;
e.writeUInt32LE(i, e.len, 4), e.len += 4;
for(s = 0; s < i; s++)
e[e.len + s] = r[s];
e.len += i;
break;
case "hashSTR":
var o = GetHexFromAddres(r);
e.write(o, e.len, 64), e.len += 64;
break;
case "uintSTR":
o = r.toString();
e.write(o, e.len, 10), e.len += 10;
break;
default:
l = l || {};
var d = t.substr(0, 1);
if("[" === d)
{
r && (i = r.length);
var b = GetMiddleString(a);
Write(e, i, "uint32");
for(s = 0; s < i; s++)
Write(e, r[s], b, void 0, l);
var length;
if(data)
length = Math.min(32, data.length);
else
length = 0;
for(var i = 0; i < length; i++)
{
buf[buf.len + i] = data[i];
}
buf.len += 32;
break;
}
case "buffer":
{
var length;
if(ParamValue === undefined)
length = data.length;
else
length = Math.min(ParamValue, data.length);
for(var i = 0; i < length; i++)
{
buf[buf.len + i] = data[i];
}
buf.len += ParamValue;
break;
}
case "arr":
{
var length;
if(data)
length = Math.min(ParamValue, data.length);
else
length = 0;
for(var i = 0; i < length; i++)
{
buf[buf.len + i] = data[i];
}
buf.len += ParamValue;
break;
}
case "tr":
{
var length = data.length;
if(MAX_TRANSACTION_SIZE > MAX_TRANSACTION_SIZE)
length = MAX_TRANSACTION_SIZE;
buf[buf.len] = length & 255;
buf[buf.len + 1] = (length >>> 8) & 255;
buf.len += 2;
for(var i = 0; i < length; i++)
{
buf[buf.len + i] = data[i];
}
buf.len += length;
break;
}
case "data":
{
var length = data.length;
buf.writeUInt32LE(length, buf.len, 4);
buf.len += 4;
for(var i = 0; i < length; i++)
{
buf[buf.len + i] = data[i];
}
buf.len += length;
break;
}
case "hashSTR":
{
var Str = GetHexFromAddres(data);
buf.write(Str, buf.len, 64);
buf.len += 64;
break;
}
case "uintSTR":
{
var Str = data.toString();
buf.write(Str, buf.len, 10);
buf.len += 10;
break;
}
default:
{
WorkStruct = WorkStruct || {};
var CurFormat = StringFormat.substr(0, 1);
if(CurFormat === "[")
{
var length;
if(data)
length = data.length;
var formatNext = GetMiddleString(format);
Write(buf, length, "uint32");
for(var i = 0; i < length; i++)
{
Write(buf, data[i], formatNext, undefined, WorkStruct);
}
}
else
if(CurFormat === "<")
{
var length;
if(data)
length = data.length;
var formatNext = GetMiddleString(format);
var IndexCount = 0;
var len = buf.len;
buf.len += 4;
for(var i = 0; i < length; i++)
{
if(data[i])
{
IndexCount++;
Write(buf, i, "uint32");
Write(buf, data[i], formatNext, undefined, WorkStruct);
}
}
buf.writeUInt32LE(IndexCount, len, 4);
}
else
if(CurFormat === "{")
{
var attrs = WorkStruct[format];
if(!attrs)
{
attrs = GetAttributes(GetMiddleString(format));
WorkStruct[format] = attrs;
}
for(var i = 0; i < attrs.length; i++)
{
var type = attrs[i];
Write(buf, data[type.Key], type.Value, undefined, WorkStruct);
}
}
else
{
throw "Bad write type params: " + format;
}
}
}
}
};
function Read(buf,StringFormat,ParamValue,WorkStruct,bDisableTime)
{
var ret;
if(typeof StringFormat === "number")
{
ToLogTrace("ERR StringFormat");
throw "ERRR!";
}
else
{
var format = StringFormat;
if(format.substr(0, 6) === "buffer")
{
if(format.length > 6)
{
ParamValue = parseInt(format.substr(6));
format = "buffer";
}
else
{
ParamValue = 0;
}
}
else
if(format.substr(0, 3) === "arr")
{
if(format.length > 3)
{
ParamValue = parseInt(format.substr(3));
format = "arr";
}
else
if("<" === d)
{
ParamValue = 0;
}
}
else
if(format.substr(0, 3) === "str")
{
if(format.length > 3)
{
r && (i = r.length);
b = GetMiddleString(a);
var h = 0, c = e.len;
e.len += 4;
for(s = 0; s < i; s++)
r[s] && (h++, Write(e, s, "uint32"), Write(e, r[s], b, void 0, l));
e.writeUInt32LE(h, c, 4);
var length = parseInt(format.substr(3));
ret = buf.toString('utf8', buf.len, buf.len + length);
buf.len += length;
var nEnd = - 1;
for(var i = ret.length - 1; i >= 0; i--)
{
if(ret.charCodeAt(i) !== 0)
{
nEnd = i;
break;
}
}
if(nEnd >= 0)
ret = ret.substr(0, i + 1);
else
ret = "";
return ret;
}
else
{
if("{" !== d)
throw "Bad write type params: " + a;
var g = l[a];
g || (g = GetAttributes(GetMiddleString(a)), l[a] = g);
for(s = 0; s < g.length; s++)
ParamValue = 0;
}
}
switch(format)
{
case "str":
{
var length;
if(buf.len + 2 <= buf.length)
length = buf[buf.len] + buf[buf.len + 1] * 256;
else
length = 0;
buf.len += 2;
var arr = buf.slice(buf.len, buf.len + length);
ret = Utf8ArrayToStr(arr);
buf.len += length;
break;
}
case "byte":
{
if(buf.len + 1 <= buf.length)
ret = buf[buf.len];
else
ret = 0;
buf.len += 1;
break;
}
case "double":
{
if(buf.len + 8 <= buf.length)
ret = buf.readDoubleLE(buf.len, 8);
else
ret = 0;
buf.len += 8;
break;
}
case "uint":
{
if(buf.len + 6 <= buf.length)
ret = buf.readUIntLE(buf.len, 6);
else
ret = 0;
buf.len += 6;
break;
}
case "uint16":
{
if(buf.len + 2 <= buf.length)
ret = buf[buf.len] + buf[buf.len + 1] * 256;
else
ret = 0;
buf.len += 2;
break;
}
case "uint32":
{
if(buf.len + 4 <= buf.length)
ret = buf.readUInt32LE(buf.len, 4);
else
ret = 0;
buf.len += 4;
break;
}
case "time":
{
if(bDisableTime)
throw "Bad read type params: time - DisableTime ON";
if(buf.len + 6 <= buf.length)
ret = buf.readUIntLE(buf.len, 6);
else
ret = 0;
ret = new Date(ret);
buf.len += 6;
break;
}
case "addres":
case "hash":
{
ret = [];
for(var i = 0; i < 32; i++)
{
if(buf.len + i <= buf.length)
ret[i] = buf[buf.len + i];
else
ret[i] = 0;
}
buf.len += 32;
break;
}
case "buffer":
case "arr":
{
if(buf.len + ParamValue <= buf.length)
ret = buf.slice(buf.len, buf.len + ParamValue);
else
ret = Buffer.alloc(ParamValue);
buf.len += ParamValue;
break;
}
case "tr":
{
if(buf.len + 1 >= buf.length)
{
ret = undefined;
break;
}
var length = buf[buf.len] + buf[buf.len + 1] * 256;
buf.len += 2;
ret = buf.slice(buf.len, buf.len + length);
buf.len += length;
break;
}
case "data":
{
var length;
if(buf.len + 4 <= buf.length)
length = buf.readUInt32LE(buf.len, 4);
else
length = 0;
if(length > buf.length - buf.len - 4)
length = 0;
buf.len += 4;
ret = buf.slice(buf.len, buf.len + length);
buf.len += length;
break;
}
case "hashSTR":
{
var Str = buf.toString('utf8', buf.len, buf.len + 64);
ret = GetAddresFromHex(Str);
buf.len += 64;
break;
}
case "uintSTR":
{
var Str = buf.toString('utf8', buf.len, buf.len + 10);
ret = parseInt(Str);
buf.len += 10;
break;
}
default:
{
WorkStruct = WorkStruct || {};
var LStr = format.substr(0, 1);
if(LStr === "[" || LStr === "<")
{
var bIndexArr = (LStr === "<");
ret = [];
var formatNext = GetMiddleString(format);
var length = Read(buf, "uint32");
for(var i = 0; i < length; i++)
{
var v = g[s];
Write(e, r[v.Key], v.Value, void 0, l);
if(buf.len <= buf.length)
{
if(bIndexArr)
{
var index = Read(buf, "uint32");
ret[index] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
}
else
{
ret[i] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
}
}
else
break;
}
}
}
}
};
function Read(e,r,t,n,l)
{
var a;
if("number" == typeof r)
throw ToLogTrace("ERR StringFormat"), "ERRR!";
var i = r;
if("buffer" === i.substr(0, 6))
6 < i.length ? (t = parseInt(i.substr(6)), i = "buffer") : t = 0;
else
if("arr" === i.substr(0, 3))
3 < i.length ? (t = parseInt(i.substr(3)), i = "arr") : t = 0;
else
if("str" === i.substr(0, 3))
{
if(3 < i.length)
{
var f = parseInt(i.substr(3));
a = e.toString("utf8", e.len, e.len + f), e.len += f;
for(var s = - 1, u = a.length - 1; 0 <= u; u--)
if(0 !== a.charCodeAt(u))
else
if(LStr === "{")
{
s = u;
break;
var attrs = WorkStruct[format];
if(!attrs)
{
attrs = GetAttributes(GetMiddleString(format));
WorkStruct[format] = attrs;
}
ret = {};
for(var i = 0; i < attrs.length; i++)
{
var type = attrs[i];
ret[type.Key] = Read(buf, type.Value, undefined, WorkStruct, bDisableTime);
}
}
else
{
throw "Bad read type params: " + format;
}
return a = 0 <= s ? a.substr(0, u + 1) : "";
}
t = 0;
}
switch(i)
{
case "str":
f = e.len + 2 <= e.length ? e[e.len] + 256 * e[e.len + 1] : 0, e.len += 2;
var o = e.slice(e.len, e.len + f);
a = Utf8ArrayToStr(o), e.len += f;
break;
case "byte":
a = e.len + 1 <= e.length ? e[e.len] : 0, e.len += 1;
break;
case "double":
a = e.len + 8 <= e.length ? e.readDoubleLE(e.len, 8) : 0, e.len += 8;
break;
case "uint":
a = e.len + 6 <= e.length ? e.readUIntLE(e.len, 6) : 0, e.len += 6;
break;
case "uint16":
a = e.len + 2 <= e.length ? e[e.len] + 256 * e[e.len + 1] : 0, e.len += 2;
break;
case "uint32":
a = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0, e.len += 4;
break;
case "time":
if(l)
throw "Bad read type params: time - DisableTime ON";
a = e.len + 6 <= e.length ? e.readUIntLE(e.len, 6) : 0, a = new Date(a), e.len += 6;
break;
case "addres":
case "hash":
a = [];
for(u = 0; u < 32; u++)
e.len + u <= e.length ? a[u] = e[e.len + u] : a[u] = 0;
e.len += 32;
break;
case "buffer":
case "arr":
a = e.len + t <= e.length ? e.slice(e.len, e.len + t) : Buffer.alloc(t), e.len += t;
break;
case "tr":
if(e.len + 1 >= e.length)
{
a = void 0;
break;
}
f = e[e.len] + 256 * e[e.len + 1];
e.len += 2, a = e.slice(e.len, e.len + f), e.len += f;
break;
case "data":
(f = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0) > e.length - e.len - 4 && (f = 0), e.len += 4, a = e.slice(e.len,
e.len + f), e.len += f;
break;
case "hashSTR":
var d = e.toString("utf8", e.len, e.len + 64);
a = GetAddresFromHex(d), e.len += 64;
break;
case "uintSTR":
d = e.toString("utf8", e.len, e.len + 10);
a = parseInt(d), e.len += 10;
break;
default:
n = n || {};
var b = i.substr(0, 1);
if("[" === b || "<" === b)
{
var h = "<" === b;
a = [];
var c = GetMiddleString(i);
for(f = Read(e, "uint32"), u = 0; u < f && e.len <= e.length; u++)
{
h ? a[Read(e, "uint32")] = Read(e, c, void 0, n, l) : a[u] = Read(e, c, void 0, n, l);
}
}
else
{
if("{" !== b)
throw "Bad read type params: " + i;
var g = n[i];
g || (g = GetAttributes(GetMiddleString(i)), n[i] = g), a = {};
for(u = 0; u < g.length; u++)
{
var v = g[u];
a[v.Key] = Read(e, v.Value, void 0, n, l);
}
}
}
return a;
};
function BufWriteByte(e)
{
this[this.len] = e, this.len += 1;
};
function BufWrite(e,r,t)
{
Write(this, e, r, t);
};
function BufRead(e,r)
{
return Read(this, e, r);
};
function GetNewBuffer(e)
{
var r = Buffer.alloc(e);
return r.Read = BufRead.bind(r), r.Write = BufWrite.bind(r), r.len = 0, r;
};
function GetReadBuffer(e)
{
var r = Buffer.from(e);
return r.Read = BufRead.bind(r), r.Write = BufWrite.bind(r), r.len = 0, r;
};
function GetObjectFromBuffer(e,r,t,n)
{
var l = Buffer.from(e);
return l.len = 0, Read(l, r, void 0, t, n);
};
function GetBufferFromObject(e,r,t,n,l)
{
var a = Buffer.alloc(t);
return a.len = 0, Write(a, e, r, void 0, n), l || (a = a.slice(0, a.len)), a;
};
function GetMiddleString(e)
{
return e.substr(1, e.length - 2);
};
function GetMiddleString2(e,r,t)
{
for(var n = 0, l = "", a = 0; a < e.length; a++)
{
var i = e.substr(a, 1);
if(" " !== i && "\n" !== i && (i !== r || 1 != ++n))
{
if(i === t && 0 === --n)
break;
n && (l += i);
}
}
return l;
return ret;
};
function GetAttributeStrings(e)
function BufWriteByte(value)
{
for(var r = 0, t = [], n = "", l = 0; l < e.length; l++)
this[this.len] = value;
this.len += 1;
};
function BufWrite(data,StringFormat,ParamValue)
{
Write(this, data, StringFormat, ParamValue);
};
function BufRead(StringFormat,ParamValue)
{
return Read(this, StringFormat, ParamValue);
};
function GetNewBuffer(size)
{
var buf = Buffer.alloc(size);
buf.Read = BufRead.bind(buf);
buf.Write = BufWrite.bind(buf);
buf.len = 0;
return buf;
};
function GetReadBuffer(buffer)
{
var buf = Buffer.from(buffer);
buf.Read = BufRead.bind(buf);
buf.Write = BufWrite.bind(buf);
buf.len = 0;
return buf;
};
function GetObjectFromBuffer(buffer,format,WorkStruct,bDisableTime)
{
var buf = Buffer.from(buffer);
buf.len = 0;
return Read(buf, format, undefined, WorkStruct, bDisableTime);
};
function GetBufferFromObject(data,format,size,WorkStruct,bNotSlice)
{
var buf = Buffer.alloc(size);
buf.len = 0;
Write(buf, data, format, undefined, WorkStruct);
if(!bNotSlice)
{
var a = e.substr(l, 1);
if("{" === a)
r++;
buf = buf.slice(0, buf.len);
}
return buf;
};
function GetMiddleString(Str)
{
return Str.substr(1, Str.length - 2);
};
function GetMiddleString2(Str,FromStr,ToStr)
{
var Count = 0;
var Result = "";
for(var i = 0; i < Str.length; i++)
{
var FStr = Str.substr(i, 1);
if(FStr === " " || FStr === "\n")
{
continue;
}
if(FStr === FromStr)
{
Count++;
if(Count === 1)
continue;
}
if(FStr === ToStr)
{
Count--;
if(Count === 0)
break;
}
if(Count)
Result = Result + FStr;
}
return Result;
};
function GetAttributeStrings(Str)
{
var Count = 0;
var Result = [];
var Element = "";
for(var i = 0; i < Str.length; i++)
{
var FStr = Str.substr(i, 1);
if(FStr === "{")
{
Count++;
}
else
if("}" === a)
r--;
else
if(FStr === "}")
{
if("," === a && 0 === r)
Count--;
}
else
if(FStr === "," && Count === 0)
{
0 < n.length && t.push(n), n = "";
if(Element.length > 0)
Result.push(Element);
Element = "";
continue;
}
if(" " === a || "\n" === a)
continue;
}
n += a;
else
if(FStr === " " || FStr === "\n")
continue;
Element = Element + FStr;
}
return 0 < n.length && t.push(n), t;
if(Element.length > 0)
Result.push(Element);
return Result;
};
function GetKeyValueStrings(e)
function GetKeyValueStrings(Str)
{
for(var r = "", t = 0; t < e.length; t++)
var Key = "";
for(var i = 0; i < Str.length; i++)
{
var n = e.substr(t, 1);
if(" " !== n && "\n" !== n)
var FStr = Str.substr(i, 1);
if(FStr === " " || FStr === "\n")
{
if(":" === n)
return {Key:r, Value:e.substr(t + 1)};
r += n;
continue;
}
if(FStr === ":")
{
var Value = Str.substr(i + 1);
return {Key:Key, Value:Value};
}
Key = Key + FStr;
}
throw "Error format Key:Value = " + e;
throw "Error format Key:Value = " + Str;
};
function GetAttributes(e)
function GetAttributes(Str)
{
for(var r = [], t = GetAttributeStrings(e), n = 0; n < t.length; n++)
var arr = [];
var attrstr = GetAttributeStrings(Str);
for(var i = 0; i < attrstr.length; i++)
{
var l = GetKeyValueStrings(t[n]);
r.push(l);
var type = GetKeyValueStrings(attrstr[i]);
arr.push(type);
}
return r;
return arr;
};
module.exports.GetNewBuffer = GetNewBuffer, module.exports.GetReadBuffer = GetReadBuffer, module.exports.alloc = GetNewBuffer,
module.exports.from = GetReadBuffer, module.exports.Write = Write, module.exports.Read = Read, module.exports.GetObjectFromBuffer = GetObjectFromBuffer,
module.exports.GetBufferFromObject = GetBufferFromObject;

View File

@@ -8,7 +8,7 @@
* Telegram: https://t.me/terafoundation
*/
global.UPDATE_CODE_VERSION_NUM = 1131;
global.UPDATE_CODE_VERSION_NUM = 1133;
global.MIN_CODE_VERSION_NUM = 1114;
global.MINING_VERSION_NUM = 0;
global.InitParamsArg = InitParamsArg;
@@ -18,8 +18,8 @@ global.CONST_NAME_ARR = ["AUTO_CORRECT_TIME", "DELTA_CURRENT_TIME", "COMMON_KEY"
"ALL_LOG_TO_CLIENT", "LOG_LEVEL", "USE_MINING", "MINING_START_TIME", "MINING_PERIOD_TIME", "POW_MAX_PERCENT", "COUNT_MINING_CPU",
"SIZE_MINING_MEMORY", "POW_RUN_COUNT", "USE_AUTO_UPDATE", "RESTART_PERIOD_SEC", "MAX_GRAY_CONNECTIONS_TO_SERVER", "TRANSACTION_PROOF_COUNT",
"UPDATE_NUM_COMPLETE", "LIMIT_SEND_TRAFIC", "WATCHDOG_DEV", "ADDRLIST_MODE", "CheckPointDelta", "MIN_VER_STAT", "DEBUG_WALLET",
"HTTP_HOSTING_PORT", "HTTPS_HOSTING_DOMAIN", "HTTP_MAX_COUNT_ROWS", "HTTP_ADMIN_PASSORD", "WATCHDOG_BADACCOUNT", "RESYNC_CONDITION",
"MAX_CONNECTIONS_COUNT", "TRUST_PROCESS_COUNT", "REST_START_COUNT", "LOAD_TO_BEGIN", ];
"HTTP_HOSTING_PORT", "HTTPS_HOSTING_DOMAIN", "HTTP_MAX_COUNT_ROWS", "HTTP_ADMIN_PASSWORD", "HTTP_START_PAGE", "WATCHDOG_BADACCOUNT",
"RESYNC_CONDITION", "MAX_CONNECTIONS_COUNT", "TRUST_PROCESS_COUNT", "REST_START_COUNT", "LOAD_TO_BEGIN", ];
global.MAX_LENGTH_SENDER_MAP = 3000;
global.DELTA_START_SENDER_MAP = 24;
global.NODES_DELTA_CALC_HOUR = 4;
@@ -73,7 +73,8 @@ global.SIZE_MINING_MEMORY = 0;
global.HTTP_HOSTING_PORT = 0;
global.HTTPS_HOSTING_DOMAIN = "";
global.HTTP_MAX_COUNT_ROWS = 20;
global.HTTP_ADMIN_PASSORD = "";
global.HTTP_ADMIN_PASSWORD = "";
global.HTTP_START_PAGE = "";
require("./startlib.js");
global.MIN_POWER_POW_HANDSHAKE = 12;
global.USE_HINT = 0;

View File

@@ -8,80 +8,127 @@
* Telegram: https://t.me/terafoundation
*/
var BufIP, fs = require("fs");
var fs = require('fs');
require("./library.js");
var MapNames = {}, FileIp = "./SITE/DB/iplocation.db", FileNames = "./SITE/DB/locationnames.csv", Format = "{Value:uint32,Length:uint32, id:uint32, latitude:uint32, longitude:uint32}",
FormatStruct = {};
var BufIP;
var MapNames = {};
var FileIp = "./SITE/DB/iplocation.db";
var FileNames = "./SITE/DB/locationnames.csv";
var Format = "{Value:uint32,Length:uint32, id:uint32, latitude:uint32, longitude:uint32}";
var FormatStruct = {};
function SetGeoLocation(e)
function SetGeoLocation(Item)
{
if(!e.ip || !BufIP || !BufIP.length)
return !1;
var t = IPToUint(e.ip), i = FindItem(BufIP, 20, t);
return i && (e.latitude = i.latitude, e.longitude = i.longitude, e.name = MapNames[i.id]), e.Geo = 1, !0;
};
function ReadItem(e,t)
{
return BufIP.len = e * t, BufLib.Read(BufIP, Format, void 0, FormatStruct);
};
function FindItem(e,t,i)
{
var n, r = Math.trunc(e.length / t), a = (ReadItem(0, t), ReadItem(r, t), 0), u = r, o = Math.trunc(i * r / 4294967296);
r <= o && (o = r - 1), o < a && (o = a);
for(var f = 40; 0 < f; )
if(!Item.ip || !BufIP || !BufIP.length)
return false;
var Num = IPToUint(Item.ip);
var Location = FindItem(BufIP, 20, Num);
if(Location)
{
if(f--, !(n = ReadItem(o, t)))
return void ToLog("GEO FindItem - Error read num: " + o);
if(n.Value > i)
Item.latitude = Location.latitude;
Item.longitude = Location.longitude;
Item.name = MapNames[Location.id];
}
Item.Geo = 1;
return true;
};
function ReadItem(Num,Size)
{
BufIP.len = Num * Size;
var Data = BufLib.Read(BufIP, Format, undefined, FormatStruct);
return Data;
};
function FindItem(Buf,Size,FindValue)
{
var Item;
var MaxNum = Math.trunc(Buf.length / Size);
var MinItem = ReadItem(0, Size);
var MaxItem = ReadItem(MaxNum, Size);
var StartNum = 0;
var EndNum = MaxNum;
var CurNum = Math.trunc(FindValue * MaxNum / 0x100000000);
if(CurNum >= MaxNum)
CurNum = MaxNum - 1;
if(CurNum < StartNum)
CurNum = StartNum;
var CountIt = 40;
while(CountIt > 0)
{
CountIt--;
Item = ReadItem(CurNum, Size);
if(Item)
{
if(u = o - 1, 0 === (l = o - a))
return ;
o -= l = Math.trunc((1 + l) / 2);
}
else
if(n.Value < i)
if(Item.Value > FindValue)
{
if(n.Value + n.Length >= i)
return n;
var l;
if(a = o + 1, 0 === (l = u - o))
return ;
o += l = Math.trunc((1 + l) / 2);
EndNum = CurNum - 1;
var Delta = CurNum - StartNum;
if(Delta === 0)
return undefined;
Delta = Math.trunc((1 + Delta) / 2);
CurNum = CurNum - Delta;
}
else
if(n.Value === i)
return n;
if(Item.Value < FindValue)
{
if(Item.Value + Item.Length >= FindValue)
return Item;
StartNum = CurNum + 1;
var Delta = EndNum - CurNum;
if(Delta === 0)
return undefined;
Delta = Math.trunc((1 + Delta) / 2);
CurNum = CurNum + Delta;
}
else
if(Item.Value === FindValue)
return Item;
}
else
{
ToLog("GEO FindItem - Error read num: " + CurNum);
return undefined;
}
}
return undefined;
};
function Init()
{
if(fs.existsSync(FileIp) && fs.existsSync(FileNames))
if(!fs.existsSync(FileIp))
return ;
if(!fs.existsSync(FileNames))
return ;
BufIP = fs.readFileSync(FileIp);
var Buf = fs.readFileSync(FileNames);
var index2 = 0;
var Count = 0;
while(true)
{
BufIP = fs.readFileSync(FileIp);
for(var e = fs.readFileSync(FileNames), t = 0; ; )
{
var i = e.indexOf("\n", t);
if(i < 0)
break;
var n = e.toString("utf-8", t, i - 1);
t = i + 1;
var r = n.split(","), a = parseInt(r[0]);
if(a)
{
0;
var u = r[10];
u = (u = u || r[7]) || r[5], MapNames[a] = u;
}
}
var index = Buf.indexOf("\n", index2);
if(index < 0)
break;
var Str = Buf.toString('utf-8', index2, index - 1);
index2 = index + 1;
var Arr = Str.split(',');
var Num = parseInt(Arr[0]);
if(!Num)
continue;
Count++;
var Name = Arr[10];
if(!Name)
Name = Arr[7];
if(!Name)
Name = Arr[5];
MapNames[Num] = Name;
}
};
function IPToUint(e)
function IPToUint(IPv4)
{
var t = e.split(".");
return 256 * (256 * (256 * + t[0] + + t[1]) + + t[2]) + + t[3];
var d = IPv4.split('.');
return (((((( + d[0]) * 256) + ( + d[1])) * 256) + ( + d[2])) * 256) + ( + d[3]);
};
global.SetGeoLocation = SetGeoLocation, Init();
global.SetGeoLocation = SetGeoLocation;
Init();

View File

@@ -1951,6 +1951,9 @@ HTTPCaller.GetHashRate = function (ArrParams)
var CountAvg = 10;
if(i === ArrParams.length - 1)
CountAvg = 3;
var StepDeltaAvg = Math.floor(StepDelta / CountAvg);
if(StepDeltaAvg < 1)
StepDeltaAvg = 1;
var ItervalArr = [];
for(var Num = Item.BlockNum1; Num < Item.BlockNum2; Num += StepDelta)
{
@@ -1966,7 +1969,7 @@ HTTPCaller.GetHashRate = function (ArrParams)
var CountSum = 0;
for(var d = 0; d < CountAvg; d++)
{
var Block = SERVER.ReadBlockHeaderDB(Num + d);
var Block = SERVER.ReadBlockHeaderDB(Num + d * StepDeltaAvg);
if(Block)
{
CountSum++;

View File

@@ -9,259 +9,492 @@
*/
require("./constant.js");
var fs = require("fs");
var fs = require('fs');
require("./log-strict.js");
var file_name_info = GetDataPath("info.log"), file_name_infoPrev = GetDataPath("info-prev.log");
var file_name_info = GetDataPath("info.log");
var file_name_infoPrev = GetDataPath("info-prev.log");
CheckSizeLogFile(file_name_info, file_name_infoPrev);
var file_name_log = GetDataPath("log.log"), file_name_logPrev = GetDataPath("log-prev.log");
var file_name_log = GetDataPath("log.log");
var file_name_logPrev = GetDataPath("log-prev.log");
CheckSizeLogFile(file_name_log, file_name_logPrev);
var file_name_log_web = GetDataPath("web.log"), file_name_log_webPrev = GetDataPath("web-prev.log");
var file_name_log_web = GetDataPath("web.log");
var file_name_log_webPrev = GetDataPath("web-prev.log");
CheckSizeLogFile(file_name_log_web, file_name_log_webPrev);
var file_name_error = GetDataPath("err.log"), file_name_errorPrev = GetDataPath("err-prev.log");
var file_name_error = GetDataPath("err.log");
var file_name_errorPrev = GetDataPath("err-prev.log");
CheckSizeLogFile(file_name_error, file_name_errorPrev);
var StartStatTime, file_name_error_tx = GetDataPath("err-tx.log"), file_name_error_txPrev = GetDataPath("err-tx-prev.log");
function ToLogFile(e,t,r)
var file_name_error_tx = GetDataPath("err-tx.log");
var file_name_error_txPrev = GetDataPath("err-tx-prev.log");
CheckSizeLogFile(file_name_error_tx, file_name_error_txPrev);
global.ToLog = function (Str,Level)
{
t instanceof Error && (t = t.message + "\n" + t.stack), global.START_SERVER || (t = global.PROCESS_NAME + ": " + t), "MAIN" !== global.PROCESS_NAME && process.send ? process.send({cmd:"log",
message:t}) : (console.log(START_PORT_NUMBER + ": " + GetStrOnlyTime() + ": " + t), r || SaveToLogFileSync(e, t));
if(Level === undefined)
Level = 1;
if(Level && Level > global.LOG_LEVEL)
return ;
if(global.ALL_LOG_TO_CLIENT)
ToLogClient(Str, undefined, undefined);
else
ToLogFile(file_name_log, Str);
};
global.WEB_LOG = 0;
global.ToLogWeb = function (Str)
{
if(global.WEB_LOG)
{
SaveToLogFileSync(file_name_log_web, Str);
}
};
global.SmallAddr = function (Str)
{
return Str.substr(0, 5);
};
global.ToErrorTrace = function (Str)
{
ToError("" + Str + ":" + new Error().stack);
};
global.ToLogTrace = function (Str)
{
ToErrorTrace(Str);
};
global.ToInfo = function (Str)
{
ToLogFile(file_name_info, Str, 1);
};
global.ToError = function (Str)
{
ToLogFile(file_name_error, Str);
};
global.ToErrorTx = function (Str)
{
SaveToLogFileSync(file_name_error_tx, Str);
ToLog(Str);
};
function ToLogClient(e,t,r)
function ToLogFile(file_name,Str,bNoFile)
{
e && (ToLogFile(file_name_log, e), t = t || "", ArrLogClient.push({text:GetStrOnlyTime() + " " + e, key:t, final:r}), 13 < ArrLogClient.length && ArrLogClient.shift());
if(Str instanceof Error)
{
Str = Str.message + "\n" + Str.stack;
}
if(!global.START_SERVER)
Str = global.PROCESS_NAME + ": " + Str;
if(global.PROCESS_NAME !== "MAIN" && process.send)
{
process.send({cmd:"log", message:Str});
return ;
}
else
{
console.log("" + START_PORT_NUMBER + ": " + GetStrOnlyTime() + ": " + Str);
}
if(bNoFile)
return ;
SaveToLogFileSync(file_name, Str);
};
CheckSizeLogFile(file_name_error_tx, file_name_error_txPrev), global.ToLog = function (e,t)
global.ArrLogClient = [];
function ToLogClient(Str,StrKey,bFinal)
{
void 0 === t && (t = 1), t && t > global.LOG_LEVEL || (global.ALL_LOG_TO_CLIENT ? ToLogClient(e, void 0, void 0) : ToLogFile(file_name_log,
e));
}, global.WEB_LOG = 0, global.ToLogWeb = function (e)
if(!Str)
return ;
ToLogFile(file_name_log, Str);
if(!StrKey)
StrKey = "";
ArrLogClient.push({text:GetStrOnlyTime() + " " + Str, key:StrKey, final:bFinal, });
if(ArrLogClient.length > 13)
ArrLogClient.shift();
};
global.ToLogClient = ToLogClient;
global.ToLogClient0 = ToLogClient;
var StartStatTime;
var CONTEXT_STATS = {Total:{}, Interval:[]};
var CONTEXT_ERRORS = {Total:{}, Interval:[]};
var CurStatIndex = 0;
global.PrepareStatEverySecond = function ()
{
global.WEB_LOG && SaveToLogFileSync(file_name_log_web, e);
}, global.SmallAddr = function (e)
CurStatIndex++;
var index = GetCurrentStatIndex();
CopyStatInterval(CONTEXT_STATS, index);
CopyStatInterval(CONTEXT_ERRORS, index);
};
global.TO_ERROR_LOG = function (Module,ErrNum,Str,type,data1,data2)
{
return e.substr(0, 5);
}, global.ToErrorTrace = function (e)
{
ToError(e + ":" + (new Error).stack);
}, global.ToLogTrace = function (e)
{
ToErrorTrace(e);
}, global.ToInfo = function (e)
{
ToLogFile(file_name_info, e, 1);
}, global.ToError = function (e)
{
ToLogFile(file_name_error, e);
}, global.ToErrorTx = function (e)
{
SaveToLogFileSync(file_name_error_tx, e), ToLog(e);
}, global.ArrLogClient = [], global.ToLogClient = ToLogClient, global.ToLogClient0 = ToLogClient;
var CONTEXT_STATS = {Total:{}, Interval:[]}, CONTEXT_ERRORS = {Total:{}, Interval:[]}, CurStatIndex = 0;
if(Str instanceof Error)
{
Str = Str.message + "\n";
}
if(type === "rinfo")
Str += " from: " + data1.address + ':' + data1.port;
else
if(type === "node")
Str += " from: " + data1.ip + ':' + data1.port;
var Key = Module + ":" + ErrNum;
ToError(" ==ERROR== " + Key + " " + Str);
AddToStatContext(CONTEXT_ERRORS, Key);
ADD_TO_STAT("ERRORS");
};
function GetCurrentStatIndex()
{
var e = 2 * MAX_STAT_PERIOD + 2;
return CurStatIndex % e;
var DefMaxStatPeriod = MAX_STAT_PERIOD * 2 + 2;
return CurStatIndex % DefMaxStatPeriod;
};
function ResizeArrMax(e)
global.HASH_RATE = 0;
global.ADD_HASH_RATE = function (Count)
{
for(var t = [], r = Math.trunc(e.length / 2), o = 0; o < r; o++)
t[o] = Math.max(e[2 * o], e[2 * o + 1]);
return t;
Count = Count / 1000000;
global.HASH_RATE += Count;
ADD_TO_STAT("HASHRATE", Count);
};
function ResizeArrAvg(e)
global.GET_STAT = function (Key)
{
for(var t = [], r = Math.trunc(e.length / 2), o = 0; o < r; o++)
t[o] = (e[2 * o] + e[2 * o + 1]) / 2;
return t;
var Val = CONTEXT_STATS.Total[Key];
if(!Val)
Val = 0;
return Val;
};
function ResizeArr(e)
global.ADD_TO_STAT_TIME = function (Name,startTime,bDetail)
{
for(var t = [], r = Math.trunc(e.length / 2), o = 0; o < r; o++)
t[o] = e[2 * o];
return t;
};
function GetDiagramData(e,t)
{
var r, o = 2 * MAX_STAT_PERIOD + 2;
r = "MAX:" === t.substr(0, 4);
for(var n, a = MAX_STAT_PERIOD, l = (GetCurrentStatIndex() - a + o) % o, i = (e.Total, []), T = void 0, g = l; g < l + a; g++)
if(global.STAT_MODE)
{
var S = g % o;
if(n = e.Interval[S])
if(bDetail && global.STAT_MODE !== 2)
return ;
var Time = process.hrtime(startTime);
var deltaTime = Time[0] * 1000 + Time[1] / 1e6;
ADD_TO_STAT(Name, deltaTime);
}
};
global.ADD_TO_STAT = function (Key,Count,bDetail)
{
if(global.STAT_MODE)
{
if(bDetail && global.STAT_MODE !== 2)
return ;
AddToStatContext(CONTEXT_STATS, Key, Count);
}
};
global.GET_STATDIAGRAMS = function (Keys)
{
var now = GetCurrentTime();
var index = GetCurrentStatIndex();
if(!Keys || !Keys.length)
return [];
var Data = [];
for(var i = 0; i < Keys.length; i++)
{
var name = Keys[i];
var Value = GetDiagramData(CONTEXT_STATS, name);
Data.push({name:name, maxindex:index, arr:Value, starttime:(StartStatTime - 0), steptime:1});
}
var MinLength = undefined;
for(var i = 0; i < Data.length; i++)
{
var arr = Data[i].arr;
if(arr.length > 0 && (MinLength === undefined || arr.length < MinLength))
MinLength = arr.length;
}
var MaxSizeArr = 500;
for(var i = 0; i < Data.length; i++)
{
var ItemServer = Data[i];
var arr = ItemServer.arr;
if(MinLength && arr.length > MinLength)
{
var _ = n[t];
void 0 !== _ ? r ? i.push(_) : (void 0 !== T ? i.push(_ - T) : i.push(_), T = _) : i.push(0);
arr = arr.slice(arr.length - MinLength);
}
if(MinLength)
if(",POWER_MY_WIN,POWER_BLOCKCHAIN,".indexOf("," + ItemServer.name + ",") >= 0)
{
arr = SERVER.GetStatBlockchain(ItemServer.name, MinLength);
}
var AvgValue = 0;
for(var j = 0; j < arr.length; j++)
{
if(arr[j])
AvgValue += arr[j];
}
if(arr.length > 0)
AvgValue = AvgValue / arr.length;
var StepTime = 1;
if(ItemServer.name.substr(0, 4) === "MAX:")
{
while(arr.length >= MaxSizeArr)
{
arr = ResizeArrMax(arr);
StepTime = StepTime * 2;
}
}
}
return i;
};
function CalcInterval(e,t,r)
{
for(var o, n = 2 * MAX_STAT_PERIOD + 2, a = {}, l = (t - r + n) % n, i = e.Total, T = l; T < l + r; T++)
{
var g = T % n;
if(o = e.Interval[g])
break;
}
if(o)
for(var S in i)
"MAX:" === S.substr(0, 4) ? a[S] = 0 : void 0 === o[S] ? a[S] = i[S] : a[S] = i[S] - o[S];
return a;
};
function AddToStatContext(e,t,r)
{
void 0 === r && (r = 1);
var o = e.Total[t];
o = o || 0, "MAX:" === t.substr(0, 4) ? o = Math.max(o, r) : o += r, e.Total[t] = o, StartStatTime = StartStatTime || GetCurrentTime(0);
};
function CopyStatInterval(e,t)
{
var r = e.Interval[t];
r || (r = {}, e.Interval[t] = r);
var o = e.Total;
for(var n in o)
r[n] = o[n], "MAX:" === n.substr(0, 4) && (o[n] = 0);
};
function SaveToLogFileAsync(e,o)
{
fs.open(e, "a", void 0, function (e,r)
{
if(e)
console.log("Ошибка открытия лог-файла ошибок");
else
{
var t = GetStrTime() + " : " + o + "\r\n";
fs.write(r, t, null, "utf8", function (e,t)
while(arr.length >= MaxSizeArr)
{
e ? console.log("Ошибка записи в лог-файл ошибок!") : fs.close(r, function (e)
arr = ResizeArrAvg(arr);
StepTime = StepTime * 2;
}
}
ItemServer.AvgValue = AvgValue;
ItemServer.steptime = StepTime;
ItemServer.arr = arr.slice(1);
}
return Data;
};
global.GET_STATS = function (Key)
{
var now = GetCurrentTime();
var index = GetCurrentStatIndex();
var stats = {Counter:CONTEXT_STATS.Total, Counter10S:CalcInterval(CONTEXT_STATS, index, 10), Counter10M:CalcInterval(CONTEXT_STATS,
index, 10 * 60), };
var errors = {Counter:CONTEXT_ERRORS.Total, Counter10S:CalcInterval(CONTEXT_ERRORS, index, 10), Counter10M:CalcInterval(CONTEXT_ERRORS,
index, 10 * 60), };
var Period = (now - StartStatTime) / 1000;
return {stats:stats, errors:errors, period:Period, Confirmation:[]};
};
global.StartCommonStat = function ()
{
for(var key in CONTEXT_STATS.Total)
return ;
ClearCommonStat();
};
global.ClearCommonStat = function ()
{
CurStatIndex = 0;
StartStatTime = undefined;
CONTEXT_STATS = {Total:{}, Interval:[]};
CONTEXT_ERRORS = {Total:{}, Interval:[]};
global.HASH_RATE = 0;
SERVER.ClearStat();
};
function ResizeArrMax(arr)
{
var arr2 = [];
var Count2 = Math.trunc(arr.length / 2);
for(var i = 0; i < Count2; i++)
{
arr2[i] = Math.max(arr[i * 2], arr[i * 2 + 1]);
}
return arr2;
};
function ResizeArrAvg(arr)
{
var arr2 = [];
var Count2 = Math.trunc(arr.length / 2);
for(var i = 0; i < Count2; i++)
{
arr2[i] = (arr[i * 2] + arr[i * 2 + 1]) / 2;
}
return arr2;
};
function ResizeArr(arr)
{
var arr2 = [];
var Count2 = Math.trunc(arr.length / 2);
for(var i = 0; i < Count2; i++)
{
arr2[i] = arr[i * 2];
}
return arr2;
};
global.ResizeArrAvg = ResizeArrAvg;
global.ResizeArrMax = ResizeArrMax;
function GetDiagramData(Context,Key)
{
var DefMaxStatPeriod = MAX_STAT_PERIOD * 2 + 2;
var IsMax;
if(Key.substr(0, 4) === "MAX:")
IsMax = true;
else
IsMax = false;
var delta = MAX_STAT_PERIOD;
var index2 = GetCurrentStatIndex();
var index1 = (index2 - delta + DefMaxStatPeriod) % DefMaxStatPeriod;
var Total = Context.Total;
var Counter1;
var arr = [];
var PrevValue = undefined;
for(var i = index1; i < index1 + delta; i++)
{
var index3 = i % DefMaxStatPeriod;
Counter1 = Context.Interval[index3];
if(Counter1)
{
var Value = Counter1[Key];
if(Value !== undefined)
{
if(!IsMax)
{
e && console.log(e);
});
if(PrevValue !== undefined)
{
arr.push(Value - PrevValue);
}
else
{
arr.push(Value);
}
PrevValue = Value;
}
else
{
arr.push(Value);
}
}
else
{
arr.push(0);
}
}
}
return arr;
};
function CalcInterval(Context,index2,delta)
{
var DefMaxStatPeriod = MAX_STAT_PERIOD * 2 + 2;
var Res = {};
var index1 = (index2 - delta + DefMaxStatPeriod) % DefMaxStatPeriod;
var Total = Context.Total;
var Counter1;
for(var i = index1; i < index1 + delta; i++)
{
var index3 = i % DefMaxStatPeriod;
Counter1 = Context.Interval[index3];
if(Counter1)
break;
}
if(Counter1)
for(var Key in Total)
{
if(Key.substr(0, 4) === "MAX:")
Res[Key] = 0;
else
{
if(Counter1[Key] === undefined)
Res[Key] = Total[Key];
else
Res[Key] = Total[Key] - Counter1[Key];
}
}
return Res;
};
function AddToStatContext(Context,Key,AddValue)
{
if(AddValue === undefined)
AddValue = 1;
var Val = Context.Total[Key];
if(!Val)
Val = 0;
if(Key.substr(0, 4) === "MAX:")
Val = Math.max(Val, AddValue);
else
Val = Val + AddValue;
Context.Total[Key] = Val;
if(!StartStatTime)
StartStatTime = GetCurrentTime(0);
};
function CopyStatInterval(Context,index)
{
var Counter = Context.Interval[index];
if(!Counter)
{
Counter = {};
Context.Interval[index] = Counter;
}
var Total = Context.Total;
for(var Key in Total)
{
Counter[Key] = Total[Key];
if(Key.substr(0, 4) === "MAX:")
Total[Key] = 0;
}
};
if(DEBUG_MODE)
global.TO_DEBUG_LOG = function (Str,type,data1,data2)
{
if(!DEBUG_MODE)
return ;
if(type === "rinfo")
Str += " from: " + data1.address + ':' + data1.port + ' - ' + data2.length;
ToLog(Str);
};
else
global.TO_DEBUG_LOG = function (Str,type,data1,data2)
{
};
function SaveToLogFileAsync(fname,Str)
{
fs.open(fname, "a", undefined, function (err,file_handle)
{
if(!err)
{
var StrLog = GetStrTime() + " : " + Str + "\r\n";
fs.write(file_handle, StrLog, null, 'utf8', function (err,written)
{
if(!err)
{
fs.close(file_handle, function (err)
{
if(err)
console.log(err);
});
}
else
{
console.log("Ошибка записи в лог-файл ошибок!");
}
});
}
else
{
console.log("Ошибка открытия лог-файла ошибок");
}
});
};
function SaveToLogFileSync(e,t)
function SaveToLogFileSync(fname,Str)
{
try
{
var r = GetStrTime() + " : " + t + "\r\n", o = fs.openSync(e, "a");
fs.writeSync(o, r, null, "utf8"), fs.closeSync(o);
var StrLog = GetStrTime() + " : " + Str + "\r\n";
var file_handle = fs.openSync(fname, "a");
fs.writeSync(file_handle, StrLog, null, 'utf8');
fs.closeSync(file_handle);
}
catch(e)
catch(err)
{
console.log(e.message);
console.log(err.message);
}
};
global.PrepareStatEverySecond = function ()
{
CurStatIndex++;
var e = GetCurrentStatIndex();
CopyStatInterval(CONTEXT_STATS, e), CopyStatInterval(CONTEXT_ERRORS, e);
}, global.TO_ERROR_LOG = function (e,t,r,o,n,a)
{
r instanceof Error && (r = r.message + "\n"), "rinfo" === o ? r += " from: " + n.address + ":" + n.port : "node" === o && (r += " from: " + n.ip + ":" + n.port);
var l = e + ":" + t;
ToError(" ==ERROR== " + l + " " + r), AddToStatContext(CONTEXT_ERRORS, l), ADD_TO_STAT("ERRORS");
}, global.HASH_RATE = 0, global.ADD_HASH_RATE = function (e)
{
e /= 1e6, global.HASH_RATE += e, ADD_TO_STAT("HASHRATE", e);
}, global.GET_STAT = function (e)
{
var t = CONTEXT_STATS.Total[e];
return t = t || 0;
}, global.ADD_TO_STAT_TIME = function (e,t,r)
{
if(global.STAT_MODE)
{
if(r && 2 !== global.STAT_MODE)
return ;
var o = process.hrtime(t), n = 1e3 * o[0] + o[1] / 1e6;
ADD_TO_STAT(e, n);
}
}, global.ADD_TO_STAT = function (e,t,r)
{
if(global.STAT_MODE)
{
if(r && 2 !== global.STAT_MODE)
return ;
AddToStatContext(CONTEXT_STATS, e, t);
}
}, global.GET_STATDIAGRAMS = function (e)
{
GetCurrentTime();
var t = GetCurrentStatIndex();
if(!e || !e.length)
return [];
for(var r = [], o = 0; o < e.length; o++)
{
var n = e[o], a = GetDiagramData(CONTEXT_STATS, n);
r.push({name:n, maxindex:t, arr:a, starttime:StartStatTime - 0, steptime:1});
}
var l = void 0;
for(o = 0; o < r.length; o++)
{
0 < (T = r[o].arr).length && (void 0 === l || T.length < l) && (l = T.length);
}
for(o = 0; o < r.length; o++)
{
var i = r[o], T = i.arr;
l && T.length > l && (T = T.slice(T.length - l)), l && 0 <= ",POWER_MY_WIN,POWER_BLOCKCHAIN,".indexOf("," + i.name + ",") && (T = SERVER.GetStatBlockchain(i.name,
l));
for(var g = 0, S = 0; S < T.length; S++)
T[S] && (g += T[S]);
0 < T.length && (g /= T.length);
var _ = 1;
if("MAX:" === i.name.substr(0, 4))
for(; 500 <= T.length; )
T = ResizeArrMax(T), _ *= 2;
else
for(; 500 <= T.length; )
T = ResizeArrAvg(T), _ *= 2;
i.AvgValue = g, i.steptime = _, i.arr = T.slice(1);
}
return r;
}, global.GET_STATS = function (e)
{
var t = GetCurrentTime(), r = GetCurrentStatIndex();
return {stats:{Counter:CONTEXT_STATS.Total, Counter10S:CalcInterval(CONTEXT_STATS, r, 10), Counter10M:CalcInterval(CONTEXT_STATS,
r, 600)}, errors:{Counter:CONTEXT_ERRORS.Total, Counter10S:CalcInterval(CONTEXT_ERRORS, r, 10), Counter10M:CalcInterval(CONTEXT_ERRORS,
r, 600)}, period:(t - StartStatTime) / 1e3, Confirmation:[]};
}, global.StartCommonStat = function ()
{
for(var e in CONTEXT_STATS.Total)
return ;
ClearCommonStat();
}, global.ClearCommonStat = function ()
{
StartStatTime = void (CurStatIndex = 0), CONTEXT_STATS = {Total:{}, Interval:[]}, CONTEXT_ERRORS = {Total:{}, Interval:[]},
global.HASH_RATE = 0, SERVER.ClearStat();
}, global.ResizeArrAvg = ResizeArrAvg, global.ResizeArrMax = ResizeArrMax, DEBUG_MODE ? global.TO_DEBUG_LOG = function (e,t,r,o)
{
DEBUG_MODE && ("rinfo" === t && (e += " from: " + r.address + ":" + r.port + " - " + o.length), ToLog(e));
} : global.TO_DEBUG_LOG = function (e,t,r,o)
{
}, global.GetStrOnlyTime = function (e)
global.GetStrOnlyTime = function (now)
{
if(!global.GetCurrentTime)
return ":::";
var t = "" + (e = e || GetCurrentTime()).getHours().toStringZ(2);
return t = (t = (t = t + ":" + e.getMinutes().toStringZ(2)) + ":" + e.getSeconds().toStringZ(2)) + "." + e.getMilliseconds().toStringZ(3);
}, global.GetStrTime = function (e)
if(!now)
now = GetCurrentTime();
var Str = "" + now.getHours().toStringZ(2);
Str = Str + ":" + now.getMinutes().toStringZ(2);
Str = Str + ":" + now.getSeconds().toStringZ(2);
Str = Str + "." + now.getMilliseconds().toStringZ(3);
return Str;
};
global.GetStrTime = function (now)
{
if(!global.GetCurrentTime)
return ":::";
var t = "" + (e = e || GetCurrentTime()).getDate().toStringZ(2);
return t = (t = (t = (t = (t = (t = t + "." + (1 + e.getMonth()).toStringZ(2)) + "." + e.getFullYear()) + " " + e.getHours().toStringZ(2)) + ":" + e.getMinutes().toStringZ(2)) + ":" + e.getSeconds().toStringZ(2)) + "." + e.getMilliseconds().toStringZ(3);
if(!now)
now = GetCurrentTime();
var Str = "" + now.getDate().toStringZ(2);
Str = Str + "." + (1 + now.getMonth()).toStringZ(2);
Str = Str + "." + now.getFullYear();
Str = Str + " " + now.getHours().toStringZ(2);
Str = Str + ":" + now.getMinutes().toStringZ(2);
Str = Str + ":" + now.getSeconds().toStringZ(2);
Str = Str + "." + now.getMilliseconds().toStringZ(3);
return Str;
};

View File

@@ -9,65 +9,108 @@
*/
function DoRest(r,t,e)
function DoRest(RestData,Data,BlockNum)
{
var u = r.Arr[0], o = Math.floor(e / REST_BLOCK_SCALE);
if(o !== Math.floor((u.BlockNum - 1) / REST_BLOCK_SCALE))
var Prev = RestData.Arr[0];
var BlockNum0 = Math.floor(BlockNum / REST_BLOCK_SCALE);
if(BlockNum0 !== Math.floor((Prev.BlockNum - 1) / REST_BLOCK_SCALE))
{
for(var n = GetRestArr(o), l = [], a = n.length - 2; 0 <= a; a--)
l.push(n[a] * REST_BLOCK_SCALE);
RestPush(r, l, e, 1);
var arr = GetRestArr(BlockNum0);
var arr2 = [];
for(var i = arr.length - 2; i >= 0; i--)
{
arr2.push(arr[i] * REST_BLOCK_SCALE);
}
RestPush(RestData, arr2, BlockNum, 1);
}
r.Arr[0] = {BlockNum:e, Value:t.Value};
RestData.Arr[0] = {BlockNum:BlockNum, Value:Data.Value};
};
function RestPush(r,t,e,u)
function RestPush(RestData,ArrRest,BlockNum,Index)
{
var o = r.Arr[u - 1], n = r.Arr[u];
if(1 < u)
var Prev = RestData.Arr[Index - 1];
var Cur = RestData.Arr[Index];
if(Index > 1)
{
var l = t[u - 2];
if(o.BlockNum > l)
var RestNum = ArrRest[Index - 2];
if(Prev.BlockNum > RestNum)
return ;
}
if(n.BlockNum && n.BlockNum >= e || o.BlockNum >= e)
return n.BlockNum = 0, void (n.Value = {});
n.BlockNum && u < r.Arr.length - 1 && RestPush(r, t, e, u + 1), r.Arr[u] = o;
if((Cur.BlockNum && Cur.BlockNum >= BlockNum) || Prev.BlockNum >= BlockNum)
{
Cur.BlockNum = 0;
Cur.Value = {};
return ;
}
if(Cur.BlockNum)
{
if(Index < RestData.Arr.length - 1)
{
RestPush(RestData, ArrRest, BlockNum, Index + 1);
}
}
RestData.Arr[Index] = Prev;
};
function GetRestArr(r)
function GetRestArr(CurBlockNum)
{
for(var t = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], e = t.length, u = 0; u <= r; u++)
for(var o = 0, n = u, l = e - 1; 0 <= l; l--)
var Arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var ArrLength = Arr.length;
var StartNum = 0;
for(var num = StartNum; num <= CurBlockNum; num++)
{
var maska = 0;
var CurNum = num;
for(var i = ArrLength - 1; i >= 0; i--)
{
var a = t[l];
if(t[l] = n, n = a, 0 == ((o = o << 4 | 15) & u))
var PosNum = Arr[i];
Arr[i] = CurNum;
CurNum = PosNum;
maska = (maska << 4) | 15;
if((maska & num) === 0)
break;
if(0 != (o & n))
if((maska & CurNum) !== 0)
break;
}
return t;
}
return Arr;
};
var RestArrMap = {};
function GetCurrentRestArr()
{
var r = GetCurrentBlockNumByTime(), t = Math.floor(r / REST_BLOCK_SCALE), e = RestArrMap[t];
if(void 0 === e)
var BlockNum = GetCurrentBlockNumByTime();
var BlockNum0 = Math.floor(BlockNum / REST_BLOCK_SCALE);
var arr = RestArrMap[BlockNum0];
if(arr === undefined)
{
RestArrMap = {}, (e = GetRestArr(t)).length = e.length - 1;
for(var u = 0; u < e.length; u++)
e[u] = e[u] * REST_BLOCK_SCALE;
RestArrMap[t] = e;
RestArrMap = {};
arr = GetRestArr(BlockNum0);
arr.length = arr.length - 1;
for(var i = 0; i < arr.length; i++)
{
arr[i] = arr[i] * REST_BLOCK_SCALE;
}
RestArrMap[BlockNum0] = arr;
}
return e;
return arr;
};
function GetCurrentRestNum(r)
function GetCurrentRestNum(NumDelta)
{
for(var t = GetCurrentBlockNumByTime() - r, e = GetCurrentRestArr(), u = e.length - 1; 0 <= u; u--)
if(e[u] <= t)
return e[u];
var BlockNum = GetCurrentBlockNumByTime();
var BlockNumMin = BlockNum - NumDelta;
var arr = GetCurrentRestArr();
for(var i = arr.length - 1; i >= 0; i--)
{
if(arr[i] <= BlockNumMin)
{
return arr[i];
}
}
return 0;
};
global.DoRest = DoRest, global.GetRestArr = GetRestArr, global.GetCurrentRestArr = GetCurrentRestArr, global.GetCurrentRestNum = GetCurrentRestNum;
global.DoRest = DoRest;
global.GetRestArr = GetRestArr;
global.GetCurrentRestArr = GetCurrentRestArr;
global.GetCurrentRestNum = GetCurrentRestNum;

View File

@@ -9,42 +9,77 @@
*/
var fs = require("fs");
function CopyFiles(l,o,t)
global.GetDataPath = function GetDataPath(name)
{
if(fs.existsSync(l))
for(var e = fs.readdirSync(l), n = 0; n < e.length; n++)
if(global.DATA_PATH.substr(global.DATA_PATH.length - 1, 1) !== "/")
global.DATA_PATH = global.DATA_PATH + "/";
return GetNormalPathString(global.DATA_PATH + name);
};
global.GetCodePath = function GetCodePath(name)
{
if(global.CODE_PATH.substr(global.CODE_PATH.length - 1, 1) !== "/")
global.CODE_PATH = global.CODE_PATH + "/";
return GetNormalPathString(global.CODE_PATH + name);
};
global.GetNormalPathString = function (Str)
{
return Str.split("\\").join('/');
};
global.CheckCreateDir = function (Path,bHidden,IsFile)
{
Path = GetNormalPathString(Path);
if(!fs.existsSync(Path))
{
if(!bHidden)
console.log("Create: " + Path);
var arr = Path.split('/');
var CurPath = arr[0];
if(IsFile)
{
var a = l + "/" + e[n], s = o + "/" + e[n];
if(fs.statSync(a).isDirectory())
t && (fs.existsSync(s) || fs.mkdirSync(s), CopyFiles(a, s, t));
else
arr.length--;
}
for(var i = 1; i < arr.length; i++)
{
CurPath += "/" + arr[i];
if(!fs.existsSync(CurPath))
{
var r = fs.readFileSync(a), i = fs.openSync(s, "w");
fs.writeSync(i, r, 0, r.length), fs.closeSync(i);
fs.mkdirSync(CurPath);
}
}
};
global.GetDataPath = function (l)
{
return "/" !== global.DATA_PATH.substr(global.DATA_PATH.length - 1, 1) && (global.DATA_PATH = global.DATA_PATH + "/"), GetNormalPathString(global.DATA_PATH + l);
}, global.GetCodePath = function (l)
{
return "/" !== global.CODE_PATH.substr(global.CODE_PATH.length - 1, 1) && (global.CODE_PATH = global.CODE_PATH + "/"), GetNormalPathString(global.CODE_PATH + l);
}, global.GetNormalPathString = function (l)
{
return l.split("\\").join("/");
}, global.CheckCreateDir = function (l,o,t)
{
if(l = GetNormalPathString(l), !fs.existsSync(l))
{
o || console.log("Create: " + l);
var e = l.split("/"), n = e[0];
t && e.length--;
for(var a = 1; a < e.length; a++)
n += "/" + e[a], fs.existsSync(n) || fs.mkdirSync(n);
}
}, global.CopyFiles = CopyFiles, global.ToLog || (global.ToLog = function (l)
};
global.CopyFiles = CopyFiles;
function CopyFiles(FromPath,ToPath,bRecursive)
{
console.log(l);
});
if(fs.existsSync(FromPath))
{
var arr = fs.readdirSync(FromPath);
for(var i = 0; i < arr.length; i++)
{
var name1 = FromPath + "/" + arr[i];
var name2 = ToPath + "/" + arr[i];
if(fs.statSync(name1).isDirectory())
{
if(bRecursive)
{
if(!fs.existsSync(name2))
fs.mkdirSync(name2);
CopyFiles(name1, name2, bRecursive);
}
}
else
{
var data = fs.readFileSync(name1);
var file_handle = fs.openSync(name2, "w");
fs.writeSync(file_handle, data, 0, data.length);
fs.closeSync(file_handle);
}
}
}
};
if(!global.ToLog)
global.ToLog = function (Str)
{
console.log(Str);
};