public async Task <BannedUtxo> TryGetBannedAsync(OutPoint outpoint, bool notedToo) { if (BannedUtxos.TryGetValue(outpoint, out BannedUtxo bannedElem)) { int maxBan = (int)TimeSpan.FromHours(RoundConfig.DosDurationHours).TotalMinutes; int banLeftMinutes = maxBan - (int)bannedElem.BannedRemaining.TotalMinutes; if (banLeftMinutes > 0) { if (bannedElem.IsNoted) { if (notedToo) { return(new BannedUtxo(bannedElem.Utxo, bannedElem.Severity, bannedElem.TimeOfBan, true, bannedElem.BannedForRound)); } else { return(null); } } else { return(new BannedUtxo(bannedElem.Utxo, bannedElem.Severity, bannedElem.TimeOfBan, false, bannedElem.BannedForRound)); } } else { await UnbanAsync(outpoint).ConfigureAwait(false); } } return(null); }
public async Task BanUtxosAsync(int severity, DateTimeOffset timeOfBan, bool forceNoted, long bannedForRound, params OutPoint[] toBan) { if (RoundConfig.DosSeverity == 0) { return; } var lines = new List <string>(); var updated = false; foreach (var utxo in toBan) { BannedUtxo?foundElem = null; if (BannedUtxos.TryGetValue(utxo, out var fe)) { foundElem = fe; bool bannedForTheSameRound = foundElem.BannedForRound == bannedForRound; if (bannedForTheSameRound && (!forceNoted || foundElem.IsNoted)) { continue; // We would be simply duplicating this ban. } } var isNoted = true; if (!forceNoted) { if (RoundConfig.DosNoteBeforeBan) { if (foundElem is { })
public async Task UnbanAsync(OutPoint output) { if (BannedUtxos.TryRemove(output, out _)) { IEnumerable <string> lines = BannedUtxos.Select(x => x.Value.ToString()); await File.WriteAllLinesAsync(BannedUtxosFilePath, lines).ConfigureAwait(false); Logger.LogInfo($"UTXO unbanned: {output.N}:{output.Hash}."); } }
public int CountBanned(bool notedToo) { if (notedToo) { return(BannedUtxos.Count); } else { return(BannedUtxos.Count(x => !x.Value.IsNoted)); } }
public async Task BanUtxosAsync(int severity, DateTimeOffset timeOfBan, bool forceNoted, long bannedForRound, params OutPoint[] toBan) { if (RoundConfig.DosSeverity == 0) { return; } var lines = new List <string>(); var updated = false; foreach (var utxo in toBan) { BannedUtxo foundElem = null; if (BannedUtxos.TryGetValue(utxo, out BannedUtxo fe)) { foundElem = fe; bool bannedForTheSameRound = foundElem.BannedForRound == bannedForRound; if (bannedForTheSameRound && (!forceNoted || foundElem.IsNoted)) { continue; // We would be simply duplicating this ban. } } var isNoted = true; if (!forceNoted) { if (RoundConfig.DosNoteBeforeBan) { if (foundElem != null) { isNoted = false; } } else { isNoted = false; } } var newElem = new BannedUtxo(utxo, severity, timeOfBan, isNoted, bannedForRound); if (BannedUtxos.TryAdd(newElem.Utxo, newElem)) { string line = newElem.ToString(); lines.Add(line); } else { var elem = BannedUtxos[utxo]; if (elem.IsNoted != isNoted || elem.BannedForRound != bannedForRound) { BannedUtxos[utxo] = new BannedUtxo(elem.Utxo, elem.Severity, elem.TimeOfBan, isNoted, bannedForRound); updated = true; } } Logger.LogInfo($"UTXO {(isNoted ? "noted" : "banned")} with severity: {severity}. UTXO: {utxo.N}:{utxo.Hash} for disrupting Round {bannedForRound}."); } if (updated) // If at any time we set updated then we must update the whole thing. { var allLines = BannedUtxos.Select(x => x.Value.ToString()); await File.WriteAllLinesAsync(BannedUtxosFilePath, allLines).ConfigureAwait(false); } else if (lines.Count != 0) // If we do not have to update the whole thing, we must check if we added a line and so only append. { await File.AppendAllLinesAsync(BannedUtxosFilePath, lines).ConfigureAwait(false); } }
public void Clear() { BannedUtxos.Clear(); File.Delete(BannedUtxosFilePath); }