1
0
Fork 0
tera/Source/core/block-exchange2.js

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--
}
}
}
};