From c3170c760241939fbdf851d221923c5f0887d513 Mon Sep 17 00:00:00 2001 From: Charis Date: Mon, 13 Jan 2020 14:53:38 +0800 Subject: [PATCH 1/6] add containsTx recheck --- src/neo/Ledger/Blockchain.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 74d06806e4..7ec5ff197c 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -429,7 +429,9 @@ private void OnParallelVerified(ParallelVerified parallelVerified) RelayResultReason reason = parallelVerified.VerifyResult; if (reason == RelayResultReason.Succeed) { - if (!MemPool.CanTransactionFitInPool(parallelVerified.Transaction)) + if (ContainsTransaction(parallelVerified.Transaction.Hash)) + reason = RelayResultReason.AlreadyExists; + else if (!MemPool.CanTransactionFitInPool(parallelVerified.Transaction)) reason = RelayResultReason.OutOfMemory; else if (!MemPool.TryAdd(parallelVerified.Transaction.Hash, parallelVerified.Transaction)) reason = RelayResultReason.OutOfMemory; From eb2a0b2fbcd676c61a6c64aa86b11ffafd0297fd Mon Sep 17 00:00:00 2001 From: Charis Date: Mon, 13 Jan 2020 16:47:42 +0800 Subject: [PATCH 2/6] add UT --- src/neo/Ledger/Blockchain.cs | 2 +- tests/neo.UnitTests/Ledger/UT_Blockchain.cs | 49 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 7ec5ff197c..a66fd79141 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -27,7 +27,7 @@ public class Import { public IEnumerable Blocks; } public class ImportCompleted { } public class FillMemoryPool { public IEnumerable Transactions; } public class FillCompleted { } - private class ParallelVerified { public Transaction Transaction; public bool ShouldRelay; public RelayResultReason VerifyResult; } + public class ParallelVerified { public Transaction Transaction; public bool ShouldRelay; public RelayResultReason VerifyResult; } public static readonly uint MillisecondsPerBlock = ProtocolSettings.Default.MillisecondsPerBlock; public const uint DecrementInterval = 2000000; diff --git a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs index 622f156b16..eac41aa89a 100644 --- a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs +++ b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs @@ -12,6 +12,7 @@ using Neo.Wallets.NEP6; using System.Linq; using System.Reflection; +using static Neo.Ledger.Blockchain; namespace Neo.UnitTests.Ledger { @@ -142,6 +143,54 @@ public void TestValidTransaction() } } + [TestMethod] + public void TestOnParallelVerified() + { + var senderProbe = CreateTestProbe(); + var snapshot = Blockchain.Singleton.GetSnapshot(); + var walletA = TestUtils.GenerateTestWallet(); + + using (var unlockA = walletA.Unlock("123")) + { + var acc = walletA.CreateAccount(); + + // Fake balance + + var key = NativeContract.GAS.CreateStorageKey(20, acc.ScriptHash); + var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem + { + Value = new Nep5AccountState().ToByteArray() + }); + + entry.Value = new Nep5AccountState() + { + Balance = 100_000_000 * NativeContract.GAS.Factor + } + .ToByteArray(); + + snapshot.Commit(); + + typeof(Blockchain) + .GetMethod("UpdateCurrentSnapshot", BindingFlags.Instance | BindingFlags.NonPublic) + .Invoke(Blockchain.Singleton, null); + + // Make parallelVerified transaction + + var tx = CreateValidTx(walletA, acc.ScriptHash, 0); + var parallelVerified = new ParallelVerified + { + Transaction = tx, + ShouldRelay = true, + VerifyResult = tx.VerifyParallelParts(snapshot) + }; + senderProbe.Send(system.Blockchain, parallelVerified); + senderProbe.ExpectMsg(RelayResultReason.Succeed); + + senderProbe.Send(system.Blockchain, parallelVerified); + senderProbe.ExpectMsg(RelayResultReason.AlreadyExists); + } + } + private Transaction CreateValidTx(NEP6Wallet wallet, UInt160 account, uint nonce) { var tx = wallet.MakeTransaction(new TransferOutput[] From 08d46b6c8ae83d326c629df9282261b2cf475b3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitor=20Naz=C3=A1rio=20Coelho?= Date: Mon, 13 Jan 2020 06:09:14 -0300 Subject: [PATCH 3/6] Update to just View check --- src/neo/Ledger/Blockchain.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index a66fd79141..9d9a74cc9d 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -429,7 +429,7 @@ private void OnParallelVerified(ParallelVerified parallelVerified) RelayResultReason reason = parallelVerified.VerifyResult; if (reason == RelayResultReason.Succeed) { - if (ContainsTransaction(parallelVerified.Transaction.Hash)) + if (View.ContainsTransaction(parallelVerified.Transaction.Hash)) reason = RelayResultReason.AlreadyExists; else if (!MemPool.CanTransactionFitInPool(parallelVerified.Transaction)) reason = RelayResultReason.OutOfMemory; From 1beaeed64e261e4d1d072858d171caf56e7a381f Mon Sep 17 00:00:00 2001 From: Charis Date: Mon, 13 Jan 2020 17:09:40 +0800 Subject: [PATCH 4/6] update --- src/neo/Ledger/Blockchain.cs | 2 +- tests/neo.UnitTests/Ledger/UT_Blockchain.cs | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index a66fd79141..9d9a74cc9d 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -429,7 +429,7 @@ private void OnParallelVerified(ParallelVerified parallelVerified) RelayResultReason reason = parallelVerified.VerifyResult; if (reason == RelayResultReason.Succeed) { - if (ContainsTransaction(parallelVerified.Transaction.Hash)) + if (View.ContainsTransaction(parallelVerified.Transaction.Hash)) reason = RelayResultReason.AlreadyExists; else if (!MemPool.CanTransactionFitInPool(parallelVerified.Transaction)) reason = RelayResultReason.OutOfMemory; diff --git a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs index eac41aa89a..549a9b68db 100644 --- a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs +++ b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs @@ -185,9 +185,6 @@ public void TestOnParallelVerified() }; senderProbe.Send(system.Blockchain, parallelVerified); senderProbe.ExpectMsg(RelayResultReason.Succeed); - - senderProbe.Send(system.Blockchain, parallelVerified); - senderProbe.ExpectMsg(RelayResultReason.AlreadyExists); } } From a3aa537f4fc845606993f1edc9820ea66b10b01e Mon Sep 17 00:00:00 2001 From: Charis Date: Mon, 13 Jan 2020 17:57:33 +0800 Subject: [PATCH 5/6] revert --- src/neo/Ledger/Blockchain.cs | 2 +- tests/neo.UnitTests/Ledger/UT_Blockchain.cs | 45 --------------------- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 9d9a74cc9d..48c7da914a 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -27,7 +27,7 @@ public class Import { public IEnumerable Blocks; } public class ImportCompleted { } public class FillMemoryPool { public IEnumerable Transactions; } public class FillCompleted { } - public class ParallelVerified { public Transaction Transaction; public bool ShouldRelay; public RelayResultReason VerifyResult; } + private class ParallelVerified { public Transaction Transaction; public bool ShouldRelay; public RelayResultReason VerifyResult; } public static readonly uint MillisecondsPerBlock = ProtocolSettings.Default.MillisecondsPerBlock; public const uint DecrementInterval = 2000000; diff --git a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs index 549a9b68db..0d2c665c8c 100644 --- a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs +++ b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs @@ -143,51 +143,6 @@ public void TestValidTransaction() } } - [TestMethod] - public void TestOnParallelVerified() - { - var senderProbe = CreateTestProbe(); - var snapshot = Blockchain.Singleton.GetSnapshot(); - var walletA = TestUtils.GenerateTestWallet(); - - using (var unlockA = walletA.Unlock("123")) - { - var acc = walletA.CreateAccount(); - - // Fake balance - - var key = NativeContract.GAS.CreateStorageKey(20, acc.ScriptHash); - var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem - { - Value = new Nep5AccountState().ToByteArray() - }); - - entry.Value = new Nep5AccountState() - { - Balance = 100_000_000 * NativeContract.GAS.Factor - } - .ToByteArray(); - - snapshot.Commit(); - - typeof(Blockchain) - .GetMethod("UpdateCurrentSnapshot", BindingFlags.Instance | BindingFlags.NonPublic) - .Invoke(Blockchain.Singleton, null); - - // Make parallelVerified transaction - - var tx = CreateValidTx(walletA, acc.ScriptHash, 0); - var parallelVerified = new ParallelVerified - { - Transaction = tx, - ShouldRelay = true, - VerifyResult = tx.VerifyParallelParts(snapshot) - }; - senderProbe.Send(system.Blockchain, parallelVerified); - senderProbe.ExpectMsg(RelayResultReason.Succeed); - } - } - private Transaction CreateValidTx(NEP6Wallet wallet, UInt160 account, uint nonce) { var tx = wallet.MakeTransaction(new TransferOutput[] From c4f39ba98da564f60af4003d3e4a5c28df103723 Mon Sep 17 00:00:00 2001 From: Charis Zhao Date: Mon, 13 Jan 2020 17:59:21 +0800 Subject: [PATCH 6/6] Update UT_Blockchain.cs --- tests/neo.UnitTests/Ledger/UT_Blockchain.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs index 0d2c665c8c..622f156b16 100644 --- a/tests/neo.UnitTests/Ledger/UT_Blockchain.cs +++ b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs @@ -12,7 +12,6 @@ using Neo.Wallets.NEP6; using System.Linq; using System.Reflection; -using static Neo.Ledger.Blockchain; namespace Neo.UnitTests.Ledger {