public AddTxResult AddTransaction(Transaction transaction, long blockNumber, bool doNotEvict = false) { Metrics.PendingTransactionsReceived++; if (doNotEvict) { _nonEvictableTransactions.TryAdd(transaction.Hash, true); if (_logger.IsDebug) { _logger.Debug($"Added a transaction: {transaction.Hash} that will not be evicted."); } } // beware we are discarding here the old signature scheme without ChainId if (transaction.Signature.GetChainId == null) { Metrics.PendingTransactionsDiscarded++; return(AddTxResult.OldScheme); } if (transaction.Signature.GetChainId != _specProvider.ChainId) { Metrics.PendingTransactionsDiscarded++; return(AddTxResult.InvalidChainId); } if (!_pendingTransactions.TryAdd(transaction.Hash, transaction)) { Metrics.PendingTransactionsKnown++; return(AddTxResult.AlreadyKnown); } if (_txStorage.Get(transaction.Hash) != null) { Metrics.PendingTransactionsKnown++; return(AddTxResult.AlreadyKnown); } transaction.SenderAddress = _ecdsa.RecoverAddress(transaction, blockNumber); // check nonce if (transaction.DeliveredBy == null) { _ownTransactions.TryAdd(transaction.Hash, transaction); _ownTimer.Enabled = true; if (_logger.IsInfo) { _logger.Info($"Broadcasting own transaction {transaction.Hash} to {_peers.Count} peers"); } } NotifySelectedPeers(transaction); FilterAndStoreTransaction(transaction, blockNumber); NewPending?.Invoke(this, new TxEventArgs(transaction)); return(AddTxResult.Added); }
private static IEnumerable <Transaction> GetTransactionsFromStorage(ITxStorage storage, IEnumerable <Transaction> transactions) => transactions.Select(t => storage.Get(t.Hash)).Where(t => !(t is null)).ToArray();