public Task SendGetHeaders(Peer peer)
{
if (!IsStarted)
return Task.CompletedTask;
var targetChainLocal = this.coreDaemon.TargetChain;
if (targetChainLocal == null)
return Task.CompletedTask;
var blockLocatorHashes = CalculateBlockLocatorHashes(targetChainLocal.Blocks);
// remove an existing request for this peer if it's stale
var now = DateTimeOffset.Now;
DateTimeOffset requestTime;
if (this.headersRequestsByPeer.TryGetValue(peer, out requestTime)
&& (now - requestTime) > STALE_REQUEST_TIME)
{
this.headersRequestsByPeer.TryRemove(peer, out requestTime);
}
// determine if a new request can be made
if (this.headersRequestsByPeer.TryAdd(peer, now))
// send out the request for headers
return peer.Sender.SendGetHeaders(blockLocatorHashes, hashStop: UInt256.Zero);
else
return Task.CompletedTask;
}