diff --git a/Lib9c.Policy/NCStagePolicy.cs b/Lib9c.Policy/NCStagePolicy.cs index bd1a393515..29a1b7b00b 100644 --- a/Lib9c.Policy/NCStagePolicy.cs +++ b/Lib9c.Policy/NCStagePolicy.cs @@ -9,14 +9,16 @@ namespace Nekoyume.Blockchain using Libplanet.Blockchain; using Libplanet.Blockchain.Policies; using Libplanet.Tx; + using Serilog; public class NCStagePolicy : IStagePolicy { + private static Dictionary _bannedAccountTracker = new(); private readonly VolatileStagePolicy _impl; private readonly ConcurrentDictionary> _txs; private readonly int _quotaPerSigner; - private static readonly ImmutableHashSet
_bannedAccounts = new[] + private ImmutableHashSet
_bannedAccounts = new[] { new Address("de96aa7702a7a1fd18ee0f84a5a0c7a2c28ec840"), new Address("153281c93274bEB9726A03C33d3F19a8D78ad805"), @@ -78,6 +80,16 @@ public IEnumerable Iterate(BlockChain blockChain, bool filtered = t { s.Remove(s.Max); } + + if (s.Count - _quotaPerSigner > -1) + { + if (!_bannedAccountTracker.ContainsKey(tx.Signer)) + { + Log.Debug("Adding {signer} to banned accounts for 30 minutes", tx.Signer); + _bannedAccountTracker.Add(tx.Signer, DateTimeOffset.Now); + _bannedAccounts = _bannedAccounts.Add(tx.Signer); + } + } } #pragma warning disable LAA1002 // DictionariesOrSetsShouldBeOrderedToEnumerate @@ -94,6 +106,16 @@ public bool Stage(BlockChain blockChain, Transaction transaction) { if (_bannedAccounts.Contains(transaction.Signer)) { + if (_bannedAccountTracker.ContainsKey(transaction.Signer)) + { + if ((DateTimeOffset.Now - _bannedAccountTracker[transaction.Signer]).Minutes >= 30) + { + Log.Debug("Removing {signer} from banned accounts after 30 minutes", transaction.Signer); + _bannedAccountTracker.Remove(transaction.Signer); + _bannedAccounts = _bannedAccounts.Remove(transaction.Signer); + } + } + return false; }