147 lines
4.7 KiB
JavaScript
147 lines
4.7 KiB
JavaScript
/*
|
|
* @project: TERA
|
|
* @version: Development (beta)
|
|
* @license: MIT (not for evil)
|
|
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
|
* Web: https://terafoundation.org
|
|
* Twitter: https://twitter.com/terafoundation
|
|
* Telegram: https://t.me/terafoundation
|
|
*/
|
|
|
|
const OBJECT_FORMAT_TRANSFER2 = {Version:"uint16", TransferTx:[{BlockNum:"uint", TxArray:[{body:"tr"}]}], TransferPOW:[{BlockNum:"uint",
|
|
Hash:[{SeqHash:"hash", AddrHash:"hash"}]}], Slots:{BlockNum:"uint", State:[{DeltaHeaderNum:"uint16", DeltaBlockNum:"uint16"}],
|
|
Hash:[{Num:"byte", SeqHash:"hash", AddrHash:"hash"}], HistoryHeads:[{Num:"byte", BlockNum:"uint", SeqHash:"hash", AddrHash:"hash"}],
|
|
HistoryBits:[{Num:"byte", BlockNum:"uint", Bits:["byte"]}], HistoryTxs:[{BlockNum:"uint", TxArray:[{body:"tr"}]}], }};
|
|
var FORMAT_DATA_TRANSFER2 = BufLib.GetFormatFromObject(OBJECT_FORMAT_TRANSFER2);
|
|
module.exports = class CConsensus2 extends require("./block-loader")
|
|
{
|
|
constructor(SetKeyPair, RunIP, RunPort, UseRNDHeader, bVirtual)
|
|
{
|
|
super(SetKeyPair, RunIP, RunPort, UseRNDHeader, bVirtual)
|
|
}
|
|
OnStartSecond()
|
|
{
|
|
PrepareStatEverySecond()
|
|
this.AddStatOnTimer()
|
|
if(global.PROTOCOL_VER === 2)
|
|
{
|
|
this.DoBlockChain()
|
|
}
|
|
else
|
|
{
|
|
this.DoBlockChain()
|
|
}
|
|
}
|
|
DoTransfer()
|
|
{
|
|
if(glStopNode)
|
|
return ;
|
|
if(!CAN_START)
|
|
return ;
|
|
if(global.PROTOCOL_VER === 2)
|
|
{
|
|
this.DoTransfer2()
|
|
}
|
|
else
|
|
{
|
|
this.DoTransfer0()
|
|
}
|
|
}
|
|
DoBlockChain2()
|
|
{
|
|
if(glStopNode)
|
|
return ;
|
|
if(!CAN_START)
|
|
return ;
|
|
this.StartConsensus()
|
|
var CURRENTBLOCKNUM = this.CurrentBlockNum;
|
|
if(GrayConnect())
|
|
{
|
|
if(!this.LoadHistoryMode)
|
|
this.StartSyncBlockchain(undefined, 1)
|
|
return ;
|
|
}
|
|
if(this.LoadHistoryMode)
|
|
return ;
|
|
var bWasSave = false;
|
|
var LoadBlockNum;
|
|
var LoadHash;
|
|
var start_save = CURRENTBLOCKNUM + TIME_START_SAVE;
|
|
for(var BlockNum = CURRENTBLOCKNUM - BLOCK_PROCESSING_LENGTH2; BlockNum > BLOCK_PROCESSING_LENGTH2 && BlockNum < CURRENTBLOCKNUM; BlockNum++)
|
|
{
|
|
var Block = this.GetBlock(BlockNum);
|
|
}
|
|
}
|
|
TRANSFER2(Info, CurTime)
|
|
{
|
|
}
|
|
static
|
|
TRANSFER2_F()
|
|
{
|
|
return FORMAT_DATA_TRANSFER2;
|
|
}
|
|
DoTransfer2()
|
|
{
|
|
var MaxPOWList;
|
|
var MaxSumList;
|
|
var start = this.CurrentBlockNum - BLOCK_PROCESSING_LENGTH;
|
|
var finish = this.GetLastCorrectBlockNum();
|
|
for(var b = start; b <= finish; b++)
|
|
{
|
|
var Block = this.GetBlock(b);
|
|
if(!Block)
|
|
continue;
|
|
if(Block.StartLevel === undefined || Block.MLevelSend === undefined)
|
|
continue;
|
|
if(!Block.Active)
|
|
continue;
|
|
if(Block.MLevelSend < 0)
|
|
{
|
|
this.CheckEndExchange(Block)
|
|
continue;
|
|
}
|
|
if(Block.EndExchange)
|
|
continue;
|
|
var Transfer = Block.LevelsTransfer[Block.MLevelSend];
|
|
if(!Transfer.WasSend)
|
|
{
|
|
if(!MaxPOWList)
|
|
{
|
|
MaxPOWList = this.GetMaxPOWList()
|
|
MaxSumList = this.GetMaxSumList()
|
|
}
|
|
var ArrT = this.GetArrayFromTxTree(Block);
|
|
this.SendDataTransfer(Transfer, ArrT, MaxPOWList, MaxSumList, Block)
|
|
}
|
|
Transfer.WasSend = true
|
|
var bNext = Transfer.WasGet;
|
|
if(!bNext)
|
|
{
|
|
var CurTimeNum = GetCurrentTime(Block.DELTA_CURRENT_TIME) - 0;
|
|
var DeltaTime = CurTimeNum - Block.StartTimeNum;
|
|
if(DeltaTime > Transfer.MustDeltaTime)
|
|
{
|
|
bNext = true
|
|
Block.ErrRun = "" + Transfer.LocalLevel + " " + Block.ErrRun
|
|
for(var Addr in Transfer.TransferNodes)
|
|
{
|
|
var Item = Transfer.TransferNodes[Addr];
|
|
ADD_TO_STAT("TRANSFER_TIME_OUT")
|
|
this.AddCheckErrCount(Item.Node, 1, "TRANSFER_TIME_OUT")
|
|
}
|
|
ADD_TO_STAT("TimeOutLevel")
|
|
}
|
|
}
|
|
if(bNext)
|
|
{
|
|
if(Block.MLevelSend === 0)
|
|
{
|
|
Block.EndExchangeTime = Date.now()
|
|
this.CheckEndExchange(Block)
|
|
}
|
|
Block.MLevelSend--
|
|
}
|
|
}
|
|
}
|
|
};
|