From a2dfaaec95df993044ee076a290008050b1840c1 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Tue, 17 Nov 2020 10:55:32 +0800 Subject: [PATCH 1/5] fix tx.verify --- neo/Network/P2P/Payloads/Transaction.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/neo/Network/P2P/Payloads/Transaction.cs index d84cb909f6..585217d9c6 100644 --- a/neo/Network/P2P/Payloads/Transaction.cs +++ b/neo/Network/P2P/Payloads/Transaction.cs @@ -1,3 +1,4 @@ +using Akka.Util.Internal; using Neo.Cryptography; using Neo.IO; using Neo.IO.Caching; @@ -97,7 +98,7 @@ public IReadOnlyDictionary References if (tx == null) return null; foreach (var reference in group) { - if (reference.PrevIndex >= Outputs.Length) + if (reference.PrevIndex >= Outputs.Length || dictionary.ContainsKey(reference)) { return null; } From 1c6e5ec6b81876554c9a003ac436d0ec47e9c2c1 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Tue, 17 Nov 2020 10:57:32 +0800 Subject: [PATCH 2/5] format --- neo/Network/P2P/Payloads/Transaction.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/neo/Network/P2P/Payloads/Transaction.cs index 585217d9c6..ca885ddb3f 100644 --- a/neo/Network/P2P/Payloads/Transaction.cs +++ b/neo/Network/P2P/Payloads/Transaction.cs @@ -1,4 +1,3 @@ -using Akka.Util.Internal; using Neo.Cryptography; using Neo.IO; using Neo.IO.Caching; From 9701142e0cc87a21f3dbec7f4ee5f3a2cb0457c1 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Wed, 18 Nov 2020 12:05:27 +0800 Subject: [PATCH 3/5] fix --- neo/Network/P2P/Payloads/Transaction.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/neo/Network/P2P/Payloads/Transaction.cs index ca885ddb3f..d6b0d0ee82 100644 --- a/neo/Network/P2P/Payloads/Transaction.cs +++ b/neo/Network/P2P/Payloads/Transaction.cs @@ -73,9 +73,16 @@ public virtual Fixed8 NetworkFee { if (_network_fee == -Fixed8.Satoshi) { - Fixed8 input = References.Values.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); - Fixed8 output = Outputs.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); - _network_fee = input - output - SystemFee; + if (References == null) + { + _network_fee = Fixed8.Zero; + } + else + { + Fixed8 input = References.Values.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); + Fixed8 output = Outputs.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); + _network_fee = input - output - SystemFee; + } } return _network_fee; } From 2dd1f6a6a8bc67a69cc38e51592857467ce4d391 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Wed, 18 Nov 2020 13:57:45 +0800 Subject: [PATCH 4/5] catch tx.verify exception to avoid state state influence --- neo/Ledger/Blockchain.cs | 32 +++++++++++++++---------- neo/Network/P2P/Payloads/Transaction.cs | 15 ++++-------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/neo/Ledger/Blockchain.cs b/neo/Ledger/Blockchain.cs index 006025d478..d235aa2608 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.Invalid; + } system.LocalNode.Tell(new LocalNode.RelayDirectly { Inventory = transaction }); return RelayResultReason.Succeed; } diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/neo/Network/P2P/Payloads/Transaction.cs index d6b0d0ee82..d84cb909f6 100644 --- a/neo/Network/P2P/Payloads/Transaction.cs +++ b/neo/Network/P2P/Payloads/Transaction.cs @@ -73,16 +73,9 @@ public virtual Fixed8 NetworkFee { if (_network_fee == -Fixed8.Satoshi) { - if (References == null) - { - _network_fee = Fixed8.Zero; - } - else - { - Fixed8 input = References.Values.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); - Fixed8 output = Outputs.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); - _network_fee = input - output - SystemFee; - } + Fixed8 input = References.Values.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); + Fixed8 output = Outputs.Where(p => p.AssetId.Equals(Blockchain.UtilityToken.Hash)).Sum(p => p.Value); + _network_fee = input - output - SystemFee; } return _network_fee; } @@ -104,7 +97,7 @@ public IReadOnlyDictionary References if (tx == null) return null; foreach (var reference in group) { - if (reference.PrevIndex >= Outputs.Length || dictionary.ContainsKey(reference)) + if (reference.PrevIndex >= Outputs.Length) { return null; } From 5f6ebee5209d45eed5772459343e12d701fcd689 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 20 Nov 2020 17:39:02 +0800 Subject: [PATCH 5/5] add RelayResultReason.Error --- neo/Ledger/Blockchain.cs | 2 +- neo/Ledger/RelayResultReason.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/neo/Ledger/Blockchain.cs b/neo/Ledger/Blockchain.cs index d235aa2608..708dce88c6 100644 --- a/neo/Ledger/Blockchain.cs +++ b/neo/Ledger/Blockchain.cs @@ -411,7 +411,7 @@ private RelayResultReason OnNewTransaction(Transaction transaction) } catch { - return RelayResultReason.Invalid; + 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 } }