コード例 #1
0
        public BlockHeader GetTipHeader()
        {
            using Microsoft.VisualStudio.Threading.AsyncReaderWriterLock.Releaser readMainLock = GlobalLocks.ReadOnMainAsync().GetAwaiter().GetResult();
            if (!_blockHeaderRepository.TryGet(ChainTip.Hash, out BlockHeader? header))
            {
                ThrowHelper.ThrowBlockHeaderRepositoryException($"Unexpected error, cannot fetch the tip at height {ChainTip.Height}.");
            }

            return(header !);
        }
コード例 #2
0
        private async Task SyncLoopAsync(CancellationToken cancellationToken)
        {
            using Microsoft.VisualStudio.Threading.AsyncReaderWriterLock.Releaser readLock = GlobalLocks.ReadOnMainAsync().GetAwaiter().GetResult();

            HeaderNode?bestHeaderNode = _chainState.BestHeader;

            if (!_chainState.TryGetBlockHeader(bestHeaderNode, out BlockHeader? bestBlockHeader))
            {
                ThrowHelper.ThrowNotSupportedException("BestHeader should always be available, this should never happen");
            }

            if (!_status.IsSynchronizingHeaders)
            {
                _status.IsSynchronizingHeaders = true;
                _status.HeadersSyncTimeout     =
                    _dateTimeProvider.GetTimeMicros()
                    + HEADERS_DOWNLOAD_TIMEOUT_BASE
                    + HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER * (
                        (_dateTimeProvider.GetAdjustedTimeAsUnixTimestamp() - bestBlockHeader.TimeStamp) / _consensusParameters.PowTargetSpacing
                        );

                /* If possible, start at the block preceding the currently
                 * best known header.  This ensures that we always get a
                 * non-empty list of headers back as long as the peer
                 * is up-to-date.  With a non-empty response, we can initialise
                 * the peer's known best block.  This wouldn't be possible
                 * if we requested starting at pindexBestHeader and
                 * got back an empty response.  */
                HeaderNode?pindexStart = bestHeaderNode.Previous ?? bestHeaderNode;

                logger.LogDebug("Starting syncing headers from height {LocatorHeight} (peer starting height: {StartingHeight})", pindexStart.Height, _status.PeerStartingHeight);

                var newGetHeaderRequest = new GetHeadersMessage
                {
                    Version      = (uint)PeerContext.NegotiatedProtocolVersion.Version,
                    BlockLocator = _chainState.GetLocator(pindexStart),
                    HashStop     = UInt256.Zero
                };

                await SendMessageAsync(newGetHeaderRequest).ConfigureAwait(false);
            }

            CheckSyncStallingLocked(bestBlockHeader);

            ConsiderEviction(_dateTimeProvider.GetTime());
        }
コード例 #3
0
 public BlockLocator?GetLocator(HeaderNode headerNode)
 {
     using Microsoft.VisualStudio.Threading.AsyncReaderWriterLock.Releaser readMainLock = GlobalLocks.ReadOnMainAsync().GetAwaiter().GetResult();
     return(HeadersTree.GetLocator(headerNode));
 }
コード例 #4
0
 public bool TryGetKnownHeaderNode(UInt256?blockHash, [MaybeNullWhen(false)] out HeaderNode node)
 {
     //using var readLock = new ReadLock(this.theLock);
     using Microsoft.VisualStudio.Threading.AsyncReaderWriterLock.Releaser readMainLock = GlobalLocks.ReadOnMainAsync().GetAwaiter().GetResult();
     return(HeadersTree.TryGetNode(blockHash, false, out node));
 }
コード例 #5
0
 public bool TryGetBestChainHeaderNode(UInt256 blockHash, [MaybeNullWhen(false)] out HeaderNode node)
 {
     using Microsoft.VisualStudio.Threading.AsyncReaderWriterLock.Releaser readMainLock = GlobalLocks.ReadOnMainAsync().GetAwaiter().GetResult();
     return(HeadersTree.TryGetNode(blockHash, true, out node));
 }