示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }
示例#3
0
        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);
        }
示例#4
0
        /// <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);
        }