diff --git a/neo/Ledger/Blockchain.cs b/neo/Ledger/Blockchain.cs index 006025d478..708dce88c6 100644 --- a/neo/Ledger/Blockchain.cs +++ b/neo/Ledger/Blockchain.cs @@ -393,20 +393,26 @@ private void OnNewHeaders(Header[] headers) private RelayResultReason OnNewTransaction(Transaction transaction) { - if (transaction.Type == TransactionType.MinerTransaction) - return RelayResultReason.Invalid; - if (ContainsTransaction(transaction.Hash)) - return RelayResultReason.AlreadyExists; - if (!MemPool.CanTransactionFitInPool(transaction)) - return RelayResultReason.OutOfMemory; - if (!transaction.Verify(currentSnapshot, MemPool.GetVerifiedTransactions())) - return RelayResultReason.Invalid; - if (!Plugin.CheckPolicy(transaction)) - return RelayResultReason.PolicyFail; - - if (!MemPool.TryAdd(transaction.Hash, transaction)) - return RelayResultReason.OutOfMemory; + try + { + if (transaction.Type == TransactionType.MinerTransaction) + return RelayResultReason.Invalid; + if (ContainsTransaction(transaction.Hash)) + return RelayResultReason.AlreadyExists; + if (!MemPool.CanTransactionFitInPool(transaction)) + return RelayResultReason.OutOfMemory; + if (!transaction.Verify(currentSnapshot, MemPool.GetVerifiedTransactions())) + return RelayResultReason.Invalid; + if (!Plugin.CheckPolicy(transaction)) + return RelayResultReason.PolicyFail; + if (!MemPool.TryAdd(transaction.Hash, transaction)) + return RelayResultReason.OutOfMemory; + } + catch + { + return RelayResultReason.Error; + } system.LocalNode.Tell(new LocalNode.RelayDirectly { Inventory = transaction }); return RelayResultReason.Succeed; } diff --git a/neo/Ledger/RelayResultReason.cs b/neo/Ledger/RelayResultReason.cs index e698d0ea34..36db9ebecc 100644 --- a/neo/Ledger/RelayResultReason.cs +++ b/neo/Ledger/RelayResultReason.cs @@ -8,6 +8,7 @@ public enum RelayResultReason : byte UnableToVerify, Invalid, PolicyFail, - Unknown + Unknown, + Error } }