From 1509b956a988bd294b75a42f5ccaa5f072281a35 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Sat, 13 Jul 2019 15:51:52 +0800 Subject: [PATCH] refactor: sync block loader Signed-off-by: MiaoWoo --- src/core/base.ts | 18 +- src/core/block-exchange.ts | 4 +- src/core/block-loader-const.ts | 49 +- src/core/block-loader.ts | 65 ++- src/core/buffer.ts | 832 ++++++++++++++++++++++----------- src/core/code.ts | 8 +- 6 files changed, 653 insertions(+), 323 deletions(-) diff --git a/src/core/base.ts b/src/core/base.ts index 55f4d46..fe78cd2 100644 --- a/src/core/base.ts +++ b/src/core/base.ts @@ -381,15 +381,15 @@ global.STreeBuffer = STreeBuffer; global.TestCreateTr = TestCreateTr; function TestCreateTr() { - // const FORMAT_CREATE = "{\ - // Type:byte,\ - // Currency:uint,\ - // PubKey:arr33,\ - // Description:str40,\ - // Adviser:uint,\ - // Reserve:arr7,\ - // POWCreate:arr12,\ - // }"; + const FORMAT_CREATE = "{\ + Type:byte,\ + Currency:uint,\ + PubKey:arr33,\ + Description:str40,\ + Adviser:uint,\ + Reserve:arr7,\ + POWCreate:arr12,\ + }"; var TR = { Type: 100, Currency: 0, PubKey: [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], Description: "Description", Adviser: 10, diff --git a/src/core/block-exchange.ts b/src/core/block-exchange.ts index 17b1816..ae1d193 100644 --- a/src/core/block-exchange.ts +++ b/src/core/block-exchange.ts @@ -182,13 +182,13 @@ export default class CConsensus extends CBlock { global.ToLog("TRANSFER BlockNum:" + Block.BlockNum + " TxArray=" + Data.TxArray.length + " from " + global.NodeName(Node)) this.ToMaxPOWList(Data.MaxPOW) this.ToMaxSumList(this.GetMaxSumListFromID(Node, Data.MaxSumID, Data.BlockList)) - //var WasNewAdd = 0; + var WasNewAdd = 0; if (Data.TxArray.length) { for (var i = 0; i < Data.TxArray.length; i++) { var Tr = Data.TxArray[i]; var Res = this.AddTrToBlockQuote(Block, Tr); if (Res === 1) { - //WasNewAdd = 1 + WasNewAdd = 1 } if (global.USE_CHECK_SENDING && Res > 0) { var Tt = Block.PowTxTree.find(Tr); diff --git a/src/core/block-loader-const.ts b/src/core/block-loader-const.ts index 98f5141..98d3071 100644 --- a/src/core/block-loader-const.ts +++ b/src/core/block-loader-const.ts @@ -8,19 +8,36 @@ * 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 * global.CONSENSUS_PERIOD_TIME -global.PACKET_ALIVE_PERIOD_NEXT_NODE = global.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:, ProofArrR:, }" -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 * global.CONSENSUS_PERIOD_TIME; +global.PACKET_ALIVE_PERIOD_NEXT_NODE = global.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:,\ + ProofArrR:,\ + }"; +global.FORMAT_SMART_TRANSFER = "{\ + Result:uint,\ + Arr:[tr],\ + }"; diff --git a/src/core/block-loader.ts b/src/core/block-loader.ts index a4974f3..be743e1 100644 --- a/src/core/block-loader.ts +++ b/src/core/block-loader.ts @@ -65,11 +65,19 @@ export default class CBlock extends CRest { if (Num < 0) return undefined; var Block: any = { - BlockNum: Num, TreeHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0], AddrHash: global.DEVELOP_PUB_KEY0, Hash: this.GetHashGenesis(Num), PowHash: this.GetHashGenesis(Num), PrevHash: [0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], SeqHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], SumHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], Comment1: "GENESIS", Comment2: "", TrCount: 0, TrDataPos: 0, TrDataLen: 0, + BlockNum: Num, + TreeHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + AddrHash: global.DEVELOP_PUB_KEY0, + Hash: this.GetHashGenesis(Num), + PowHash: this.GetHashGenesis(Num), + PrevHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + SeqHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + SumHash: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + Comment1: "GENESIS", + Comment2: "", + TrCount: 0, + TrDataPos: 0, + TrDataLen: 0, }; Block.SeqHash = this.GetSeqHash(Block.BlockNum, Block.PrevHash, Block.TreeHash) Block.SumPow = 0 @@ -138,7 +146,7 @@ export default class CBlock extends CRest { var PrevHash = global.CalcHashFromArray(arr, true); return PrevHash; } - StartSyncBlockchain(Node?, bSilent?, bCheckPoint?) { + StartSyncBlockchain(Node?, bSilent?, bCheckPoint?, PrevStartedBlockNum?) { this.FREE_ALL_MEM_CHAINS() if (global.NO_HISTORY_MODE) { this.LoadHistoryMode = 0 @@ -152,6 +160,19 @@ export default class CBlock extends CRest { 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 + global.ToLog("Current DeltaNum=" + DeltaNum + " StartBlockNum=" + StartBlockNum, 2) + } + else { + StartBlockNum = this.BlockNumDB + } this.LoadHistoryMode = true this.LoadHistoryMessage = !bSilent this.LoadHistoryContext = { @@ -182,7 +203,7 @@ export default class CBlock extends CRest { var DeltaTime = Date.now() - Context.StartTimeHistory; if (DeltaTime > Context.MaxTimeOut) { global.ToLog("DETECT TIMEOUT LOAD") - this.StartSyncBlockchain() + this.StartSyncBlockchain(undefined, undefined, undefined, Context.BlockNum) return; } } @@ -230,9 +251,28 @@ export default class CBlock extends CRest { return false; Tree.insert({ hash: LoadHash }) var chain: any = { - id: 0, Count: 16, BlockNum: Num, IsSum: bIsSum, Hash: LoadHash, time: undefined, FindBlockDB: false, LoadDB: false, LoadCountDB: 0, - LoadSumDB: 0, LoadSum: 0, ParentChain: undefined, RootChain: undefined, BlockNumStart: Num, HashStart: LoadHash, IsSumStart: bIsSum, - BlockHead: undefined, MapSend: {}, Comment2: "", StopSend: false, Info: "", Error: false, + id: 0, + Count: 16, + BlockNum: Num, + IsSum: bIsSum, + Hash: LoadHash, + time: undefined, + FindBlockDB: false, + LoadDB: false, + LoadCountDB: 0, + LoadSumDB: 0, + LoadSum: 0, + ParentChain: undefined, + RootChain: undefined, + BlockNumStart: Num, + HashStart: LoadHash, + IsSumStart: bIsSum, + BlockHead: undefined, + MapSend: {}, + Comment2: "", + StopSend: false, + Info: "", + Error: false, }; this.ChainBindMethods(chain) chain.AddInfo(StrInfo) @@ -491,6 +531,7 @@ export default class CBlock extends CRest { } else { if (!Context.WasLoadNum) { + global.ToLog("Not found: " + Context.BlockNum + " from node:" + global.NodeName(Info.Node), 2) Context.BlockNum = Math.floor(Context.BlockNum - Context.DeltaBlockNum) Context.DeltaBlockNum = Context.DeltaBlockNum * 1.2 if (Context.BlockNum < global.BLOCK_PROCESSING_LENGTH2) @@ -775,8 +816,8 @@ export default class CBlock extends CRest { if (global.IsZeroArr(Block.TreeHash)) { Res = this.WriteBlockDB(Block) } else { - global.ToLogTrace("global.IsZeroArr(Block.TreeHash)") - throw "global.IsZeroArr(Block.TreeHash)"; + global.ToLogTrace("IsZeroArr(Block.TreeHash)") + throw "IsZeroArr(Block.TreeHash)"; } } if (!Res) { diff --git a/src/core/buffer.ts b/src/core/buffer.ts index c411884..0c965b2 100644 --- a/src/core/buffer.ts +++ b/src/core/buffer.ts @@ -8,319 +8,591 @@ * 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?) { - if (!(e.len >= e.length)) { - if ("number" == typeof t) - throw global.ToLogTrace("ERRR StringFormat "), "ERR!!"; - var a = t; - if ("buffer" === a.substr(0, 6) && 6 < a.length) - n = parseInt(a.substr(6)), a = "buffer"; +function Write(buf, data, StringFormat?, ParamValue?, WorkStruct?) { + if (buf.len >= buf.length) { + return; + } + if (typeof StringFormat === "number") { + global.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) { - var i = parseInt(a.substr(3)); - return r && e.write(r, e.len, i), void (e.len += i); + if (format.substr(0, 3) === "str" && format.length > 3) { + 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 = global.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 = global.toUTF8Array(data); + let 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; - global.MAX_TRANSACTION_SIZE > global.MAX_TRANSACTION_SIZE && (i = global.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 = global.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); + { + let 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; } - else - if ("<" === d) { - 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); + case "buffer": + { + let 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": + { + let 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": + { + let length = data.length; + if (global.MAX_TRANSACTION_SIZE > global.MAX_TRANSACTION_SIZE) + length = global.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": + { + let 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 = global.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 === "[") { + let 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 === "<") { + let 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") { + global.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 { + ParamValue = 0; + } + } + else + if (format.substr(0, 3) === "str") { + if (format.length > 3) { + 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++) { - var v = g[s]; - Write(e, r[v.Key], v.Value, void 0, l); + ParamValue = 0; + } + } + switch (format) { + case "str": + { + let 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 = global.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; + } + let 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": + { + let 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 = global.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); + let length = Read(buf, "uint32"); + for (var i = 0; i < length; i++) { + 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 global.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)) { - s = u; - break; + else + if (LStr === "{") { + 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 = global.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 = global.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) { - for (var r = 0, t = [], n = "", l = 0; l < e.length; l++) { - var a = e.substr(l, 1); - if ("{" === a) - r++; +function BufWriteByte(value) { + 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) { + 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 ("," === a && 0 === r) { - 0 < n.length && t.push(n), n = ""; + if (FStr === "}") { + Count--; + } + else + if (FStr === "," && Count === 0) { + 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) { - for (var r = "", t = 0; t < e.length; t++) { - var n = e.substr(t, 1); - if (" " !== n && "\n" !== n) { - if (":" === n) - return { Key: r, Value: e.substr(t + 1) }; - r += n; +function GetKeyValueStrings(Str) { + var Key = ""; + for (var i = 0; i < Str.length; i++) { + var FStr = Str.substr(i, 1); + if (FStr === " " || FStr === "\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) { - for (var r = [], t = GetAttributeStrings(e), n = 0; n < t.length; n++) { - var l = GetKeyValueStrings(t[n]); - r.push(l); +function GetAttributes(Str) { + var arr = []; + var attrstr = GetAttributeStrings(Str); + for (var i = 0; i < attrstr.length; i++) { + 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; diff --git a/src/core/code.ts b/src/core/code.ts index d9e43d0..5eaff31 100644 --- a/src/core/code.ts +++ b/src/core/code.ts @@ -10,9 +10,9 @@ "use strict"; import * as fs from 'fs' -import CCommon from './base' import { secp256k1 } from '../core/library' -// const FORMAT_EVAL_SEND = "{MaxBlockNum:uint,Code:str,Sign:arr64}"; +const FORMAT_EVAL_SEND = "{MaxBlockNum:uint,Code:str,Sign:arr64}"; +import CCommon from './base' export default class CCode extends CCommon { LastEvalCodeNum constructor(SetKeyPair, RunIP, RunPort, UseRNDHeader, bVirtual) { @@ -183,8 +183,8 @@ global.RestartNode = function RestartNode(bForce) { global.CloseSocket(Node.Socket, "Restart"); } } - this.StopServer(); - this.StopNode(); + global.SERVER.StopServer(); + global.SERVER.StopNode(); global.StopChildProcess(); global.ToLog("****************************************** RESTART!!!"); global.ToLog("EXIT 1");