public async Task <bool> TryUpdatePrivateBlockHeight() { eth_blockNumber response; try { var connectionString = _cfg.GetPrivateGethConnectionString(); response = await FetchGethBlockResponse(connectionString); } catch (Exception ex) { Console.WriteLine("Failed to fetch private geth block height."); Console.WriteLine(ex.JsonSerializeAsPrettyException()); return(false); } var nr = response.TryGetBlockNumber(); if (nr > (privateBlockNumber?.TryGetBlockNumber() ?? 0)) { response.name = "private"; privateBlockNumber = response; TryUpdateBlockTimes(response); return(true); } return(false); }
private void TryUpdateBlockTimes(eth_blockNumber currentBlock, long?currentBlockOverride = null) { lock (_locker) { var currentBlockNr = currentBlockOverride ?? currentBlock.TryGetBlockNumber(); if (lastBlockTimesBlockNr == currentBlockNr || currentBlockNr <= 0 || this.GetLastBlockNr().TryGetBlockNumber() > currentBlockNr) { return; } if (lastBlockTimesBlockNr <= 0 || currentBlockNr > lastBlockTimesBlockNr + 1) { lastBlockTimesBlockNr = currentBlockNr; blockTimesStopWatch.Restart(); return; } blockTimes.Add(blockTimesStopWatch.ElapsedMilliseconds); if (blockTimes.Count > _cfg.bockTimesAverageCount) { blockTimes.RemoveAt(0); } averageBlockTime = (long)blockTimes.Average(); lastBlockTimesBlockNr = currentBlockNr; blockTimesStopWatch.Restart(); } }
public async Task <bool> TryUpdateEtherscanBlockHeight() { eth_blockNumber response; try { var requestUri = _cfg.GetEtherscanConnectionString() + _cfg.etherscanBlockHeightFetchQuery; response = await FetchEtherscanBlockResponse(requestUri); } catch (Exception ex) { Console.WriteLine("Failed to fetch etherscan block height."); Console.WriteLine(ex.JsonSerializeAsPrettyException()); return(false); } var nr = response.TryGetBlockNumber(); if (nr > (etherscanBlockNumber?.TryGetBlockNumber() ?? 0)) { response.name = "etherscan"; etherscanBlockNumber = response; TryUpdateBlockTimes(response); return(true); } return(false); }
/// <summary> /// Returns Last Detected eth_blockNumber /// </summary> /// <returns>null or eth_blockNumber object</returns> public eth_blockNumber GetLastBlockNr(bool apiOnly = false) { var blocks = GetAllBlocksNr(apiOnly: apiOnly); eth_blockNumber max = null; foreach (var block in blocks) { if (block == null) { continue; } if (max == null) { max = block; continue; } if (max.blockNumber < block.blockNumber) { max = block; continue; } //The most early detected block timestamp is used to keep consistent results of the API if (max.blockNumber == block.blockNumber) { if (max.TimeStamp > block.TimeStamp) { max = block; } } } return(max); }