private void StartFeeFilterBroadcast(INetworkPeer sender) { if (this.settings.FeeFilter) { INetworkPeer peer = sender; if (peer.PeerVersion != null && peer.PeerVersion.Relay && peer.PeerVersion.Version >= ProtocolVersion.FEEFILTER_VERSION) { if (this.asyncLoop != null) { this.asyncLoop = this.asyncProvider.CreateAndRunAsyncLoop($"MemoryPool.FeeFilter:{peer.Connection.Id}", async token => { if (this.initialBlockDownloadState.IsInitialBlockDownload()) { return; } var feeRate = await this.mempoolManager.GetMempoolMinFeeAsync(MempoolValidator.DefaultMaxMempoolSize * 1000000).ConfigureAwait(false); var currentFilter = feeRate.FeePerK; // We always have a fee filter of at least minRelayTxFee Money filterToSend = Math.Max(currentFilter, new FeeRate(this.network.MinRelayTxFee).FeePerK); if (filterToSend != this.lastSendFilter) { INetworkPeer peer = this.AttachedPeer; if (peer != null && peer.IsConnected) { this.logger.LogDebug("Sending for transaction data from peer '{0}'.", peer.RemoteSocketEndpoint); var filterPayload = new FeeFilterPayload() { NewFeeFilter = filterToSend }; await peer.SendMessageAsync(filterPayload).ConfigureAwait(false); this.lastSendFilter = filterToSend; } } }, this.nodeLifetime.ApplicationStopping, repeatEvery: TimeSpan.FromMinutes(10), startAfter: TimeSpans.TenSeconds); } } } }
private async Task ProcessFeeFilterAsync(INetworkPeer peer, FeeFilterPayload feeFilter) { if (peer.PeerVersion.Relay) { if (feeFilter.NewFeeFilter > 0) { if (this.mempoolBehavior == null) { this.mempoolBehavior = peer.Behavior <MempoolBehavior>(); } this.mempoolBehavior.MinFeeFilter = feeFilter.NewFeeFilter; this.logger.LogDebug("Received feefilter of `{0}` from peer id: {1}", feeFilter.NewFeeFilter, peer.Connection.Id); } } }