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 !); }
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()); }
public BlockLocator?GetLocator(HeaderNode headerNode) { using Microsoft.VisualStudio.Threading.AsyncReaderWriterLock.Releaser readMainLock = GlobalLocks.ReadOnMainAsync().GetAwaiter().GetResult(); return(HeadersTree.GetLocator(headerNode)); }
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)); }
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)); }