protected override Task WorkAction()
{
var currentChain = coreDaemon.UnconfirmedTxesChain;
if (currentChain == null)
return Task.CompletedTask;
// init stats logging at current chain height on first run
if (unconfirmedTxesLogHeight == -1)
unconfirmedTxesLogHeight = currentChain.Height;
lock (confirmedBlockStatsByHeight)
{
// log confirmed txes stats at each height, up to the re-org buffer allowance
while (unconfirmedTxesLogHeight < currentChain.Height - REORG_BUFFER)
{
var nextLogHeight = unconfirmedTxesLogHeight + 1;
ConfirmedBlockStats confirmedBlockStats;
if (confirmedBlockStatsByHeight.TryGetValue(nextLogHeight, out confirmedBlockStats))
{
var chainedHeader = confirmedBlockStats.ChainedHeader;
var confirmedTxesStats = confirmedBlockStats.ConfirmedTxesStats;
var confirmTime = confirmedBlockStats.ConfirmTime;
// don't log stats on initial sync, only log blocks that have been processed within an hour of their header time
var blockTime = currentChain.Blocks[nextLogHeight].Time;
if (confirmTime - blockTime <= TimeSpan.FromHours(1))
{
// log confirmed txes stats
var statsString = new StringBuilder();
statsString.AppendLine($"[StatsWorker] Block {chainedHeader.Height}, {chainedHeader.Hash} confirmed at: {confirmTime}");
var blockJsonStats = JsonConvert.SerializeObject(
new
{
blockHash = chainedHeader.Hash.ToString(),
blockHeight = chainedHeader.Height,
confirmTimeUnixMilliseconds = confirmTime.ToUnixTimeMilliseconds(),
txes =
from confirmedTxStats in confirmedTxesStats
select new
{
hash = confirmedTxStats.Hash.ToString(),
confirmationMilliseconds = (int)confirmedTxStats.ConfirmationTimeSpan.TotalMilliseconds,
fee = confirmedTxStats.Fee,
txByteSize = confirmedTxStats.TxByteSize
}
});
statsString.AppendLine(blockJsonStats);
//logger.Info(statsString);
}
confirmedBlockStatsByHeight.Remove(nextLogHeight);
}
else
{
logger.Warn($"[StatsWorker] Missing block confirmation stats at height {nextLogHeight}");
}
unconfirmedTxesLogHeight = nextLogHeight;
}
}
return Task.CompletedTask;
}