@@ -12,9 +12,26 @@
|
||||
const fs = require("fs");
|
||||
import * as crypto from 'crypto';
|
||||
require('./block-loader-const');
|
||||
const STAT_BLOCK_LOAD_PERIOD = CONSENSUS_PERIOD_TIME / 5;
|
||||
const STAT_BLOCK_LOAD_PERIOD = global.CONSENSUS_PERIOD_TIME / 5;
|
||||
module.exports = class CBlock extends require("./rest-loader.js")
|
||||
{
|
||||
MapMapLoaded
|
||||
BlockChain
|
||||
ChainID
|
||||
BlockID
|
||||
TaskNodeIndex
|
||||
LoadedChainList
|
||||
LastChainLoad
|
||||
StartLoadBlockTime
|
||||
LoadHistoryMode
|
||||
MapBlockBodyLoad
|
||||
BlockNumDB
|
||||
RelayMode
|
||||
LoadHistoryMessage
|
||||
LastLoadedBlockNum
|
||||
LoadHistoryContext
|
||||
LoadBlockStatNum
|
||||
BADHashCount
|
||||
constructor(SetKeyPair, RunIP, RunPort, UseRNDHeader, bVirtual) {
|
||||
super(SetKeyPair, RunIP, RunPort, UseRNDHeader, bVirtual)
|
||||
this.MapMapLoaded = {}
|
||||
@@ -43,9 +60,9 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
GenesisBlockHeaderDB(Num) {
|
||||
if (Num < 0)
|
||||
return undefined;
|
||||
var Block = {
|
||||
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: DEVELOP_PUB_KEY0, Hash: this.GetHashGenesis(Num), PowHash: this.GetHashGenesis(Num), PrevHash: [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,
|
||||
@@ -59,7 +76,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
this.FindStartBlockNum()
|
||||
if (this.UseTruncateBlockDB)
|
||||
this.TruncateBlockDB(this.UseTruncateBlockDB)
|
||||
var CurNum = GetCurrentBlockNumByTime();
|
||||
var CurNum = global.GetCurrentBlockNumByTime();
|
||||
if (CurNum <= this.BlockNumDB) {
|
||||
this.TruncateBlockDB(CurNum)
|
||||
}
|
||||
@@ -70,8 +87,8 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
if (this.BlockNumDB < global.BLOCK_PROCESSING_LENGTH2)
|
||||
this.CreateGenesisBlocks()
|
||||
if (fs.existsSync(GetCodePath("EXPERIMENTAL/_run.js"))) {
|
||||
require(GetCodePath("EXPERIMENTAL/_run.js")).Run()
|
||||
if (fs.existsSync(global.GetCodePath("EXPERIMENTAL/_run.js"))) {
|
||||
require(global.GetCodePath("EXPERIMENTAL/_run.js")).Run()
|
||||
}
|
||||
this.LoadMemBlocksOnStart()
|
||||
}
|
||||
@@ -89,7 +106,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
var startPrev = Block.BlockNum - global.BLOCK_PROCESSING_LENGTH2;
|
||||
var Sum = 0;
|
||||
var arr = [];
|
||||
for (var i = 0; i < BLOCK_PROCESSING_LENGTH; i++) {
|
||||
for (var i = 0; i < global.BLOCK_PROCESSING_LENGTH; i++) {
|
||||
var PrevBlock = this.GetBlock(startPrev + i);
|
||||
if (PrevBlock && PrevBlock.bSave) {
|
||||
Sum = Sum + PrevBlock.SumPow
|
||||
@@ -99,13 +116,13 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
var PrevHash = CalcHashFromArray(arr, true);
|
||||
var PrevHash = global.CalcHashFromArray(arr, true);
|
||||
return PrevHash;
|
||||
}
|
||||
GetPrevHashDB(Block) {
|
||||
var startPrev = Block.BlockNum - global.BLOCK_PROCESSING_LENGTH2;
|
||||
var arr = [];
|
||||
for (var i = 0; i < BLOCK_PROCESSING_LENGTH; i++) {
|
||||
for (var i = 0; i < global.BLOCK_PROCESSING_LENGTH; i++) {
|
||||
var num = startPrev + i;
|
||||
var PrevBlock = this.ReadBlockHeaderDB(num);
|
||||
if (!PrevBlock || !PrevBlock.bSave) {
|
||||
@@ -114,18 +131,18 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
arr.push(PrevBlock.Hash)
|
||||
}
|
||||
var PrevHash = CalcHashFromArray(arr, true);
|
||||
var PrevHash = global.CalcHashFromArray(arr, true);
|
||||
return PrevHash;
|
||||
}
|
||||
StartSyncBlockchain(Node, bSilent, bCheckPoint) {
|
||||
StartSyncBlockchain(Node?, bSilent?, bCheckPoint?) {
|
||||
this.FREE_ALL_MEM_CHAINS()
|
||||
if (global.NO_HISTORY_MODE) {
|
||||
this.LoadHistoryMode = 0
|
||||
return;
|
||||
}
|
||||
if (global.CREATE_ON_START && !LOCAL_RUN)
|
||||
if (global.CREATE_ON_START && !global.LOCAL_RUN)
|
||||
return;
|
||||
if (!GrayConnect())
|
||||
if (!global.GrayConnect())
|
||||
this.RelayMode = true
|
||||
else
|
||||
this.RelayMode = false
|
||||
@@ -137,7 +154,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
PrevBlockNum: - 1, Node: Node, BlockNum: this.BlockNumDB, MapSend: {}, Foward: 1, Pause: 0, DeltaBlockNum: 10,
|
||||
StartTimeHistory: Date.now(), MaxTimeOut: 30 * 1000
|
||||
}
|
||||
if (!bSilent && !bCheckPoint && REST_START_COUNT) {
|
||||
if (!bSilent && !bCheckPoint && global.REST_START_COUNT) {
|
||||
this.CheckSyncRest()
|
||||
}
|
||||
if (!this.ActualNodes.size) {
|
||||
@@ -181,7 +198,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
Context.BlockNum = this.BlockNumDB
|
||||
}
|
||||
var BlockDB = this.ReadBlockHeaderDB(Context.BlockNum);
|
||||
if (!BlockDB || this.BlockNumDB >= GetCurrentBlockNumByTime() - BLOCK_PROCESSING_LENGTH - 2) {
|
||||
if (!BlockDB || this.BlockNumDB >= global.GetCurrentBlockNumByTime() - global.BLOCK_PROCESSING_LENGTH - 2) {
|
||||
this.LoadHistoryMode = false
|
||||
if (this.LoadHistoryMessage)
|
||||
global.ToLog("Finish synchronization")
|
||||
@@ -200,7 +217,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
if (global.NO_HISTORY_MODE)
|
||||
return;
|
||||
this.StartLoadBlockTime = Date.now()
|
||||
if (Num > this.CurrentBlockNum + TIME_START_SAVE) {
|
||||
if (Num > this.CurrentBlockNum + global.TIME_START_SAVE) {
|
||||
return;
|
||||
}
|
||||
bIsSum = bIsSum || false
|
||||
@@ -208,7 +225,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
if (Tree.find({ hash: LoadHash }))
|
||||
return false;
|
||||
Tree.insert({ hash: LoadHash })
|
||||
var chain = {
|
||||
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,
|
||||
@@ -232,7 +249,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
this.LoadedChainList.push(chain)
|
||||
}
|
||||
LoopChainLoad() {
|
||||
if (glStopNode)
|
||||
if (global.glStopNode)
|
||||
return;
|
||||
if (this.UseTruncateBlockDB)
|
||||
this.TruncateBlockDB(this.UseTruncateBlockDB)
|
||||
@@ -248,7 +265,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
this.SendLoadToBegin()
|
||||
}
|
||||
var CountStopSend = 0;
|
||||
var min_num = this.CurrentBlockNum - MAX_COUNT_CHAIN_LOAD;
|
||||
var min_num = this.CurrentBlockNum - global.MAX_COUNT_CHAIN_LOAD;
|
||||
var min_num_load = this.CurrentBlockNum;
|
||||
for (var i = 0; i < this.LoadedChainList.length; i++) {
|
||||
var chain = this.LoadedChainList[i];
|
||||
@@ -263,7 +280,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
min_num_load = RootChain.BlockNum
|
||||
if (!chain.StopSend) {
|
||||
if (chain.BlockHead) {
|
||||
if (chain.BlockNum < this.CurrentBlockNum - COUNT_HISTORY_BLOCKS_FOR_LOAD) {
|
||||
if (chain.BlockNum < this.CurrentBlockNum - global.COUNT_HISTORY_BLOCKS_FOR_LOAD) {
|
||||
if (global.WATCHDOG_DEV)
|
||||
global.ToLog("Very long length of blocks to load history, stop chain with id=" + chain.id + " (" + chain.BlockNum + "-" + chain.BlockNumMax + ")")
|
||||
chain.StopSend = true
|
||||
@@ -302,17 +319,17 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
global.ADD_TO_STAT("MAX:LOADEDCHAINLIST", this.LoadedChainList.length)
|
||||
this.FREE_MEM_CHAINS(min_num_load)
|
||||
this.LastLoadedBlockNum = 0
|
||||
if (this.LoadedChainList.length > COUNT_HISTORY_BLOCKS_FOR_LOAD) {
|
||||
if (this.LoadedChainList.length > global.COUNT_HISTORY_BLOCKS_FOR_LOAD) {
|
||||
if (global.WATCHDOG_DEV)
|
||||
global.ToLog("LoadedChainList>COUNT_HISTORY_BLOCKS_FOR_LOAD -> FREE_ALL_MEM_CHAINS")
|
||||
this.FREE_ALL_MEM_CHAINS()
|
||||
}
|
||||
}
|
||||
GetNextNode(task, keyid, checktime, BlockNum) {
|
||||
var CurTime = GetCurrentTime(0) - 0;
|
||||
GetNextNode(task, keyid?, checktime?, BlockNum?) {
|
||||
var CurTime = global.GetCurrentTime(0) - 0;
|
||||
if (checktime && task.time) {
|
||||
var Delta = CurTime - task.time;
|
||||
if (Delta < PACKET_ALIVE_PERIOD_NEXT_NODE)
|
||||
if (Delta < global.PACKET_ALIVE_PERIOD_NEXT_NODE)
|
||||
return { Result: false, timewait: true };
|
||||
}
|
||||
task.time = undefined
|
||||
@@ -337,7 +354,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
Node = arr[this.TaskNodeIndex % arr.length]
|
||||
}
|
||||
if (Node.Active) {
|
||||
if (!Node.INFO || !Node.INFO.WasPing || Node.StopGetBlock || (Node.INFO.CheckPointHashDB && CHECK_POINT.BlockNum && global.CompareArr(CHECK_POINT.Hash,
|
||||
if (!Node.INFO || !Node.INFO.WasPing || Node.StopGetBlock || (Node.INFO.CheckPointHashDB && global.global.CHECK_POINT.BlockNum && global.CompareArr(global.global.CHECK_POINT.Hash,
|
||||
Node.INFO.CheckPointHashDB) !== 0)) {
|
||||
timewait = true
|
||||
continue;
|
||||
@@ -391,7 +408,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
var DopStr = "";
|
||||
if (chain.IsSum)
|
||||
DopStr = "SUM:"
|
||||
chain.AddInfo(chain.BlockNum + "/" + DopStr + this.GetStrFromHashShort(chain.Hash) + "->" + GetNodeStrPort(Node))
|
||||
chain.AddInfo(chain.BlockNum + "/" + DopStr + this.GetStrFromHashShort(chain.Hash) + "->" + global.GetNodeStrPort(Node))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -415,9 +432,9 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}";
|
||||
}
|
||||
GetBlockArrFromBuffer_Load(BufRead, Info) {
|
||||
var BlockArr = GetBlockArrFromBuffer(BufRead, Info);
|
||||
var BlockArr = global.GetBlockArrFromBuffer(BufRead, Info);
|
||||
if (BlockArr.length > 0 && BlockArr[0].BlockNum === global.BLOCK_PROCESSING_LENGTH2)
|
||||
BlockArr.unshift(this.ReadBlockHeaderDB(BLOCK_PROCESSING_LENGTH2 - 1))
|
||||
BlockArr.unshift(this.ReadBlockHeaderDB(global.BLOCK_PROCESSING_LENGTH2 - 1))
|
||||
return BlockArr;
|
||||
}
|
||||
RETBLOCKHEADER_FOWARD(Info, CurTime) {
|
||||
@@ -434,8 +451,8 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
var Block = arr[i];
|
||||
if (!Block)
|
||||
return;
|
||||
if (Block.BlockNum === CHECK_POINT.BlockNum && !IsZeroArr(CHECK_POINT.Hash)) {
|
||||
if (global.CompareArr(CHECK_POINT.Hash, Block.Hash) !== 0) {
|
||||
if (Block.BlockNum === global.CHECK_POINT.BlockNum && !global.IsZeroArr(global.CHECK_POINT.Hash)) {
|
||||
if (global.CompareArr(global.CHECK_POINT.Hash, Block.Hash) !== 0) {
|
||||
break;
|
||||
}
|
||||
Context.FindCheckPoint = true
|
||||
@@ -450,7 +467,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
arr2.push(Block)
|
||||
}
|
||||
else
|
||||
if (BlockDB && IsZeroArr(BlockDB.SumHash)) {
|
||||
if (BlockDB && global.IsZeroArr(BlockDB.SumHash)) {
|
||||
bFindDB = 1
|
||||
arr2.push(Block)
|
||||
}
|
||||
@@ -485,7 +502,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
}
|
||||
RETBLOCKHEADER(Info, CurTime) {
|
||||
Info.Node.NextPing = MIN_PERIOD_PING
|
||||
Info.Node.NextPing = global.MIN_PERIOD_PING
|
||||
if (Info.Context.Foward)
|
||||
return this.RETBLOCKHEADER_FOWARD(Info, CurTime);
|
||||
var chain = Info.Context.Chain;
|
||||
@@ -496,10 +513,10 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
if (arr.length <= 1) {
|
||||
var keysend = "" + Info.Node.addrStr + ":" + chain.BlockNum;
|
||||
chain.MapSend[keysend] = 1
|
||||
chain.AddInfo("NO:" + GetNodeStrPort(Info.Node))
|
||||
chain.AddInfo("NO:" + global.GetNodeStrPort(Info.Node))
|
||||
return;
|
||||
}
|
||||
chain.AddInfo("L=" + arr.length + " from:" + GetNodeStrPort(Info.Node))
|
||||
chain.AddInfo("L=" + arr.length + " from:" + global.GetNodeStrPort(Info.Node))
|
||||
var NextLoadBlock;
|
||||
var PrevBlock;
|
||||
for (var i = arr.length - 1; i >= 0; i--) {
|
||||
@@ -551,7 +568,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
MapBlockLoaded["TH:" + StrTreeHash] = Block
|
||||
var BlockDB = this.ReadBlockHeaderDB(Block.BlockNum);
|
||||
if (BlockDB) {
|
||||
Block.Power = GetPowPower(Block.PowHash)
|
||||
Block.Power = global.GetPowPower(Block.PowHash)
|
||||
chain.LoadCountDB++
|
||||
chain.LoadSumDB += BlockDB.Power
|
||||
chain.LoadSum += Block.Power
|
||||
@@ -571,11 +588,11 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
if (NextLoadBlock && !NextLoadBlock.chain.StopSend) {
|
||||
if (arr.length >= chain.Count) {
|
||||
chain.Count = chain.Count * 2
|
||||
if (chain.Count > COUNT_BLOCKS_FOR_LOAD)
|
||||
chain.Count = COUNT_BLOCKS_FOR_LOAD
|
||||
if (chain.Count > global.COUNT_BLOCKS_FOR_LOAD)
|
||||
chain.Count = global.COUNT_BLOCKS_FOR_LOAD
|
||||
}
|
||||
if (chain.LoadCountDB >= COUNT_BLOCKS_FOR_CHECK_POW) {
|
||||
if (chain.LoadSumDB - chain.LoadSum > MAX_DELTA_COUNT_SUM_FOR_LOAD) {
|
||||
if (chain.LoadCountDB >= global.COUNT_BLOCKS_FOR_CHECK_POW) {
|
||||
if (chain.LoadSumDB - chain.LoadSum > global.MAX_DELTA_COUNT_SUM_FOR_LOAD) {
|
||||
var Str = "ERR LOADED SUM POW chains: SumDB > Sum loaded from: " + NodeInfo(Info.Node);
|
||||
chain.StopSend = true
|
||||
chain.AddInfo(Str)
|
||||
@@ -611,7 +628,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
var PrevBlock = BlockMin;
|
||||
for (var i = 1; i < arr.length; i++) {
|
||||
var Block = arr[i];
|
||||
Block.Power = GetPowPower(Block.PowHash)
|
||||
Block.Power = global.GetPowPower(Block.PowHash)
|
||||
Block.SumPow = PrevBlock.SumPow + Block.Power
|
||||
PrevBlock = Block
|
||||
}
|
||||
@@ -637,7 +654,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
PrepareTransactionsForLoad(chain, arr, bNoSlice) {
|
||||
PrepareTransactionsForLoad(chain, arr, bNoSlice?) {
|
||||
if (!bNoSlice)
|
||||
arr = arr.slice(1)
|
||||
chain.arr = arr
|
||||
@@ -648,7 +665,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
}
|
||||
LoopBlockLoad() {
|
||||
if (glStopNode)
|
||||
if (global.glStopNode)
|
||||
return;
|
||||
var CountSend = 0;
|
||||
for (var num = 0; num < this.LoadedChainList.length; num++) {
|
||||
@@ -658,7 +675,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
for (var i = chain.CurNumArrLoad; i < chain.arr.length; i++) {
|
||||
Count++
|
||||
var Block = chain.arr[i];
|
||||
if (!IsZeroArr(Block.TreeHash) && !Block.TreeEq && !Block.LoadDBFinaly) {
|
||||
if (!global.IsZeroArr(Block.TreeHash) && !Block.TreeEq && !Block.LoadDBFinaly) {
|
||||
if (!Block.MapSend) {
|
||||
if (!Block.BodyLoad) {
|
||||
var BlockDB = this.ReadBlockHeaderDB(Block.BlockNum);
|
||||
@@ -676,7 +693,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
if (this.SendBlockNext(Block)) {
|
||||
CountSend++
|
||||
if (CountSend >= MAX_BLOCK_SEND)
|
||||
if (CountSend >= global.MAX_BLOCK_SEND)
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -694,7 +711,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
CheckAndWriteLoadedChain(chain) {
|
||||
if (chain.CurNumArrLoad >= chain.arr.length) {
|
||||
var Block = chain.arr[chain.arr.length - 1];
|
||||
if (chain.WriteToDBAfterLoad || Block.BlockNum >= this.CurrentBlockNum + TIME_START_SAVE - 2) {
|
||||
if (chain.WriteToDBAfterLoad || Block.BlockNum >= this.CurrentBlockNum + global.TIME_START_SAVE - 2) {
|
||||
var bAllLoaded = true;
|
||||
if (!chain.WriteToDBAfterLoad) {
|
||||
var cur_parent = chain.ParentChain;
|
||||
@@ -728,7 +745,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
var startTime = process.hrtime();
|
||||
if (this.LoadHistoryMessage)
|
||||
global.ToLog("WRITE DATA Count:" + arr.length + " " + arr[0].BlockNum + "-" + arr[arr.length - 1].BlockNum, 2)
|
||||
var CurrentBlockNum = GetCurrentBlockNumByTime();
|
||||
var CurrentBlockNum = global.GetCurrentBlockNumByTime();
|
||||
var Block, FirstBlock;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
Block = arr[i]
|
||||
@@ -752,12 +769,12 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
Res = this.WriteBlockDBFinaly(Block)
|
||||
}
|
||||
else {
|
||||
if (IsZeroArr(Block.TreeHash)) {
|
||||
if (global.IsZeroArr(Block.TreeHash)) {
|
||||
Res = this.WriteBlockDB(Block)
|
||||
}
|
||||
else {
|
||||
ToLogTrace("IsZeroArr(Block.TreeHash)")
|
||||
throw "IsZeroArr(Block.TreeHash)";
|
||||
global.ToLogTrace("global.IsZeroArr(Block.TreeHash)")
|
||||
throw "global.IsZeroArr(Block.TreeHash)";
|
||||
}
|
||||
}
|
||||
if (!Res) {
|
||||
@@ -766,7 +783,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
return;
|
||||
}
|
||||
Block.LoadDB = true
|
||||
if (Block.BlockNum >= CurrentBlockNum - BLOCK_COUNT_IN_MEMORY) {
|
||||
if (Block.BlockNum >= CurrentBlockNum - global.BLOCK_COUNT_IN_MEMORY) {
|
||||
this.CopyBlockToMem(Block)
|
||||
}
|
||||
else {
|
||||
@@ -776,7 +793,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
var BlockMem = this.BlockChain[Block.BlockNum];
|
||||
if (BlockMem) {
|
||||
AddInfoBlock(BlockMem, "LOAD:" + GetPowPower(Block.PowHash) + " TH:" + this.GetStrFromHashShort(Block.TreeHash).substr(0, 4))
|
||||
global.AddInfoBlock(BlockMem, "LOAD:" + global.GetPowPower(Block.PowHash) + " TH:" + this.GetStrFromHashShort(Block.TreeHash).substr(0, 4))
|
||||
}
|
||||
}
|
||||
if (Block && FirstBlock) {
|
||||
@@ -784,7 +801,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
this.SetNoPOW(CurNumStart, 1, FirstBlock.BlockNum)
|
||||
}
|
||||
this.FREE_ALL_MEM_CHAINS()
|
||||
ADD_TO_STAT_TIME("WRITECHAIN_TO_DB_TIME", startTime)
|
||||
global.ADD_TO_STAT_TIME("WRITECHAIN_TO_DB_TIME", startTime)
|
||||
}
|
||||
CopyBlock(Block, BlockDst) {
|
||||
BlockDst.BlockNum = Block.BlockNum
|
||||
@@ -834,12 +851,12 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
POW.SumPow = Block.SumPow
|
||||
}
|
||||
AddToStatBlockConfirmation(Block) {
|
||||
if (Block.BlockNum > START_BLOCK_RUN + global.BLOCK_PROCESSING_LENGTH2) {
|
||||
if (Block.BlockNum > global.START_BLOCK_RUN + global.BLOCK_PROCESSING_LENGTH2) {
|
||||
var TimeDelta = this.CurrentBlockNum - Block.BlockNum;
|
||||
global.ADD_TO_STAT("MAX:BlockConfirmation", TimeDelta)
|
||||
}
|
||||
else {
|
||||
global.ADD_TO_STAT("MAX:BlockConfirmation", BLOCK_PROCESSING_LENGTH)
|
||||
global.ADD_TO_STAT("MAX:BlockConfirmation", global.BLOCK_PROCESSING_LENGTH)
|
||||
}
|
||||
}
|
||||
SendBlockNext(Block) {
|
||||
@@ -854,9 +871,9 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
this.SendF(Node, { "Method": "GETBLOCK", "Context": Block.Context, "Data": { BlockNum: Block.BlockNum, TreeHash: Block.TreeHash } })
|
||||
Node.SendBlockCount++
|
||||
SendResult = 1
|
||||
AddInfoBlock(Block, "SendNext")
|
||||
global.AddInfoBlock(Block, "SendNext")
|
||||
if (Block.chain)
|
||||
Block.chain.AddInfo("QUERY BL:" + Block.BlockNum + "/" + this.GetStrFromHashShort(Block.TreeHash) + " TO:" + GetNodeStrPort(Node))
|
||||
Block.chain.AddInfo("QUERY BL:" + Block.BlockNum + "/" + this.GetStrFromHashShort(Block.TreeHash) + " TO:" + global.GetNodeStrPort(Node))
|
||||
}
|
||||
else {
|
||||
if (!Ret.timewait) {
|
||||
@@ -867,7 +884,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
return SendResult;
|
||||
}
|
||||
ClearChains(DeleteChain, bShow) {
|
||||
ClearChains(DeleteChain, bShow?) {
|
||||
if (!DeleteChain) {
|
||||
this.FREE_ALL_MEM_CHAINS()
|
||||
return this.LoadedChainList.length;
|
||||
@@ -899,7 +916,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
return;
|
||||
this.LoadBlockStatNum = TimeNum
|
||||
const PeriodSec = 5;
|
||||
const Period = CONSENSUS_PERIOD_TIME / STAT_BLOCK_LOAD_PERIOD;
|
||||
const Period = global.CONSENSUS_PERIOD_TIME / STAT_BLOCK_LOAD_PERIOD;
|
||||
const PeriodCount = PeriodSec * Period;
|
||||
var FreeGet = 64;
|
||||
var it = this.ActualNodes.iterator(), Node;
|
||||
@@ -940,41 +957,41 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}";
|
||||
}
|
||||
RETGETBLOCK(Info, CurTime) {
|
||||
Info.Node.NextPing = MIN_PERIOD_PING
|
||||
Info.Node.NextPing = global.MIN_PERIOD_PING
|
||||
var Block = Info.Context.Block;
|
||||
if (Block && !Block.TreeEq) {
|
||||
var Data = global.BufLib.GetObjectFromBuffer(Info.Data, FORMAT_BLOCK_TRANSFER, WRK_BLOCK_TRANSFER);
|
||||
var Data = global.BufLib.GetObjectFromBuffer(Info.Data, global.FORMAT_BLOCK_TRANSFER, global.WRK_BLOCK_TRANSFER);
|
||||
Info.Data = undefined
|
||||
if (Data.BlockNum !== Block.BlockNum || global.CompareArr(Data.TreeHash, Block.TreeHash) !== 0) {
|
||||
this.SetBlockNOSendToNode(Block, Info.Node, "NO")
|
||||
return;
|
||||
}
|
||||
if (Block.chain) {
|
||||
Block.chain.AddInfo("Load TR:" + Data.BlockNum + "/" + this.GetStrFromHashShort(Data.TreeHash) + " from:" + GetNodeStrPort(Info.Node))
|
||||
AddInfoBlock(Block, "LOAD TR OK")
|
||||
Block.chain.AddInfo("Load TR:" + Data.BlockNum + "/" + this.GetStrFromHashShort(Data.TreeHash) + " from:" + global.GetNodeStrPort(Info.Node))
|
||||
global.AddInfoBlock(Block, "LOAD TR OK")
|
||||
}
|
||||
var arrContent = Data.arrContent;
|
||||
var TreeHash = CalcTreeHashFromArrBody(Block.BlockNum, arrContent);
|
||||
var TreeHash = global.CalcTreeHashFromArrBody(Block.BlockNum, arrContent);
|
||||
if (global.CompareArr(Block.TreeHash, TreeHash) !== 0) {
|
||||
global.ToLog("2. BAD CMP TreeHash block=" + Block.BlockNum + " from:" + NodeName(Info.Node) + " TreeHash=" + global.GetHexFromArr(TreeHash) + " BlockTreeHash=" + global.GetHexFromArr(Block.TreeHash))
|
||||
this.SetBlockNOSendToNode(Block, Info.Node, "BAD CMP TreeHash")
|
||||
return;
|
||||
}
|
||||
if (arrContent.length > 0 && Data.BlockNum % PERIOD_ACCOUNT_HASH === 0) {
|
||||
if (arrContent.length > 0 && Data.BlockNum % global.PERIOD_ACCOUNT_HASH === 0) {
|
||||
var TR = arrContent[0];
|
||||
if (TR[0] === TYPE_TRANSACTION_ACC_HASH) {
|
||||
if (!DApps.Accounts.TRCheckAccountHash(TR, Data.BlockNum)) {
|
||||
if (TR[0] === global.TYPE_TRANSACTION_ACC_HASH) {
|
||||
if (!global.DApps.Accounts.TRCheckAccountHash(TR, Data.BlockNum)) {
|
||||
if (!this.BADHashCount)
|
||||
this.BADHashCount = 0
|
||||
this.BADHashCount++
|
||||
global.ToLog("**** BAD ACCOUNT Hash in block=" + Block.BlockNum + " from:" + NodeName(Info.Node) + " ****")
|
||||
global.ToLog("May be need to Rewrite transactions from: " + (Block.BlockNum - 2 * DELTA_BLOCK_ACCOUNT_HASH))
|
||||
global.ToLog("May be need to Rewrite transactions from: " + (Block.BlockNum - 2 * global.DELTA_BLOCK_ACCOUNT_HASH))
|
||||
this.SetBlockNOSendToNode(Block, Info.Node, "BAD CMP ACC HASH")
|
||||
if (global.WATCHDOG_BADACCOUNT && this.BADHashCount > 60) {
|
||||
global.ToLog("Run WATCHDOG!")
|
||||
this.BADHashCount = 0
|
||||
this.FREE_ALL_MEM_CHAINS()
|
||||
this.SetTruncateBlockDB(Block.BlockNum - 5 * DELTA_BLOCK_ACCOUNT_HASH)
|
||||
this.SetTruncateBlockDB(Block.BlockNum - 5 * global.DELTA_BLOCK_ACCOUNT_HASH)
|
||||
}
|
||||
else {
|
||||
}
|
||||
@@ -995,7 +1012,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
Block.Send = undefined
|
||||
global.ADD_TO_STAT("BLOCK_LOADED", 1)
|
||||
Info.Node.LoadBlockCount++
|
||||
if (GrayConnect())
|
||||
if (global.GrayConnect())
|
||||
Info.Node.BlockProcessCount++
|
||||
if (this.LoadHistoryMode) {
|
||||
var Context = this.LoadHistoryContext;
|
||||
@@ -1036,7 +1053,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
var keysend = "" + Node.addrStr + ":" + Str;
|
||||
Block.MapSend[keysend] = 1
|
||||
if (Block.chain)
|
||||
Block.chain.AddInfo("" + Block.BlockNum + " " + Str2 + "<-" + GetNodeStrPort(Node))
|
||||
Block.chain.AddInfo("" + Block.BlockNum + " " + Str2 + "<-" + global.GetNodeStrPort(Node))
|
||||
}
|
||||
FindBlockInLoadedChain(BlockNum, TreeHash) {
|
||||
var StrTreeHash = global.GetHexFromArr(TreeHash);
|
||||
@@ -1050,25 +1067,25 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
CheckSeqHashDB(Block, StrError) {
|
||||
if (Block.BlockNum < global.BLOCK_PROCESSING_LENGTH2)
|
||||
return true;
|
||||
var TreeHashTest = CalcTreeHashFromArrBody(Block.BlockNum, Block.arrContent);
|
||||
var TreeHashTest = global.CalcTreeHashFromArrBody(Block.BlockNum, Block.arrContent);
|
||||
if (global.CompareArr(TreeHashTest, Block.TreeHash) !== 0) {
|
||||
var StrHex = global.GetHexFromArr(TreeHashTest);
|
||||
var StrHex0 = global.GetHexFromArr(Block.TreeHash);
|
||||
var Str = StrError + " #3 ERROR TREEHASH: " + Block.BlockNum + " Hex:" + StrHex0.substr(0, 12) + " != " + StrHex.substr(0,
|
||||
12);
|
||||
if (global.WATCHDOG_DEV)
|
||||
ToErrorTrace(Str)
|
||||
global.ToErrorTrace(Str)
|
||||
else
|
||||
global.ToError(Str)
|
||||
return false;
|
||||
}
|
||||
var PrevHash = this.GetPrevHashDB(Block);
|
||||
var testSeqHash = this.GetSeqHash(Block.BlockNum, PrevHash, Block.TreeHash);
|
||||
var TestValue = GetHashFromSeqAddr(testSeqHash, Block.AddrHash, Block.BlockNum, PrevHash);
|
||||
var TestValue = global.GetHashFromSeqAddr(testSeqHash, Block.AddrHash, Block.BlockNum, PrevHash);
|
||||
if (global.CompareArr(TestValue.Hash, Block.Hash) !== 0) {
|
||||
var Str = StrError + " #2 ERROR HASH - block num: " + Block.BlockNum;
|
||||
if (global.WATCHDOG_DEV)
|
||||
ToErrorTrace(Str)
|
||||
global.ToErrorTrace(Str)
|
||||
else
|
||||
global.ToError(Str)
|
||||
return false;
|
||||
@@ -1089,10 +1106,10 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
global.ToLog("arr[" + i + "]=" + global.GetHexFromArr(arr[i]))
|
||||
}
|
||||
}
|
||||
GetBlock(num, bToMem, bReadBody) {
|
||||
GetBlock(num, bToMem?, bReadBody?) {
|
||||
if (bToMem === undefined)
|
||||
bToMem = true
|
||||
if (num < this.CurrentBlockNum - BLOCK_COUNT_IN_MEMORY)
|
||||
if (num < this.CurrentBlockNum - global.BLOCK_COUNT_IN_MEMORY)
|
||||
bToMem = false
|
||||
var Block = this.BlockChain[num];
|
||||
if (!Block) {
|
||||
@@ -1109,7 +1126,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
GetMapLoaded(num) {
|
||||
if (num < 0)
|
||||
num = 0
|
||||
var index = Math.floor(num / BLOCK_COUNT_IN_MEMORY);
|
||||
var index = Math.floor(num / global.BLOCK_COUNT_IN_MEMORY);
|
||||
var map = this.MapMapLoaded[index];
|
||||
if (!map) {
|
||||
map = {}
|
||||
@@ -1129,19 +1146,19 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
}
|
||||
FREE_MEM_CHAINS(NumMax) {
|
||||
this.FREE_MEM_BLOCKS(NumMax - BLOCK_COUNT_IN_MEMORY)
|
||||
var maxArrMap = Math.floor(NumMax / BLOCK_COUNT_IN_MEMORY) - 1;
|
||||
this.FREE_MEM_BLOCKS(NumMax - global.BLOCK_COUNT_IN_MEMORY)
|
||||
var maxArrMap = Math.floor(NumMax / global.BLOCK_COUNT_IN_MEMORY) - 1;
|
||||
if (maxArrMap >= 0) {
|
||||
var nWasCount = 0;
|
||||
for (var key in this.MapMapLoaded)
|
||||
if (key < maxArrMap) {
|
||||
if (key as any < maxArrMap) {
|
||||
nWasCount++
|
||||
delete this.MapMapLoaded[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
FREE_ALL_MEM_CHAINS() {
|
||||
this.FREE_MEM_BLOCKS(this.BlockNumDB - BLOCK_COUNT_IN_MEMORY)
|
||||
this.FREE_MEM_BLOCKS(this.BlockNumDB - global.BLOCK_COUNT_IN_MEMORY)
|
||||
for (var i = 0; i < this.LoadedChainList.length; i++) {
|
||||
var chain = this.LoadedChainList[i];
|
||||
if (chain) {
|
||||
@@ -1155,7 +1172,9 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
}
|
||||
this.LoadedChainList = []
|
||||
this.MapMapLoaded = {}
|
||||
//@ts-ignore
|
||||
if (typeof gc === "function")
|
||||
//@ts-ignore
|
||||
gc()
|
||||
}
|
||||
AddValueToHistory(typedata, val) {
|
||||
@@ -1169,7 +1188,7 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
GetHistoryTree(typedata) {
|
||||
var Tree = global.HistoryBlockBuf.LoadValue(typedata, 1);
|
||||
if (!Tree) {
|
||||
Tree = new RBTree(CompareItemHash)
|
||||
Tree = new RBTree(global.CompareItemHash)
|
||||
global.HistoryBlockBuf.SaveValue(typedata, Tree)
|
||||
}
|
||||
return Tree;
|
||||
@@ -1182,8 +1201,8 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
while (root_chain.RootChain) {
|
||||
Count++
|
||||
root_chain = root_chain.RootChain
|
||||
if (Count > MAX_COUNT_CHAIN_LOAD) {
|
||||
TO_ERROR_LOG("BLOCK", 10, "Error COUNT GetRootChain")
|
||||
if (Count > global.MAX_COUNT_CHAIN_LOAD) {
|
||||
global.TO_ERROR_LOG("BLOCK", 10, "Error COUNT GetRootChain")
|
||||
global.SERVER.FREE_ALL_MEM_CHAINS()
|
||||
return undefined;
|
||||
}
|
||||
@@ -1200,10 +1219,10 @@ module.exports = class CBlock extends require("./rest-loader.js")
|
||||
};
|
||||
chain.GetRootChain = GetRootChain.bind(chain)
|
||||
chain.GetFindDB = GetFindDB.bind(chain)
|
||||
chain.AddInfo = AddInfoChain.bind(chain)
|
||||
chain.AddInfo = global.AddInfoChain.bind(chain)
|
||||
}
|
||||
GetMemoryStamp(Str) {
|
||||
return Str + ":##:" + Math.floor(this.CurrentBlockNum / BLOCK_COUNT_IN_MEMORY);
|
||||
return Str + ":##:" + Math.floor(this.CurrentBlockNum / global.BLOCK_COUNT_IN_MEMORY);
|
||||
}
|
||||
GetStrFromHashShort(Hash) {
|
||||
var Str = global.GetHexFromArr(Hash);
|
||||
@@ -1255,7 +1274,7 @@ global.LoadBlockFromNetwork = function(Params, F) {
|
||||
global.SERVER.SendF(Node, {
|
||||
"Method": "GETBLOCK", "Data": { BlockNum: BlockNum, TreeHash: [] }, "Context": {
|
||||
F: function(Info) {
|
||||
var Block = global.BufLib.GetObjectFromBuffer(Info.Data, FORMAT_BLOCK_TRANSFER, WRK_BLOCK_TRANSFER);
|
||||
var Block = global.BufLib.GetObjectFromBuffer(Info.Data, global.FORMAT_BLOCK_TRANSFER, global.WRK_BLOCK_TRANSFER);
|
||||
Info.Data = undefined;
|
||||
if (!Block.BlockNum || Block.BlockNum !== Params.BlockNum) {
|
||||
global.ToLog("Error get BlockNum:" + Params.BlockNum + " from " + NodeName(Info.Node), 2);
|
||||
@@ -1281,4 +1300,4 @@ global.LoadBlockFromNetwork = function(Params, F) {
|
||||
F(1);
|
||||
}
|
||||
};
|
||||
global.HistoryBlockBuf = new STreeBuffer(HISTORY_BLOCK_COUNT * 1000, CompareItemHashSimple, "string");
|
||||
global.HistoryBlockBuf = new STreeBuffer(global.HISTORY_BLOCK_COUNT * 1000, global.CompareItemHashSimple, "string");
|
||||
|
||||
Reference in New Issue
Block a user