From dc4aaa4000a7bca712fb583099600c8d5c45c0d4 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 19 Nov 2019 01:55:47 +0800 Subject: [PATCH 1/8] Storage abstract --- neo.UnitTests/Consensus/UT_Consensus.cs | 2 +- .../Consensus/UT_ConsensusContext.cs | 2 +- .../Extensions/NativeContractExtensions.cs | 5 +- .../Nep5NativeContractExtensions.cs | 9 +- neo.UnitTests/IO/Caching/UT_DataCache.cs | 6 +- neo.UnitTests/Ledger/UT_Blockchain.cs | 10 +- neo.UnitTests/Ledger/UT_MemoryPool.cs | 73 +++----------- neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs | 4 +- neo.UnitTests/Ledger/UT_TrimmedBlock.cs | 10 +- .../Network/P2P/Payloads/UT_Transaction.cs | 39 +++++--- .../Network/P2P/UT_ProtocolHandler.cs | 10 +- neo.UnitTests/Network/P2P/UT_RemoteNode.cs | 2 +- neo.UnitTests/Network/RPC/UT_RpcServer.cs | 3 +- .../Network/RPC/UT_TransactionManager.cs | 4 +- neo.UnitTests/Plugins/UT_Plugin.cs | 3 +- .../Iterators/UT_StorageIterator.cs | 6 +- .../Native/Tokens/UT_GasToken.cs | 10 +- .../Native/Tokens/UT_NeoToken.cs | 45 +++++---- .../Native/Tokens/UT_Nep5Token.cs | 18 ++-- .../SmartContract/Native/UT_NativeContract.cs | 15 ++- .../SmartContract/Native/UT_PolicyContract.cs | 17 ++-- .../SmartContract/UT_ApplicationEngine.cs | 38 +++----- .../SmartContract/UT_InteropService.NEO.cs | 36 ++++--- .../SmartContract/UT_InteropService.cs | 68 +++++++------- .../SmartContract/UT_SmartContractHelper.cs | 38 +++----- neo.UnitTests/SmartContract/UT_Syscalls.cs | 12 +-- neo.UnitTests/TestBlockchain.cs | 60 +++--------- neo.UnitTests/TestDataCache.cs | 53 ----------- neo.UnitTests/TestMetaDataCache.cs | 26 ----- neo.UnitTests/TestVerifiable.cs | 2 +- neo.UnitTests/UT_DataCache.cs | 6 +- neo.UnitTests/UT_NeoSystem.cs | 4 +- neo.UnitTests/Wallets/UT_Wallet.cs | 36 ++++--- neo/Consensus/ConsensusContext.cs | 12 +-- neo/Consensus/ConsensusService.cs | 4 +- neo/IO/Caching/CloneCache.cs | 8 +- neo/IO/Caching/DataCache.cs | 10 +- neo/IO/Data/LevelDB/SliceBuilder.cs | 9 +- neo/Ledger/Blockchain.cs | 40 ++++---- neo/Ledger/MemoryPool.cs | 8 +- neo/NeoSystem.cs | 6 +- neo/Network/P2P/Payloads/BlockBase.cs | 4 +- neo/Network/P2P/Payloads/ConsensusPayload.cs | 4 +- neo/Network/P2P/Payloads/IInventory.cs | 2 +- neo/Network/P2P/Payloads/IVerifiable.cs | 2 +- neo/Network/P2P/Payloads/Transaction.cs | 8 +- neo/Network/P2P/ProtocolHandler.cs | 10 +- neo/Network/RPC/RpcServer.cs | 26 ++--- .../{CloneSnapshot.cs => ClonedView.cs} | 20 ++-- neo/Persistence/Helper.cs | 62 ------------ neo/Persistence/IPersistence.cs | 17 ---- neo/Persistence/IReadOnlyStore.cs | 10 ++ neo/Persistence/ISnapshot.cs | 11 +++ neo/Persistence/IStore.cs | 12 +++ neo/Persistence/LevelDB/DbCache.cs | 56 ----------- neo/Persistence/LevelDB/DbMetaDataCache.cs | 42 --------- neo/Persistence/LevelDB/DbSnapshot.cs | 49 ---------- neo/Persistence/LevelDB/LevelDBStore.cs | 94 ------------------- neo/Persistence/LevelDB/Snapshot.cs | 55 +++++++++++ neo/Persistence/LevelDB/Store.cs | 69 ++++++++++++++ .../Memory/ByteArrayEqualityComparer.cs | 47 ++++++++++ neo/Persistence/Memory/Helper.cs | 12 +++ neo/Persistence/Memory/Snapshot.cs | 69 ++++++++++++++ neo/Persistence/Memory/Store.cs | 70 ++++++++++++++ neo/Persistence/{LevelDB => }/Prefixes.cs | 6 +- neo/Persistence/RawView.cs | 30 ++++++ neo/Persistence/Snapshot.cs | 45 --------- neo/Persistence/SnapshotView.cs | 43 +++++++++ neo/Persistence/Store.cs | 30 ------ neo/Persistence/StoreDataCache.cs | 54 +++++++++++ neo/Persistence/StoreMetaDataCache.cs | 37 ++++++++ neo/Persistence/View.cs | 94 +++++++++++++++++++ neo/Plugins/IPersistencePlugin.cs | 4 +- neo/SmartContract/ApplicationEngine.cs | 10 +- .../ContractParametersContext.cs | 2 +- neo/SmartContract/Helper.cs | 2 +- .../Iterators/StorageIterator.cs | 4 +- neo/SmartContract/Native/PolicyContract.cs | 10 +- neo/SmartContract/Native/Tokens/GasToken.cs | 2 +- neo/SmartContract/Native/Tokens/NeoToken.cs | 14 +-- neo/SmartContract/Native/Tokens/Nep5Token.cs | 4 +- neo/Wallets/Wallet.cs | 6 +- 82 files changed, 971 insertions(+), 946 deletions(-) delete mode 100644 neo.UnitTests/TestDataCache.cs delete mode 100644 neo.UnitTests/TestMetaDataCache.cs rename neo/Persistence/{CloneSnapshot.cs => ClonedView.cs} (52%) delete mode 100644 neo/Persistence/Helper.cs delete mode 100644 neo/Persistence/IPersistence.cs create mode 100644 neo/Persistence/IReadOnlyStore.cs create mode 100644 neo/Persistence/ISnapshot.cs create mode 100644 neo/Persistence/IStore.cs delete mode 100644 neo/Persistence/LevelDB/DbCache.cs delete mode 100644 neo/Persistence/LevelDB/DbMetaDataCache.cs delete mode 100644 neo/Persistence/LevelDB/DbSnapshot.cs delete mode 100644 neo/Persistence/LevelDB/LevelDBStore.cs create mode 100644 neo/Persistence/LevelDB/Snapshot.cs create mode 100644 neo/Persistence/LevelDB/Store.cs create mode 100644 neo/Persistence/Memory/ByteArrayEqualityComparer.cs create mode 100644 neo/Persistence/Memory/Helper.cs create mode 100644 neo/Persistence/Memory/Snapshot.cs create mode 100644 neo/Persistence/Memory/Store.cs rename neo/Persistence/{LevelDB => }/Prefixes.cs (76%) create mode 100644 neo/Persistence/RawView.cs delete mode 100644 neo/Persistence/Snapshot.cs create mode 100644 neo/Persistence/SnapshotView.cs delete mode 100644 neo/Persistence/Store.cs create mode 100644 neo/Persistence/StoreDataCache.cs create mode 100644 neo/Persistence/StoreMetaDataCache.cs create mode 100644 neo/Persistence/View.cs diff --git a/neo.UnitTests/Consensus/UT_Consensus.cs b/neo.UnitTests/Consensus/UT_Consensus.cs index c8d8fbf6c4..1a3a4a5f0f 100644 --- a/neo.UnitTests/Consensus/UT_Consensus.cs +++ b/neo.UnitTests/Consensus/UT_Consensus.cs @@ -42,7 +42,7 @@ public void ConsensusService_Primary_Sends_PrepareRequest_After_OnStart() TestProbe subscriber = CreateTestProbe(); var mockWallet = new Mock(); mockWallet.Setup(p => p.GetAccount(It.IsAny())).Returns(p => new TestWalletAccount(p)); - ConsensusContext context = new ConsensusContext(mockWallet.Object, TestBlockchain.GetStore()); + ConsensusContext context = new ConsensusContext(mockWallet.Object, TestBlockchain.Store); int timeIndex = 0; var timeValues = new[] { diff --git a/neo.UnitTests/Consensus/UT_ConsensusContext.cs b/neo.UnitTests/Consensus/UT_ConsensusContext.cs index 9a0dd39ba7..44c5523780 100644 --- a/neo.UnitTests/Consensus/UT_ConsensusContext.cs +++ b/neo.UnitTests/Consensus/UT_ConsensusContext.cs @@ -39,7 +39,7 @@ public void TestSetup() _validatorKeys[x] = new KeyPair(pk); } - _context = new ConsensusContext(mockWallet.Object, TestBlockchain.GetStore()) + _context = new ConsensusContext(mockWallet.Object, TestBlockchain.Store) { Validators = _validatorKeys.Select(u => u.PublicKey).ToArray() }; diff --git a/neo.UnitTests/Extensions/NativeContractExtensions.cs b/neo.UnitTests/Extensions/NativeContractExtensions.cs index 4d3f7bcb95..944e22ede8 100644 --- a/neo.UnitTests/Extensions/NativeContractExtensions.cs +++ b/neo.UnitTests/Extensions/NativeContractExtensions.cs @@ -1,4 +1,5 @@ using Neo.Network.P2P.Payloads; +using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.VM; @@ -8,12 +9,12 @@ namespace Neo.UnitTests.Extensions { public static class NativeContractExtensions { - public static StackItem Call(this NativeContract contract, Neo.Persistence.Snapshot snapshot, string method, params ContractParameter[] args) + public static StackItem Call(this NativeContract contract, SnapshotView snapshot, string method, params ContractParameter[] args) { return Call(contract, snapshot, null, method, args); } - public static StackItem Call(this NativeContract contract, Neo.Persistence.Snapshot snapshot, IVerifiable container, string method, params ContractParameter[] args) + public static StackItem Call(this NativeContract contract, SnapshotView snapshot, IVerifiable container, string method, params ContractParameter[] args) { var engine = new ApplicationEngine(TriggerType.Application, container, snapshot, 0, true); diff --git a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs b/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs index a531591d34..b5608569dd 100644 --- a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs +++ b/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs @@ -1,5 +1,6 @@ using FluentAssertions; using Neo.Network.P2P.Payloads; +using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.VM; @@ -34,14 +35,14 @@ public ManualWitness(params UInt160[] hashForVerify) public void DeserializeUnsigned(BinaryReader reader) { } - public UInt160[] GetScriptHashesForVerifying(Persistence.Snapshot snapshot) => _hashForVerify; + public UInt160[] GetScriptHashesForVerifying(View snapshot) => _hashForVerify; public void Serialize(BinaryWriter writer) { } public void SerializeUnsigned(BinaryWriter writer) { } } - public static bool Transfer(this NativeContract contract, Persistence.Snapshot snapshot, byte[] from, byte[] to, BigInteger amount, bool signFrom) + public static bool Transfer(this NativeContract contract, SnapshotView snapshot, byte[] from, byte[] to, BigInteger amount, bool signFrom) { var engine = new ApplicationEngine(TriggerType.Application, new ManualWitness(signFrom ? new UInt160(from) : null), snapshot, 0, true); @@ -90,7 +91,7 @@ public static string[] SupportedStandards(this NativeContract contract) .ToArray(); } - public static BigInteger TotalSupply(this NativeContract contract, Persistence.Snapshot snapshot) + public static BigInteger TotalSupply(this NativeContract contract, SnapshotView snapshot) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); @@ -110,7 +111,7 @@ public static BigInteger TotalSupply(this NativeContract contract, Persistence.S return (result as VM.Types.Integer).GetBigInteger(); } - public static BigInteger BalanceOf(this NativeContract contract, Persistence.Snapshot snapshot, byte[] account) + public static BigInteger BalanceOf(this NativeContract contract, SnapshotView snapshot, byte[] account) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); diff --git a/neo.UnitTests/IO/Caching/UT_DataCache.cs b/neo.UnitTests/IO/Caching/UT_DataCache.cs index 437f2b92f1..cd9752c819 100644 --- a/neo.UnitTests/IO/Caching/UT_DataCache.cs +++ b/neo.UnitTests/IO/Caching/UT_DataCache.cs @@ -105,7 +105,7 @@ class MyDataCache : DataCache { public Dictionary InnerDict = new Dictionary(); - public override void DeleteInternal(TKey key) + protected override void DeleteInternal(TKey key) { InnerDict.Remove(key); } @@ -115,9 +115,9 @@ protected override void AddInternal(TKey key, TValue value) InnerDict.Add(key, value); } - protected override IEnumerable> FindInternal(byte[] key_prefix) + protected override IEnumerable<(TKey, TValue)> FindInternal(byte[] key_prefix) { - return InnerDict.Where(kvp => kvp.Key.ToArray().Take(key_prefix.Length).SequenceEqual(key_prefix)); + return InnerDict.Where(kvp => kvp.Key.ToArray().Take(key_prefix.Length).SequenceEqual(key_prefix)).Select(p => (p.Key, p.Value)); } protected override TValue GetInternal(TKey key) diff --git a/neo.UnitTests/Ledger/UT_Blockchain.cs b/neo.UnitTests/Ledger/UT_Blockchain.cs index af0ec69a79..d885584801 100644 --- a/neo.UnitTests/Ledger/UT_Blockchain.cs +++ b/neo.UnitTests/Ledger/UT_Blockchain.cs @@ -9,7 +9,7 @@ namespace Neo.UnitTests.Ledger { internal class TestBlock : Block { - public override bool Verify(Snapshot snapshot) + public override bool Verify(SnapshotView snapshot) { return true; } @@ -22,7 +22,7 @@ public static TestBlock Cast(Block input) internal class TestHeader : Header { - public override bool Verify(Snapshot snapshot) + public override bool Verify(SnapshotView snapshot) { return true; } @@ -37,14 +37,14 @@ public static TestHeader Cast(Header input) public class UT_Blockchain { private NeoSystem system; - private Store store; + private IStore store; Transaction txSample = Blockchain.GenesisBlock.Transactions[0]; [TestInitialize] public void Initialize() { - system = TestBlockchain.InitializeMockNeoSystem(); - store = TestBlockchain.GetStore(); + system = TestBlockchain.TheNeoSystem; + store = TestBlockchain.Store; Blockchain.Singleton.MemPool.TryAdd(txSample.Hash, txSample); } diff --git a/neo.UnitTests/Ledger/UT_MemoryPool.cs b/neo.UnitTests/Ledger/UT_MemoryPool.cs index 6f9022bef1..b30e1debf7 100644 --- a/neo.UnitTests/Ledger/UT_MemoryPool.cs +++ b/neo.UnitTests/Ledger/UT_MemoryPool.cs @@ -3,7 +3,6 @@ using Moq; using Neo.Cryptography; using Neo.IO; -using Neo.IO.Caching; using Neo.Ledger; using Neo.Network.P2P.Payloads; using Neo.Persistence; @@ -39,11 +38,11 @@ public void TestSetup() // protect against external changes on TimeProvider TimeProvider.ResetToDefault(); - NeoSystem TheNeoSystem = TestBlockchain.InitializeMockNeoSystem(); + TestBlockchain.InitializeMockNeoSystem(); // Create a MemoryPool with capacity of 100 - _unit = new MemoryPool(TheNeoSystem, 100); - _unit.LoadPolicy(TestBlockchain.GetStore().GetSnapshot()); + _unit = new MemoryPool(TestBlockchain.TheNeoSystem, 100); + _unit.LoadPolicy(Blockchain.Singleton.GetSnapshot()); // Verify capacity equals the amount specified _unit.Capacity.Should().Be(100); @@ -51,7 +50,7 @@ public void TestSetup() _unit.VerifiedCount.Should().Be(0); _unit.UnVerifiedCount.Should().Be(0); _unit.Count.Should().Be(0); - _unit2 = new MemoryPool(TheNeoSystem, 0); + _unit2 = new MemoryPool(TestBlockchain.TheNeoSystem, 0); plugin = new TestIMemoryPoolTxObserverPlugin(); } @@ -74,8 +73,8 @@ private Transaction CreateTransactionWithFee(long fee) var randomBytes = new byte[16]; random.NextBytes(randomBytes); Mock mock = new Mock(); - mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); - mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); mock.Object.Script = randomBytes; mock.Object.Sender = UInt160.Zero; mock.Object.NetworkFee = fee; @@ -343,10 +342,8 @@ public void TestGetVerifiedTransactions() [TestMethod] public void TestReVerifyTopUnverifiedTransactionsIfNeeded() { - NeoSystem TheNeoSystem = TestBlockchain.InitializeMockNeoSystem(); - var s = Blockchain.Singleton.Height; - _unit = new MemoryPool(TheNeoSystem, 600); - _unit.LoadPolicy(TestBlockchain.GetStore().GetSnapshot()); + _unit = new MemoryPool(TestBlockchain.TheNeoSystem, 600); + _unit.LoadPolicy(Blockchain.Singleton.GetSnapshot()); AddTransaction(CreateTransaction(100000001)); AddTransaction(CreateTransaction(100000001)); AddTransaction(CreateTransaction(100000001)); @@ -406,7 +403,7 @@ public void TestTryGetValue() [TestMethod] public void TestUpdatePoolForBlockPersisted() { - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); byte[] transactionsPerBlock = { 0x18, 0x00, 0x00, 0x00 }; // 24 byte[] feePerByte = { 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 }; // 1048576 StorageItem item1 = new StorageItem @@ -417,14 +414,12 @@ public void TestUpdatePoolForBlockPersisted() { Value = feePerByte }; - var myDataCache = new MyDataCache(); var key1 = CreateStorageKey(Prefix_MaxTransactionsPerBlock); var key2 = CreateStorageKey(Prefix_FeePerByte); key1.ScriptHash = NativeContract.Policy.Hash; key2.ScriptHash = NativeContract.Policy.Hash; - myDataCache.Add(key1, item1); - myDataCache.Add(key2, item2); - mockSnapshot.SetupGet(p => p.Storages).Returns(myDataCache); + snapshot.Storages.Add(key1, item1); + snapshot.Storages.Add(key2, item2); var tx1 = CreateTransaction(); var tx2 = CreateTransaction(); @@ -436,7 +431,7 @@ public void TestUpdatePoolForBlockPersisted() _unit.UnVerifiedCount.Should().Be(0); _unit.VerifiedCount.Should().Be(1); - _unit.UpdatePoolForBlockPersisted(block, mockSnapshot.Object); + _unit.UpdatePoolForBlockPersisted(block, snapshot); _unit.UnVerifiedCount.Should().Be(0); _unit.VerifiedCount.Should().Be(0); @@ -455,48 +450,4 @@ public StorageKey CreateStorageKey(byte prefix, byte[] key = null) return storageKey; } } - - public class MyDataCache : DataCache - where TKey : IEquatable, ISerializable - where TValue : class, ICloneable, ISerializable, new() - { - private readonly TValue _defaultValue; - - public MyDataCache() - { - _defaultValue = null; - } - - public MyDataCache(TValue defaultValue) - { - this._defaultValue = defaultValue; - } - public override void DeleteInternal(TKey key) - { - } - - protected override void AddInternal(TKey key, TValue value) - { - Add(key, value); - } - - protected override IEnumerable> FindInternal(byte[] key_prefix) - { - return Enumerable.Empty>(); - } - - protected override TValue GetInternal(TKey key) - { - return TryGet(key); - } - - protected override TValue TryGetInternal(TKey key) - { - return _defaultValue; - } - - protected override void UpdateInternal(TKey key, TValue value) - { - } - } } diff --git a/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs b/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs index 81fb0d9354..e9a2be5d16 100644 --- a/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs +++ b/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs @@ -18,8 +18,8 @@ private Transaction CreateTransactionWithFee(long networkFee, long systemFee) var randomBytes = new byte[16]; random.NextBytes(randomBytes); Mock mock = new Mock(); - mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); - mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); mock.Object.Script = randomBytes; mock.Object.Sender = UInt160.Zero; mock.Object.NetworkFee = networkFee; diff --git a/neo.UnitTests/Ledger/UT_TrimmedBlock.cs b/neo.UnitTests/Ledger/UT_TrimmedBlock.cs index 3704279701..482297f7ab 100644 --- a/neo.UnitTests/Ledger/UT_TrimmedBlock.cs +++ b/neo.UnitTests/Ledger/UT_TrimmedBlock.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.IO; using Neo.Ledger; @@ -42,7 +42,7 @@ public void TestGetIsBlock() [TestMethod] public void TestGetBlock() { - var cache = new TestDataCache(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var tx1 = TestUtils.GetTransaction(); tx1.Script = new byte[] { 0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01, @@ -63,12 +63,12 @@ public void TestGetBlock() Transaction = tx2, BlockIndex = 1 }; - cache.Add(tx1.Hash, state1); - cache.Add(tx2.Hash, state2); + snapshot.Transactions.Add(tx1.Hash, state1); + snapshot.Transactions.Add(tx2.Hash, state2); TrimmedBlock tblock = GetTrimmedBlockWithNoTransaction(); tblock.Hashes = new UInt256[] { tx1.Hash, tx2.Hash }; - Block block = tblock.GetBlock(cache); + Block block = tblock.GetBlock(snapshot.Transactions); block.Index.Should().Be(1); block.MerkleRoot.Should().Be(UInt256.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff02")); diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs b/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs index c8c874cee6..36e31f5204 100644 --- a/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs +++ b/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs @@ -5,7 +5,6 @@ using Neo.IO.Json; using Neo.Ledger; using Neo.Network.P2P.Payloads; -using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.SmartContract.Native.Tokens; @@ -20,13 +19,12 @@ namespace Neo.UnitTests.Network.P2P.Payloads public class UT_Transaction { Transaction uut; - Store store; [TestInitialize] public void TestSetup() { + TestBlockchain.InitializeMockNeoSystem(); uut = new Transaction(); - store = TestBlockchain.GetStore(); } [TestMethod] @@ -86,10 +84,9 @@ public void Size_Get() [TestMethod] public void FeeIsMultiSigContract() { - var store = TestBlockchain.GetStore(); var walletA = TestUtils.GenerateTestWallet(); var walletB = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); using (var unlockA = walletA.Unlock("123")) using (var unlockB = walletB.Unlock("123")) @@ -121,6 +118,8 @@ public void FeeIsMultiSigContract() } .ToByteArray(); + snapshot.Commit(); + // Make transaction var tx = walletA.MakeTransaction(new TransferOutput[] @@ -175,7 +174,7 @@ public void FeeIsMultiSigContract() public void FeeIsSignatureContractDetailed() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); using (var unlock = wallet.Unlock("123")) { @@ -196,6 +195,8 @@ public void FeeIsSignatureContractDetailed() } .ToByteArray(); + snapshot.Commit(); + // Make transaction // self-transfer of 1e-8 GAS @@ -290,7 +291,7 @@ public void FeeIsSignatureContractDetailed() public void FeeIsSignatureContract_TestScope_Global() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -312,6 +313,8 @@ public void FeeIsSignatureContract_TestScope_Global() } .ToByteArray(); + snapshot.Commit(); + // Make transaction // Manually creating script @@ -381,7 +384,7 @@ public void FeeIsSignatureContract_TestScope_Global() public void FeeIsSignatureContract_TestScope_CurrentHash_GAS() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -403,6 +406,8 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_GAS() } .ToByteArray(); + snapshot.Commit(); + // Make transaction // Manually creating script @@ -473,7 +478,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_GAS() public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -495,6 +500,8 @@ public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() } .ToByteArray(); + snapshot.Commit(); + // Make transaction // Manually creating script @@ -568,7 +575,7 @@ public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_FAULT() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -626,7 +633,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_FAULT() public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -648,6 +655,8 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() } .ToByteArray(); + snapshot.Commit(); + // Make transaction // Manually creating script @@ -723,7 +732,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() public void FeeIsSignatureContract_TestScope_NoScopeFAULT() { var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -775,7 +784,7 @@ public void FeeIsSignatureContract_TestScope_NoScopeFAULT() [TestMethod] public void Transaction_Reverify_Hashes_Length_Unequal_To_Witnesses_Length() { - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); Transaction txSimple = new Transaction { Version = 0x00, @@ -981,7 +990,7 @@ public void FeeIsSignatureContract_TestScope_Global_Default() cosigner.Scopes.Should().Be(WitnessScope.Global); var wallet = TestUtils.GenerateTestWallet(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) @@ -1003,6 +1012,8 @@ public void FeeIsSignatureContract_TestScope_Global_Default() } .ToByteArray(); + snapshot.Commit(); + // Make transaction // Manually creating script diff --git a/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs b/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs index f8b932c4f2..1f62a77580 100644 --- a/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs +++ b/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs @@ -9,26 +9,18 @@ namespace Neo.UnitTests.Network.P2P [TestClass] public class UT_ProtocolHandler : TestKit { - private NeoSystem testBlockchain; - [TestCleanup] public void Cleanup() { Shutdown(); } - [TestInitialize] - public void TestSetup() - { - testBlockchain = TestBlockchain.InitializeMockNeoSystem(); - } - [TestMethod] public void ProtocolHandler_Test_SendVersion_TellParent() { var senderProbe = CreateTestProbe(); var parent = CreateTestProbe(); - var protocolActor = ActorOfAsTestActorRef(() => new ProtocolHandler(testBlockchain), parent); + var protocolActor = ActorOfAsTestActorRef(() => new ProtocolHandler(TestBlockchain.TheNeoSystem), parent); var payload = new VersionPayload() { diff --git a/neo.UnitTests/Network/P2P/UT_RemoteNode.cs b/neo.UnitTests/Network/P2P/UT_RemoteNode.cs index 570cc904da..a700902f6c 100644 --- a/neo.UnitTests/Network/P2P/UT_RemoteNode.cs +++ b/neo.UnitTests/Network/P2P/UT_RemoteNode.cs @@ -23,7 +23,7 @@ public UT_RemoteNode() [ClassInitialize] public static void TestSetup(TestContext ctx) { - testBlockchain = TestBlockchain.InitializeMockNeoSystem(); + testBlockchain = TestBlockchain.TheNeoSystem; } [TestMethod] diff --git a/neo.UnitTests/Network/RPC/UT_RpcServer.cs b/neo.UnitTests/Network/RPC/UT_RpcServer.cs index fae945a21a..cfdfe7fbd8 100644 --- a/neo.UnitTests/Network/RPC/UT_RpcServer.cs +++ b/neo.UnitTests/Network/RPC/UT_RpcServer.cs @@ -14,8 +14,7 @@ public class UT_RpcServer [TestInitialize] public void Setup() { - var system = TestBlockchain.InitializeMockNeoSystem(); - server = new RpcServer(system); + server = new RpcServer(TestBlockchain.TheNeoSystem); } [TestCleanup] diff --git a/neo.UnitTests/Network/RPC/UT_TransactionManager.cs b/neo.UnitTests/Network/RPC/UT_TransactionManager.cs index e1cce967cd..e11c551a9a 100644 --- a/neo.UnitTests/Network/RPC/UT_TransactionManager.cs +++ b/neo.UnitTests/Network/RPC/UT_TransactionManager.cs @@ -3,6 +3,7 @@ using Neo.Cryptography; using Neo.IO; using Neo.IO.Json; +using Neo.Ledger; using Neo.Network.P2P; using Neo.Network.P2P.Payloads; using Neo.Network.RPC; @@ -156,8 +157,7 @@ public void TestSignMulti() .AddSignature(keyPair1) .Sign(); - var store = TestBlockchain.GetStore(); - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var tx = txManager.Tx; Assert.IsTrue(tx.VerifyWitnesses(snapshot, tx.NetworkFee)); diff --git a/neo.UnitTests/Plugins/UT_Plugin.cs b/neo.UnitTests/Plugins/UT_Plugin.cs index 3c6098e47a..7c3224c82a 100644 --- a/neo.UnitTests/Plugins/UT_Plugin.cs +++ b/neo.UnitTests/Plugins/UT_Plugin.cs @@ -65,8 +65,7 @@ public void TestNotifyPluginsLoadedAfterSystemConstructed() [TestMethod] public void TestResumeNodeStartupAndSuspendNodeStartup() { - var system = TestBlockchain.InitializeMockNeoSystem(); - TestLogPlugin.TestLoadPlugins(system); + TestLogPlugin.TestLoadPlugins(TestBlockchain.TheNeoSystem); TestLogPlugin.TestSuspendNodeStartup(); TestLogPlugin.TestSuspendNodeStartup(); TestLogPlugin.TestResumeNodeStartup().Should().BeFalse(); diff --git a/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs b/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs index aad833b04e..a0126b3b03 100644 --- a/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs +++ b/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs @@ -14,7 +14,7 @@ public class UT_StorageIterator [TestMethod] public void TestGeneratorAndDispose() { - StorageIterator storageIterator = new StorageIterator(new List>().GetEnumerator()); + StorageIterator storageIterator = new StorageIterator(new List<(StorageKey, StorageItem)>().GetEnumerator()); Assert.IsNotNull(storageIterator); Action action = () => storageIterator.Dispose(); action.Should().NotThrow(); @@ -23,12 +23,12 @@ public void TestGeneratorAndDispose() [TestMethod] public void TestKeyAndValueAndNext() { - List> list = new List>(); + List<(StorageKey, StorageItem)> list = new List<(StorageKey, StorageItem)>(); StorageKey storageKey = new StorageKey(); storageKey.Key = new byte[1]; StorageItem storageItem = new StorageItem(); storageItem.Value = new byte[1]; - list.Add(new KeyValuePair(storageKey, storageItem)); + list.Add((storageKey, storageItem)); StorageIterator storageIterator = new StorageIterator(list.GetEnumerator()); storageIterator.Next(); Assert.AreEqual(new ByteArray(new byte[1]), storageIterator.Key()); diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs b/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs index 7e811d3eda..96beff3cbd 100644 --- a/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs +++ b/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs @@ -2,7 +2,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.Ledger; using Neo.Network.P2P.Payloads; -using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.UnitTests.Extensions; @@ -17,13 +16,10 @@ namespace Neo.UnitTests.SmartContract.Native.Tokens [TestClass] public class UT_GasToken { - Store Store; - [TestInitialize] public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); - Store = TestBlockchain.GetStore(); } [TestMethod] @@ -41,7 +37,7 @@ public void TestSetup() [TestMethod] public void Check_BalanceOfTransferAndBurn() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); snapshot.PersistingBlock = new Block() { Index = 1000 }; byte[] from = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, @@ -133,7 +129,7 @@ public void Check_BalanceOfTransferAndBurn() [TestMethod] public void Check_BadScript() { - var engine = new ApplicationEngine(TriggerType.Application, null, Store.GetSnapshot(), 0); + var engine = new ApplicationEngine(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); var script = new ScriptBuilder(); script.Emit(OpCode.NOP); @@ -160,7 +156,7 @@ public void TestGetSysFeeAmount1() [TestMethod] public void TestGetSysFeeAmount2() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); NativeContract.GAS.GetSysFeeAmount(snapshot, 0).Should().Be(new BigInteger(0)); NativeContract.GAS.GetSysFeeAmount(snapshot, 1).Should().Be(new BigInteger(0)); diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs index 6df9f7074e..4abc800094 100644 --- a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -21,13 +21,10 @@ namespace Neo.UnitTests.SmartContract.Native.Tokens [TestClass] public class UT_NeoToken { - private Store Store; - [TestInitialize] public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); - Store = TestBlockchain.GetStore(); } [TestMethod] @@ -45,7 +42,7 @@ public void TestSetup() [TestMethod] public void Check_Vote() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); snapshot.PersistingBlock = new Block() { Index = 1000 }; byte[] from = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, @@ -85,7 +82,7 @@ public void Check_Vote() [TestMethod] public void Check_UnclaimedGas() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); snapshot.PersistingBlock = new Block() { Index = 1000 }; byte[] from = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, @@ -103,7 +100,7 @@ public void Check_UnclaimedGas() [TestMethod] public void Check_RegisterValidator() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var ret = Check_RegisterValidator(snapshot, new byte[0]); ret.State.Should().BeFalse(); @@ -148,7 +145,7 @@ public void Check_RegisterValidator() [TestMethod] public void Check_Transfer() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); snapshot.PersistingBlock = new Block() { Index = 1000 }; byte[] from = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, @@ -201,7 +198,7 @@ public void Check_Transfer() [TestMethod] public void Check_BalanceOf() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); byte[] account = Contract.CreateMultiSigRedeemScript(Blockchain.StandbyValidators.Length / 2 + 1, Blockchain.StandbyValidators).ToScriptHash().ToArray(); @@ -215,7 +212,7 @@ public void Check_BalanceOf() [TestMethod] public void Check_Initialize() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // StandbyValidators @@ -240,7 +237,7 @@ public void Check_Initialize() [TestMethod] public void Check_BadScript() { - var engine = new ApplicationEngine(TriggerType.Application, null, Store.GetSnapshot(), 0); + var engine = new ApplicationEngine(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); var script = new ScriptBuilder(); script.Emit(OpCode.NOP); @@ -252,7 +249,7 @@ public void Check_BadScript() [TestMethod] public void TestCalculateBonus() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); StorageKey key = CreateStorageKey(20, UInt160.Zero.ToArray()); snapshot.Storages.Add(key, new StorageItem { @@ -295,7 +292,7 @@ public void TestGetNextBlockValidators1() [TestMethod] public void TestGetNextBlockValidators2() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); var result = NativeContract.NEO.GetNextBlockValidators(snapshot); result.Length.Should().Be(7); result[0].ToArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); @@ -343,7 +340,7 @@ public void TestGetRegisteredValidators1() [TestMethod] public void TestGetRegisteredValidators2() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); var result = NativeContract.NEO.GetRegisteredValidators(snapshot).ToArray(); result.Length.Should().Be(7); result[0].PublicKey.ToArray().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); @@ -390,7 +387,7 @@ public void TestGetValidators1() [TestMethod] public void TestGetValidators2() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); var result = NativeContract.NEO.GetValidators(snapshot); result[0].ToArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); result[1].ToArray().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); @@ -416,7 +413,7 @@ public void TestGetValidators2() [TestMethod] public void TestInitialize() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); var engine = new ApplicationEngine(TriggerType.System, null, snapshot, 0, true); Action action = () => NativeContract.NEO.Initialize(engine); action.Should().Throw(); @@ -425,6 +422,7 @@ public void TestInitialize() NativeContract.NEO.Initialize(engine).Should().BeFalse(); snapshot.Storages.Delete(CreateStorageKey(11)); + snapshot.PersistingBlock = Blockchain.GenesisBlock; engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); NativeContract.NEO.Initialize(engine).Should().BeTrue(); } @@ -448,14 +446,14 @@ public void TestOnBalanceChanging() [TestMethod] public void TestTotalSupply() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); NativeContract.NEO.TotalSupply(snapshot).Should().Be(new BigInteger(100000000)); } [TestMethod] public void TestUnclaimedGas() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); NativeContract.NEO.UnclaimedGas(snapshot, UInt160.Zero, 10).Should().Be(new BigInteger(0)); snapshot.Storages.Add(CreateStorageKey(20, UInt160.Zero.ToArray()), new StorageItem { @@ -467,7 +465,7 @@ public void TestUnclaimedGas() [TestMethod] public void TestVote() { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); UInt160 account = UInt160.Parse("01ff00ff00ff00ff00ff00ff00ff00ff00ff00a4"); StorageKey keyAccount = CreateStorageKey(20, account.ToArray()); StorageKey keyValidator = CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()); @@ -529,7 +527,8 @@ public void TestValidatorState_ToByteArray() internal (bool State, bool Result) Transfer4TesingOnBalanceChanging(BigInteger amount, bool addVotes) { - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + snapshot.PersistingBlock = Blockchain.GenesisBlock; var engine = new ApplicationEngine(TriggerType.Application, Blockchain.GenesisBlock, snapshot, 0, true); ScriptBuilder sb = new ScriptBuilder(); var tmp = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot); @@ -578,7 +577,7 @@ public void TestValidatorState_ToByteArray() return (true, (result as VM.Types.Boolean).GetBoolean()); } - internal static (bool State, bool Result) Check_Vote(Snapshot snapshot, byte[] account, byte[][] pubkeys, bool signAccount) + internal static (bool State, bool Result) Check_Vote(SnapshotView snapshot, byte[] account, byte[][] pubkeys, bool signAccount) { var engine = new ApplicationEngine(TriggerType.Application, new Nep5NativeContractExtensions.ManualWitness(signAccount ? new UInt160(account) : UInt160.Zero), snapshot, 0, true); @@ -608,7 +607,7 @@ internal static (bool State, bool Result) Check_Vote(Snapshot snapshot, byte[] a return (true, (result as VM.Types.Boolean).GetBoolean()); } - internal static (bool State, bool Result) Check_RegisterValidator(Snapshot snapshot, byte[] pubkey) + internal static (bool State, bool Result) Check_RegisterValidator(SnapshotView snapshot, byte[] pubkey) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); @@ -632,7 +631,7 @@ internal static (bool State, bool Result) Check_RegisterValidator(Snapshot snaps return (true, (result as VM.Types.Boolean).GetBoolean()); } - internal static ECPoint[] Check_GetValidators(Snapshot snapshot) + internal static ECPoint[] Check_GetValidators(SnapshotView snapshot) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); @@ -652,7 +651,7 @@ internal static ECPoint[] Check_GetValidators(Snapshot snapshot) return (result as VM.Types.Array).Select(u => u.GetByteArray().AsSerializable()).ToArray(); } - internal static (BigInteger Value, bool State) Check_UnclaimedGas(Snapshot snapshot, byte[] address) + internal static (BigInteger Value, bool State) Check_UnclaimedGas(SnapshotView snapshot, byte[] address) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs b/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs index 0cec84a5a8..5da8851901 100644 --- a/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs +++ b/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs @@ -1,8 +1,6 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; using Neo.Ledger; -using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Native.Tokens; using Neo.VM; @@ -19,8 +17,7 @@ public class UT_Nep5Token [TestMethod] public void TestTotalSupply() { - var mockSnapshot = new Mock(); - var myDataCache = new TestDataCache(); + var snapshot = Blockchain.Singleton.GetSnapshot(); StorageItem item = new StorageItem { Value = new byte[] { 0x01 } @@ -37,10 +34,9 @@ public void TestTotalSupply() var Hash = script.ToScriptHash(); key.ScriptHash = Hash; - myDataCache.Add(key, item); - mockSnapshot.SetupGet(p => p.Storages).Returns(myDataCache); + snapshot.Storages.Add(key, item); TestNep5Token test = new TestNep5Token(); - ApplicationEngine ae = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + ApplicationEngine ae = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); StackItem stackItem = test.TotalSupply(ae, null); stackItem.GetBigInteger().Should().Be(1); } @@ -48,8 +44,7 @@ public void TestTotalSupply() [TestMethod] public void TestTotalSupplyDecimal() { - var mockSnapshot = new Mock(); - var myDataCache = new TestDataCache(); + var snapshot = Blockchain.Singleton.GetSnapshot(); TestNep5Token test = new TestNep5Token(); BigInteger totalSupply = 100_000_000; @@ -72,10 +67,9 @@ public void TestTotalSupplyDecimal() var Hash = script.ToScriptHash(); key.ScriptHash = Hash; - myDataCache.Add(key, item); - mockSnapshot.SetupGet(p => p.Storages).Returns(myDataCache); + snapshot.Storages.Add(key, item); - ApplicationEngine ae = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + ApplicationEngine ae = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); StackItem stackItem = test.TotalSupply(ae, null); stackItem.GetBigInteger().Should().Be(10_000_000_000_000_000); } diff --git a/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs b/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs index 61e93de6ad..71cfd3c093 100644 --- a/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs +++ b/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs @@ -1,6 +1,6 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Persistence; +using Neo.Ledger; using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.VM; @@ -13,13 +13,10 @@ namespace Neo.UnitTests.SmartContract.Native [TestClass] public class UT_NativeContract { - Store Store; - [TestInitialize] public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); - Store = TestBlockchain.GetStore(); } [TestMethod] @@ -37,7 +34,7 @@ public void TestInitialize() [TestMethod] public void TestInvoke() { - ApplicationEngine engine1 = new ApplicationEngine(TriggerType.Application, null, Store.GetSnapshot(), 0); + ApplicationEngine engine1 = new ApplicationEngine(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); TestNativeContract testNativeContract = new TestNativeContract(); ScriptBuilder sb1 = new ScriptBuilder(); @@ -46,7 +43,7 @@ public void TestInvoke() engine1.LoadScript(sb1.ToArray()); testNativeContract.Invoke(engine1).Should().BeFalse(); - ApplicationEngine engine2 = new ApplicationEngine(TriggerType.Application, null, Store.GetSnapshot(), 0); + ApplicationEngine engine2 = new ApplicationEngine(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); ScriptBuilder sb2 = new ScriptBuilder(); sb2.EmitSysCall("test".ToInteropMethodHash()); @@ -68,14 +65,14 @@ public void TestInvoke() [TestMethod] public void TestOnPersistWithArgs() { - ApplicationEngine engine1 = new ApplicationEngine(TriggerType.Application, null, Store.GetSnapshot(), 0); + ApplicationEngine engine1 = new ApplicationEngine(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); TestNativeContract testNativeContract = new TestNativeContract(); VMArray args = new VMArray(); VM.Types.Boolean result1 = new VM.Types.Boolean(false); testNativeContract.TestOnPersist(engine1, args).Should().Be(result1); - ApplicationEngine engine2 = new ApplicationEngine(TriggerType.System, null, Store.GetSnapshot(), 0); + ApplicationEngine engine2 = new ApplicationEngine(TriggerType.System, null, Blockchain.Singleton.GetSnapshot(), 0); VM.Types.Boolean result2 = new VM.Types.Boolean(true); testNativeContract.TestOnPersist(engine2, args).Should().Be(result2); } diff --git a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs b/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs index e0f87182a6..7c7541c38a 100644 --- a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs +++ b/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs @@ -14,13 +14,10 @@ namespace Neo.UnitTests.SmartContract.Native [TestClass] public class UT_PolicyContract { - Store Store; - [TestInitialize] public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); - Store = TestBlockchain.GetStore(); } [TestMethod] @@ -29,7 +26,7 @@ public void TestSetup() [TestMethod] public void Check_Initialize() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var keyCount = snapshot.Storages.GetChangeSet().Count(); NativeContract.Policy.Initialize(new ApplicationEngine(TriggerType.Application, null, snapshot, 0)).Should().BeTrue(); @@ -56,7 +53,7 @@ public void Check_Initialize() [TestMethod] public void Check_SetMaxBlockSize() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // Fake blockchain @@ -102,7 +99,7 @@ public void Check_SetMaxBlockSize() [TestMethod] public void Check_SetMaxTransactionsPerBlock() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // Fake blockchain @@ -137,7 +134,7 @@ public void Check_SetMaxTransactionsPerBlock() [TestMethod] public void Check_SetFeePerByte() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // Fake blockchain @@ -172,7 +169,7 @@ public void Check_SetFeePerByte() [TestMethod] public void Check_Block_UnblockAccount() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); // Fake blockchain @@ -232,7 +229,7 @@ public void Check_Block_UnblockAccount() public void TestCheckPolicy() { Transaction tx = Blockchain.GenesisBlock.Transactions[0]; - Snapshot snapshot = Store.GetSnapshot().Clone(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); StorageKey storageKey = new StorageKey { @@ -247,7 +244,7 @@ public void TestCheckPolicy() NativeContract.Policy.CheckPolicy(tx, snapshot).Should().BeFalse(); - snapshot = Store.GetSnapshot().Clone(); + snapshot = Blockchain.Singleton.GetSnapshot(); NativeContract.Policy.CheckPolicy(tx, snapshot).Should().BeTrue(); } } diff --git a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs b/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs index fae3938a22..3369a9696d 100644 --- a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs +++ b/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs @@ -7,7 +7,6 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.SmartContract; -using Neo.UnitTests.Ledger; using Neo.VM; using System; @@ -18,19 +17,17 @@ public class UT_ApplicationEngine { private string message = null; private StackItem item = null; - private Store Store; [TestInitialize] public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); - Store = TestBlockchain.GetStore(); } [TestMethod] public void TestLog() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); ApplicationEngine.Log += Test_Log1; string logMessage = "TestMessage"; @@ -55,7 +52,7 @@ public void TestLog() [TestMethod] public void TestNotify() { - var snapshot = Store.GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); ApplicationEngine.Notify += Test_Notify1; StackItem notifyItem = "TestItem"; @@ -80,10 +77,10 @@ public void TestNotify() [TestMethod] public void TestDisposable() { - var snapshot = Store.GetSnapshot().Clone(); - var replica = snapshot.Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); + var m = new Mock(); var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); - engine.AddDisposable(replica).Should().Be(replica); + engine.AddDisposable(m.Object).Should().Be(m.Object); Action action = () => engine.Dispose(); action.Should().NotThrow(); } @@ -111,19 +108,12 @@ private void Test_Notify2(object sender, NotifyEventArgs e) [TestMethod] public void TestCreateDummyBlock() { - var mockSnapshot = new Mock(); - UInt256 currentBlockHash = UInt256.Parse("0x0000000000000000000000000000000000000000000000000000000000000000"); - TrimmedBlock block = new TrimmedBlock(); - var cache = new TestDataCache(); - cache.Add(currentBlockHash, block); - mockSnapshot.SetupGet(p => p.Blocks).Returns(cache); - TestMetaDataCache testCache = new TestMetaDataCache(); - mockSnapshot.SetupGet(p => p.BlockHashIndex).Returns(testCache); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); byte[] SyscallSystemRuntimeCheckWitnessHash = new byte[] { 0x68, 0xf8, 0x27, 0xec, 0x8c }; - ApplicationEngine.Run(SyscallSystemRuntimeCheckWitnessHash, mockSnapshot.Object); - mockSnapshot.Object.PersistingBlock.Version.Should().Be(0); - mockSnapshot.Object.PersistingBlock.PrevHash.Should().Be(currentBlockHash); - mockSnapshot.Object.PersistingBlock.MerkleRoot.Should().Be(new UInt256()); + ApplicationEngine.Run(SyscallSystemRuntimeCheckWitnessHash, snapshot); + snapshot.PersistingBlock.Version.Should().Be(0); + snapshot.PersistingBlock.PrevHash.Should().Be(Blockchain.GenesisBlock.Hash); + snapshot.PersistingBlock.MerkleRoot.Should().Be(new UInt256()); } [TestMethod] @@ -135,10 +125,8 @@ public void TestOnSysCall() engine.LoadScript(SyscallSystemRuntimeCheckWitnessHash); engine.GetOnSysCall(descriptor.Hash).Should().BeFalse(); - var mockSnapshot = new Mock(); - TestMetaDataCache testCache = new TestMetaDataCache(); - mockSnapshot.SetupGet(p => p.BlockHashIndex).Returns(testCache); - engine = new TestApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0, true); + var snapshot = Blockchain.Singleton.GetSnapshot(); + engine = new TestApplicationEngine(TriggerType.Application, null, snapshot, 0, true); engine.LoadScript(SyscallSystemRuntimeCheckWitnessHash); engine.GetOnSysCall(descriptor.Hash).Should().BeTrue(); } @@ -152,7 +140,7 @@ private static bool Blockchain_GetHeight(ApplicationEngine engine) public class TestApplicationEngine : ApplicationEngine { - public TestApplicationEngine(TriggerType trigger, IVerifiable container, Snapshot snapshot, long gas, bool testMode = false) : base(trigger, container, snapshot, gas, testMode) + public TestApplicationEngine(TriggerType trigger, IVerifiable container, SnapshotView snapshot, long gas, bool testMode = false) : base(trigger, container, snapshot, gas, testMode) { } diff --git a/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs b/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs index 243cfa89ef..e4df788495 100644 --- a/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs +++ b/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs @@ -1,12 +1,10 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; using Neo.Cryptography; using Neo.Cryptography.ECC; using Neo.Ledger; using Neo.Network.P2P; using Neo.Network.P2P.Payloads; -using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Enumerators; using Neo.SmartContract.Iterators; @@ -142,10 +140,10 @@ public void TestAccount_IsStandard() InteropService.Invoke(engine, InteropService.Neo_Account_IsStandard).Should().BeTrue(); engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeTrue(); - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(state.ScriptHash.ToArray()); InteropService.Invoke(engine, InteropService.Neo_Account_IsStandard).Should().BeTrue(); @@ -176,10 +174,10 @@ public void TestContract_Create() engine.CurrentContext.EvaluationStack.Push(script); InteropService.Invoke(engine, InteropService.Neo_Contract_Create).Should().BeTrue(); - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(manifest.ToString()); engine.CurrentContext.EvaluationStack.Push(state.Script); @@ -219,7 +217,7 @@ public void TestContract_Update() Signature = signature } }; - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; var storageItem = new StorageItem @@ -233,9 +231,9 @@ public void TestContract_Update() ScriptHash = state.ScriptHash, Key = new byte[] { 0x01 } }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(state.Script); engine.CurrentContext.EvaluationStack.Push(manifest.ToString()); engine.CurrentContext.EvaluationStack.Push(script); @@ -244,10 +242,10 @@ public void TestContract_Update() // Remove Storage flag with something stored state.Manifest.Features = ContractFeatures.NoProperty; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(state.Script); engine.CurrentContext.EvaluationStack.Push(manifest.ToString()); engine.CurrentContext.EvaluationStack.Push(script); @@ -257,7 +255,7 @@ public void TestContract_Update() [TestMethod] public void TestStorage_Find() { - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; @@ -271,9 +269,9 @@ public void TestStorage_Find() ScriptHash = state.ScriptHash, Key = new byte[] { 0x01 } }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - var engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(new byte[] { 0x01 }); diff --git a/neo.UnitTests/SmartContract/UT_InteropService.cs b/neo.UnitTests/SmartContract/UT_InteropService.cs index cc6eac738a..84656143fa 100644 --- a/neo.UnitTests/SmartContract/UT_InteropService.cs +++ b/neo.UnitTests/SmartContract/UT_InteropService.cs @@ -1,12 +1,10 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; using Neo.Cryptography; using Neo.Cryptography.ECC; using Neo.Ledger; using Neo.Network.P2P; using Neo.Network.P2P.Payloads; -using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Manifest; using Neo.VM; @@ -31,7 +29,7 @@ public void TestSetup() public void Runtime_GetNotifications_Test() { UInt160 scriptHash2; - var snapshot = TestBlockchain.GetStore().GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); using (var script = new ScriptBuilder()) { @@ -445,10 +443,10 @@ public void TestBlockchain_GetContract() InteropService.Invoke(engine, InteropService.System_Blockchain_GetContract).Should().BeTrue(); engine.CurrentContext.EvaluationStack.Pop().Should().Be(StackItem.Null); - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(state.ScriptHash.ToArray()); InteropService.Invoke(engine, InteropService.System_Blockchain_GetContract).Should().BeTrue(); @@ -483,7 +481,7 @@ public void TestStorage_GetReadOnlyContext() [TestMethod] public void TestStorage_Get() { - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; @@ -498,9 +496,9 @@ public void TestStorage_Get() Value = new byte[] { 0x01, 0x02, 0x03, 0x04 }, IsConstant = true }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - var engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(new byte[] { 0x01 }); @@ -512,8 +510,8 @@ public void TestStorage_Get() InteropService.Invoke(engine, InteropService.System_Storage_Get).Should().BeTrue(); engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString().Should().Be(storageItem.Value.ToHexString()); - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache()); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Delete(state.ScriptHash); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(new InteropInterface(new StorageContext @@ -574,7 +572,7 @@ public void TestStorage_Put() InteropService.Invoke(engine, InteropService.System_Storage_Put).Should().BeFalse(); //storage value is constant - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); state.Manifest.Features = ContractFeatures.HasStorage; var storageKey = new StorageKey @@ -587,9 +585,9 @@ public void TestStorage_Put() Value = new byte[] { 0x01, 0x02, 0x03, 0x04 }, IsConstant = true }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); key = new byte[] { 0x01 }; value = new byte[] { 0x02 }; @@ -622,7 +620,7 @@ public void TestStorage_PutEx() engine.CurrentContext.EvaluationStack.Push(1); InteropService.Invoke(engine, InteropService.System_Storage_PutEx).Should().BeFalse(); - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; var storageKey = new StorageKey @@ -635,9 +633,9 @@ public void TestStorage_PutEx() Value = new byte[] { 0x01, 0x02, 0x03, 0x04 }, IsConstant = false }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); var key = new byte[] { 0x01 }; var value = new byte[] { 0x02 }; @@ -661,7 +659,7 @@ public void TestStorage_Delete() InteropService.Invoke(engine, InteropService.System_Storage_Delete).Should().BeFalse(); - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; var storageKey = new StorageKey @@ -674,9 +672,9 @@ public void TestStorage_Delete() Value = new byte[] { 0x01, 0x02, 0x03, 0x04 }, IsConstant = false }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); state.Manifest.Features = ContractFeatures.HasStorage; var key = new byte[] { 0x01 }; @@ -733,13 +731,13 @@ public void TestInvoke() [TestMethod] public void TestContract_Call() { - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; byte[] method = Encoding.UTF8.GetBytes("method"); byte[] args = new byte[0]; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(state.ScriptHash, state)); - var engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(state.ScriptHash, state); + var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(args); @@ -773,7 +771,7 @@ public void TestContract_Destroy() var engine = GetEngine(false, true); InteropService.Invoke(engine, InteropService.System_Contract_Destroy).Should().BeTrue(); - var mockSnapshot = new Mock(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var state = TestUtils.GetContract(); state.Manifest.Features = ContractFeatures.HasStorage; var scriptHash = UInt160.Parse("0xcb9f3b7c6fb1cf2c13a40637c189bdd066a272b4"); @@ -788,17 +786,17 @@ public void TestContract_Destroy() ScriptHash = scriptHash, Key = new byte[] { 0x01 } }; - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(scriptHash, state)); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache(storageKey, storageItem)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(scriptHash, state); + snapshot.Storages.Add(storageKey, storageItem); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[0]); InteropService.Invoke(engine, InteropService.System_Contract_Destroy).Should().BeTrue(); //storages are removed - mockSnapshot = new Mock(); + snapshot = Blockchain.Singleton.GetSnapshot(); state = TestUtils.GetContract(); - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache(scriptHash, state)); - engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); + snapshot.Contracts.Add(scriptHash, state); + engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0); engine.LoadScript(new byte[0]); InteropService.Invoke(engine, InteropService.System_Contract_Destroy).Should().BeTrue(); } @@ -812,7 +810,7 @@ public static void LogEvent(object sender, LogEventArgs args) private static ApplicationEngine GetEngine(bool hasContainer = false, bool hasSnapshot = false) { var tx = TestUtils.GetTransaction(); - var snapshot = TestBlockchain.GetStore().GetSnapshot().Clone(); + var snapshot = Blockchain.Singleton.GetSnapshot(); ApplicationEngine engine; if (hasContainer && hasSnapshot) { diff --git a/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs b/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs index 8379fccd6b..ba455de88d 100644 --- a/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs +++ b/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs @@ -1,9 +1,7 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; using Neo.Ledger; using Neo.Network.P2P.Payloads; -using Neo.Persistence; using Neo.SmartContract; using Neo.VM; using Neo.VM.Types; @@ -266,41 +264,31 @@ public void TestToScriptHash() [TestMethod] public void TestVerifyWitnesses() { - var mockSnapshot1 = new Mock(); + var snapshot1 = Blockchain.Singleton.GetSnapshot(); UInt256 index1 = UInt256.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff01"); - TestDataCache testDataCache1 = new TestDataCache(); - testDataCache1.Add(index1, new TrimmedBlock()); - testDataCache1.Delete(index1); - mockSnapshot1.SetupGet(p => p.Blocks).Returns(testDataCache1); - Assert.AreEqual(false, Neo.SmartContract.Helper.VerifyWitnesses(new Header() { PrevHash = index1 }, mockSnapshot1.Object, 100)); + snapshot1.Blocks.Add(index1, new TrimmedBlock()); + snapshot1.Blocks.Delete(index1); + Assert.AreEqual(false, Neo.SmartContract.Helper.VerifyWitnesses(new Header() { PrevHash = index1 }, snapshot1, 100)); - var mockSnapshot2 = new Mock(); + var snapshot2 = Blockchain.Singleton.GetSnapshot(); UInt256 index2 = UInt256.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff01"); TrimmedBlock block2 = new TrimmedBlock(); block2.NextConsensus = UInt160.Zero; - TestDataCache testDataCache21 = new TestDataCache(); - testDataCache21.Add(index2, block2); + snapshot2.Blocks.Add(index2, block2); Header header2 = new Header() { PrevHash = index2, Witness = new Witness { VerificationScript = new byte[0] } }; - mockSnapshot2.SetupGet(p => p.Blocks).Returns(testDataCache21); - TestDataCache testDataCache22 = new TestDataCache(); - testDataCache22.Add(UInt160.Zero, new ContractState()); - testDataCache22.Delete(UInt160.Zero); - mockSnapshot2.SetupGet(p => p.Contracts).Returns(testDataCache22); - Assert.AreEqual(false, Neo.SmartContract.Helper.VerifyWitnesses(header2, mockSnapshot2.Object, 100)); + snapshot2.Contracts.Add(UInt160.Zero, new ContractState()); + snapshot2.Contracts.Delete(UInt160.Zero); + Assert.AreEqual(false, Neo.SmartContract.Helper.VerifyWitnesses(header2, snapshot2, 100)); - var mockSnapshot3 = new Mock(); + var snapshot3 = Blockchain.Singleton.GetSnapshot(); UInt256 index3 = UInt256.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff01"); TrimmedBlock block3 = new TrimmedBlock(); block3.NextConsensus = UInt160.Zero; - TestDataCache testDataCache31 = new TestDataCache(); - testDataCache31.Add(index3, block3); + snapshot3.Blocks.Add(index3, block3); Header header3 = new Header() { PrevHash = index3, Witness = new Witness { VerificationScript = new byte[0] } }; - mockSnapshot3.SetupGet(p => p.Blocks).Returns(testDataCache31); - TestDataCache testDataCache32 = new TestDataCache(); - testDataCache32.Add(UInt160.Zero, new ContractState()); - mockSnapshot3.SetupGet(p => p.Contracts).Returns(testDataCache32); - Assert.AreEqual(false, Neo.SmartContract.Helper.VerifyWitnesses(header3, mockSnapshot3.Object, 100)); + snapshot3.Contracts.Add(UInt160.Zero, new ContractState()); + Assert.AreEqual(false, Neo.SmartContract.Helper.VerifyWitnesses(header3, snapshot3, 100)); } } } diff --git a/neo.UnitTests/SmartContract/UT_Syscalls.cs b/neo.UnitTests/SmartContract/UT_Syscalls.cs index b778f63d94..d1c65db682 100644 --- a/neo.UnitTests/SmartContract/UT_Syscalls.cs +++ b/neo.UnitTests/SmartContract/UT_Syscalls.cs @@ -45,7 +45,7 @@ public void System_Blockchain_GetBlock() Transactions = new Transaction[] { tx } }; - var snapshot = TestBlockchain.GetStore().GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); using (var script = new ScriptBuilder()) { @@ -63,8 +63,8 @@ public void System_Blockchain_GetBlock() // With block - var blocks = (TestDataCache)snapshot.Blocks; - var txs = (TestDataCache)snapshot.Transactions; + var blocks = snapshot.Blocks; + var txs = snapshot.Transactions; blocks.Add(block.Hash, block.Trim()); txs.Add(tx.Hash, new TransactionState() { Transaction = tx, BlockIndex = block.Index, VMState = VMState.HALT }); @@ -88,7 +88,7 @@ public void System_Blockchain_GetBlock() [TestMethod] public void System_ExecutionEngine_GetScriptContainer() { - var snapshot = TestBlockchain.GetStore().GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); using (var script = new ScriptBuilder()) { script.EmitSysCall(InteropService.System_ExecutionEngine_GetScriptContainer); @@ -136,8 +136,8 @@ public void System_ExecutionEngine_GetScriptContainer() public void System_Runtime_GetInvocationCounter() { ContractState contractA, contractB, contractC; - var snapshot = TestBlockchain.GetStore().GetSnapshot(); - var contracts = (TestDataCache)snapshot.Contracts; + var snapshot = Blockchain.Singleton.GetSnapshot(); + var contracts = snapshot.Contracts; // Create dummy contracts diff --git a/neo.UnitTests/TestBlockchain.cs b/neo.UnitTests/TestBlockchain.cs index 5740c13b08..6b0cdccd94 100644 --- a/neo.UnitTests/TestBlockchain.cs +++ b/neo.UnitTests/TestBlockchain.cs @@ -1,67 +1,29 @@ -using Moq; -using Neo.IO.Wrappers; using Neo.Ledger; using Neo.Persistence; using System; +using MemoryStore = Neo.Persistence.Memory.Store; namespace Neo.UnitTests { public static class TestBlockchain { - private static NeoSystem TheNeoSystem; - private static Mock _Store; - - public static Store GetStore() - { - if (_Store == null) InitializeMockNeoSystem(); - return _Store.Object; - } + public static readonly IStore Store; + public static readonly NeoSystem TheNeoSystem; static TestBlockchain() { - InitializeMockNeoSystem(); - GetStore(); - } - - public static NeoSystem InitializeMockNeoSystem() - { - if (TheNeoSystem == null) - { - var mockSnapshot = new Mock(); - mockSnapshot.SetupGet(p => p.Blocks).Returns(new TestDataCache()); - mockSnapshot.SetupGet(p => p.Transactions).Returns(new TestDataCache()); - mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache()); - mockSnapshot.SetupGet(p => p.Storages).Returns(new TestDataCache()); - mockSnapshot.SetupGet(p => p.HeaderHashList).Returns(new TestDataCache()); - mockSnapshot.SetupGet(p => p.BlockHashIndex).Returns(new TestMetaDataCache()); - mockSnapshot.SetupGet(p => p.HeaderHashIndex).Returns(new TestMetaDataCache()); - - _Store = new Mock(); - - var defaultTx = TestUtils.CreateRandomHashTransaction(); - var txState = new TransactionState - { - BlockIndex = 1, - Transaction = defaultTx - }; - _Store.Setup(p => p.GetBlocks()).Returns(new TestDataCache()); - _Store.Setup(p => p.GetTransactions()).Returns(new TestDataCache(defaultTx.Hash, txState)); - _Store.Setup(p => p.GetContracts()).Returns(new TestDataCache()); - _Store.Setup(p => p.GetStorages()).Returns(new TestDataCache()); - _Store.Setup(p => p.GetHeaderHashList()).Returns(new TestDataCache()); - _Store.Setup(p => p.GetBlockHashIndex()).Returns(new TestMetaDataCache()); - _Store.Setup(p => p.GetHeaderHashIndex()).Returns(new TestMetaDataCache()); - _Store.Setup(p => p.GetSnapshot()).Returns(mockSnapshot.Object); + Store = new MemoryStore(); - Console.WriteLine("initialize NeoSystem"); - TheNeoSystem = new NeoSystem(_Store.Object); // new Mock(mockStore.Object); + Console.WriteLine("initialize NeoSystem"); + TheNeoSystem = new NeoSystem(Store); - // Ensure that blockchain is loaded + // Ensure that blockchain is loaded - var blockchain = Blockchain.Singleton; - } + var _ = Blockchain.Singleton; + } - return TheNeoSystem; + public static void InitializeMockNeoSystem() + { } } } diff --git a/neo.UnitTests/TestDataCache.cs b/neo.UnitTests/TestDataCache.cs deleted file mode 100644 index 37300f22e1..0000000000 --- a/neo.UnitTests/TestDataCache.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Neo.IO; -using Neo.IO.Caching; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Neo.UnitTests -{ - public class TestDataCache : DataCache - where TKey : IEquatable, ISerializable - where TValue : class, ICloneable, ISerializable, new() - { - private readonly Dictionary dic = new Dictionary(); - - public TestDataCache() { } - - public TestDataCache(TKey key, TValue value) - { - dic.Add(key, value); - } - - public override void DeleteInternal(TKey key) - { - dic.Remove(key); - } - - protected override void AddInternal(TKey key, TValue value) - { - dic.Add(key, value); - } - - protected override IEnumerable> FindInternal(byte[] key_prefix) - { - return dic.ToList(); - } - - protected override TValue GetInternal(TKey key) - { - if (dic[key] == null) throw new NotImplementedException(); - return dic[key]; - } - - protected override TValue TryGetInternal(TKey key) - { - return dic.TryGetValue(key, out TValue value) ? value : null; - } - - protected override void UpdateInternal(TKey key, TValue value) - { - dic[key] = value; - } - } -} diff --git a/neo.UnitTests/TestMetaDataCache.cs b/neo.UnitTests/TestMetaDataCache.cs deleted file mode 100644 index 0cb5646928..0000000000 --- a/neo.UnitTests/TestMetaDataCache.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Neo.IO; -using Neo.IO.Caching; - -namespace Neo.UnitTests -{ - public class TestMetaDataCache : MetaDataCache where T : class, ICloneable, ISerializable, new() - { - public TestMetaDataCache() - : base(null) - { - } - - protected override void AddInternal(T item) - { - } - - protected override T TryGetInternal() - { - return null; - } - - protected override void UpdateInternal(T item) - { - } - } -} diff --git a/neo.UnitTests/TestVerifiable.cs b/neo.UnitTests/TestVerifiable.cs index c0920df480..e497ad95e1 100644 --- a/neo.UnitTests/TestVerifiable.cs +++ b/neo.UnitTests/TestVerifiable.cs @@ -27,7 +27,7 @@ public void DeserializeUnsigned(BinaryReader reader) throw new NotImplementedException(); } - public UInt160[] GetScriptHashesForVerifying(Snapshot snapshot) + public UInt160[] GetScriptHashesForVerifying(View snapshot) { throw new NotImplementedException(); } diff --git a/neo.UnitTests/UT_DataCache.cs b/neo.UnitTests/UT_DataCache.cs index a428e72d8d..0cee679316 100644 --- a/neo.UnitTests/UT_DataCache.cs +++ b/neo.UnitTests/UT_DataCache.cs @@ -17,7 +17,7 @@ public void TestSetup() [TestMethod] public void TestCachedFind_Between() { - var snapshot = TestBlockchain.GetStore().GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var storages = snapshot.Storages; var cache = new CloneCache(storages); @@ -60,7 +60,7 @@ public void TestCachedFind_Between() [TestMethod] public void TestCachedFind_Last() { - var snapshot = TestBlockchain.GetStore().GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var storages = snapshot.Storages; var cache = new CloneCache(storages); @@ -98,7 +98,7 @@ public void TestCachedFind_Last() [TestMethod] public void TestCachedFind_Empty() { - var snapshot = TestBlockchain.GetStore().GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var storages = snapshot.Storages; var cache = new CloneCache(storages); diff --git a/neo.UnitTests/UT_NeoSystem.cs b/neo.UnitTests/UT_NeoSystem.cs index 2d71db97df..1ed00464fa 100644 --- a/neo.UnitTests/UT_NeoSystem.cs +++ b/neo.UnitTests/UT_NeoSystem.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Neo.UnitTests @@ -11,7 +11,7 @@ public class UT_NeoSystem [TestInitialize] public void Setup() { - neoSystem = TestBlockchain.InitializeMockNeoSystem(); + neoSystem = TestBlockchain.TheNeoSystem; } [TestMethod] diff --git a/neo.UnitTests/Wallets/UT_Wallet.cs b/neo.UnitTests/Wallets/UT_Wallet.cs index e6bf40721c..ed02f4d61e 100644 --- a/neo.UnitTests/Wallets/UT_Wallet.cs +++ b/neo.UnitTests/Wallets/UT_Wallet.cs @@ -3,7 +3,6 @@ using Neo.Cryptography.ECC; using Neo.Ledger; using Neo.Network.P2P.Payloads; -using Neo.Persistence; using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.SmartContract.Native.Tokens; @@ -90,7 +89,6 @@ public override bool VerifyPassword(string password) [TestClass] public class UT_Wallet { - Store store; private static KeyPair glkey; private static string nep2Key; @@ -104,7 +102,7 @@ public static void ClassInit(TestContext context) [TestInitialize] public void TestSetup() { - store = TestBlockchain.GetStore(); + TestBlockchain.InitializeMockNeoSystem(); } [TestMethod] @@ -198,7 +196,7 @@ public void TestGetAvailable() account.Lock = false; // Fake balance - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var key = NativeContract.GAS.CreateStorageKey(20, account.ScriptHash); var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem { @@ -209,6 +207,7 @@ public void TestGetAvailable() Balance = 10000 * NativeContract.GAS.Factor } .ToByteArray(); + snapshot.Commit(); wallet.GetAvailable(NativeContract.GAS.Hash).Should().Be(new BigDecimal(1000000000000, 8)); @@ -217,6 +216,7 @@ public void TestGetAvailable() Balance = 0 } .ToByteArray(); + snapshot.Commit(); } [TestMethod] @@ -228,7 +228,7 @@ public void TestGetBalance() account.Lock = false; // Fake balance - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var key = NativeContract.GAS.CreateStorageKey(20, account.ScriptHash); var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem { @@ -239,6 +239,7 @@ public void TestGetBalance() Balance = 10000 * NativeContract.GAS.Factor } .ToByteArray(); + snapshot.Commit(); wallet.GetBalance(UInt160.Zero, new UInt160[] { account.ScriptHash }).Should().Be(new BigDecimal(0, 0)); wallet.GetBalance(NativeContract.GAS.Hash, new UInt160[] { account.ScriptHash }).Should().Be(new BigDecimal(1000000000000, 8)); @@ -248,6 +249,7 @@ public void TestGetBalance() Balance = 0 } .ToByteArray(); + snapshot.Commit(); } [TestMethod] @@ -336,29 +338,31 @@ public void TestMakeTransaction1() action.Should().Throw(); // Fake balance - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var key = NativeContract.GAS.CreateStorageKey(20, account.ScriptHash); - var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem + var entry1 = snapshot.Storages.GetAndChange(key, () => new StorageItem { Value = new Nep5AccountState().ToByteArray() }); - entry.Value = new Nep5AccountState() + entry1.Value = new Nep5AccountState() { Balance = 10000 * NativeContract.GAS.Factor } .ToByteArray(); key = NativeContract.NEO.CreateStorageKey(20, account.ScriptHash); - entry = snapshot.Storages.GetAndChange(key, () => new StorageItem + var entry2 = snapshot.Storages.GetAndChange(key, () => new StorageItem { Value = new Nep5AccountState().ToByteArray() }); - entry.Value = new NeoToken.AccountState() + entry2.Value = new NeoToken.AccountState() { Balance = 10000 * NativeContract.NEO.Factor } .ToByteArray(); + snapshot.Commit(); + var tx = wallet.MakeTransaction(new TransferOutput[] { new TransferOutput() @@ -381,11 +385,17 @@ public void TestMakeTransaction1() }); tx.Should().NotBeNull(); - entry.Value = new NeoToken.AccountState() + entry1.Value = new Nep5AccountState() + { + Balance = 0 + } + .ToByteArray(); + entry2.Value = new NeoToken.AccountState() { Balance = 0 } .ToByteArray(); + snapshot.Commit(); } [TestMethod] @@ -400,7 +410,7 @@ public void TestMakeTransaction2() account.Lock = false; // Fake balance - var snapshot = store.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var key = NativeContract.GAS.CreateStorageKey(20, account.ScriptHash); var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem { @@ -411,6 +421,7 @@ public void TestMakeTransaction2() Balance = 1000000 * NativeContract.GAS.Factor } .ToByteArray(); + snapshot.Commit(); var tx = wallet.MakeTransaction(new byte[] { }, account.ScriptHash, new TransactionAttribute[] { }); tx.Should().NotBeNull(); @@ -423,6 +434,7 @@ public void TestMakeTransaction2() Balance = 0 } .ToByteArray(); + snapshot.Commit(); } [TestMethod] diff --git a/neo/Consensus/ConsensusContext.cs b/neo/Consensus/ConsensusContext.cs index e7c2649782..8f30b1e77a 100644 --- a/neo/Consensus/ConsensusContext.cs +++ b/neo/Consensus/ConsensusContext.cs @@ -21,7 +21,7 @@ internal class ConsensusContext : IDisposable, ISerializable /// /// Key for saving consensus state. /// - private static readonly byte[] ConsensusStateKey = { 0xf4 }; + private const byte ConsensusStatePrefix = 0xf4; public Block Block; public byte ViewNumber; @@ -42,11 +42,11 @@ internal class ConsensusContext : IDisposable, ISerializable /// public SendersFeeMonitor SendersFeeMonitor = new SendersFeeMonitor(); - public Snapshot Snapshot { get; private set; } + public SnapshotView Snapshot { get; private set; } private KeyPair keyPair; private int _witnessSize; private readonly Wallet wallet; - private readonly Store store; + private readonly IStore store; public int F => (Validators.Length - 1) / 3; public int M => Validators.Length - F; @@ -74,7 +74,7 @@ internal class ConsensusContext : IDisposable, ISerializable public int Size => throw new NotImplementedException(); - public ConsensusContext(Wallet wallet, Store store) + public ConsensusContext(Wallet wallet, IStore store) { this.wallet = wallet; this.store = store; @@ -145,7 +145,7 @@ public uint GetPrimaryIndex(byte viewNumber) public bool Load() { - byte[] data = store.Get(ConsensusStateKey); + byte[] data = store.TryGet(ConsensusStatePrefix, null); if (data is null || data.Length == 0) return false; using (MemoryStream ms = new MemoryStream(data, false)) using (BinaryReader reader = new BinaryReader(ms)) @@ -408,7 +408,7 @@ public void Reset(byte viewNumber) public void Save() { - store.PutSync(ConsensusStateKey, this.ToArray()); + store.PutSync(ConsensusStatePrefix, null, this.ToArray()); } public void Serialize(BinaryWriter writer) diff --git a/neo/Consensus/ConsensusService.cs b/neo/Consensus/ConsensusService.cs index 574082043a..3fcfe57ceb 100644 --- a/neo/Consensus/ConsensusService.cs +++ b/neo/Consensus/ConsensusService.cs @@ -46,7 +46,7 @@ internal class Timer { public uint Height; public byte ViewNumber; } /// private bool isRecovering = false; - public ConsensusService(IActorRef localNode, IActorRef taskManager, Store store, Wallet wallet) + public ConsensusService(IActorRef localNode, IActorRef taskManager, IStore store, Wallet wallet) : this(localNode, taskManager, new ConsensusContext(wallet, store)) { } @@ -601,7 +601,7 @@ protected override void PostStop() base.PostStop(); } - public static Props Props(IActorRef localNode, IActorRef taskManager, Store store, Wallet wallet) + public static Props Props(IActorRef localNode, IActorRef taskManager, IStore store, Wallet wallet) { return Akka.Actor.Props.Create(() => new ConsensusService(localNode, taskManager, store, wallet)).WithMailbox("consensus-service-mailbox"); } diff --git a/neo/IO/Caching/CloneCache.cs b/neo/IO/Caching/CloneCache.cs index 0dd030fcb6..559ee3d279 100644 --- a/neo/IO/Caching/CloneCache.cs +++ b/neo/IO/Caching/CloneCache.cs @@ -19,15 +19,15 @@ protected override void AddInternal(TKey key, TValue value) innerCache.Add(key, value); } - public override void DeleteInternal(TKey key) + protected override void DeleteInternal(TKey key) { innerCache.Delete(key); } - protected override IEnumerable> FindInternal(byte[] key_prefix) + protected override IEnumerable<(TKey, TValue)> FindInternal(byte[] key_prefix) { - foreach (KeyValuePair pair in innerCache.Find(key_prefix)) - yield return new KeyValuePair(pair.Key, pair.Value.Clone()); + foreach (var (key, value) in innerCache.Find(key_prefix)) + yield return (key, value.Clone()); } protected override TValue GetInternal(TKey key) diff --git a/neo/IO/Caching/DataCache.cs b/neo/IO/Caching/DataCache.cs index dc97031d10..373c4f2757 100644 --- a/neo/IO/Caching/DataCache.cs +++ b/neo/IO/Caching/DataCache.cs @@ -107,7 +107,7 @@ public void Delete(TKey key) } } - public abstract void DeleteInternal(TKey key); + protected abstract void DeleteInternal(TKey key); public void DeleteWhere(Func predicate) { @@ -123,7 +123,7 @@ public void DeleteWhere(Func predicate) /// /// Must maintain the deserialized format of TKey /// Entries found with the desired prefix - public IEnumerable> Find(byte[] key_prefix = null) + public IEnumerable<(TKey Key, TValue Value)> Find(byte[] key_prefix = null) { IEnumerable<(byte[], TKey, TValue)> cached; lock (dictionary) @@ -159,13 +159,13 @@ public void DeleteWhere(Func predicate) { if (!c2 || (c1 && ByteArrayComparer.Default.Compare(i1.KeyBytes, i2.KeyBytes) < 0)) { - yield return new KeyValuePair(i1.Key, i1.Item); + yield return (i1.Key, i1.Item); c1 = e1.MoveNext(); i1 = c1 ? e1.Current : default; } else { - yield return new KeyValuePair(i2.Key, i2.Item); + yield return (i2.Key, i2.Item); c2 = e2.MoveNext(); i2 = c2 ? e2.Current : default; } @@ -173,7 +173,7 @@ public void DeleteWhere(Func predicate) } } - protected abstract IEnumerable> FindInternal(byte[] key_prefix); + protected abstract IEnumerable<(TKey Key, TValue Value)> FindInternal(byte[] key_prefix); public IEnumerable GetChangeSet() { diff --git a/neo/IO/Data/LevelDB/SliceBuilder.cs b/neo/IO/Data/LevelDB/SliceBuilder.cs index d5888c6b5e..cf1cff0264 100644 --- a/neo/IO/Data/LevelDB/SliceBuilder.cs +++ b/neo/IO/Data/LevelDB/SliceBuilder.cs @@ -38,19 +38,22 @@ public SliceBuilder Add(long value) public SliceBuilder Add(IEnumerable value) { - data.AddRange(value); + if (value != null) + data.AddRange(value); return this; } public SliceBuilder Add(string value) { - data.AddRange(Encoding.UTF8.GetBytes(value)); + if (value != null) + data.AddRange(Encoding.UTF8.GetBytes(value)); return this; } public SliceBuilder Add(ISerializable value) { - data.AddRange(value.ToArray()); + if (value != null) + data.AddRange(value.ToArray()); return this; } diff --git a/neo/Ledger/Blockchain.cs b/neo/Ledger/Blockchain.cs index dea46ae3e8..9adffbff5b 100644 --- a/neo/Ledger/Blockchain.cs +++ b/neo/Ledger/Blockchain.cs @@ -62,9 +62,10 @@ public class FillCompleted { } private readonly Dictionary block_cache = new Dictionary(); private readonly Dictionary> block_cache_unverified = new Dictionary>(); internal readonly RelayCache ConsensusRelayCache = new RelayCache(100); - private Snapshot currentSnapshot; + private SnapshotView currentSnapshot; - public Store Store { get; } + public IStore Store { get; } + public RawView RawView { get; } public MemoryPool MemPool { get; } public uint Height => currentSnapshot.Height; public uint HeaderHeight => currentSnapshot.HeaderHeight; @@ -95,27 +96,28 @@ static Blockchain() } } - public Blockchain(NeoSystem system, Store store) + public Blockchain(NeoSystem system, IStore store) { this.system = system; this.MemPool = new MemoryPool(system, ProtocolSettings.Default.MemoryPoolMaxTransactions); this.Store = store; + this.RawView = new RawView(store); lock (lockObj) { if (singleton != null) throw new InvalidOperationException(); - header_index.AddRange(store.GetHeaderHashList().Find().OrderBy(p => (uint)p.Key).SelectMany(p => p.Value.Hashes)); + header_index.AddRange(RawView.HeaderHashList.Find().OrderBy(p => (uint)p.Key).SelectMany(p => p.Value.Hashes)); stored_header_count += (uint)header_index.Count; if (stored_header_count == 0) { - header_index.AddRange(store.GetBlocks().Find().OrderBy(p => p.Value.Index).Select(p => p.Key)); + header_index.AddRange(RawView.Blocks.Find().OrderBy(p => p.Value.Index).Select(p => p.Key)); } else { - HashIndexState hashIndex = store.GetHeaderHashIndex().Get(); + HashIndexState hashIndex = RawView.HeaderHashIndex.Get(); if (hashIndex.Index >= stored_header_count) { - DataCache cache = store.GetBlocks(); + DataCache cache = RawView.Blocks; for (UInt256 hash = hashIndex.Hash; hash != header_index[(int)stored_header_count - 1];) { header_index.Insert((int)stored_header_count, hash); @@ -139,13 +141,13 @@ public Blockchain(NeoSystem system, Store store) public bool ContainsBlock(UInt256 hash) { if (block_cache.ContainsKey(hash)) return true; - return Store.ContainsBlock(hash); + return RawView.ContainsBlock(hash); } public bool ContainsTransaction(UInt256 hash) { if (MemPool.ContainsKey(hash)) return true; - return Store.ContainsTransaction(hash); + return RawView.ContainsTransaction(hash); } private static Transaction DeployNativeContracts() @@ -179,7 +181,7 @@ public Block GetBlock(UInt256 hash) { if (block_cache.TryGetValue(hash, out Block block)) return block; - return Store.GetBlock(hash); + return RawView.GetBlock(hash); } public UInt256 GetBlockHash(uint index) @@ -193,16 +195,16 @@ public static UInt160 GetConsensusAddress(ECPoint[] validators) return Contract.CreateMultiSigRedeemScript(validators.Length - (validators.Length - 1) / 3, validators).ToScriptHash(); } - public Snapshot GetSnapshot() + public SnapshotView GetSnapshot() { - return Store.GetSnapshot(); + return new SnapshotView(Store); } public Transaction GetTransaction(UInt256 hash) { if (MemPool.TryGetValue(hash, out Transaction transaction)) return transaction; - return Store.GetTransaction(hash); + return RawView.GetTransaction(hash); } private void OnImport(IEnumerable blocks) @@ -237,7 +239,7 @@ private void OnFillMemoryPool(IEnumerable transactions) // Add the transactions to the memory pool foreach (var tx in transactions) { - if (Store.ContainsTransaction(tx.Hash)) + if (RawView.ContainsTransaction(tx.Hash)) continue; if (!NativeContract.Policy.CheckPolicy(tx, currentSnapshot)) continue; @@ -320,7 +322,7 @@ private RelayResultReason OnNewBlock(Block block) if (block.Index == header_index.Count) { header_index.Add(block.Hash); - using (Snapshot snapshot = GetSnapshot()) + using (SnapshotView snapshot = GetSnapshot()) { snapshot.Blocks.Add(block.Hash, block.Header.Trim()); snapshot.HeaderHashIndex.GetAndChange().Hash = block.Hash; @@ -345,7 +347,7 @@ private RelayResultReason OnNewConsensus(ConsensusPayload payload) private void OnNewHeaders(Header[] headers) { - using (Snapshot snapshot = GetSnapshot()) + using (SnapshotView snapshot = GetSnapshot()) { foreach (Header header in headers) { @@ -426,7 +428,7 @@ protected override void OnReceive(object message) private void Persist(Block block) { - using (Snapshot snapshot = GetSnapshot()) + using (SnapshotView snapshot = GetSnapshot()) { List all_application_executed = new List(); snapshot.PersistingBlock = block; @@ -504,12 +506,12 @@ protected override void PostStop() currentSnapshot?.Dispose(); } - public static Props Props(NeoSystem system, Store store) + public static Props Props(NeoSystem system, IStore store) { return Akka.Actor.Props.Create(() => new Blockchain(system, store)).WithMailbox("blockchain-mailbox"); } - private void SaveHeaderHashList(Snapshot snapshot = null) + private void SaveHeaderHashList(SnapshotView snapshot = null) { if ((header_index.Count - stored_header_count < 2000)) return; diff --git a/neo/Ledger/MemoryPool.cs b/neo/Ledger/MemoryPool.cs index 15c647f163..c574743719 100644 --- a/neo/Ledger/MemoryPool.cs +++ b/neo/Ledger/MemoryPool.cs @@ -105,7 +105,7 @@ public MemoryPool(NeoSystem system, int capacity) Capacity = capacity; } - internal bool LoadPolicy(Snapshot snapshot) + internal bool LoadPolicy(SnapshotView snapshot) { _maxTxPerBlock = (int)NativeContract.Policy.GetMaxTransactionsPerBlock(snapshot); long newFeePerByte = NativeContract.Policy.GetFeePerByte(snapshot); @@ -348,7 +348,7 @@ internal void InvalidateVerifiedTransactions() } // Note: this must only be called from a single thread (the Blockchain actor) - internal void UpdatePoolForBlockPersisted(Block block, Snapshot snapshot) + internal void UpdatePoolForBlockPersisted(Block block, SnapshotView snapshot) { bool policyChanged = LoadPolicy(snapshot); @@ -407,7 +407,7 @@ internal void InvalidateAllTransactions() } private int ReverifyTransactions(SortedSet verifiedSortedTxPool, - SortedSet unverifiedSortedTxPool, int count, double millisecondsTimeout, Snapshot snapshot) + SortedSet unverifiedSortedTxPool, int count, double millisecondsTimeout, SnapshotView snapshot) { DateTime reverifyCutOffTimeStamp = DateTime.UtcNow.AddMilliseconds(millisecondsTimeout); List reverifiedItems = new List(count); @@ -479,7 +479,7 @@ internal void InvalidateAllTransactions() /// Max transactions to reverify, the value passed can be >=1 /// The snapshot to use for verifying. /// true if more unsorted messages exist, otherwise false - internal bool ReVerifyTopUnverifiedTransactionsIfNeeded(int maxToVerify, Snapshot snapshot) + internal bool ReVerifyTopUnverifiedTransactionsIfNeeded(int maxToVerify, SnapshotView snapshot) { if (Blockchain.Singleton.Height < Blockchain.Singleton.HeaderHeight) return false; diff --git a/neo/NeoSystem.cs b/neo/NeoSystem.cs index 9265f47645..b1ef9b6ec8 100644 --- a/neo/NeoSystem.cs +++ b/neo/NeoSystem.cs @@ -26,11 +26,11 @@ public class NeoSystem : IDisposable public IActorRef Consensus { get; private set; } public RpcServer RpcServer { get; private set; } - private readonly Store store; + private readonly IStore store; private ChannelsConfig start_message = null; private bool suspend = false; - public NeoSystem(Store store) + public NeoSystem(IStore store) { this.store = store; Plugin.LoadPlugins(this); @@ -69,7 +69,7 @@ internal void ResumeNodeStartup() } } - public void StartConsensus(Wallet wallet, Store consensus_store = null, bool ignoreRecoveryLogs = false) + public void StartConsensus(Wallet wallet, IStore consensus_store = null, bool ignoreRecoveryLogs = false) { Consensus = ActorSystem.ActorOf(ConsensusService.Props(this.LocalNode, this.TaskManager, consensus_store ?? store, wallet)); Consensus.Tell(new ConsensusService.Start { IgnoreRecoveryLogs = ignoreRecoveryLogs }, Blockchain); diff --git a/neo/Network/P2P/Payloads/BlockBase.cs b/neo/Network/P2P/Payloads/BlockBase.cs index 4274cb990a..6c7b324fb9 100644 --- a/neo/Network/P2P/Payloads/BlockBase.cs +++ b/neo/Network/P2P/Payloads/BlockBase.cs @@ -74,7 +74,7 @@ void IVerifiable.DeserializeUnsigned(BinaryReader reader) NextConsensus = reader.ReadSerializable(); } - UInt160[] IVerifiable.GetScriptHashesForVerifying(Snapshot snapshot) + UInt160[] IVerifiable.GetScriptHashesForVerifying(View snapshot) { if (PrevHash == UInt256.Zero) return new[] { Witness.ScriptHash }; Header prev_header = snapshot.GetHeader(PrevHash); @@ -124,7 +124,7 @@ public void FromJson(JObject json) Witness = ((JArray)json["witnesses"]).Select(p => Witness.FromJson(p)).FirstOrDefault(); } - public virtual bool Verify(Snapshot snapshot) + public virtual bool Verify(SnapshotView snapshot) { Header prev_header = snapshot.GetHeader(PrevHash); if (prev_header == null) return false; diff --git a/neo/Network/P2P/Payloads/ConsensusPayload.cs b/neo/Network/P2P/Payloads/ConsensusPayload.cs index 062e5d9830..4eaa55fde7 100644 --- a/neo/Network/P2P/Payloads/ConsensusPayload.cs +++ b/neo/Network/P2P/Payloads/ConsensusPayload.cs @@ -95,7 +95,7 @@ void IVerifiable.DeserializeUnsigned(BinaryReader reader) Data = reader.ReadVarBytes(); } - UInt160[] IVerifiable.GetScriptHashesForVerifying(Snapshot snapshot) + UInt160[] IVerifiable.GetScriptHashesForVerifying(View snapshot) { ECPoint[] validators = NativeContract.NEO.GetNextBlockValidators(snapshot); if (validators.Length <= ValidatorIndex) @@ -118,7 +118,7 @@ void IVerifiable.SerializeUnsigned(BinaryWriter writer) writer.WriteVarBytes(Data); } - public bool Verify(Snapshot snapshot) + public bool Verify(SnapshotView snapshot) { if (BlockIndex <= snapshot.Height) return false; diff --git a/neo/Network/P2P/Payloads/IInventory.cs b/neo/Network/P2P/Payloads/IInventory.cs index 26b62346d9..f22b6c6aee 100644 --- a/neo/Network/P2P/Payloads/IInventory.cs +++ b/neo/Network/P2P/Payloads/IInventory.cs @@ -8,6 +8,6 @@ public interface IInventory : IVerifiable InventoryType InventoryType { get; } - bool Verify(Snapshot snapshot); + bool Verify(SnapshotView snapshot); } } diff --git a/neo/Network/P2P/Payloads/IVerifiable.cs b/neo/Network/P2P/Payloads/IVerifiable.cs index 8540d8a626..dea10592d5 100644 --- a/neo/Network/P2P/Payloads/IVerifiable.cs +++ b/neo/Network/P2P/Payloads/IVerifiable.cs @@ -10,7 +10,7 @@ public interface IVerifiable : ISerializable void DeserializeUnsigned(BinaryReader reader); - UInt160[] GetScriptHashesForVerifying(Snapshot snapshot); + UInt160[] GetScriptHashesForVerifying(View snapshot); void SerializeUnsigned(BinaryWriter writer); } diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/neo/Network/P2P/Payloads/Transaction.cs index de81275877..aa7c7c0622 100644 --- a/neo/Network/P2P/Payloads/Transaction.cs +++ b/neo/Network/P2P/Payloads/Transaction.cs @@ -123,14 +123,14 @@ public override int GetHashCode() return Hash.GetHashCode(); } - public UInt160[] GetScriptHashesForVerifying(Snapshot snapshot) + public UInt160[] GetScriptHashesForVerifying(View snapshot) { var hashes = new HashSet { Sender }; hashes.UnionWith(Cosigners.Select(p => p.Account)); return hashes.OrderBy(p => p).ToArray(); } - public virtual bool Reverify(Snapshot snapshot, BigInteger totalSenderFeeFromPool) + public virtual bool Reverify(SnapshotView snapshot, BigInteger totalSenderFeeFromPool) { if (ValidUntilBlock <= snapshot.Height || ValidUntilBlock > snapshot.Height + MaxValidUntilBlockIncrement) return false; @@ -202,12 +202,12 @@ public static Transaction FromJson(JObject json) return tx; } - bool IInventory.Verify(Snapshot snapshot) + bool IInventory.Verify(SnapshotView snapshot) { return Verify(snapshot, BigInteger.Zero); } - public virtual bool Verify(Snapshot snapshot, BigInteger totalSenderFeeFromPool) + public virtual bool Verify(SnapshotView snapshot, BigInteger totalSenderFeeFromPool) { if (!Reverify(snapshot, totalSenderFeeFromPool)) return false; int size = Size; diff --git a/neo/Network/P2P/ProtocolHandler.cs b/neo/Network/P2P/ProtocolHandler.cs index 1e62e4dfbf..3e9a4b2cfc 100644 --- a/neo/Network/P2P/ProtocolHandler.cs +++ b/neo/Network/P2P/ProtocolHandler.cs @@ -162,7 +162,7 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) { UInt256 hash = payload.HashStart; int count = payload.Count < 0 || payload.Count > InvPayload.MaxHashesCount ? InvPayload.MaxHashesCount : payload.Count; - TrimmedBlock state = Blockchain.Singleton.Store.GetBlocks().TryGet(hash); + TrimmedBlock state = Blockchain.Singleton.RawView.Blocks.TryGet(hash); if (state == null) return; List hashes = new List(); for (uint i = 1; i <= count; i++) @@ -182,7 +182,7 @@ private void OnGetBlockDataMessageReceived(GetBlockDataPayload payload) { for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) { - Block block = Blockchain.Singleton.Store.GetBlock(i); + Block block = Blockchain.Singleton.RawView.GetBlock(i); if (block == null) break; @@ -237,7 +237,7 @@ private void OnGetHeadersMessageReceived(GetBlocksPayload payload) { UInt256 hash = payload.HashStart; int count = payload.Count < 0 || payload.Count > HeadersPayload.MaxHeadersCount ? HeadersPayload.MaxHeadersCount : payload.Count; - DataCache cache = Blockchain.Singleton.Store.GetBlocks(); + DataCache cache = Blockchain.Singleton.RawView.Blocks; TrimmedBlock state = cache.TryGet(hash); if (state == null) return; List
headers = new List
(); @@ -273,11 +273,11 @@ private void OnInvMessageReceived(InvPayload payload) switch (payload.Type) { case InventoryType.Block: - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) hashes = hashes.Where(p => !snapshot.ContainsBlock(p)).ToArray(); break; case InventoryType.TX: - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) hashes = hashes.Where(p => !snapshot.ContainsTransaction(p)).ToArray(); break; } diff --git a/neo/Network/RPC/RpcServer.cs b/neo/Network/RPC/RpcServer.cs index 7414d54d10..75f641ed15 100644 --- a/neo/Network/RPC/RpcServer.cs +++ b/neo/Network/RPC/RpcServer.cs @@ -57,7 +57,7 @@ public void DeserializeUnsigned(BinaryReader reader) throw new NotImplementedException(); } - public UInt160[] GetScriptHashesForVerifying(Snapshot snapshot) + public UInt160[] GetScriptHashesForVerifying(View snapshot) { return _scriptHashesForVerifying; } @@ -435,12 +435,12 @@ private JObject GetBlock(JObject key, bool verbose) if (key is JNumber) { uint index = uint.Parse(key.AsString()); - block = Blockchain.Singleton.Store.GetBlock(index); + block = Blockchain.Singleton.RawView.GetBlock(index); } else { UInt256 hash = UInt256.Parse(key.AsString()); - block = Blockchain.Singleton.Store.GetBlock(hash); + block = Blockchain.Singleton.RawView.GetBlock(hash); } if (block == null) throw new RpcException(-100, "Unknown block"); @@ -448,7 +448,7 @@ private JObject GetBlock(JObject key, bool verbose) { JObject json = block.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - block.Index + 1; - UInt256 hash = Blockchain.Singleton.Store.GetNextBlockHash(block.Hash); + UInt256 hash = Blockchain.Singleton.RawView.GetNextBlockHash(block.Hash); if (hash != null) json["nextblockhash"] = hash.ToString(); return json; @@ -476,12 +476,12 @@ private JObject GetBlockHeader(JObject key, bool verbose) if (key is JNumber) { uint height = uint.Parse(key.AsString()); - header = Blockchain.Singleton.Store.GetHeader(height); + header = Blockchain.Singleton.RawView.GetHeader(height); } else { UInt256 hash = UInt256.Parse(key.AsString()); - header = Blockchain.Singleton.Store.GetHeader(hash); + header = Blockchain.Singleton.RawView.GetHeader(hash); } if (header == null) throw new RpcException(-100, "Unknown block"); @@ -490,7 +490,7 @@ private JObject GetBlockHeader(JObject key, bool verbose) { JObject json = header.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; - UInt256 hash = Blockchain.Singleton.Store.GetNextBlockHash(header.Hash); + UInt256 hash = Blockchain.Singleton.RawView.GetNextBlockHash(header.Hash); if (hash != null) json["nextblockhash"] = hash.ToString(); return json; @@ -516,7 +516,7 @@ private JObject GetConnectionCount() private JObject GetContractState(UInt160 script_hash) { - ContractState contract = Blockchain.Singleton.Store.GetContracts().TryGet(script_hash); + ContractState contract = Blockchain.Singleton.RawView.Contracts.TryGet(script_hash); return contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract"); } @@ -564,10 +564,10 @@ private JObject GetRawTransaction(UInt256 hash, bool verbose) if (verbose) { JObject json = tx.ToJson(); - TransactionState txState = Blockchain.Singleton.Store.GetTransactions().TryGet(hash); + TransactionState txState = Blockchain.Singleton.RawView.Transactions.TryGet(hash); if (txState != null) { - Header header = Blockchain.Singleton.Store.GetHeader(txState.BlockIndex); + Header header = Blockchain.Singleton.RawView.GetHeader(txState.BlockIndex); json["blockhash"] = header.Hash.ToString(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; json["blocktime"] = header.Timestamp; @@ -580,7 +580,7 @@ private JObject GetRawTransaction(UInt256 hash, bool verbose) private JObject GetStorage(UInt160 script_hash, byte[] key) { - StorageItem item = Blockchain.Singleton.Store.GetStorages().TryGet(new StorageKey + StorageItem item = Blockchain.Singleton.RawView.Storages.TryGet(new StorageKey { ScriptHash = script_hash, Key = key @@ -590,14 +590,14 @@ private JObject GetStorage(UInt160 script_hash, byte[] key) private JObject GetTransactionHeight(UInt256 hash) { - uint? height = Blockchain.Singleton.Store.GetTransactions().TryGet(hash)?.BlockIndex; + uint? height = Blockchain.Singleton.RawView.Transactions.TryGet(hash)?.BlockIndex; if (height.HasValue) return height.Value; throw new RpcException(-100, "Unknown transaction"); } private JObject GetValidators() { - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) { var validators = NativeContract.NEO.GetValidators(snapshot); return NativeContract.NEO.GetRegisteredValidators(snapshot).Select(p => diff --git a/neo/Persistence/CloneSnapshot.cs b/neo/Persistence/ClonedView.cs similarity index 52% rename from neo/Persistence/CloneSnapshot.cs rename to neo/Persistence/ClonedView.cs index 0b79bd2739..dee716a7a4 100644 --- a/neo/Persistence/CloneSnapshot.cs +++ b/neo/Persistence/ClonedView.cs @@ -4,7 +4,7 @@ namespace Neo.Persistence { - internal class CloneSnapshot : Snapshot + internal class ClonedView : View { public override DataCache Blocks { get; } public override DataCache Transactions { get; } @@ -14,16 +14,16 @@ internal class CloneSnapshot : Snapshot public override MetaDataCache BlockHashIndex { get; } public override MetaDataCache HeaderHashIndex { get; } - public CloneSnapshot(Snapshot snapshot) + public ClonedView(View view) { - this.PersistingBlock = snapshot.PersistingBlock; - this.Blocks = snapshot.Blocks.CreateSnapshot(); - this.Transactions = snapshot.Transactions.CreateSnapshot(); - this.Contracts = snapshot.Contracts.CreateSnapshot(); - this.Storages = snapshot.Storages.CreateSnapshot(); - this.HeaderHashList = snapshot.HeaderHashList.CreateSnapshot(); - this.BlockHashIndex = snapshot.BlockHashIndex.CreateSnapshot(); - this.HeaderHashIndex = snapshot.HeaderHashIndex.CreateSnapshot(); + this.PersistingBlock = view.PersistingBlock; + this.Blocks = view.Blocks.CreateSnapshot(); + this.Transactions = view.Transactions.CreateSnapshot(); + this.Contracts = view.Contracts.CreateSnapshot(); + this.Storages = view.Storages.CreateSnapshot(); + this.HeaderHashList = view.HeaderHashList.CreateSnapshot(); + this.BlockHashIndex = view.BlockHashIndex.CreateSnapshot(); + this.HeaderHashIndex = view.HeaderHashIndex.CreateSnapshot(); } } } diff --git a/neo/Persistence/Helper.cs b/neo/Persistence/Helper.cs deleted file mode 100644 index 7f412e47d3..0000000000 --- a/neo/Persistence/Helper.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Neo.Ledger; -using Neo.Network.P2P.Payloads; - -namespace Neo.Persistence -{ - public static class Helper - { - public static bool ContainsBlock(this IPersistence persistence, UInt256 hash) - { - TrimmedBlock state = persistence.Blocks.TryGet(hash); - if (state == null) return false; - return state.IsBlock; - } - - public static bool ContainsTransaction(this IPersistence persistence, UInt256 hash) - { - TransactionState state = persistence.Transactions.TryGet(hash); - return state != null; - } - - public static Block GetBlock(this IPersistence persistence, uint index) - { - if (index == 0) return Blockchain.GenesisBlock; - UInt256 hash = Blockchain.Singleton.GetBlockHash(index); - if (hash == null) return null; - return persistence.GetBlock(hash); - } - - public static Block GetBlock(this IPersistence persistence, UInt256 hash) - { - TrimmedBlock state = persistence.Blocks.TryGet(hash); - if (state == null) return null; - if (!state.IsBlock) return null; - return state.GetBlock(persistence.Transactions); - } - - public static Header GetHeader(this IPersistence persistence, uint index) - { - if (index == 0) return Blockchain.GenesisBlock.Header; - UInt256 hash = Blockchain.Singleton.GetBlockHash(index); - if (hash == null) return null; - return persistence.GetHeader(hash); - } - - public static Header GetHeader(this IPersistence persistence, UInt256 hash) - { - return persistence.Blocks.TryGet(hash)?.Header; - } - - public static UInt256 GetNextBlockHash(this IPersistence persistence, UInt256 hash) - { - TrimmedBlock state = persistence.Blocks.TryGet(hash); - if (state == null) return null; - return Blockchain.Singleton.GetBlockHash(state.Index + 1); - } - - public static Transaction GetTransaction(this IPersistence persistence, UInt256 hash) - { - return persistence.Transactions.TryGet(hash)?.Transaction; - } - } -} diff --git a/neo/Persistence/IPersistence.cs b/neo/Persistence/IPersistence.cs deleted file mode 100644 index 0632b5d0fa..0000000000 --- a/neo/Persistence/IPersistence.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Neo.IO.Caching; -using Neo.IO.Wrappers; -using Neo.Ledger; - -namespace Neo.Persistence -{ - public interface IPersistence - { - DataCache Blocks { get; } - DataCache Transactions { get; } - DataCache Contracts { get; } - DataCache Storages { get; } - DataCache HeaderHashList { get; } - MetaDataCache BlockHashIndex { get; } - MetaDataCache HeaderHashIndex { get; } - } -} diff --git a/neo/Persistence/IReadOnlyStore.cs b/neo/Persistence/IReadOnlyStore.cs new file mode 100644 index 0000000000..cac7b8fa0b --- /dev/null +++ b/neo/Persistence/IReadOnlyStore.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Neo.Persistence +{ + public interface IReadOnlyStore + { + IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix); + byte[] TryGet(byte table, byte[] key); + } +} diff --git a/neo/Persistence/ISnapshot.cs b/neo/Persistence/ISnapshot.cs new file mode 100644 index 0000000000..66d00c49b3 --- /dev/null +++ b/neo/Persistence/ISnapshot.cs @@ -0,0 +1,11 @@ +using System; + +namespace Neo.Persistence +{ + public interface ISnapshot : IDisposable, IReadOnlyStore + { + void Commit(); + void Delete(byte table, byte[] key); + void Put(byte table, byte[] key, byte[] value); + } +} diff --git a/neo/Persistence/IStore.cs b/neo/Persistence/IStore.cs new file mode 100644 index 0000000000..e3d515956d --- /dev/null +++ b/neo/Persistence/IStore.cs @@ -0,0 +1,12 @@ +using System; + +namespace Neo.Persistence +{ + public interface IStore : IDisposable, IReadOnlyStore + { + void Delete(byte table, byte[] key); + ISnapshot GetSnapshot(); + void Put(byte table, byte[] key, byte[] value); + void PutSync(byte table, byte[] key, byte[] value); + } +} diff --git a/neo/Persistence/LevelDB/DbCache.cs b/neo/Persistence/LevelDB/DbCache.cs deleted file mode 100644 index ae55b31326..0000000000 --- a/neo/Persistence/LevelDB/DbCache.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Neo.IO; -using Neo.IO.Caching; -using Neo.IO.Data.LevelDB; -using System; -using System.Collections.Generic; - -namespace Neo.Persistence.LevelDB -{ - public class DbCache : DataCache - where TKey : IEquatable, ISerializable, new() - where TValue : class, ICloneable, ISerializable, new() - { - private readonly DB db; - private readonly ReadOptions options; - private readonly WriteBatch batch; - private readonly byte prefix; - - public DbCache(DB db, ReadOptions options, WriteBatch batch, byte prefix) - { - this.db = db; - this.options = options ?? ReadOptions.Default; - this.batch = batch; - this.prefix = prefix; - } - - protected override void AddInternal(TKey key, TValue value) - { - batch?.Put(prefix, key, value); - } - - public override void DeleteInternal(TKey key) - { - batch?.Delete(prefix, key); - } - - protected override IEnumerable> FindInternal(byte[] key_prefix) - { - return db.Find(options, SliceBuilder.Begin(prefix).Add(key_prefix), (k, v) => new KeyValuePair(k.ToArray().AsSerializable(1), v.ToArray().AsSerializable())); - } - - protected override TValue GetInternal(TKey key) - { - return db.Get(options, prefix, key); - } - - protected override TValue TryGetInternal(TKey key) - { - return db.TryGet(options, prefix, key); - } - - protected override void UpdateInternal(TKey key, TValue value) - { - batch?.Put(prefix, key, value); - } - } -} diff --git a/neo/Persistence/LevelDB/DbMetaDataCache.cs b/neo/Persistence/LevelDB/DbMetaDataCache.cs deleted file mode 100644 index 0163d84e39..0000000000 --- a/neo/Persistence/LevelDB/DbMetaDataCache.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Neo.IO; -using Neo.IO.Caching; -using Neo.IO.Data.LevelDB; -using System; - -namespace Neo.Persistence.LevelDB -{ - internal class DbMetaDataCache : MetaDataCache - where T : class, ICloneable, ISerializable, new() - { - private readonly DB db; - private readonly ReadOptions options; - private readonly WriteBatch batch; - private readonly byte prefix; - - public DbMetaDataCache(DB db, ReadOptions options, WriteBatch batch, byte prefix, Func factory = null) - : base(factory) - { - this.db = db; - this.options = options ?? ReadOptions.Default; - this.batch = batch; - this.prefix = prefix; - } - - protected override void AddInternal(T item) - { - batch?.Put(prefix, item.ToArray()); - } - - protected override T TryGetInternal() - { - if (!db.TryGet(options, prefix, out Slice slice)) - return null; - return slice.ToArray().AsSerializable(); - } - - protected override void UpdateInternal(T item) - { - batch?.Put(prefix, item.ToArray()); - } - } -} diff --git a/neo/Persistence/LevelDB/DbSnapshot.cs b/neo/Persistence/LevelDB/DbSnapshot.cs deleted file mode 100644 index 365584fa7c..0000000000 --- a/neo/Persistence/LevelDB/DbSnapshot.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Neo.IO.Caching; -using Neo.IO.Data.LevelDB; -using Neo.IO.Wrappers; -using Neo.Ledger; -using LSnapshot = Neo.IO.Data.LevelDB.Snapshot; - -namespace Neo.Persistence.LevelDB -{ - internal class DbSnapshot : Snapshot - { - private readonly DB db; - private readonly LSnapshot snapshot; - private readonly WriteBatch batch; - - public override DataCache Blocks { get; } - public override DataCache Transactions { get; } - public override DataCache Contracts { get; } - public override DataCache Storages { get; } - public override DataCache HeaderHashList { get; } - public override MetaDataCache BlockHashIndex { get; } - public override MetaDataCache HeaderHashIndex { get; } - - public DbSnapshot(DB db) - { - this.db = db; - this.snapshot = db.GetSnapshot(); - this.batch = new WriteBatch(); - ReadOptions options = new ReadOptions { FillCache = false, Snapshot = snapshot }; - Blocks = new DbCache(db, options, batch, Prefixes.DATA_Block); - Transactions = new DbCache(db, options, batch, Prefixes.DATA_Transaction); - Contracts = new DbCache(db, options, batch, Prefixes.ST_Contract); - Storages = new DbCache(db, options, batch, Prefixes.ST_Storage); - HeaderHashList = new DbCache(db, options, batch, Prefixes.IX_HeaderHashList); - BlockHashIndex = new DbMetaDataCache(db, options, batch, Prefixes.IX_CurrentBlock); - HeaderHashIndex = new DbMetaDataCache(db, options, batch, Prefixes.IX_CurrentHeader); - } - - public override void Commit() - { - base.Commit(); - db.Write(WriteOptions.Default, batch); - } - - public override void Dispose() - { - snapshot.Dispose(); - } - } -} diff --git a/neo/Persistence/LevelDB/LevelDBStore.cs b/neo/Persistence/LevelDB/LevelDBStore.cs deleted file mode 100644 index 805c1fe915..0000000000 --- a/neo/Persistence/LevelDB/LevelDBStore.cs +++ /dev/null @@ -1,94 +0,0 @@ -using Neo.IO.Caching; -using Neo.IO.Data.LevelDB; -using Neo.IO.Wrappers; -using Neo.Ledger; -using System; -using System.Reflection; - -namespace Neo.Persistence.LevelDB -{ - public class LevelDBStore : Store, IDisposable - { - private readonly DB db; - - public LevelDBStore(string path) - { - this.db = DB.Open(path, new Options { CreateIfMissing = true }); - if (db.TryGet(ReadOptions.Default, SliceBuilder.Begin(Prefixes.SYS_Version), out Slice value) && Version.TryParse(value.ToString(), out Version version) && version >= Version.Parse("2.9.1")) - return; - WriteBatch batch = new WriteBatch(); - ReadOptions options = new ReadOptions { FillCache = false }; - using (Iterator it = db.NewIterator(options)) - { - for (it.SeekToFirst(); it.Valid(); it.Next()) - { - batch.Delete(it.Key()); - } - } - db.Put(WriteOptions.Default, SliceBuilder.Begin(Prefixes.SYS_Version), Assembly.GetExecutingAssembly().GetName().Version.ToString()); - db.Write(WriteOptions.Default, batch); - } - - public void Dispose() - { - db.Dispose(); - } - - public override byte[] Get(byte[] key) - { - if (!db.TryGet(ReadOptions.Default, key, out Slice slice)) - return null; - return slice.ToArray(); - } - - public override DataCache GetBlocks() - { - return new DbCache(db, null, null, Prefixes.DATA_Block); - } - - public override DataCache GetContracts() - { - return new DbCache(db, null, null, Prefixes.ST_Contract); - } - - public override Snapshot GetSnapshot() - { - return new DbSnapshot(db); - } - - public override DataCache GetStorages() - { - return new DbCache(db, null, null, Prefixes.ST_Storage); - } - - public override DataCache GetTransactions() - { - return new DbCache(db, null, null, Prefixes.DATA_Transaction); - } - - public override DataCache GetHeaderHashList() - { - return new DbCache(db, null, null, Prefixes.IX_HeaderHashList); - } - - public override MetaDataCache GetBlockHashIndex() - { - return new DbMetaDataCache(db, null, null, Prefixes.IX_CurrentBlock); - } - - public override MetaDataCache GetHeaderHashIndex() - { - return new DbMetaDataCache(db, null, null, Prefixes.IX_CurrentHeader); - } - - public override void Put(byte[] key, byte[] value) - { - db.Put(WriteOptions.Default, key, value); - } - - public override void PutSync(byte[] key, byte[] value) - { - db.Put(new WriteOptions { Sync = true }, key, value); - } - } -} diff --git a/neo/Persistence/LevelDB/Snapshot.cs b/neo/Persistence/LevelDB/Snapshot.cs new file mode 100644 index 0000000000..dbf5cbe278 --- /dev/null +++ b/neo/Persistence/LevelDB/Snapshot.cs @@ -0,0 +1,55 @@ +using Neo.IO.Data.LevelDB; +using System.Collections.Generic; +using System.Linq; +using LSnapshot = Neo.IO.Data.LevelDB.Snapshot; + +namespace Neo.Persistence.LevelDB +{ + internal class Snapshot : ISnapshot + { + private readonly DB db; + private readonly LSnapshot snapshot; + private readonly ReadOptions options; + private readonly WriteBatch batch; + + public Snapshot(DB db) + { + this.db = db; + this.snapshot = db.GetSnapshot(); + this.options = new ReadOptions { FillCache = false, Snapshot = snapshot }; + this.batch = new WriteBatch(); + } + + public void Commit() + { + db.Write(WriteOptions.Default, batch); + } + + public void Delete(byte table, byte[] key) + { + batch.Delete(SliceBuilder.Begin(table).Add(key)); + } + + public void Dispose() + { + snapshot.Dispose(); + } + + public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) + { + return db.Find(options, SliceBuilder.Begin(table).Add(prefix), (k, v) => (k.ToArray().Skip(1).ToArray(), v.ToArray())); + } + + public void Put(byte table, byte[] key, byte[] value) + { + batch.Put(SliceBuilder.Begin(table).Add(key), value); + } + + public byte[] TryGet(byte table, byte[] key) + { + if (!db.TryGet(options, SliceBuilder.Begin(table).Add(key), out Slice slice)) + return null; + return slice.ToArray(); + } + } +} diff --git a/neo/Persistence/LevelDB/Store.cs b/neo/Persistence/LevelDB/Store.cs new file mode 100644 index 0000000000..fbded76391 --- /dev/null +++ b/neo/Persistence/LevelDB/Store.cs @@ -0,0 +1,69 @@ +using Neo.IO.Data.LevelDB; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Neo.Persistence.LevelDB +{ + public class Store : IStore + { + private const byte SYS_Version = 0xf0; + private readonly DB db; + + public Store(string path) + { + this.db = DB.Open(path, new Options { CreateIfMissing = true }); + if (db.TryGet(ReadOptions.Default, SliceBuilder.Begin(SYS_Version), out Slice value) && Version.TryParse(value.ToString(), out Version version) && version >= Version.Parse("2.9.1")) + return; + WriteBatch batch = new WriteBatch(); + ReadOptions options = new ReadOptions { FillCache = false }; + using (Iterator it = db.NewIterator(options)) + { + for (it.SeekToFirst(); it.Valid(); it.Next()) + { + batch.Delete(it.Key()); + } + } + db.Put(WriteOptions.Default, SliceBuilder.Begin(SYS_Version), Assembly.GetExecutingAssembly().GetName().Version.ToString()); + db.Write(WriteOptions.Default, batch); + } + + public void Delete(byte table, byte[] key) + { + db.Delete(WriteOptions.Default, SliceBuilder.Begin(table).Add(key)); + } + + public void Dispose() + { + db.Dispose(); + } + + public IEnumerable<(byte[], byte[])> Find(byte table, byte[] prefix) + { + return db.Find(ReadOptions.Default, SliceBuilder.Begin(table).Add(prefix), (k, v) => (k.ToArray().Skip(1).ToArray(), v.ToArray())); + } + + public ISnapshot GetSnapshot() + { + return new Snapshot(db); + } + + public void Put(byte table, byte[] key, byte[] value) + { + db.Put(WriteOptions.Default, SliceBuilder.Begin(table).Add(key), value); + } + + public void PutSync(byte table, byte[] key, byte[] value) + { + db.Put(new WriteOptions { Sync = true }, SliceBuilder.Begin(table).Add(key), value); + } + + public byte[] TryGet(byte table, byte[] key) + { + if (!db.TryGet(ReadOptions.Default, SliceBuilder.Begin(table).Add(key), out Slice slice)) + return null; + return slice.ToArray(); + } + } +} diff --git a/neo/Persistence/Memory/ByteArrayEqualityComparer.cs b/neo/Persistence/Memory/ByteArrayEqualityComparer.cs new file mode 100644 index 0000000000..97096498aa --- /dev/null +++ b/neo/Persistence/Memory/ByteArrayEqualityComparer.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; + +namespace Neo.Persistence.Memory +{ + internal class ByteArrayEqualityComparer : IEqualityComparer + { + public static readonly ByteArrayEqualityComparer Default = new ByteArrayEqualityComparer(); + + public unsafe bool Equals(byte[] x, byte[] y) + { + if (ReferenceEquals(x, y)) return true; + if (x is null || y is null) return false; + int len = x.Length; + if (len != y.Length) return false; + if (len == 0) return true; + fixed (byte* xp = x, yp = y) + { + long* xlp = (long*)xp, ylp = (long*)yp; + for (; len >= 8; len -= 8) + { + if (*xlp != *ylp) return false; + xlp++; + ylp++; + } + byte* xbp = (byte*)xlp, ybp = (byte*)ylp; + for (; len > 0; len--) + { + if (*xbp != *ybp) return false; + xbp++; + ybp++; + } + } + return true; + } + + public int GetHashCode(byte[] obj) + { + unchecked + { + int hash = 17; + foreach (byte element in obj) + hash = hash * 31 + element; + return hash; + } + } + } +} diff --git a/neo/Persistence/Memory/Helper.cs b/neo/Persistence/Memory/Helper.cs new file mode 100644 index 0000000000..c3535d897d --- /dev/null +++ b/neo/Persistence/Memory/Helper.cs @@ -0,0 +1,12 @@ +namespace Neo.Persistence.Memory +{ + internal static class Helper + { + private static readonly byte[] EmptyBytes = new byte[0]; + + public static byte[] EnsureNotNull(this byte[] source) + { + return source ?? EmptyBytes; + } + } +} diff --git a/neo/Persistence/Memory/Snapshot.cs b/neo/Persistence/Memory/Snapshot.cs new file mode 100644 index 0000000000..0d1b4ad98a --- /dev/null +++ b/neo/Persistence/Memory/Snapshot.cs @@ -0,0 +1,69 @@ +using Neo.IO; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading; + +namespace Neo.Persistence.Memory +{ + internal class Snapshot : ISnapshot + { + private readonly ReaderWriterLockSlim readerWriterLock; + private readonly Dictionary[] innerData; + private readonly ImmutableDictionary[] immutableData; + private readonly Dictionary[] writeBatch; + + public Snapshot(Dictionary[] innerData, ReaderWriterLockSlim readerWriterLock) + { + this.readerWriterLock = readerWriterLock; + this.innerData = innerData; + readerWriterLock.EnterReadLock(); + this.immutableData = innerData.Select(p => p.ToImmutableDictionary(ByteArrayEqualityComparer.Default)).ToArray(); + readerWriterLock.ExitReadLock(); + this.writeBatch = new Dictionary[innerData.Length]; + for (int i = 0; i < writeBatch.Length; i++) + writeBatch[i] = new Dictionary(ByteArrayEqualityComparer.Default); + } + + public void Commit() + { + readerWriterLock.EnterWriteLock(); + for (int i = 0; i < writeBatch.Length; i++) + foreach (var pair in writeBatch[i]) + if (pair.Value is null) + innerData[i].Remove(pair.Key); + else + innerData[i][pair.Key] = pair.Value; + readerWriterLock.ExitWriteLock(); + } + + public void Delete(byte table, byte[] key) + { + writeBatch[table][key.EnsureNotNull()] = null; + } + + public void Dispose() + { + } + + public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) + { + IEnumerable> records = immutableData[table]; + if (prefix?.Length > 0) + records = records.Where(p => p.Key.Length >= prefix.Length && p.Key.Take(prefix.Length).SequenceEqual(prefix)); + records = records.OrderBy(p => p.Key, ByteArrayComparer.Default); + return records.Select(p => (p.Key, p.Value)); + } + + public void Put(byte table, byte[] key, byte[] value) + { + writeBatch[table][key.EnsureNotNull()] = value; + } + + public byte[] TryGet(byte table, byte[] key) + { + immutableData[table].TryGetValue(key.EnsureNotNull(), out byte[] value); + return value; + } + } +} diff --git a/neo/Persistence/Memory/Store.cs b/neo/Persistence/Memory/Store.cs new file mode 100644 index 0000000000..39944b903d --- /dev/null +++ b/neo/Persistence/Memory/Store.cs @@ -0,0 +1,70 @@ +using Neo.IO; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; + +namespace Neo.Persistence.Memory +{ + public class Store : IStore + { + private readonly ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim(); + private readonly Dictionary[] innerData; + + public Store() + { + innerData = new Dictionary[256]; + for (int i = 0; i < innerData.Length; i++) + innerData[i] = new Dictionary(ByteArrayEqualityComparer.Default); + } + + public void Delete(byte table, byte[] key) + { + readerWriterLock.EnterWriteLock(); + innerData[table].Remove(key.EnsureNotNull()); + readerWriterLock.ExitWriteLock(); + } + + public void Dispose() + { + readerWriterLock.Dispose(); + } + + public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) + { + IEnumerable> records = innerData[table]; + if (prefix?.Length > 0) + records = records.Where(p => p.Key.Length >= prefix.Length && p.Key.Take(prefix.Length).SequenceEqual(prefix)); + records = records.OrderBy(p => p.Key, ByteArrayComparer.Default); + readerWriterLock.EnterReadLock(); + foreach (var pair in records) + yield return (pair.Key, pair.Value); + readerWriterLock.ExitReadLock(); + } + + public ISnapshot GetSnapshot() + { + return new Snapshot(innerData, readerWriterLock); + } + + public void Put(byte table, byte[] key, byte[] value) + { + PutSync(table, key, value); + } + + public void PutSync(byte table, byte[] key, byte[] value) + { + readerWriterLock.EnterWriteLock(); + innerData[table][key.EnsureNotNull()] = value; + readerWriterLock.ExitWriteLock(); + } + + public byte[] TryGet(byte table, byte[] key) + { + readerWriterLock.EnterReadLock(); + innerData[table].TryGetValue(key.EnsureNotNull(), out byte[] value); + readerWriterLock.ExitReadLock(); + return value; + } + } +} diff --git a/neo/Persistence/LevelDB/Prefixes.cs b/neo/Persistence/Prefixes.cs similarity index 76% rename from neo/Persistence/LevelDB/Prefixes.cs rename to neo/Persistence/Prefixes.cs index f40359a55a..dad8540787 100644 --- a/neo/Persistence/LevelDB/Prefixes.cs +++ b/neo/Persistence/Prefixes.cs @@ -1,4 +1,4 @@ -namespace Neo.Persistence.LevelDB +namespace Neo.Persistence { internal static class Prefixes { @@ -12,9 +12,7 @@ internal static class Prefixes public const byte IX_CurrentBlock = 0xc0; public const byte IX_CurrentHeader = 0xc1; - public const byte SYS_Version = 0xf0; - - /* Prefixes 0xf1 to 0xff are reserved for external use. + /* Prefixes 0xf0 to 0xff are reserved for external use. * * Note: The saved consensus state uses the Prefix 0xf4 */ diff --git a/neo/Persistence/RawView.cs b/neo/Persistence/RawView.cs new file mode 100644 index 0000000000..55dcdf3686 --- /dev/null +++ b/neo/Persistence/RawView.cs @@ -0,0 +1,30 @@ +using Neo.IO.Caching; +using Neo.IO.Wrappers; +using Neo.Ledger; +using System; + +namespace Neo.Persistence +{ + public class RawView : View + { + private readonly IReadOnlyStore store; + + public override DataCache Blocks => new StoreDataCache(store, Prefixes.DATA_Block); + public override DataCache Transactions => new StoreDataCache(store, Prefixes.DATA_Transaction); + public override DataCache Contracts => new StoreDataCache(store, Prefixes.ST_Contract); + public override DataCache Storages => new StoreDataCache(store, Prefixes.ST_Storage); + public override DataCache HeaderHashList => new StoreDataCache(store, Prefixes.IX_HeaderHashList); + public override MetaDataCache BlockHashIndex => new StoreMetaDataCache(store, Prefixes.IX_CurrentBlock); + public override MetaDataCache HeaderHashIndex => new StoreMetaDataCache(store, Prefixes.IX_CurrentHeader); + + public RawView(IReadOnlyStore store) + { + this.store = store; + } + + public override void Commit() + { + throw new NotSupportedException(); + } + } +} diff --git a/neo/Persistence/Snapshot.cs b/neo/Persistence/Snapshot.cs deleted file mode 100644 index 1e900800b0..0000000000 --- a/neo/Persistence/Snapshot.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Neo.IO.Caching; -using Neo.IO.Wrappers; -using Neo.Ledger; -using Neo.Network.P2P.Payloads; -using System; - -namespace Neo.Persistence -{ - public abstract class Snapshot : IDisposable, IPersistence - { - public Block PersistingBlock { get; internal set; } - public abstract DataCache Blocks { get; } - public abstract DataCache Transactions { get; } - public abstract DataCache Contracts { get; } - public abstract DataCache Storages { get; } - public abstract DataCache HeaderHashList { get; } - public abstract MetaDataCache BlockHashIndex { get; } - public abstract MetaDataCache HeaderHashIndex { get; } - - public uint Height => BlockHashIndex.Get().Index; - public uint HeaderHeight => HeaderHashIndex.Get().Index; - public UInt256 CurrentBlockHash => BlockHashIndex.Get().Hash; - public UInt256 CurrentHeaderHash => HeaderHashIndex.Get().Hash; - - public Snapshot Clone() - { - return new CloneSnapshot(this); - } - - public virtual void Commit() - { - Blocks.Commit(); - Transactions.Commit(); - Contracts.Commit(); - Storages.Commit(); - HeaderHashList.Commit(); - BlockHashIndex.Commit(); - HeaderHashIndex.Commit(); - } - - public virtual void Dispose() - { - } - } -} diff --git a/neo/Persistence/SnapshotView.cs b/neo/Persistence/SnapshotView.cs new file mode 100644 index 0000000000..e2c4247583 --- /dev/null +++ b/neo/Persistence/SnapshotView.cs @@ -0,0 +1,43 @@ +using Neo.IO.Caching; +using Neo.IO.Wrappers; +using Neo.Ledger; +using System; + +namespace Neo.Persistence +{ + public class SnapshotView : View, IDisposable + { + private readonly ISnapshot snapshot; + + public override DataCache Blocks { get; } + public override DataCache Transactions { get; } + public override DataCache Contracts { get; } + public override DataCache Storages { get; } + public override DataCache HeaderHashList { get; } + public override MetaDataCache BlockHashIndex { get; } + public override MetaDataCache HeaderHashIndex { get; } + + public SnapshotView(IStore store) + { + this.snapshot = store.GetSnapshot(); + Blocks = new StoreDataCache(snapshot, Prefixes.DATA_Block); + Transactions = new StoreDataCache(snapshot, Prefixes.DATA_Transaction); + Contracts = new StoreDataCache(snapshot, Prefixes.ST_Contract); + Storages = new StoreDataCache(snapshot, Prefixes.ST_Storage); + HeaderHashList = new StoreDataCache(snapshot, Prefixes.IX_HeaderHashList); + BlockHashIndex = new StoreMetaDataCache(snapshot, Prefixes.IX_CurrentBlock); + HeaderHashIndex = new StoreMetaDataCache(snapshot, Prefixes.IX_CurrentHeader); + } + + public override void Commit() + { + base.Commit(); + snapshot.Commit(); + } + + public void Dispose() + { + snapshot.Dispose(); + } + } +} diff --git a/neo/Persistence/Store.cs b/neo/Persistence/Store.cs deleted file mode 100644 index eab5c182b9..0000000000 --- a/neo/Persistence/Store.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Neo.IO.Caching; -using Neo.IO.Wrappers; -using Neo.Ledger; - -namespace Neo.Persistence -{ - public abstract class Store : IPersistence - { - DataCache IPersistence.Blocks => GetBlocks(); - DataCache IPersistence.Transactions => GetTransactions(); - DataCache IPersistence.Contracts => GetContracts(); - DataCache IPersistence.Storages => GetStorages(); - DataCache IPersistence.HeaderHashList => GetHeaderHashList(); - MetaDataCache IPersistence.BlockHashIndex => GetBlockHashIndex(); - MetaDataCache IPersistence.HeaderHashIndex => GetHeaderHashIndex(); - - public abstract byte[] Get(byte[] key); - public abstract DataCache GetBlocks(); - public abstract DataCache GetTransactions(); - public abstract DataCache GetContracts(); - public abstract DataCache GetStorages(); - public abstract DataCache GetHeaderHashList(); - public abstract MetaDataCache GetBlockHashIndex(); - public abstract MetaDataCache GetHeaderHashIndex(); - public abstract void Put(byte[] key, byte[] value); - public abstract void PutSync(byte[] key, byte[] value); - - public abstract Snapshot GetSnapshot(); - } -} diff --git a/neo/Persistence/StoreDataCache.cs b/neo/Persistence/StoreDataCache.cs new file mode 100644 index 0000000000..995a34290f --- /dev/null +++ b/neo/Persistence/StoreDataCache.cs @@ -0,0 +1,54 @@ +using Neo.IO; +using Neo.IO.Caching; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Neo.Persistence +{ + internal class StoreDataCache : DataCache + where TKey : IEquatable, ISerializable, new() + where TValue : class, ICloneable, ISerializable, new() + { + private readonly IReadOnlyStore store; + private readonly ISnapshot snapshot; + private readonly byte prefix; + + public StoreDataCache(IReadOnlyStore store, byte prefix) + { + this.store = store; + this.snapshot = store as ISnapshot; + this.prefix = prefix; + } + + protected override void AddInternal(TKey key, TValue value) + { + snapshot?.Put(prefix, key.ToArray(), value.ToArray()); + } + + protected override void DeleteInternal(TKey key) + { + snapshot?.Delete(prefix, key.ToArray()); + } + + protected override IEnumerable<(TKey, TValue)> FindInternal(byte[] key_prefix) + { + return store.Find(prefix, key_prefix).Select(p => (p.Key.AsSerializable(), p.Value.AsSerializable())); + } + + protected override TValue GetInternal(TKey key) + { + return store.TryGet(prefix, key.ToArray()).AsSerializable(); + } + + protected override TValue TryGetInternal(TKey key) + { + return store.TryGet(prefix, key.ToArray())?.AsSerializable(); + } + + protected override void UpdateInternal(TKey key, TValue value) + { + snapshot?.Put(prefix, key.ToArray(), value.ToArray()); + } + } +} diff --git a/neo/Persistence/StoreMetaDataCache.cs b/neo/Persistence/StoreMetaDataCache.cs new file mode 100644 index 0000000000..152a315e03 --- /dev/null +++ b/neo/Persistence/StoreMetaDataCache.cs @@ -0,0 +1,37 @@ +using Neo.IO; +using Neo.IO.Caching; +using System; + +namespace Neo.Persistence +{ + internal class StoreMetaDataCache : MetaDataCache + where T : class, ICloneable, ISerializable, new() + { + private readonly IReadOnlyStore store; + private readonly ISnapshot snapshot; + private readonly byte prefix; + + public StoreMetaDataCache(IReadOnlyStore store, byte prefix, Func factory = null) + : base(factory) + { + this.store = store; + this.snapshot = store as ISnapshot; + this.prefix = prefix; + } + + protected override void AddInternal(T item) + { + snapshot?.Put(prefix, null, item.ToArray()); + } + + protected override T TryGetInternal() + { + return store.TryGet(prefix, null)?.AsSerializable(); + } + + protected override void UpdateInternal(T item) + { + snapshot?.Put(prefix, null, item.ToArray()); + } + } +} diff --git a/neo/Persistence/View.cs b/neo/Persistence/View.cs new file mode 100644 index 0000000000..1a40cf3df7 --- /dev/null +++ b/neo/Persistence/View.cs @@ -0,0 +1,94 @@ +using Neo.IO.Caching; +using Neo.IO.Wrappers; +using Neo.Ledger; +using Neo.Network.P2P.Payloads; + +namespace Neo.Persistence +{ + public abstract class View + { + public Block PersistingBlock { get; internal set; } + public abstract DataCache Blocks { get; } + public abstract DataCache Transactions { get; } + public abstract DataCache Contracts { get; } + public abstract DataCache Storages { get; } + public abstract DataCache HeaderHashList { get; } + public abstract MetaDataCache BlockHashIndex { get; } + public abstract MetaDataCache HeaderHashIndex { get; } + + public uint Height => BlockHashIndex.Get().Index; + public uint HeaderHeight => HeaderHashIndex.Get().Index; + public UInt256 CurrentBlockHash => BlockHashIndex.Get().Hash; + public UInt256 CurrentHeaderHash => HeaderHashIndex.Get().Hash; + + public View Clone() + { + return new ClonedView(this); + } + + public virtual void Commit() + { + Blocks.Commit(); + Transactions.Commit(); + Contracts.Commit(); + Storages.Commit(); + HeaderHashList.Commit(); + BlockHashIndex.Commit(); + HeaderHashIndex.Commit(); + } + + public bool ContainsBlock(UInt256 hash) + { + TrimmedBlock state = Blocks.TryGet(hash); + if (state == null) return false; + return state.IsBlock; + } + + public bool ContainsTransaction(UInt256 hash) + { + TransactionState state = Transactions.TryGet(hash); + return state != null; + } + + public Block GetBlock(uint index) + { + if (index == 0) return Blockchain.GenesisBlock; + UInt256 hash = Blockchain.Singleton.GetBlockHash(index); + if (hash == null) return null; + return GetBlock(hash); + } + + public Block GetBlock(UInt256 hash) + { + TrimmedBlock state = Blocks.TryGet(hash); + if (state == null) return null; + if (!state.IsBlock) return null; + return state.GetBlock(Transactions); + } + + public Header GetHeader(uint index) + { + if (index == 0) return Blockchain.GenesisBlock.Header; + UInt256 hash = Blockchain.Singleton.GetBlockHash(index); + if (hash == null) return null; + return GetHeader(hash); + } + + public Header GetHeader(UInt256 hash) + { + return Blocks.TryGet(hash)?.Header; + } + + public UInt256 GetNextBlockHash(UInt256 hash) + { + TrimmedBlock state = Blocks.TryGet(hash); + if (state == null) return null; + return Blockchain.Singleton.GetBlockHash(state.Index + 1); + } + + public Transaction GetTransaction(UInt256 hash) + { + return Transactions.TryGet(hash)?.Transaction; + } + } +} diff --git a/neo/Plugins/IPersistencePlugin.cs b/neo/Plugins/IPersistencePlugin.cs index 0f06ae51eb..606443305a 100644 --- a/neo/Plugins/IPersistencePlugin.cs +++ b/neo/Plugins/IPersistencePlugin.cs @@ -7,8 +7,8 @@ namespace Neo.Plugins { public interface IPersistencePlugin { - void OnPersist(Snapshot snapshot, IReadOnlyList applicationExecutedList); - void OnCommit(Snapshot snapshot); + void OnPersist(SnapshotView snapshot, IReadOnlyList applicationExecutedList); + void OnCommit(SnapshotView snapshot); bool ShouldThrowExceptionFromCommit(Exception ex); } } diff --git a/neo/SmartContract/ApplicationEngine.cs b/neo/SmartContract/ApplicationEngine.cs index 2eeeef52e0..8fdaebc7a4 100644 --- a/neo/SmartContract/ApplicationEngine.cs +++ b/neo/SmartContract/ApplicationEngine.cs @@ -20,7 +20,7 @@ public partial class ApplicationEngine : ExecutionEngine public TriggerType Trigger { get; } public IVerifiable ScriptContainer { get; } - public Snapshot Snapshot { get; } + public View Snapshot { get; } public long GasConsumed { get; private set; } = 0; public UInt160 CurrentScriptHash => CurrentContext?.GetState().ScriptHash; public UInt160 CallingScriptHash => InvocationStack.Count > 1 ? InvocationStack.Peek(1).GetState().ScriptHash : null; @@ -28,7 +28,7 @@ public partial class ApplicationEngine : ExecutionEngine public IReadOnlyList Notifications => notifications; internal Dictionary InvocationCounter { get; } = new Dictionary(); - public ApplicationEngine(TriggerType trigger, IVerifiable container, Snapshot snapshot, long gas, bool testMode = false) + public ApplicationEngine(TriggerType trigger, IVerifiable container, View snapshot, long gas, bool testMode = false) { this.gas_amount = GasFree + gas; this.testMode = testMode; @@ -83,7 +83,7 @@ protected override bool PreExecuteInstruction() return AddGas(OpCodePrices[CurrentContext.CurrentInstruction.OpCode]); } - private static Block CreateDummyBlock(Snapshot snapshot) + private static Block CreateDummyBlock(View snapshot) { var currentBlock = snapshot.Blocks[snapshot.CurrentBlockHash]; return new Block @@ -104,7 +104,7 @@ private static Block CreateDummyBlock(Snapshot snapshot) }; } - public static ApplicationEngine Run(byte[] script, Snapshot snapshot, + public static ApplicationEngine Run(byte[] script, View snapshot, IVerifiable container = null, Block persistingBlock = null, bool testMode = false, long extraGAS = default) { snapshot.PersistingBlock = persistingBlock ?? snapshot.PersistingBlock ?? CreateDummyBlock(snapshot); @@ -116,7 +116,7 @@ private static Block CreateDummyBlock(Snapshot snapshot) public static ApplicationEngine Run(byte[] script, IVerifiable container = null, Block persistingBlock = null, bool testMode = false, long extraGAS = default) { - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) { return Run(script, snapshot, container, persistingBlock, testMode, extraGAS); } diff --git a/neo/SmartContract/ContractParametersContext.cs b/neo/SmartContract/ContractParametersContext.cs index 327c8b1ef8..4465e7831e 100644 --- a/neo/SmartContract/ContractParametersContext.cs +++ b/neo/SmartContract/ContractParametersContext.cs @@ -94,7 +94,7 @@ public IReadOnlyList ScriptHashes return _ScriptHashes; } - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) { _ScriptHashes = Verifiable.GetScriptHashesForVerifying(snapshot); } diff --git a/neo/SmartContract/Helper.cs b/neo/SmartContract/Helper.cs index 4f7e320c37..d5e7c2c351 100644 --- a/neo/SmartContract/Helper.cs +++ b/neo/SmartContract/Helper.cs @@ -254,7 +254,7 @@ public static UInt160 ToScriptHash(this byte[] script) return new UInt160(Crypto.Default.Hash160(script)); } - internal static bool VerifyWitnesses(this IVerifiable verifiable, Snapshot snapshot, long gas) + internal static bool VerifyWitnesses(this IVerifiable verifiable, SnapshotView snapshot, long gas) { if (gas < 0) return false; diff --git a/neo/SmartContract/Iterators/StorageIterator.cs b/neo/SmartContract/Iterators/StorageIterator.cs index 45c9d21ebd..ece20162f6 100644 --- a/neo/SmartContract/Iterators/StorageIterator.cs +++ b/neo/SmartContract/Iterators/StorageIterator.cs @@ -6,9 +6,9 @@ namespace Neo.SmartContract.Iterators { internal class StorageIterator : IIterator { - private readonly IEnumerator> enumerator; + private readonly IEnumerator<(StorageKey Key, StorageItem Value)> enumerator; - public StorageIterator(IEnumerator> enumerator) + public StorageIterator(IEnumerator<(StorageKey, StorageItem)> enumerator) { this.enumerator = enumerator; } diff --git a/neo/SmartContract/Native/PolicyContract.cs b/neo/SmartContract/Native/PolicyContract.cs index 3ffe8199e5..17828e30a4 100644 --- a/neo/SmartContract/Native/PolicyContract.cs +++ b/neo/SmartContract/Native/PolicyContract.cs @@ -28,7 +28,7 @@ public PolicyContract() Manifest.Features = ContractFeatures.HasStorage; } - internal bool CheckPolicy(Transaction tx, Snapshot snapshot) + internal bool CheckPolicy(Transaction tx, SnapshotView snapshot) { UInt160[] blockedAccounts = GetBlockedAccounts(snapshot); if (blockedAccounts.Intersect(tx.GetScriptHashesForVerifying(snapshot)).Any()) @@ -71,7 +71,7 @@ private StackItem GetMaxTransactionsPerBlock(ApplicationEngine engine, VMArray a return GetMaxTransactionsPerBlock(engine.Snapshot); } - public uint GetMaxTransactionsPerBlock(Snapshot snapshot) + public uint GetMaxTransactionsPerBlock(View snapshot) { return BitConverter.ToUInt32(snapshot.Storages[CreateStorageKey(Prefix_MaxTransactionsPerBlock)].Value, 0); } @@ -82,7 +82,7 @@ private StackItem GetMaxBlockSize(ApplicationEngine engine, VMArray args) return GetMaxBlockSize(engine.Snapshot); } - public uint GetMaxBlockSize(Snapshot snapshot) + public uint GetMaxBlockSize(View snapshot) { return BitConverter.ToUInt32(snapshot.Storages[CreateStorageKey(Prefix_MaxBlockSize)].Value, 0); } @@ -93,7 +93,7 @@ private StackItem GetFeePerByte(ApplicationEngine engine, VMArray args) return GetFeePerByte(engine.Snapshot); } - public long GetFeePerByte(Snapshot snapshot) + public long GetFeePerByte(View snapshot) { return BitConverter.ToInt64(snapshot.Storages[CreateStorageKey(Prefix_FeePerByte)].Value, 0); } @@ -104,7 +104,7 @@ private StackItem GetBlockedAccounts(ApplicationEngine engine, VMArray args) return GetBlockedAccounts(engine.Snapshot).Select(p => (StackItem)p.ToArray()).ToList(); } - public UInt160[] GetBlockedAccounts(Snapshot snapshot) + public UInt160[] GetBlockedAccounts(View snapshot) { return snapshot.Storages[CreateStorageKey(Prefix_BlockedAccounts)].Value.AsSerializableArray(); } diff --git a/neo/SmartContract/Native/Tokens/GasToken.cs b/neo/SmartContract/Native/Tokens/GasToken.cs index 7ef522dab7..c368cd0ac0 100644 --- a/neo/SmartContract/Native/Tokens/GasToken.cs +++ b/neo/SmartContract/Native/Tokens/GasToken.cs @@ -59,7 +59,7 @@ private StackItem GetSysFeeAmount(ApplicationEngine engine, VMArray args) return GetSysFeeAmount(engine.Snapshot, index); } - public BigInteger GetSysFeeAmount(Snapshot snapshot, uint index) + public BigInteger GetSysFeeAmount(View snapshot, uint index) { if (index == 0) return Blockchain.GenesisBlock.Transactions.Sum(p => p.SystemFee); StorageKey key = CreateStorageKey(Prefix_SystemFeeAmount, BitConverter.GetBytes(index)); diff --git a/neo/SmartContract/Native/Tokens/NeoToken.cs b/neo/SmartContract/Native/Tokens/NeoToken.cs index 7b28bd0923..614fbdf025 100644 --- a/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -33,7 +33,7 @@ internal NeoToken() this.TotalAmount = 100000000 * Factor; } - public override BigInteger TotalSupply(Snapshot snapshot) + public override BigInteger TotalSupply(View snapshot) { return TotalAmount; } @@ -64,7 +64,7 @@ private void DistributeGas(ApplicationEngine engine, UInt160 account, AccountSta engine.Snapshot.Storages.GetAndChange(CreateAccountKey(account)).Value = state.ToByteArray(); } - private BigInteger CalculateBonus(Snapshot snapshot, BigInteger value, uint start, uint end) + private BigInteger CalculateBonus(View snapshot, BigInteger value, uint start, uint end) { if (value.IsZero || start >= end) return BigInteger.Zero; if (value.Sign < 0) throw new ArgumentOutOfRangeException(nameof(value)); @@ -124,7 +124,7 @@ private StackItem UnclaimedGas(ApplicationEngine engine, VMArray args) return UnclaimedGas(engine.Snapshot, account, end); } - public BigInteger UnclaimedGas(Snapshot snapshot, UInt160 account, uint end) + public BigInteger UnclaimedGas(View snapshot, UInt160 account, uint end) { StorageItem storage = snapshot.Storages.TryGet(CreateAccountKey(account)); if (storage is null) return BigInteger.Zero; @@ -139,7 +139,7 @@ private StackItem RegisterValidator(ApplicationEngine engine, VMArray args) return RegisterValidator(engine.Snapshot, pubkey); } - private bool RegisterValidator(Snapshot snapshot, ECPoint pubkey) + private bool RegisterValidator(View snapshot, ECPoint pubkey) { StorageKey key = CreateStorageKey(Prefix_Validator, pubkey); if (snapshot.Storages.TryGet(key) != null) return false; @@ -199,7 +199,7 @@ private StackItem GetRegisteredValidators(ApplicationEngine engine, VMArray args return GetRegisteredValidators(engine.Snapshot).Select(p => new Struct(new StackItem[] { p.PublicKey.ToArray(), p.Votes })).ToArray(); } - public IEnumerable<(ECPoint PublicKey, BigInteger Votes)> GetRegisteredValidators(Snapshot snapshot) + public IEnumerable<(ECPoint PublicKey, BigInteger Votes)> GetRegisteredValidators(View snapshot) { byte[] prefix_key = StorageKey.CreateSearchPrefix(Hash, new[] { Prefix_Validator }); return snapshot.Storages.Find(prefix_key).Select(p => @@ -215,7 +215,7 @@ private StackItem GetValidators(ApplicationEngine engine, VMArray args) return GetValidators(engine.Snapshot).Select(p => (StackItem)p.ToArray()).ToList(); } - public ECPoint[] GetValidators(Snapshot snapshot) + public ECPoint[] GetValidators(View snapshot) { StorageItem storage_count = snapshot.Storages.TryGet(CreateStorageKey(Prefix_ValidatorsCount)); if (storage_count is null) return Blockchain.StandbyValidators; @@ -240,7 +240,7 @@ private StackItem GetNextBlockValidators(ApplicationEngine engine, VMArray args) return GetNextBlockValidators(engine.Snapshot).Select(p => (StackItem)p.ToArray()).ToList(); } - public ECPoint[] GetNextBlockValidators(Snapshot snapshot) + public ECPoint[] GetNextBlockValidators(View snapshot) { StorageItem storage = snapshot.Storages.TryGet(CreateStorageKey(Prefix_NextValidators)); if (storage is null) return Blockchain.StandbyValidators; diff --git a/neo/SmartContract/Native/Tokens/Nep5Token.cs b/neo/SmartContract/Native/Tokens/Nep5Token.cs index a95885a665..f9468bbd6a 100644 --- a/neo/SmartContract/Native/Tokens/Nep5Token.cs +++ b/neo/SmartContract/Native/Tokens/Nep5Token.cs @@ -137,7 +137,7 @@ protected StackItem TotalSupply(ApplicationEngine engine, VMArray args) return TotalSupply(engine.Snapshot); } - public virtual BigInteger TotalSupply(Snapshot snapshot) + public virtual BigInteger TotalSupply(View snapshot) { StorageItem storage = snapshot.Storages.TryGet(CreateStorageKey(Prefix_TotalSupply)); if (storage is null) return BigInteger.Zero; @@ -150,7 +150,7 @@ protected StackItem BalanceOf(ApplicationEngine engine, VMArray args) return BalanceOf(engine.Snapshot, new UInt160(args[0].GetByteArray())); } - public virtual BigInteger BalanceOf(Snapshot snapshot, UInt160 account) + public virtual BigInteger BalanceOf(View snapshot, UInt160 account) { StorageItem storage = snapshot.Storages.TryGet(CreateAccountKey(account)); if (storage is null) return BigInteger.Zero; diff --git a/neo/Wallets/Wallet.cs b/neo/Wallets/Wallet.cs index bc52b9b368..2583086d25 100644 --- a/neo/Wallets/Wallet.cs +++ b/neo/Wallets/Wallet.cs @@ -221,7 +221,7 @@ public Transaction MakeTransaction(TransferOutput[] outputs, UInt160 from = null throw new ArgumentException($"The address {from.ToString()} was not found in the wallet"); accounts = new[] { from }; } - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) { HashSet cosignerList = new HashSet(); byte[] script; @@ -290,14 +290,14 @@ public Transaction MakeTransaction(byte[] script, UInt160 sender = null, Transac throw new ArgumentException($"The address {sender.ToString()} was not found in the wallet"); accounts = new[] { sender }; } - using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) + using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) { var balances_gas = accounts.Select(p => (Account: p, Value: NativeContract.GAS.BalanceOf(snapshot, p))).Where(p => p.Value.Sign > 0).ToList(); return MakeTransaction(snapshot, script, attributes ?? new TransactionAttribute[0], cosigners ?? new Cosigner[0], balances_gas); } } - private Transaction MakeTransaction(Snapshot snapshot, byte[] script, TransactionAttribute[] attributes, Cosigner[] cosigners, List<(UInt160 Account, BigInteger Value)> balances_gas) + private Transaction MakeTransaction(SnapshotView snapshot, byte[] script, TransactionAttribute[] attributes, Cosigner[] cosigners, List<(UInt160 Account, BigInteger Value)> balances_gas) { Random rand = new Random(); foreach (var (account, value) in balances_gas) From ea23b29f96e218060592db97dc09f8e78b8d744c Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 19 Nov 2019 12:50:38 +0800 Subject: [PATCH 2/8] Rename --- .../Extensions/NativeContractExtensions.cs | 4 +-- .../Nep5NativeContractExtensions.cs | 8 +++--- neo.UnitTests/Ledger/UT_Blockchain.cs | 4 +-- neo.UnitTests/Ledger/UT_MemoryPool.cs | 4 +-- neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs | 4 +-- .../Native/Tokens/UT_NeoToken.cs | 26 +++++++++---------- .../SmartContract/Native/UT_PolicyContract.cs | 2 +- .../SmartContract/UT_ApplicationEngine.cs | 4 +-- neo.UnitTests/TestVerifiable.cs | 2 +- neo/Ledger/MemoryPool.cs | 8 +++--- neo/Network/P2P/Payloads/BlockBase.cs | 4 +-- neo/Network/P2P/Payloads/ConsensusPayload.cs | 4 +-- neo/Network/P2P/Payloads/IInventory.cs | 2 +- neo/Network/P2P/Payloads/IVerifiable.cs | 2 +- neo/Network/P2P/Payloads/Transaction.cs | 8 +++--- neo/Network/RPC/RpcServer.cs | 2 +- neo/Persistence/ClonedView.cs | 4 +-- neo/Persistence/RawView.cs | 2 +- neo/Persistence/SnapshotView.cs | 2 +- neo/Persistence/{View.cs => StoreView.cs} | 4 +-- neo/Plugins/IPersistencePlugin.cs | 4 +-- neo/SmartContract/ApplicationEngine.cs | 8 +++--- neo/SmartContract/Helper.cs | 2 +- neo/SmartContract/Native/PolicyContract.cs | 10 +++---- neo/SmartContract/Native/Tokens/GasToken.cs | 2 +- neo/SmartContract/Native/Tokens/NeoToken.cs | 14 +++++----- neo/SmartContract/Native/Tokens/Nep5Token.cs | 4 +-- neo/Wallets/Wallet.cs | 2 +- 28 files changed, 73 insertions(+), 73 deletions(-) rename neo/Persistence/{View.cs => StoreView.cs} (97%) diff --git a/neo.UnitTests/Extensions/NativeContractExtensions.cs b/neo.UnitTests/Extensions/NativeContractExtensions.cs index 944e22ede8..e2408ce392 100644 --- a/neo.UnitTests/Extensions/NativeContractExtensions.cs +++ b/neo.UnitTests/Extensions/NativeContractExtensions.cs @@ -9,12 +9,12 @@ namespace Neo.UnitTests.Extensions { public static class NativeContractExtensions { - public static StackItem Call(this NativeContract contract, SnapshotView snapshot, string method, params ContractParameter[] args) + public static StackItem Call(this NativeContract contract, StoreView snapshot, string method, params ContractParameter[] args) { return Call(contract, snapshot, null, method, args); } - public static StackItem Call(this NativeContract contract, SnapshotView snapshot, IVerifiable container, string method, params ContractParameter[] args) + public static StackItem Call(this NativeContract contract, StoreView snapshot, IVerifiable container, string method, params ContractParameter[] args) { var engine = new ApplicationEngine(TriggerType.Application, container, snapshot, 0, true); diff --git a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs b/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs index b5608569dd..028d2932c1 100644 --- a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs +++ b/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs @@ -35,14 +35,14 @@ public ManualWitness(params UInt160[] hashForVerify) public void DeserializeUnsigned(BinaryReader reader) { } - public UInt160[] GetScriptHashesForVerifying(View snapshot) => _hashForVerify; + public UInt160[] GetScriptHashesForVerifying(StoreView snapshot) => _hashForVerify; public void Serialize(BinaryWriter writer) { } public void SerializeUnsigned(BinaryWriter writer) { } } - public static bool Transfer(this NativeContract contract, SnapshotView snapshot, byte[] from, byte[] to, BigInteger amount, bool signFrom) + public static bool Transfer(this NativeContract contract, StoreView snapshot, byte[] from, byte[] to, BigInteger amount, bool signFrom) { var engine = new ApplicationEngine(TriggerType.Application, new ManualWitness(signFrom ? new UInt160(from) : null), snapshot, 0, true); @@ -91,7 +91,7 @@ public static string[] SupportedStandards(this NativeContract contract) .ToArray(); } - public static BigInteger TotalSupply(this NativeContract contract, SnapshotView snapshot) + public static BigInteger TotalSupply(this NativeContract contract, StoreView snapshot) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); @@ -111,7 +111,7 @@ public static BigInteger TotalSupply(this NativeContract contract, SnapshotView return (result as VM.Types.Integer).GetBigInteger(); } - public static BigInteger BalanceOf(this NativeContract contract, SnapshotView snapshot, byte[] account) + public static BigInteger BalanceOf(this NativeContract contract, StoreView snapshot, byte[] account) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); diff --git a/neo.UnitTests/Ledger/UT_Blockchain.cs b/neo.UnitTests/Ledger/UT_Blockchain.cs index d885584801..27dd15b6aa 100644 --- a/neo.UnitTests/Ledger/UT_Blockchain.cs +++ b/neo.UnitTests/Ledger/UT_Blockchain.cs @@ -9,7 +9,7 @@ namespace Neo.UnitTests.Ledger { internal class TestBlock : Block { - public override bool Verify(SnapshotView snapshot) + public override bool Verify(StoreView snapshot) { return true; } @@ -22,7 +22,7 @@ public static TestBlock Cast(Block input) internal class TestHeader : Header { - public override bool Verify(SnapshotView snapshot) + public override bool Verify(StoreView snapshot) { return true; } diff --git a/neo.UnitTests/Ledger/UT_MemoryPool.cs b/neo.UnitTests/Ledger/UT_MemoryPool.cs index b30e1debf7..77bbca4ecb 100644 --- a/neo.UnitTests/Ledger/UT_MemoryPool.cs +++ b/neo.UnitTests/Ledger/UT_MemoryPool.cs @@ -73,8 +73,8 @@ private Transaction CreateTransactionWithFee(long fee) var randomBytes = new byte[16]; random.NextBytes(randomBytes); Mock mock = new Mock(); - mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); - mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); mock.Object.Script = randomBytes; mock.Object.Sender = UInt160.Zero; mock.Object.NetworkFee = fee; diff --git a/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs b/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs index e9a2be5d16..ac5cf57b7c 100644 --- a/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs +++ b/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs @@ -18,8 +18,8 @@ private Transaction CreateTransactionWithFee(long networkFee, long systemFee) var randomBytes = new byte[16]; random.NextBytes(randomBytes); Mock mock = new Mock(); - mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); - mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); mock.Object.Script = randomBytes; mock.Object.Sender = UInt160.Zero; mock.Object.NetworkFee = networkFee; diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs index 4abc800094..fc0690efcb 100644 --- a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -249,7 +249,7 @@ public void Check_BadScript() [TestMethod] public void TestCalculateBonus() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); StorageKey key = CreateStorageKey(20, UInt160.Zero.ToArray()); snapshot.Storages.Add(key, new StorageItem { @@ -292,7 +292,7 @@ public void TestGetNextBlockValidators1() [TestMethod] public void TestGetNextBlockValidators2() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var result = NativeContract.NEO.GetNextBlockValidators(snapshot); result.Length.Should().Be(7); result[0].ToArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); @@ -340,7 +340,7 @@ public void TestGetRegisteredValidators1() [TestMethod] public void TestGetRegisteredValidators2() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var result = NativeContract.NEO.GetRegisteredValidators(snapshot).ToArray(); result.Length.Should().Be(7); result[0].PublicKey.ToArray().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); @@ -387,7 +387,7 @@ public void TestGetValidators1() [TestMethod] public void TestGetValidators2() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var result = NativeContract.NEO.GetValidators(snapshot); result[0].ToArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); result[1].ToArray().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); @@ -413,7 +413,7 @@ public void TestGetValidators2() [TestMethod] public void TestInitialize() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); var engine = new ApplicationEngine(TriggerType.System, null, snapshot, 0, true); Action action = () => NativeContract.NEO.Initialize(engine); action.Should().Throw(); @@ -446,14 +446,14 @@ public void TestOnBalanceChanging() [TestMethod] public void TestTotalSupply() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); NativeContract.NEO.TotalSupply(snapshot).Should().Be(new BigInteger(100000000)); } [TestMethod] public void TestUnclaimedGas() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); NativeContract.NEO.UnclaimedGas(snapshot, UInt160.Zero, 10).Should().Be(new BigInteger(0)); snapshot.Storages.Add(CreateStorageKey(20, UInt160.Zero.ToArray()), new StorageItem { @@ -465,7 +465,7 @@ public void TestUnclaimedGas() [TestMethod] public void TestVote() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); UInt160 account = UInt160.Parse("01ff00ff00ff00ff00ff00ff00ff00ff00ff00a4"); StorageKey keyAccount = CreateStorageKey(20, account.ToArray()); StorageKey keyValidator = CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()); @@ -527,7 +527,7 @@ public void TestValidatorState_ToByteArray() internal (bool State, bool Result) Transfer4TesingOnBalanceChanging(BigInteger amount, bool addVotes) { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); snapshot.PersistingBlock = Blockchain.GenesisBlock; var engine = new ApplicationEngine(TriggerType.Application, Blockchain.GenesisBlock, snapshot, 0, true); ScriptBuilder sb = new ScriptBuilder(); @@ -577,7 +577,7 @@ public void TestValidatorState_ToByteArray() return (true, (result as VM.Types.Boolean).GetBoolean()); } - internal static (bool State, bool Result) Check_Vote(SnapshotView snapshot, byte[] account, byte[][] pubkeys, bool signAccount) + internal static (bool State, bool Result) Check_Vote(StoreView snapshot, byte[] account, byte[][] pubkeys, bool signAccount) { var engine = new ApplicationEngine(TriggerType.Application, new Nep5NativeContractExtensions.ManualWitness(signAccount ? new UInt160(account) : UInt160.Zero), snapshot, 0, true); @@ -607,7 +607,7 @@ internal static (bool State, bool Result) Check_Vote(SnapshotView snapshot, byte return (true, (result as VM.Types.Boolean).GetBoolean()); } - internal static (bool State, bool Result) Check_RegisterValidator(SnapshotView snapshot, byte[] pubkey) + internal static (bool State, bool Result) Check_RegisterValidator(StoreView snapshot, byte[] pubkey) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); @@ -631,7 +631,7 @@ internal static (bool State, bool Result) Check_RegisterValidator(SnapshotView s return (true, (result as VM.Types.Boolean).GetBoolean()); } - internal static ECPoint[] Check_GetValidators(SnapshotView snapshot) + internal static ECPoint[] Check_GetValidators(StoreView snapshot) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); @@ -651,7 +651,7 @@ internal static ECPoint[] Check_GetValidators(SnapshotView snapshot) return (result as VM.Types.Array).Select(u => u.GetByteArray().AsSerializable()).ToArray(); } - internal static (BigInteger Value, bool State) Check_UnclaimedGas(SnapshotView snapshot, byte[] address) + internal static (BigInteger Value, bool State) Check_UnclaimedGas(StoreView snapshot, byte[] address) { var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); diff --git a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs b/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs index 7c7541c38a..fcca609238 100644 --- a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs +++ b/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs @@ -229,7 +229,7 @@ public void Check_Block_UnblockAccount() public void TestCheckPolicy() { Transaction tx = Blockchain.GenesisBlock.Transactions[0]; - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); StorageKey storageKey = new StorageKey { diff --git a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs b/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs index 3369a9696d..20c0196538 100644 --- a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs +++ b/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs @@ -108,7 +108,7 @@ private void Test_Notify2(object sender, NotifyEventArgs e) [TestMethod] public void TestCreateDummyBlock() { - SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); + var snapshot = Blockchain.Singleton.GetSnapshot(); byte[] SyscallSystemRuntimeCheckWitnessHash = new byte[] { 0x68, 0xf8, 0x27, 0xec, 0x8c }; ApplicationEngine.Run(SyscallSystemRuntimeCheckWitnessHash, snapshot); snapshot.PersistingBlock.Version.Should().Be(0); @@ -140,7 +140,7 @@ private static bool Blockchain_GetHeight(ApplicationEngine engine) public class TestApplicationEngine : ApplicationEngine { - public TestApplicationEngine(TriggerType trigger, IVerifiable container, SnapshotView snapshot, long gas, bool testMode = false) : base(trigger, container, snapshot, gas, testMode) + public TestApplicationEngine(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas, bool testMode = false) : base(trigger, container, snapshot, gas, testMode) { } diff --git a/neo.UnitTests/TestVerifiable.cs b/neo.UnitTests/TestVerifiable.cs index e497ad95e1..7959eeec3b 100644 --- a/neo.UnitTests/TestVerifiable.cs +++ b/neo.UnitTests/TestVerifiable.cs @@ -27,7 +27,7 @@ public void DeserializeUnsigned(BinaryReader reader) throw new NotImplementedException(); } - public UInt160[] GetScriptHashesForVerifying(View snapshot) + public UInt160[] GetScriptHashesForVerifying(StoreView snapshot) { throw new NotImplementedException(); } diff --git a/neo/Ledger/MemoryPool.cs b/neo/Ledger/MemoryPool.cs index c574743719..184c8cf578 100644 --- a/neo/Ledger/MemoryPool.cs +++ b/neo/Ledger/MemoryPool.cs @@ -105,7 +105,7 @@ public MemoryPool(NeoSystem system, int capacity) Capacity = capacity; } - internal bool LoadPolicy(SnapshotView snapshot) + internal bool LoadPolicy(StoreView snapshot) { _maxTxPerBlock = (int)NativeContract.Policy.GetMaxTransactionsPerBlock(snapshot); long newFeePerByte = NativeContract.Policy.GetFeePerByte(snapshot); @@ -348,7 +348,7 @@ internal void InvalidateVerifiedTransactions() } // Note: this must only be called from a single thread (the Blockchain actor) - internal void UpdatePoolForBlockPersisted(Block block, SnapshotView snapshot) + internal void UpdatePoolForBlockPersisted(Block block, StoreView snapshot) { bool policyChanged = LoadPolicy(snapshot); @@ -407,7 +407,7 @@ internal void InvalidateAllTransactions() } private int ReverifyTransactions(SortedSet verifiedSortedTxPool, - SortedSet unverifiedSortedTxPool, int count, double millisecondsTimeout, SnapshotView snapshot) + SortedSet unverifiedSortedTxPool, int count, double millisecondsTimeout, StoreView snapshot) { DateTime reverifyCutOffTimeStamp = DateTime.UtcNow.AddMilliseconds(millisecondsTimeout); List reverifiedItems = new List(count); @@ -479,7 +479,7 @@ internal void InvalidateAllTransactions() /// Max transactions to reverify, the value passed can be >=1 /// The snapshot to use for verifying. /// true if more unsorted messages exist, otherwise false - internal bool ReVerifyTopUnverifiedTransactionsIfNeeded(int maxToVerify, SnapshotView snapshot) + internal bool ReVerifyTopUnverifiedTransactionsIfNeeded(int maxToVerify, StoreView snapshot) { if (Blockchain.Singleton.Height < Blockchain.Singleton.HeaderHeight) return false; diff --git a/neo/Network/P2P/Payloads/BlockBase.cs b/neo/Network/P2P/Payloads/BlockBase.cs index 6c7b324fb9..37ab7abe66 100644 --- a/neo/Network/P2P/Payloads/BlockBase.cs +++ b/neo/Network/P2P/Payloads/BlockBase.cs @@ -74,7 +74,7 @@ void IVerifiable.DeserializeUnsigned(BinaryReader reader) NextConsensus = reader.ReadSerializable(); } - UInt160[] IVerifiable.GetScriptHashesForVerifying(View snapshot) + UInt160[] IVerifiable.GetScriptHashesForVerifying(StoreView snapshot) { if (PrevHash == UInt256.Zero) return new[] { Witness.ScriptHash }; Header prev_header = snapshot.GetHeader(PrevHash); @@ -124,7 +124,7 @@ public void FromJson(JObject json) Witness = ((JArray)json["witnesses"]).Select(p => Witness.FromJson(p)).FirstOrDefault(); } - public virtual bool Verify(SnapshotView snapshot) + public virtual bool Verify(StoreView snapshot) { Header prev_header = snapshot.GetHeader(PrevHash); if (prev_header == null) return false; diff --git a/neo/Network/P2P/Payloads/ConsensusPayload.cs b/neo/Network/P2P/Payloads/ConsensusPayload.cs index 4eaa55fde7..21730a3470 100644 --- a/neo/Network/P2P/Payloads/ConsensusPayload.cs +++ b/neo/Network/P2P/Payloads/ConsensusPayload.cs @@ -95,7 +95,7 @@ void IVerifiable.DeserializeUnsigned(BinaryReader reader) Data = reader.ReadVarBytes(); } - UInt160[] IVerifiable.GetScriptHashesForVerifying(View snapshot) + UInt160[] IVerifiable.GetScriptHashesForVerifying(StoreView snapshot) { ECPoint[] validators = NativeContract.NEO.GetNextBlockValidators(snapshot); if (validators.Length <= ValidatorIndex) @@ -118,7 +118,7 @@ void IVerifiable.SerializeUnsigned(BinaryWriter writer) writer.WriteVarBytes(Data); } - public bool Verify(SnapshotView snapshot) + public bool Verify(StoreView snapshot) { if (BlockIndex <= snapshot.Height) return false; diff --git a/neo/Network/P2P/Payloads/IInventory.cs b/neo/Network/P2P/Payloads/IInventory.cs index f22b6c6aee..2b175647c5 100644 --- a/neo/Network/P2P/Payloads/IInventory.cs +++ b/neo/Network/P2P/Payloads/IInventory.cs @@ -8,6 +8,6 @@ public interface IInventory : IVerifiable InventoryType InventoryType { get; } - bool Verify(SnapshotView snapshot); + bool Verify(StoreView snapshot); } } diff --git a/neo/Network/P2P/Payloads/IVerifiable.cs b/neo/Network/P2P/Payloads/IVerifiable.cs index dea10592d5..cecd0570da 100644 --- a/neo/Network/P2P/Payloads/IVerifiable.cs +++ b/neo/Network/P2P/Payloads/IVerifiable.cs @@ -10,7 +10,7 @@ public interface IVerifiable : ISerializable void DeserializeUnsigned(BinaryReader reader); - UInt160[] GetScriptHashesForVerifying(View snapshot); + UInt160[] GetScriptHashesForVerifying(StoreView snapshot); void SerializeUnsigned(BinaryWriter writer); } diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/neo/Network/P2P/Payloads/Transaction.cs index aa7c7c0622..6bda3f8c6b 100644 --- a/neo/Network/P2P/Payloads/Transaction.cs +++ b/neo/Network/P2P/Payloads/Transaction.cs @@ -123,14 +123,14 @@ public override int GetHashCode() return Hash.GetHashCode(); } - public UInt160[] GetScriptHashesForVerifying(View snapshot) + public UInt160[] GetScriptHashesForVerifying(StoreView snapshot) { var hashes = new HashSet { Sender }; hashes.UnionWith(Cosigners.Select(p => p.Account)); return hashes.OrderBy(p => p).ToArray(); } - public virtual bool Reverify(SnapshotView snapshot, BigInteger totalSenderFeeFromPool) + public virtual bool Reverify(StoreView snapshot, BigInteger totalSenderFeeFromPool) { if (ValidUntilBlock <= snapshot.Height || ValidUntilBlock > snapshot.Height + MaxValidUntilBlockIncrement) return false; @@ -202,12 +202,12 @@ public static Transaction FromJson(JObject json) return tx; } - bool IInventory.Verify(SnapshotView snapshot) + bool IInventory.Verify(StoreView snapshot) { return Verify(snapshot, BigInteger.Zero); } - public virtual bool Verify(SnapshotView snapshot, BigInteger totalSenderFeeFromPool) + public virtual bool Verify(StoreView snapshot, BigInteger totalSenderFeeFromPool) { if (!Reverify(snapshot, totalSenderFeeFromPool)) return false; int size = Size; diff --git a/neo/Network/RPC/RpcServer.cs b/neo/Network/RPC/RpcServer.cs index 75f641ed15..4e334b811c 100644 --- a/neo/Network/RPC/RpcServer.cs +++ b/neo/Network/RPC/RpcServer.cs @@ -57,7 +57,7 @@ public void DeserializeUnsigned(BinaryReader reader) throw new NotImplementedException(); } - public UInt160[] GetScriptHashesForVerifying(View snapshot) + public UInt160[] GetScriptHashesForVerifying(StoreView snapshot) { return _scriptHashesForVerifying; } diff --git a/neo/Persistence/ClonedView.cs b/neo/Persistence/ClonedView.cs index dee716a7a4..927207d6a1 100644 --- a/neo/Persistence/ClonedView.cs +++ b/neo/Persistence/ClonedView.cs @@ -4,7 +4,7 @@ namespace Neo.Persistence { - internal class ClonedView : View + internal class ClonedView : StoreView { public override DataCache Blocks { get; } public override DataCache Transactions { get; } @@ -14,7 +14,7 @@ internal class ClonedView : View public override MetaDataCache BlockHashIndex { get; } public override MetaDataCache HeaderHashIndex { get; } - public ClonedView(View view) + public ClonedView(StoreView view) { this.PersistingBlock = view.PersistingBlock; this.Blocks = view.Blocks.CreateSnapshot(); diff --git a/neo/Persistence/RawView.cs b/neo/Persistence/RawView.cs index 55dcdf3686..0ce1ceba32 100644 --- a/neo/Persistence/RawView.cs +++ b/neo/Persistence/RawView.cs @@ -5,7 +5,7 @@ namespace Neo.Persistence { - public class RawView : View + public class RawView : StoreView { private readonly IReadOnlyStore store; diff --git a/neo/Persistence/SnapshotView.cs b/neo/Persistence/SnapshotView.cs index e2c4247583..c58c373a74 100644 --- a/neo/Persistence/SnapshotView.cs +++ b/neo/Persistence/SnapshotView.cs @@ -5,7 +5,7 @@ namespace Neo.Persistence { - public class SnapshotView : View, IDisposable + public class SnapshotView : StoreView, IDisposable { private readonly ISnapshot snapshot; diff --git a/neo/Persistence/View.cs b/neo/Persistence/StoreView.cs similarity index 97% rename from neo/Persistence/View.cs rename to neo/Persistence/StoreView.cs index 1a40cf3df7..0fd9cfa39f 100644 --- a/neo/Persistence/View.cs +++ b/neo/Persistence/StoreView.cs @@ -5,7 +5,7 @@ namespace Neo.Persistence { - public abstract class View + public abstract class StoreView { public Block PersistingBlock { get; internal set; } public abstract DataCache Blocks { get; } @@ -21,7 +21,7 @@ public abstract class View public UInt256 CurrentBlockHash => BlockHashIndex.Get().Hash; public UInt256 CurrentHeaderHash => HeaderHashIndex.Get().Hash; - public View Clone() + public StoreView Clone() { return new ClonedView(this); } diff --git a/neo/Plugins/IPersistencePlugin.cs b/neo/Plugins/IPersistencePlugin.cs index 606443305a..14a3316115 100644 --- a/neo/Plugins/IPersistencePlugin.cs +++ b/neo/Plugins/IPersistencePlugin.cs @@ -7,8 +7,8 @@ namespace Neo.Plugins { public interface IPersistencePlugin { - void OnPersist(SnapshotView snapshot, IReadOnlyList applicationExecutedList); - void OnCommit(SnapshotView snapshot); + void OnPersist(StoreView snapshot, IReadOnlyList applicationExecutedList); + void OnCommit(StoreView snapshot); bool ShouldThrowExceptionFromCommit(Exception ex); } } diff --git a/neo/SmartContract/ApplicationEngine.cs b/neo/SmartContract/ApplicationEngine.cs index 8fdaebc7a4..c923ecadaf 100644 --- a/neo/SmartContract/ApplicationEngine.cs +++ b/neo/SmartContract/ApplicationEngine.cs @@ -20,7 +20,7 @@ public partial class ApplicationEngine : ExecutionEngine public TriggerType Trigger { get; } public IVerifiable ScriptContainer { get; } - public View Snapshot { get; } + public StoreView Snapshot { get; } public long GasConsumed { get; private set; } = 0; public UInt160 CurrentScriptHash => CurrentContext?.GetState().ScriptHash; public UInt160 CallingScriptHash => InvocationStack.Count > 1 ? InvocationStack.Peek(1).GetState().ScriptHash : null; @@ -28,7 +28,7 @@ public partial class ApplicationEngine : ExecutionEngine public IReadOnlyList Notifications => notifications; internal Dictionary InvocationCounter { get; } = new Dictionary(); - public ApplicationEngine(TriggerType trigger, IVerifiable container, View snapshot, long gas, bool testMode = false) + public ApplicationEngine(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas, bool testMode = false) { this.gas_amount = GasFree + gas; this.testMode = testMode; @@ -83,7 +83,7 @@ protected override bool PreExecuteInstruction() return AddGas(OpCodePrices[CurrentContext.CurrentInstruction.OpCode]); } - private static Block CreateDummyBlock(View snapshot) + private static Block CreateDummyBlock(StoreView snapshot) { var currentBlock = snapshot.Blocks[snapshot.CurrentBlockHash]; return new Block @@ -104,7 +104,7 @@ private static Block CreateDummyBlock(View snapshot) }; } - public static ApplicationEngine Run(byte[] script, View snapshot, + public static ApplicationEngine Run(byte[] script, StoreView snapshot, IVerifiable container = null, Block persistingBlock = null, bool testMode = false, long extraGAS = default) { snapshot.PersistingBlock = persistingBlock ?? snapshot.PersistingBlock ?? CreateDummyBlock(snapshot); diff --git a/neo/SmartContract/Helper.cs b/neo/SmartContract/Helper.cs index d5e7c2c351..d01c00e2fe 100644 --- a/neo/SmartContract/Helper.cs +++ b/neo/SmartContract/Helper.cs @@ -254,7 +254,7 @@ public static UInt160 ToScriptHash(this byte[] script) return new UInt160(Crypto.Default.Hash160(script)); } - internal static bool VerifyWitnesses(this IVerifiable verifiable, SnapshotView snapshot, long gas) + internal static bool VerifyWitnesses(this IVerifiable verifiable, StoreView snapshot, long gas) { if (gas < 0) return false; diff --git a/neo/SmartContract/Native/PolicyContract.cs b/neo/SmartContract/Native/PolicyContract.cs index 17828e30a4..c1ed1fe250 100644 --- a/neo/SmartContract/Native/PolicyContract.cs +++ b/neo/SmartContract/Native/PolicyContract.cs @@ -28,7 +28,7 @@ public PolicyContract() Manifest.Features = ContractFeatures.HasStorage; } - internal bool CheckPolicy(Transaction tx, SnapshotView snapshot) + internal bool CheckPolicy(Transaction tx, StoreView snapshot) { UInt160[] blockedAccounts = GetBlockedAccounts(snapshot); if (blockedAccounts.Intersect(tx.GetScriptHashesForVerifying(snapshot)).Any()) @@ -71,7 +71,7 @@ private StackItem GetMaxTransactionsPerBlock(ApplicationEngine engine, VMArray a return GetMaxTransactionsPerBlock(engine.Snapshot); } - public uint GetMaxTransactionsPerBlock(View snapshot) + public uint GetMaxTransactionsPerBlock(StoreView snapshot) { return BitConverter.ToUInt32(snapshot.Storages[CreateStorageKey(Prefix_MaxTransactionsPerBlock)].Value, 0); } @@ -82,7 +82,7 @@ private StackItem GetMaxBlockSize(ApplicationEngine engine, VMArray args) return GetMaxBlockSize(engine.Snapshot); } - public uint GetMaxBlockSize(View snapshot) + public uint GetMaxBlockSize(StoreView snapshot) { return BitConverter.ToUInt32(snapshot.Storages[CreateStorageKey(Prefix_MaxBlockSize)].Value, 0); } @@ -93,7 +93,7 @@ private StackItem GetFeePerByte(ApplicationEngine engine, VMArray args) return GetFeePerByte(engine.Snapshot); } - public long GetFeePerByte(View snapshot) + public long GetFeePerByte(StoreView snapshot) { return BitConverter.ToInt64(snapshot.Storages[CreateStorageKey(Prefix_FeePerByte)].Value, 0); } @@ -104,7 +104,7 @@ private StackItem GetBlockedAccounts(ApplicationEngine engine, VMArray args) return GetBlockedAccounts(engine.Snapshot).Select(p => (StackItem)p.ToArray()).ToList(); } - public UInt160[] GetBlockedAccounts(View snapshot) + public UInt160[] GetBlockedAccounts(StoreView snapshot) { return snapshot.Storages[CreateStorageKey(Prefix_BlockedAccounts)].Value.AsSerializableArray(); } diff --git a/neo/SmartContract/Native/Tokens/GasToken.cs b/neo/SmartContract/Native/Tokens/GasToken.cs index c368cd0ac0..6b5901185e 100644 --- a/neo/SmartContract/Native/Tokens/GasToken.cs +++ b/neo/SmartContract/Native/Tokens/GasToken.cs @@ -59,7 +59,7 @@ private StackItem GetSysFeeAmount(ApplicationEngine engine, VMArray args) return GetSysFeeAmount(engine.Snapshot, index); } - public BigInteger GetSysFeeAmount(View snapshot, uint index) + public BigInteger GetSysFeeAmount(StoreView snapshot, uint index) { if (index == 0) return Blockchain.GenesisBlock.Transactions.Sum(p => p.SystemFee); StorageKey key = CreateStorageKey(Prefix_SystemFeeAmount, BitConverter.GetBytes(index)); diff --git a/neo/SmartContract/Native/Tokens/NeoToken.cs b/neo/SmartContract/Native/Tokens/NeoToken.cs index 614fbdf025..d881c348da 100644 --- a/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -33,7 +33,7 @@ internal NeoToken() this.TotalAmount = 100000000 * Factor; } - public override BigInteger TotalSupply(View snapshot) + public override BigInteger TotalSupply(StoreView snapshot) { return TotalAmount; } @@ -64,7 +64,7 @@ private void DistributeGas(ApplicationEngine engine, UInt160 account, AccountSta engine.Snapshot.Storages.GetAndChange(CreateAccountKey(account)).Value = state.ToByteArray(); } - private BigInteger CalculateBonus(View snapshot, BigInteger value, uint start, uint end) + private BigInteger CalculateBonus(StoreView snapshot, BigInteger value, uint start, uint end) { if (value.IsZero || start >= end) return BigInteger.Zero; if (value.Sign < 0) throw new ArgumentOutOfRangeException(nameof(value)); @@ -124,7 +124,7 @@ private StackItem UnclaimedGas(ApplicationEngine engine, VMArray args) return UnclaimedGas(engine.Snapshot, account, end); } - public BigInteger UnclaimedGas(View snapshot, UInt160 account, uint end) + public BigInteger UnclaimedGas(StoreView snapshot, UInt160 account, uint end) { StorageItem storage = snapshot.Storages.TryGet(CreateAccountKey(account)); if (storage is null) return BigInteger.Zero; @@ -139,7 +139,7 @@ private StackItem RegisterValidator(ApplicationEngine engine, VMArray args) return RegisterValidator(engine.Snapshot, pubkey); } - private bool RegisterValidator(View snapshot, ECPoint pubkey) + private bool RegisterValidator(StoreView snapshot, ECPoint pubkey) { StorageKey key = CreateStorageKey(Prefix_Validator, pubkey); if (snapshot.Storages.TryGet(key) != null) return false; @@ -199,7 +199,7 @@ private StackItem GetRegisteredValidators(ApplicationEngine engine, VMArray args return GetRegisteredValidators(engine.Snapshot).Select(p => new Struct(new StackItem[] { p.PublicKey.ToArray(), p.Votes })).ToArray(); } - public IEnumerable<(ECPoint PublicKey, BigInteger Votes)> GetRegisteredValidators(View snapshot) + public IEnumerable<(ECPoint PublicKey, BigInteger Votes)> GetRegisteredValidators(StoreView snapshot) { byte[] prefix_key = StorageKey.CreateSearchPrefix(Hash, new[] { Prefix_Validator }); return snapshot.Storages.Find(prefix_key).Select(p => @@ -215,7 +215,7 @@ private StackItem GetValidators(ApplicationEngine engine, VMArray args) return GetValidators(engine.Snapshot).Select(p => (StackItem)p.ToArray()).ToList(); } - public ECPoint[] GetValidators(View snapshot) + public ECPoint[] GetValidators(StoreView snapshot) { StorageItem storage_count = snapshot.Storages.TryGet(CreateStorageKey(Prefix_ValidatorsCount)); if (storage_count is null) return Blockchain.StandbyValidators; @@ -240,7 +240,7 @@ private StackItem GetNextBlockValidators(ApplicationEngine engine, VMArray args) return GetNextBlockValidators(engine.Snapshot).Select(p => (StackItem)p.ToArray()).ToList(); } - public ECPoint[] GetNextBlockValidators(View snapshot) + public ECPoint[] GetNextBlockValidators(StoreView snapshot) { StorageItem storage = snapshot.Storages.TryGet(CreateStorageKey(Prefix_NextValidators)); if (storage is null) return Blockchain.StandbyValidators; diff --git a/neo/SmartContract/Native/Tokens/Nep5Token.cs b/neo/SmartContract/Native/Tokens/Nep5Token.cs index f9468bbd6a..e36f6bb3f4 100644 --- a/neo/SmartContract/Native/Tokens/Nep5Token.cs +++ b/neo/SmartContract/Native/Tokens/Nep5Token.cs @@ -137,7 +137,7 @@ protected StackItem TotalSupply(ApplicationEngine engine, VMArray args) return TotalSupply(engine.Snapshot); } - public virtual BigInteger TotalSupply(View snapshot) + public virtual BigInteger TotalSupply(StoreView snapshot) { StorageItem storage = snapshot.Storages.TryGet(CreateStorageKey(Prefix_TotalSupply)); if (storage is null) return BigInteger.Zero; @@ -150,7 +150,7 @@ protected StackItem BalanceOf(ApplicationEngine engine, VMArray args) return BalanceOf(engine.Snapshot, new UInt160(args[0].GetByteArray())); } - public virtual BigInteger BalanceOf(View snapshot, UInt160 account) + public virtual BigInteger BalanceOf(StoreView snapshot, UInt160 account) { StorageItem storage = snapshot.Storages.TryGet(CreateAccountKey(account)); if (storage is null) return BigInteger.Zero; diff --git a/neo/Wallets/Wallet.cs b/neo/Wallets/Wallet.cs index 2583086d25..f2cf92e7b2 100644 --- a/neo/Wallets/Wallet.cs +++ b/neo/Wallets/Wallet.cs @@ -297,7 +297,7 @@ public Transaction MakeTransaction(byte[] script, UInt160 sender = null, Transac } } - private Transaction MakeTransaction(SnapshotView snapshot, byte[] script, TransactionAttribute[] attributes, Cosigner[] cosigners, List<(UInt160 Account, BigInteger Value)> balances_gas) + private Transaction MakeTransaction(StoreView snapshot, byte[] script, TransactionAttribute[] attributes, Cosigner[] cosigners, List<(UInt160 Account, BigInteger Value)> balances_gas) { Random rand = new Random(); foreach (var (account, value) in balances_gas) From 68daaae40916bee6d7638fc3f41dc23ea760291f Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 19 Nov 2019 22:27:33 +0800 Subject: [PATCH 3/8] Comments --- neo/Persistence/IReadOnlyStore.cs | 3 +++ neo/Persistence/ISnapshot.cs | 3 +++ neo/Persistence/IStore.cs | 3 +++ neo/Persistence/RawView.cs | 3 +++ neo/Persistence/SnapshotView.cs | 3 +++ neo/Persistence/StoreView.cs | 3 +++ 6 files changed, 18 insertions(+) diff --git a/neo/Persistence/IReadOnlyStore.cs b/neo/Persistence/IReadOnlyStore.cs index cac7b8fa0b..7a23bd4c80 100644 --- a/neo/Persistence/IReadOnlyStore.cs +++ b/neo/Persistence/IReadOnlyStore.cs @@ -2,6 +2,9 @@ namespace Neo.Persistence { + /// + /// This interface provides methods to read from the database. + /// public interface IReadOnlyStore { IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix); diff --git a/neo/Persistence/ISnapshot.cs b/neo/Persistence/ISnapshot.cs index 66d00c49b3..335089d4bc 100644 --- a/neo/Persistence/ISnapshot.cs +++ b/neo/Persistence/ISnapshot.cs @@ -2,6 +2,9 @@ namespace Neo.Persistence { + /// + /// This interface provides methods for reading, writing, and committing from/to snapshot. + /// public interface ISnapshot : IDisposable, IReadOnlyStore { void Commit(); diff --git a/neo/Persistence/IStore.cs b/neo/Persistence/IStore.cs index e3d515956d..e91e0b9386 100644 --- a/neo/Persistence/IStore.cs +++ b/neo/Persistence/IStore.cs @@ -2,6 +2,9 @@ namespace Neo.Persistence { + /// + /// This interface provides methods for reading, writing from/to database. Developers should implement this interface to provide new storage engines for NEO. + /// public interface IStore : IDisposable, IReadOnlyStore { void Delete(byte table, byte[] key); diff --git a/neo/Persistence/RawView.cs b/neo/Persistence/RawView.cs index 0ce1ceba32..686dcbe652 100644 --- a/neo/Persistence/RawView.cs +++ b/neo/Persistence/RawView.cs @@ -5,6 +5,9 @@ namespace Neo.Persistence { + /// + /// Provide a read-only for accessing directly from database instead of from snapshot. + /// public class RawView : StoreView { private readonly IReadOnlyStore store; diff --git a/neo/Persistence/SnapshotView.cs b/neo/Persistence/SnapshotView.cs index c58c373a74..5eb9071fe3 100644 --- a/neo/Persistence/SnapshotView.cs +++ b/neo/Persistence/SnapshotView.cs @@ -5,6 +5,9 @@ namespace Neo.Persistence { + /// + /// Provide a for accessing snapshots. + /// public class SnapshotView : StoreView, IDisposable { private readonly ISnapshot snapshot; diff --git a/neo/Persistence/StoreView.cs b/neo/Persistence/StoreView.cs index 0fd9cfa39f..f7dbcd7592 100644 --- a/neo/Persistence/StoreView.cs +++ b/neo/Persistence/StoreView.cs @@ -5,6 +5,9 @@ namespace Neo.Persistence { + /// + /// It provides a set of properties and methods for reading formatted data from the underlying storage. Such as and . + /// public abstract class StoreView { public Block PersistingBlock { get; internal set; } From 0ccdb7be8b293d9279667b194402656a659f95cc Mon Sep 17 00:00:00 2001 From: erikzhang Date: Mon, 25 Nov 2019 01:02:13 +0800 Subject: [PATCH 4/8] fix --- neo.UnitTests/Ledger/UT_MemoryPool.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/neo.UnitTests/Ledger/UT_MemoryPool.cs b/neo.UnitTests/Ledger/UT_MemoryPool.cs index ccef723739..c68504f4c6 100644 --- a/neo.UnitTests/Ledger/UT_MemoryPool.cs +++ b/neo.UnitTests/Ledger/UT_MemoryPool.cs @@ -99,8 +99,8 @@ private Transaction CreateTransactionWithFeeAndBalanceVerify(long fee) random.NextBytes(randomBytes); Mock mock = new Mock(); UInt160 sender = UInt160.Zero; - mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(((Snapshot snapshot, BigInteger amount) => NativeContract.GAS.BalanceOf(snapshot, sender) >= amount + fee)); - mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); + mock.Setup(p => p.Reverify(It.IsAny(), It.IsAny())).Returns(((StoreView snapshot, BigInteger amount) => NativeContract.GAS.BalanceOf(snapshot, sender) >= amount + fee)); + mock.Setup(p => p.Verify(It.IsAny(), It.IsAny())).Returns(true); mock.Object.Script = randomBytes; mock.Object.Sender = sender; mock.Object.NetworkFee = fee; @@ -222,7 +222,7 @@ public void BlockPersistAndReverificationWillAbandonTxAsBalanceTransfered() // Simulate the transfer process in tx by burning the balance UInt160 sender = block.Transactions[0].Sender; - Snapshot snapshot = Blockchain.Singleton.GetSnapshot(); + SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); BigInteger balance = NativeContract.GAS.BalanceOf(snapshot, sender); ApplicationEngine applicationEngine = new ApplicationEngine(TriggerType.All, block, snapshot, (long)balance); From 911dd77e27406d47a3285629faddea4a559590cf Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 26 Nov 2019 00:10:01 +0800 Subject: [PATCH 5/8] move projects --- neo.sln | 20 ++++++++++++++----- {neo => src/neo}/BigDecimal.cs | 0 {neo => src/neo}/Consensus/ChangeView.cs | 0 .../neo}/Consensus/ChangeViewReason.cs | 0 {neo => src/neo}/Consensus/Commit.cs | 0 .../neo}/Consensus/ConsensusContext.cs | 0 .../neo}/Consensus/ConsensusMessage.cs | 0 .../neo}/Consensus/ConsensusMessageType.cs | 0 .../neo}/Consensus/ConsensusService.cs | 0 {neo => src/neo}/Consensus/PrepareRequest.cs | 0 {neo => src/neo}/Consensus/PrepareResponse.cs | 0 ...ecoveryMessage.ChangeViewPayloadCompact.cs | 0 .../RecoveryMessage.CommitPayloadCompact.cs | 0 ...coveryMessage.PreparationPayloadCompact.cs | 0 {neo => src/neo}/Consensus/RecoveryMessage.cs | 0 {neo => src/neo}/Consensus/RecoveryRequest.cs | 0 {neo => src/neo}/Cryptography/Base58.cs | 0 {neo => src/neo}/Cryptography/BloomFilter.cs | 0 {neo => src/neo}/Cryptography/Crypto.cs | 0 {neo => src/neo}/Cryptography/ECC/ECCurve.cs | 0 {neo => src/neo}/Cryptography/ECC/ECDsa.cs | 0 .../neo}/Cryptography/ECC/ECFieldElement.cs | 0 {neo => src/neo}/Cryptography/ECC/ECPoint.cs | 0 {neo => src/neo}/Cryptography/Helper.cs | 0 {neo => src/neo}/Cryptography/MerkleTree.cs | 0 .../neo}/Cryptography/MerkleTreeNode.cs | 0 {neo => src/neo}/Cryptography/Murmur3.cs | 0 .../neo}/Cryptography/RIPEMD160Managed.cs | 0 {neo => src/neo}/Cryptography/SCrypt.cs | 0 {neo => src/neo}/Helper.cs | 0 {neo => src/neo}/IO/Actors/Idle.cs | 0 {neo => src/neo}/IO/Actors/PriorityMailbox.cs | 0 .../neo}/IO/Actors/PriorityMessageQueue.cs | 0 {neo => src/neo}/IO/ByteArrayComparer.cs | 0 {neo => src/neo}/IO/Caching/Cache.cs | 0 {neo => src/neo}/IO/Caching/CloneCache.cs | 0 {neo => src/neo}/IO/Caching/CloneMetaCache.cs | 0 {neo => src/neo}/IO/Caching/DataCache.cs | 0 {neo => src/neo}/IO/Caching/FIFOCache.cs | 0 {neo => src/neo}/IO/Caching/FIFOSet.cs | 0 {neo => src/neo}/IO/Caching/MetaDataCache.cs | 0 .../neo}/IO/Caching/OrderedDictionary.cs | 0 .../neo}/IO/Caching/ReflectionCache.cs | 0 .../IO/Caching/ReflectionCacheAttribute.cs | 0 {neo => src/neo}/IO/Caching/RelayCache.cs | 0 {neo => src/neo}/IO/Caching/TrackState.cs | 0 {neo => src/neo}/IO/Data/LevelDB/DB.cs | 0 {neo => src/neo}/IO/Data/LevelDB/Helper.cs | 0 {neo => src/neo}/IO/Data/LevelDB/Iterator.cs | 0 .../neo}/IO/Data/LevelDB/LevelDBException.cs | 0 {neo => src/neo}/IO/Data/LevelDB/Native.cs | 0 {neo => src/neo}/IO/Data/LevelDB/Options.cs | 0 .../neo}/IO/Data/LevelDB/ReadOptions.cs | 0 {neo => src/neo}/IO/Data/LevelDB/Slice.cs | 0 .../neo}/IO/Data/LevelDB/SliceBuilder.cs | 0 {neo => src/neo}/IO/Data/LevelDB/Snapshot.cs | 0 .../neo}/IO/Data/LevelDB/WriteBatch.cs | 0 .../neo}/IO/Data/LevelDB/WriteOptions.cs | 0 {neo => src/neo}/IO/Helper.cs | 0 {neo => src/neo}/IO/ICloneable.cs | 0 {neo => src/neo}/IO/ISerializable.cs | 0 {neo => src/neo}/IO/Json/JArray.cs | 0 {neo => src/neo}/IO/Json/JBoolean.cs | 0 {neo => src/neo}/IO/Json/JNumber.cs | 0 {neo => src/neo}/IO/Json/JObject.cs | 0 {neo => src/neo}/IO/Json/JString.cs | 0 .../neo}/IO/Wrappers/SerializableWrapper.cs | 0 {neo => src/neo}/IO/Wrappers/UInt32Wrapper.cs | 0 .../Ledger/Blockchain.ApplicationExecuted.cs | 0 {neo => src/neo}/Ledger/Blockchain.cs | 0 {neo => src/neo}/Ledger/ContractState.cs | 0 {neo => src/neo}/Ledger/HashIndexState.cs | 0 {neo => src/neo}/Ledger/HeaderHashList.cs | 0 {neo => src/neo}/Ledger/MemoryPool.cs | 0 {neo => src/neo}/Ledger/PoolItem.cs | 0 {neo => src/neo}/Ledger/RelayResultReason.cs | 0 {neo => src/neo}/Ledger/SendersFeeMonitor.cs | 0 {neo => src/neo}/Ledger/StorageFlags.cs | 0 {neo => src/neo}/Ledger/StorageItem.cs | 0 {neo => src/neo}/Ledger/StorageKey.cs | 0 {neo => src/neo}/Ledger/TransactionState.cs | 0 {neo => src/neo}/Ledger/TrimmedBlock.cs | 0 {neo => src/neo}/NeoSystem.cs | 0 .../P2P/Capabilities/FullNodeCapability.cs | 0 .../P2P/Capabilities/NodeCapability.cs | 0 .../P2P/Capabilities/NodeCapabilityType.cs | 0 .../P2P/Capabilities/ServerCapability.cs | 0 .../neo}/Network/P2P/ChannelsConfig.cs | 0 {neo => src/neo}/Network/P2P/Connection.cs | 0 {neo => src/neo}/Network/P2P/Helper.cs | 0 {neo => src/neo}/Network/P2P/LocalNode.cs | 0 {neo => src/neo}/Network/P2P/Message.cs | 0 .../neo}/Network/P2P/MessageCommand.cs | 0 {neo => src/neo}/Network/P2P/MessageFlags.cs | 0 .../neo}/Network/P2P/Payloads/AddrPayload.cs | 0 .../neo}/Network/P2P/Payloads/Block.cs | 0 .../neo}/Network/P2P/Payloads/BlockBase.cs | 0 .../Network/P2P/Payloads/ConsensusData.cs | 0 .../Network/P2P/Payloads/ConsensusPayload.cs | 0 .../neo}/Network/P2P/Payloads/Cosigner.cs | 0 .../Network/P2P/Payloads/FilterAddPayload.cs | 0 .../Network/P2P/Payloads/FilterLoadPayload.cs | 0 .../P2P/Payloads/GetBlockDataPayload.cs | 0 .../Network/P2P/Payloads/GetBlocksPayload.cs | 0 .../neo}/Network/P2P/Payloads/Header.cs | 0 .../Network/P2P/Payloads/HeadersPayload.cs | 0 .../neo}/Network/P2P/Payloads/IInventory.cs | 0 .../neo}/Network/P2P/Payloads/IVerifiable.cs | 0 .../neo}/Network/P2P/Payloads/InvPayload.cs | 0 .../Network/P2P/Payloads/InventoryType.cs | 0 .../P2P/Payloads/MerkleBlockPayload.cs | 0 .../P2P/Payloads/NetworkAddressWithTime.cs | 0 .../neo}/Network/P2P/Payloads/PingPayload.cs | 0 .../neo}/Network/P2P/Payloads/Transaction.cs | 0 .../P2P/Payloads/TransactionAttribute.cs | 0 .../P2P/Payloads/TransactionAttributeUsage.cs | 0 .../Network/P2P/Payloads/VersionPayload.cs | 0 .../neo}/Network/P2P/Payloads/Witness.cs | 0 .../neo}/Network/P2P/Payloads/WitnessScope.cs | 0 {neo => src/neo}/Network/P2P/Peer.cs | 0 .../neo}/Network/P2P/ProtocolHandler.cs | 0 {neo => src/neo}/Network/P2P/RemoteNode.cs | 0 {neo => src/neo}/Network/P2P/TaskManager.cs | 0 {neo => src/neo}/Network/P2P/TaskSession.cs | 0 .../neo}/Network/RPC/ContractClient.cs | 0 {neo => src/neo}/Network/RPC/Helper.cs | 0 .../neo}/Network/RPC/Models/RpcBlock.cs | 0 .../neo}/Network/RPC/Models/RpcBlockHeader.cs | 0 .../Network/RPC/Models/RpcInvokeResult.cs | 0 .../Network/RPC/Models/RpcNep5Balances.cs | 0 .../Network/RPC/Models/RpcNep5TokenInfo.cs | 0 .../neo}/Network/RPC/Models/RpcPeers.cs | 0 .../neo}/Network/RPC/Models/RpcPlugin.cs | 0 .../neo}/Network/RPC/Models/RpcRawMemPool.cs | 0 .../neo}/Network/RPC/Models/RpcRequest.cs | 0 .../neo}/Network/RPC/Models/RpcResponse.cs | 0 .../neo}/Network/RPC/Models/RpcTransaction.cs | 0 .../RPC/Models/RpcValidateAddressResult.cs | 0 .../neo}/Network/RPC/Models/RpcValidator.cs | 0 .../neo}/Network/RPC/Models/RpcVersion.cs | 0 {neo => src/neo}/Network/RPC/Nep5API.cs | 0 {neo => src/neo}/Network/RPC/PolicyAPI.cs | 0 {neo => src/neo}/Network/RPC/RpcClient.cs | 0 {neo => src/neo}/Network/RPC/RpcException.cs | 0 {neo => src/neo}/Network/RPC/RpcServer.cs | 0 .../neo}/Network/RPC/TransactionManager.cs | 0 {neo => src/neo}/Network/RPC/WalletAPI.cs | 0 {neo => src/neo}/Network/UPnP.cs | 0 {neo => src/neo}/Persistence/ClonedView.cs | 0 .../neo}/Persistence/IReadOnlyStore.cs | 0 {neo => src/neo}/Persistence/ISnapshot.cs | 0 {neo => src/neo}/Persistence/IStore.cs | 0 .../neo}/Persistence/LevelDB/Snapshot.cs | 0 {neo => src/neo}/Persistence/LevelDB/Store.cs | 0 .../Memory/ByteArrayEqualityComparer.cs | 0 {neo => src/neo}/Persistence/Memory/Helper.cs | 0 .../neo}/Persistence/Memory/Snapshot.cs | 0 {neo => src/neo}/Persistence/Memory/Store.cs | 0 {neo => src/neo}/Persistence/Prefixes.cs | 0 {neo => src/neo}/Persistence/RawView.cs | 0 {neo => src/neo}/Persistence/SnapshotView.cs | 0 .../neo}/Persistence/StoreDataCache.cs | 0 .../neo}/Persistence/StoreMetaDataCache.cs | 0 {neo => src/neo}/Persistence/StoreView.cs | 0 {neo => src/neo}/Plugins/ILogPlugin.cs | 0 .../Plugins/IMemoryPoolTxObserverPlugin.cs | 0 {neo => src/neo}/Plugins/IP2PPlugin.cs | 0 .../neo}/Plugins/IPersistencePlugin.cs | 0 {neo => src/neo}/Plugins/IRpcPlugin.cs | 0 {neo => src/neo}/Plugins/LogLevel.cs | 0 .../neo}/Plugins/MemoryPoolTxRemovalReason.cs | 0 {neo => src/neo}/Plugins/Plugin.cs | 0 {neo => src/neo}/Properties/AssemblyInfo.cs | 0 {neo => src/neo}/ProtocolSettings.cs | 0 .../ApplicationEngine.OpCodePrices.cs | 0 .../neo}/SmartContract/ApplicationEngine.cs | 0 .../SmartContract/ContainerPlaceholder.cs | 0 {neo => src/neo}/SmartContract/Contract.cs | 0 .../neo}/SmartContract/ContractParameter.cs | 0 .../SmartContract/ContractParameterType.cs | 0 .../ContractParametersContext.cs | 0 .../Enumerators/ConcatenatedEnumerator.cs | 0 .../SmartContract/Enumerators/IEnumerator.cs | 0 .../Enumerators/IteratorKeysWrapper.cs | 0 .../Enumerators/IteratorValuesWrapper.cs | 0 .../SmartContract/ExecutionContextState.cs | 0 {neo => src/neo}/SmartContract/Helper.cs | 0 .../neo}/SmartContract/IInteroperable.cs | 0 .../neo}/SmartContract/InteropDescriptor.cs | 0 .../neo}/SmartContract/InteropService.NEO.cs | 0 .../neo}/SmartContract/InteropService.cs | 0 .../SmartContract/Iterators/ArrayWrapper.cs | 0 .../Iterators/ConcatenatedIterator.cs | 0 .../neo}/SmartContract/Iterators/IIterator.cs | 0 .../SmartContract/Iterators/MapWrapper.cs | 0 .../Iterators/StorageIterator.cs | 0 .../neo}/SmartContract/JsonSerializer.cs | 0 .../neo}/SmartContract/LogEventArgs.cs | 0 .../SmartContract/Manifest/ContractAbi.cs | 0 .../Manifest/ContractEventDescriptor.cs | 0 .../Manifest/ContractFeatures.cs | 0 .../SmartContract/Manifest/ContractGroup.cs | 0 .../Manifest/ContractManifest.cs | 0 .../Manifest/ContractMethodDescriptor.cs | 0 .../Manifest/ContractParameterDefinition.cs | 0 .../Manifest/ContractPermission.cs | 0 .../Manifest/ContractPermissionDescriptor.cs | 0 .../Manifest/WildCardContainer.cs | 0 .../Native/ContractMethodAttribute.cs | 0 .../Native/ContractMethodMetadata.cs | 0 .../SmartContract/Native/NativeContract.cs | 0 .../SmartContract/Native/PolicyContract.cs | 0 .../SmartContract/Native/Tokens/GasToken.cs | 0 .../SmartContract/Native/Tokens/NeoToken.cs | 0 .../Native/Tokens/Nep5AccountState.cs | 0 .../SmartContract/Native/Tokens/Nep5Token.cs | 0 {neo => src/neo}/SmartContract/NefFile.cs | 0 .../neo}/SmartContract/NotifyEventArgs.cs | 0 .../neo}/SmartContract/StackItemType.cs | 0 .../neo}/SmartContract/StorageContext.cs | 0 {neo => src/neo}/SmartContract/TriggerType.cs | 0 {neo => src/neo}/TimeProvider.cs | 0 {neo => src/neo}/UInt160.cs | 0 {neo => src/neo}/UInt256.cs | 0 {neo => src/neo}/UIntBase.cs | 0 {neo => src/neo}/Utility.cs | 0 {neo => src/neo}/VM/Helper.cs | 0 {neo => src/neo}/Wallets/AssetDescriptor.cs | 0 {neo => src/neo}/Wallets/Helper.cs | 0 {neo => src/neo}/Wallets/KeyPair.cs | 0 {neo => src/neo}/Wallets/NEP6/NEP6Account.cs | 0 {neo => src/neo}/Wallets/NEP6/NEP6Contract.cs | 0 {neo => src/neo}/Wallets/NEP6/NEP6Wallet.cs | 0 .../neo}/Wallets/NEP6/ScryptParameters.cs | 0 {neo => src/neo}/Wallets/NEP6/WalletLocker.cs | 0 {neo => src/neo}/Wallets/SQLite/Account.cs | 0 {neo => src/neo}/Wallets/SQLite/Address.cs | 0 {neo => src/neo}/Wallets/SQLite/Contract.cs | 0 {neo => src/neo}/Wallets/SQLite/Key.cs | 0 {neo => src/neo}/Wallets/SQLite/UserWallet.cs | 0 .../neo}/Wallets/SQLite/UserWalletAccount.cs | 0 .../Wallets/SQLite/VerificationContract.cs | 0 .../neo}/Wallets/SQLite/WalletDataContext.cs | 0 {neo => src/neo}/Wallets/TransferOutput.cs | 0 {neo => src/neo}/Wallets/Wallet.cs | 0 {neo => src/neo}/Wallets/WalletAccount.cs | 0 {neo => src/neo}/neo.csproj | 0 .../neo.UnitTests}/Consensus/UT_Consensus.cs | 0 .../Consensus/UT_ConsensusContext.cs | 0 .../Consensus/UT_ConsensusServiceMailbox.cs | 0 .../Cryptography/ECC/UT_ECDsa.cs | 0 .../Cryptography/ECC/UT_ECFieldElement.cs | 0 .../Cryptography/ECC/UT_ECPoint.cs | 0 .../neo.UnitTests}/Cryptography/UT_Base58.cs | 0 .../Cryptography/UT_BloomFilter.cs | 0 .../neo.UnitTests}/Cryptography/UT_Crypto.cs | 0 .../Cryptography/UT_Cryptography_Helper.cs | 0 .../Cryptography/UT_MerkleTree.cs | 0 .../Cryptography/UT_MerkleTreeNode.cs | 0 .../neo.UnitTests}/Cryptography/UT_Murmur3.cs | 0 .../neo.UnitTests}/Cryptography/UT_SCrypt.cs | 0 .../Extensions/NativeContractExtensions.cs | 0 .../Nep5NativeContractExtensions.cs | 0 .../neo.UnitTests}/IO/Caching/UT_Cache.cs | 0 .../IO/Caching/UT_CloneCache.cs | 0 .../IO/Caching/UT_CloneMetaCache.cs | 0 .../neo.UnitTests}/IO/Caching/UT_DataCache.cs | 0 .../neo.UnitTests}/IO/Caching/UT_FIFOSet.cs | 0 .../IO/Caching/UT_MetaDataCache.cs | 0 .../IO/Caching/UT_OrderedDictionary.cs | 0 .../IO/Caching/UT_ReflectionCache.cs | 0 .../IO/Caching/UT_RelayCache.cs | 0 .../IO/Data/LevelDb/UT_Slice.cs | 0 .../neo.UnitTests}/IO/Json/UT_JArray.cs | 0 .../neo.UnitTests}/IO/Json/UT_JBoolean.cs | 0 .../neo.UnitTests}/IO/Json/UT_JNumber.cs | 0 .../neo.UnitTests}/IO/Json/UT_JObject.cs | 0 .../neo.UnitTests}/IO/Json/UT_JString.cs | 0 .../neo.UnitTests}/IO/UT_ByteArrayComparer.cs | 0 .../neo.UnitTests}/IO/UT_IOHelper.cs | 0 .../IO/Wrappers/UT_SerializableWrapper.cs | 0 .../IO/Wrappers/UT_UInt32Wrapper.cs | 0 .../neo.UnitTests}/Ledger/UT_Blockchain.cs | 0 .../neo.UnitTests}/Ledger/UT_ContractState.cs | 0 .../Ledger/UT_HashIndexState.cs | 0 .../Ledger/UT_HeaderHashList.cs | 0 .../neo.UnitTests}/Ledger/UT_MemoryPool.cs | 0 .../neo.UnitTests}/Ledger/UT_PoolItem.cs | 0 .../Ledger/UT_SendersFeeMonitor.cs | 0 .../neo.UnitTests}/Ledger/UT_StorageItem.cs | 0 .../neo.UnitTests}/Ledger/UT_StorageKey.cs | 0 .../Ledger/UT_TransactionState.cs | 0 .../neo.UnitTests}/Ledger/UT_TrimmedBlock.cs | 0 .../Network/P2P/Payloads/UT_Block.cs | 0 .../Network/P2P/Payloads/UT_Cosigner.cs | 0 .../Network/P2P/Payloads/UT_Header.cs | 0 .../Network/P2P/Payloads/UT_Transaction.cs | 0 .../Network/P2P/Payloads/UT_Witness.cs | 0 .../neo.UnitTests}/Network/P2P/UT_Message.cs | 0 .../Network/P2P/UT_ProtocolHandler.cs | 0 .../Network/P2P/UT_ProtocolHandlerMailbox.cs | 0 .../Network/P2P/UT_RemoteNode.cs | 0 .../Network/P2P/UT_RemoteNodeMailbox.cs | 0 .../Network/P2P/UT_TaskManagerMailbox.cs | 0 .../Network/RPC/Models/UT_RpcBlock.cs | 0 .../Network/RPC/Models/UT_RpcBlockHeader.cs | 0 .../Network/RPC/Models/UT_RpcNep5Balance.cs | 0 .../Network/RPC/Models/UT_RpcNep5Balances.cs | 0 .../Network/RPC/Models/UT_RpcPeer.cs | 0 .../Network/RPC/Models/UT_RpcPeers.cs | 0 .../Network/RPC/Models/UT_RpcRawMemPool.cs | 0 .../Network/RPC/Models/UT_RpcRequest.cs | 0 .../Network/RPC/Models/UT_RpcResponse.cs | 0 .../Network/RPC/Models/UT_RpcVersion.cs | 0 .../Network/RPC/UT_ContractClient.cs | 0 .../neo.UnitTests}/Network/RPC/UT_Helper.cs | 0 .../neo.UnitTests}/Network/RPC/UT_Nep5API.cs | 0 .../Network/RPC/UT_PolicyAPI.cs | 0 .../Network/RPC/UT_RpcClient.cs | 0 .../Network/RPC/UT_RpcServer.cs | 0 .../Network/RPC/UT_TransactionManager.cs | 0 .../Network/RPC/UT_WalletAPI.cs | 0 .../neo.UnitTests}/Plugins/TestLogPlugin.cs | 0 .../neo.UnitTests}/Plugins/UT_Plugin.cs | 0 .../neo.UnitTests}/README.md | 0 .../Enumerators/UT_ConcatenatedEnumerator.cs | 0 .../Enumerators/UT_IteratorKeysWrapper.cs | 0 .../Enumerators/UT_IteratorValuesWrapper.cs | 0 .../Iterators/UT_ArrayWrapper.cs | 0 .../Iterators/UT_ConcatenatedIterator.cs | 0 .../SmartContract/Iterators/UT_MapWrapper.cs | 0 .../Iterators/UT_StorageIterator.cs | 0 .../Manifest/UT_ContractEventDescriptor.cs | 0 .../Manifest/UT_ContractGroup.cs | 0 .../Manifest/UT_ContractManifest.cs | 0 .../Manifest/UT_ContractPermission.cs | 0 .../UT_ContractPermissionDescriptor.cs | 0 .../Manifest/UT_WildCardContainer.cs | 0 .../Native/Tokens/UT_GasToken.cs | 0 .../Native/Tokens/UT_NeoToken.cs | 0 .../Native/Tokens/UT_Nep5Token.cs | 0 .../SmartContract/Native/UT_NativeContract.cs | 0 .../SmartContract/Native/UT_PolicyContract.cs | 0 .../SmartContract/UT_ApplicationEngine.cs | 0 .../SmartContract/UT_ContainerPlaceholder.cs | 0 .../SmartContract/UT_Contract.cs | 0 .../SmartContract/UT_ContractParameter.cs | 0 .../UT_ContractParameterContext.cs | 0 .../SmartContract/UT_InteropDescriptor.cs | 0 .../SmartContract/UT_InteropPrices.cs | 0 .../SmartContract/UT_InteropService.NEO.cs | 0 .../SmartContract/UT_InteropService.cs | 0 .../SmartContract/UT_JsonSerializer.cs | 0 .../SmartContract/UT_LogEventArgs.cs | 0 .../SmartContract/UT_NefFile.cs | 0 .../SmartContract/UT_NotifyEventArgs.cs | 0 .../SmartContract/UT_OpCodePrices.cs | 0 .../SmartContract/UT_SmartContractHelper.cs | 0 .../SmartContract/UT_StorageContext.cs | 0 .../SmartContract/UT_Syscalls.cs | 0 .../neo.UnitTests}/TestBlockchain.cs | 0 .../neo.UnitTests}/TestUtils.cs | 0 .../neo.UnitTests}/TestVerifiable.cs | 0 .../neo.UnitTests}/TestWalletAccount.cs | 0 .../neo.UnitTests}/UT_BigDecimal.cs | 0 .../neo.UnitTests}/UT_Culture.cs | 0 .../neo.UnitTests}/UT_DataCache.cs | 0 .../neo.UnitTests}/UT_Helper.cs | 0 .../neo.UnitTests}/UT_NeoSystem.cs | 0 .../neo.UnitTests}/UT_ProtocolSettings.cs | 0 .../neo.UnitTests}/UT_UInt160.cs | 0 .../neo.UnitTests}/UT_UInt256.cs | 0 .../neo.UnitTests}/UT_UIntBase.cs | 0 .../neo.UnitTests}/UT_UIntBenchmarks.cs | 0 .../neo.UnitTests}/UT_Utility.cs | 0 .../neo.UnitTests}/VM/UT_Helper.cs | 0 .../Wallets/NEP6/UT_NEP6Account.cs | 0 .../Wallets/NEP6/UT_NEP6Contract.cs | 0 .../Wallets/NEP6/UT_NEP6Wallet.cs | 0 .../Wallets/NEP6/UT_ScryptParameters.cs | 0 .../Wallets/SQLite/UT_Account.cs | 0 .../Wallets/SQLite/UT_Address.cs | 0 .../Wallets/SQLite/UT_Contract.cs | 0 .../neo.UnitTests}/Wallets/SQLite/UT_Key.cs | 0 .../Wallets/SQLite/UT_UserWallet.cs | 0 .../Wallets/SQLite/UT_UserWalletAccount.cs | 0 .../Wallets/SQLite/UT_VerificationContract.cs | 0 .../Wallets/UT_AssetDescriptor.cs | 0 .../neo.UnitTests}/Wallets/UT_KeyPair.cs | 0 .../neo.UnitTests}/Wallets/UT_Wallet.cs | 0 .../Wallets/UT_WalletAccount.cs | 0 .../Wallets/UT_Wallets_Helper.cs | 0 .../neo.UnitTests}/neo.UnitTests.csproj | 2 +- .../neo.UnitTests}/protocol.json | 0 394 files changed, 16 insertions(+), 6 deletions(-) rename {neo => src/neo}/BigDecimal.cs (100%) rename {neo => src/neo}/Consensus/ChangeView.cs (100%) rename {neo => src/neo}/Consensus/ChangeViewReason.cs (100%) rename {neo => src/neo}/Consensus/Commit.cs (100%) rename {neo => src/neo}/Consensus/ConsensusContext.cs (100%) rename {neo => src/neo}/Consensus/ConsensusMessage.cs (100%) rename {neo => src/neo}/Consensus/ConsensusMessageType.cs (100%) rename {neo => src/neo}/Consensus/ConsensusService.cs (100%) rename {neo => src/neo}/Consensus/PrepareRequest.cs (100%) rename {neo => src/neo}/Consensus/PrepareResponse.cs (100%) rename {neo => src/neo}/Consensus/RecoveryMessage.ChangeViewPayloadCompact.cs (100%) rename {neo => src/neo}/Consensus/RecoveryMessage.CommitPayloadCompact.cs (100%) rename {neo => src/neo}/Consensus/RecoveryMessage.PreparationPayloadCompact.cs (100%) rename {neo => src/neo}/Consensus/RecoveryMessage.cs (100%) rename {neo => src/neo}/Consensus/RecoveryRequest.cs (100%) rename {neo => src/neo}/Cryptography/Base58.cs (100%) rename {neo => src/neo}/Cryptography/BloomFilter.cs (100%) rename {neo => src/neo}/Cryptography/Crypto.cs (100%) rename {neo => src/neo}/Cryptography/ECC/ECCurve.cs (100%) rename {neo => src/neo}/Cryptography/ECC/ECDsa.cs (100%) rename {neo => src/neo}/Cryptography/ECC/ECFieldElement.cs (100%) rename {neo => src/neo}/Cryptography/ECC/ECPoint.cs (100%) rename {neo => src/neo}/Cryptography/Helper.cs (100%) rename {neo => src/neo}/Cryptography/MerkleTree.cs (100%) rename {neo => src/neo}/Cryptography/MerkleTreeNode.cs (100%) rename {neo => src/neo}/Cryptography/Murmur3.cs (100%) rename {neo => src/neo}/Cryptography/RIPEMD160Managed.cs (100%) rename {neo => src/neo}/Cryptography/SCrypt.cs (100%) rename {neo => src/neo}/Helper.cs (100%) rename {neo => src/neo}/IO/Actors/Idle.cs (100%) rename {neo => src/neo}/IO/Actors/PriorityMailbox.cs (100%) rename {neo => src/neo}/IO/Actors/PriorityMessageQueue.cs (100%) rename {neo => src/neo}/IO/ByteArrayComparer.cs (100%) rename {neo => src/neo}/IO/Caching/Cache.cs (100%) rename {neo => src/neo}/IO/Caching/CloneCache.cs (100%) rename {neo => src/neo}/IO/Caching/CloneMetaCache.cs (100%) rename {neo => src/neo}/IO/Caching/DataCache.cs (100%) rename {neo => src/neo}/IO/Caching/FIFOCache.cs (100%) rename {neo => src/neo}/IO/Caching/FIFOSet.cs (100%) rename {neo => src/neo}/IO/Caching/MetaDataCache.cs (100%) rename {neo => src/neo}/IO/Caching/OrderedDictionary.cs (100%) rename {neo => src/neo}/IO/Caching/ReflectionCache.cs (100%) rename {neo => src/neo}/IO/Caching/ReflectionCacheAttribute.cs (100%) rename {neo => src/neo}/IO/Caching/RelayCache.cs (100%) rename {neo => src/neo}/IO/Caching/TrackState.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/DB.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/Helper.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/Iterator.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/LevelDBException.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/Native.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/Options.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/ReadOptions.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/Slice.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/SliceBuilder.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/Snapshot.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/WriteBatch.cs (100%) rename {neo => src/neo}/IO/Data/LevelDB/WriteOptions.cs (100%) rename {neo => src/neo}/IO/Helper.cs (100%) rename {neo => src/neo}/IO/ICloneable.cs (100%) rename {neo => src/neo}/IO/ISerializable.cs (100%) rename {neo => src/neo}/IO/Json/JArray.cs (100%) rename {neo => src/neo}/IO/Json/JBoolean.cs (100%) rename {neo => src/neo}/IO/Json/JNumber.cs (100%) rename {neo => src/neo}/IO/Json/JObject.cs (100%) rename {neo => src/neo}/IO/Json/JString.cs (100%) rename {neo => src/neo}/IO/Wrappers/SerializableWrapper.cs (100%) rename {neo => src/neo}/IO/Wrappers/UInt32Wrapper.cs (100%) rename {neo => src/neo}/Ledger/Blockchain.ApplicationExecuted.cs (100%) rename {neo => src/neo}/Ledger/Blockchain.cs (100%) rename {neo => src/neo}/Ledger/ContractState.cs (100%) rename {neo => src/neo}/Ledger/HashIndexState.cs (100%) rename {neo => src/neo}/Ledger/HeaderHashList.cs (100%) rename {neo => src/neo}/Ledger/MemoryPool.cs (100%) rename {neo => src/neo}/Ledger/PoolItem.cs (100%) rename {neo => src/neo}/Ledger/RelayResultReason.cs (100%) rename {neo => src/neo}/Ledger/SendersFeeMonitor.cs (100%) rename {neo => src/neo}/Ledger/StorageFlags.cs (100%) rename {neo => src/neo}/Ledger/StorageItem.cs (100%) rename {neo => src/neo}/Ledger/StorageKey.cs (100%) rename {neo => src/neo}/Ledger/TransactionState.cs (100%) rename {neo => src/neo}/Ledger/TrimmedBlock.cs (100%) rename {neo => src/neo}/NeoSystem.cs (100%) rename {neo => src/neo}/Network/P2P/Capabilities/FullNodeCapability.cs (100%) rename {neo => src/neo}/Network/P2P/Capabilities/NodeCapability.cs (100%) rename {neo => src/neo}/Network/P2P/Capabilities/NodeCapabilityType.cs (100%) rename {neo => src/neo}/Network/P2P/Capabilities/ServerCapability.cs (100%) rename {neo => src/neo}/Network/P2P/ChannelsConfig.cs (100%) rename {neo => src/neo}/Network/P2P/Connection.cs (100%) rename {neo => src/neo}/Network/P2P/Helper.cs (100%) rename {neo => src/neo}/Network/P2P/LocalNode.cs (100%) rename {neo => src/neo}/Network/P2P/Message.cs (100%) rename {neo => src/neo}/Network/P2P/MessageCommand.cs (100%) rename {neo => src/neo}/Network/P2P/MessageFlags.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/AddrPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/Block.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/BlockBase.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/ConsensusData.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/ConsensusPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/Cosigner.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/FilterAddPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/FilterLoadPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/GetBlockDataPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/GetBlocksPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/Header.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/HeadersPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/IInventory.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/IVerifiable.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/InvPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/InventoryType.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/MerkleBlockPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/NetworkAddressWithTime.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/PingPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/Transaction.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/TransactionAttribute.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/TransactionAttributeUsage.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/VersionPayload.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/Witness.cs (100%) rename {neo => src/neo}/Network/P2P/Payloads/WitnessScope.cs (100%) rename {neo => src/neo}/Network/P2P/Peer.cs (100%) rename {neo => src/neo}/Network/P2P/ProtocolHandler.cs (100%) rename {neo => src/neo}/Network/P2P/RemoteNode.cs (100%) rename {neo => src/neo}/Network/P2P/TaskManager.cs (100%) rename {neo => src/neo}/Network/P2P/TaskSession.cs (100%) rename {neo => src/neo}/Network/RPC/ContractClient.cs (100%) rename {neo => src/neo}/Network/RPC/Helper.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcBlock.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcBlockHeader.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcInvokeResult.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcNep5Balances.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcNep5TokenInfo.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcPeers.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcPlugin.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcRawMemPool.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcRequest.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcResponse.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcTransaction.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcValidateAddressResult.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcValidator.cs (100%) rename {neo => src/neo}/Network/RPC/Models/RpcVersion.cs (100%) rename {neo => src/neo}/Network/RPC/Nep5API.cs (100%) rename {neo => src/neo}/Network/RPC/PolicyAPI.cs (100%) rename {neo => src/neo}/Network/RPC/RpcClient.cs (100%) rename {neo => src/neo}/Network/RPC/RpcException.cs (100%) rename {neo => src/neo}/Network/RPC/RpcServer.cs (100%) rename {neo => src/neo}/Network/RPC/TransactionManager.cs (100%) rename {neo => src/neo}/Network/RPC/WalletAPI.cs (100%) rename {neo => src/neo}/Network/UPnP.cs (100%) rename {neo => src/neo}/Persistence/ClonedView.cs (100%) rename {neo => src/neo}/Persistence/IReadOnlyStore.cs (100%) rename {neo => src/neo}/Persistence/ISnapshot.cs (100%) rename {neo => src/neo}/Persistence/IStore.cs (100%) rename {neo => src/neo}/Persistence/LevelDB/Snapshot.cs (100%) rename {neo => src/neo}/Persistence/LevelDB/Store.cs (100%) rename {neo => src/neo}/Persistence/Memory/ByteArrayEqualityComparer.cs (100%) rename {neo => src/neo}/Persistence/Memory/Helper.cs (100%) rename {neo => src/neo}/Persistence/Memory/Snapshot.cs (100%) rename {neo => src/neo}/Persistence/Memory/Store.cs (100%) rename {neo => src/neo}/Persistence/Prefixes.cs (100%) rename {neo => src/neo}/Persistence/RawView.cs (100%) rename {neo => src/neo}/Persistence/SnapshotView.cs (100%) rename {neo => src/neo}/Persistence/StoreDataCache.cs (100%) rename {neo => src/neo}/Persistence/StoreMetaDataCache.cs (100%) rename {neo => src/neo}/Persistence/StoreView.cs (100%) rename {neo => src/neo}/Plugins/ILogPlugin.cs (100%) rename {neo => src/neo}/Plugins/IMemoryPoolTxObserverPlugin.cs (100%) rename {neo => src/neo}/Plugins/IP2PPlugin.cs (100%) rename {neo => src/neo}/Plugins/IPersistencePlugin.cs (100%) rename {neo => src/neo}/Plugins/IRpcPlugin.cs (100%) rename {neo => src/neo}/Plugins/LogLevel.cs (100%) rename {neo => src/neo}/Plugins/MemoryPoolTxRemovalReason.cs (100%) rename {neo => src/neo}/Plugins/Plugin.cs (100%) rename {neo => src/neo}/Properties/AssemblyInfo.cs (100%) rename {neo => src/neo}/ProtocolSettings.cs (100%) rename {neo => src/neo}/SmartContract/ApplicationEngine.OpCodePrices.cs (100%) rename {neo => src/neo}/SmartContract/ApplicationEngine.cs (100%) rename {neo => src/neo}/SmartContract/ContainerPlaceholder.cs (100%) rename {neo => src/neo}/SmartContract/Contract.cs (100%) rename {neo => src/neo}/SmartContract/ContractParameter.cs (100%) rename {neo => src/neo}/SmartContract/ContractParameterType.cs (100%) rename {neo => src/neo}/SmartContract/ContractParametersContext.cs (100%) rename {neo => src/neo}/SmartContract/Enumerators/ConcatenatedEnumerator.cs (100%) rename {neo => src/neo}/SmartContract/Enumerators/IEnumerator.cs (100%) rename {neo => src/neo}/SmartContract/Enumerators/IteratorKeysWrapper.cs (100%) rename {neo => src/neo}/SmartContract/Enumerators/IteratorValuesWrapper.cs (100%) rename {neo => src/neo}/SmartContract/ExecutionContextState.cs (100%) rename {neo => src/neo}/SmartContract/Helper.cs (100%) rename {neo => src/neo}/SmartContract/IInteroperable.cs (100%) rename {neo => src/neo}/SmartContract/InteropDescriptor.cs (100%) rename {neo => src/neo}/SmartContract/InteropService.NEO.cs (100%) rename {neo => src/neo}/SmartContract/InteropService.cs (100%) rename {neo => src/neo}/SmartContract/Iterators/ArrayWrapper.cs (100%) rename {neo => src/neo}/SmartContract/Iterators/ConcatenatedIterator.cs (100%) rename {neo => src/neo}/SmartContract/Iterators/IIterator.cs (100%) rename {neo => src/neo}/SmartContract/Iterators/MapWrapper.cs (100%) rename {neo => src/neo}/SmartContract/Iterators/StorageIterator.cs (100%) rename {neo => src/neo}/SmartContract/JsonSerializer.cs (100%) rename {neo => src/neo}/SmartContract/LogEventArgs.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractAbi.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractEventDescriptor.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractFeatures.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractGroup.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractManifest.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractMethodDescriptor.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractParameterDefinition.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractPermission.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/ContractPermissionDescriptor.cs (100%) rename {neo => src/neo}/SmartContract/Manifest/WildCardContainer.cs (100%) rename {neo => src/neo}/SmartContract/Native/ContractMethodAttribute.cs (100%) rename {neo => src/neo}/SmartContract/Native/ContractMethodMetadata.cs (100%) rename {neo => src/neo}/SmartContract/Native/NativeContract.cs (100%) rename {neo => src/neo}/SmartContract/Native/PolicyContract.cs (100%) rename {neo => src/neo}/SmartContract/Native/Tokens/GasToken.cs (100%) rename {neo => src/neo}/SmartContract/Native/Tokens/NeoToken.cs (100%) rename {neo => src/neo}/SmartContract/Native/Tokens/Nep5AccountState.cs (100%) rename {neo => src/neo}/SmartContract/Native/Tokens/Nep5Token.cs (100%) rename {neo => src/neo}/SmartContract/NefFile.cs (100%) rename {neo => src/neo}/SmartContract/NotifyEventArgs.cs (100%) rename {neo => src/neo}/SmartContract/StackItemType.cs (100%) rename {neo => src/neo}/SmartContract/StorageContext.cs (100%) rename {neo => src/neo}/SmartContract/TriggerType.cs (100%) rename {neo => src/neo}/TimeProvider.cs (100%) rename {neo => src/neo}/UInt160.cs (100%) rename {neo => src/neo}/UInt256.cs (100%) rename {neo => src/neo}/UIntBase.cs (100%) rename {neo => src/neo}/Utility.cs (100%) rename {neo => src/neo}/VM/Helper.cs (100%) rename {neo => src/neo}/Wallets/AssetDescriptor.cs (100%) rename {neo => src/neo}/Wallets/Helper.cs (100%) rename {neo => src/neo}/Wallets/KeyPair.cs (100%) rename {neo => src/neo}/Wallets/NEP6/NEP6Account.cs (100%) rename {neo => src/neo}/Wallets/NEP6/NEP6Contract.cs (100%) rename {neo => src/neo}/Wallets/NEP6/NEP6Wallet.cs (100%) rename {neo => src/neo}/Wallets/NEP6/ScryptParameters.cs (100%) rename {neo => src/neo}/Wallets/NEP6/WalletLocker.cs (100%) rename {neo => src/neo}/Wallets/SQLite/Account.cs (100%) rename {neo => src/neo}/Wallets/SQLite/Address.cs (100%) rename {neo => src/neo}/Wallets/SQLite/Contract.cs (100%) rename {neo => src/neo}/Wallets/SQLite/Key.cs (100%) rename {neo => src/neo}/Wallets/SQLite/UserWallet.cs (100%) rename {neo => src/neo}/Wallets/SQLite/UserWalletAccount.cs (100%) rename {neo => src/neo}/Wallets/SQLite/VerificationContract.cs (100%) rename {neo => src/neo}/Wallets/SQLite/WalletDataContext.cs (100%) rename {neo => src/neo}/Wallets/TransferOutput.cs (100%) rename {neo => src/neo}/Wallets/Wallet.cs (100%) rename {neo => src/neo}/Wallets/WalletAccount.cs (100%) rename {neo => src/neo}/neo.csproj (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Consensus/UT_Consensus.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Consensus/UT_ConsensusContext.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Consensus/UT_ConsensusServiceMailbox.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/ECC/UT_ECDsa.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/ECC/UT_ECFieldElement.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/ECC/UT_ECPoint.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_Base58.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_BloomFilter.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_Crypto.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_Cryptography_Helper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_MerkleTree.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_MerkleTreeNode.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_Murmur3.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Cryptography/UT_SCrypt.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Extensions/NativeContractExtensions.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Extensions/Nep5NativeContractExtensions.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_Cache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_CloneCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_CloneMetaCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_DataCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_FIFOSet.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_MetaDataCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_OrderedDictionary.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_ReflectionCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Caching/UT_RelayCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Data/LevelDb/UT_Slice.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Json/UT_JArray.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Json/UT_JBoolean.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Json/UT_JNumber.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Json/UT_JObject.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Json/UT_JString.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/UT_ByteArrayComparer.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/UT_IOHelper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Wrappers/UT_SerializableWrapper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/IO/Wrappers/UT_UInt32Wrapper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_Blockchain.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_ContractState.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_HashIndexState.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_HeaderHashList.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_MemoryPool.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_PoolItem.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_SendersFeeMonitor.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_StorageItem.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_StorageKey.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_TransactionState.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Ledger/UT_TrimmedBlock.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/Payloads/UT_Block.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/Payloads/UT_Cosigner.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/Payloads/UT_Header.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/Payloads/UT_Transaction.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/Payloads/UT_Witness.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/UT_Message.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/UT_ProtocolHandler.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/UT_ProtocolHandlerMailbox.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/UT_RemoteNode.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/UT_RemoteNodeMailbox.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/P2P/UT_TaskManagerMailbox.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcBlock.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcBlockHeader.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcNep5Balance.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcNep5Balances.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcPeer.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcPeers.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcRawMemPool.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcRequest.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcResponse.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/Models/UT_RpcVersion.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_ContractClient.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_Helper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_Nep5API.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_PolicyAPI.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_RpcClient.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_RpcServer.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_TransactionManager.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Network/RPC/UT_WalletAPI.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Plugins/TestLogPlugin.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Plugins/UT_Plugin.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/README.md (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Enumerators/UT_ConcatenatedEnumerator.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Iterators/UT_ArrayWrapper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Iterators/UT_ConcatenatedIterator.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Iterators/UT_MapWrapper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Iterators/UT_StorageIterator.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Manifest/UT_ContractEventDescriptor.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Manifest/UT_ContractGroup.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Manifest/UT_ContractManifest.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Manifest/UT_ContractPermission.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Manifest/UT_ContractPermissionDescriptor.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Manifest/UT_WildCardContainer.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Native/Tokens/UT_GasToken.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Native/Tokens/UT_NeoToken.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Native/Tokens/UT_Nep5Token.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Native/UT_NativeContract.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/Native/UT_PolicyContract.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_ApplicationEngine.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_ContainerPlaceholder.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_Contract.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_ContractParameter.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_ContractParameterContext.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_InteropDescriptor.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_InteropPrices.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_InteropService.NEO.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_InteropService.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_JsonSerializer.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_LogEventArgs.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_NefFile.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_NotifyEventArgs.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_OpCodePrices.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_SmartContractHelper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_StorageContext.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/SmartContract/UT_Syscalls.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/TestBlockchain.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/TestUtils.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/TestVerifiable.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/TestWalletAccount.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_BigDecimal.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_Culture.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_DataCache.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_Helper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_NeoSystem.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_ProtocolSettings.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_UInt160.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_UInt256.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_UIntBase.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_UIntBenchmarks.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/UT_Utility.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/VM/UT_Helper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/NEP6/UT_NEP6Account.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/NEP6/UT_NEP6Contract.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/NEP6/UT_NEP6Wallet.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/NEP6/UT_ScryptParameters.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_Account.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_Address.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_Contract.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_Key.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_UserWallet.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_UserWalletAccount.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/SQLite/UT_VerificationContract.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/UT_AssetDescriptor.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/UT_KeyPair.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/UT_Wallet.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/UT_WalletAccount.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/Wallets/UT_Wallets_Helper.cs (100%) rename {neo.UnitTests => tests/neo.UnitTests}/neo.UnitTests.csproj (94%) rename {neo.UnitTests => tests/neo.UnitTests}/protocol.json (100%) diff --git a/neo.sln b/neo.sln index fd72762fc2..fd9f07d904 100644 --- a/neo.sln +++ b/neo.sln @@ -1,11 +1,14 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26430.15 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29519.87 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "neo", "neo\neo.csproj", "{36447A9B-0311-4D4D-A3D5-AECBE9C15BBC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "neo", "src\neo\neo.csproj", "{36447A9B-0311-4D4D-A3D5-AECBE9C15BBC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "neo.UnitTests", "neo.UnitTests\neo.UnitTests.csproj", "{5B783B30-B422-4C2F-AC22-187A8D1993F4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "neo.UnitTests", "tests\neo.UnitTests\neo.UnitTests.csproj", "{5B783B30-B422-4C2F-AC22-187A8D1993F4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{7BBCCE7E-39B5-40F7-80EE-B7DB83D42163}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{98E65C7E-8BB5-4A21-893C-625F3335DEAD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -25,4 +28,11 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {36447A9B-0311-4D4D-A3D5-AECBE9C15BBC} = {7BBCCE7E-39B5-40F7-80EE-B7DB83D42163} + {5B783B30-B422-4C2F-AC22-187A8D1993F4} = {98E65C7E-8BB5-4A21-893C-625F3335DEAD} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E14FA734-DB38-45BC-966B-3D32E82E0935} + EndGlobalSection EndGlobal diff --git a/neo/BigDecimal.cs b/src/neo/BigDecimal.cs similarity index 100% rename from neo/BigDecimal.cs rename to src/neo/BigDecimal.cs diff --git a/neo/Consensus/ChangeView.cs b/src/neo/Consensus/ChangeView.cs similarity index 100% rename from neo/Consensus/ChangeView.cs rename to src/neo/Consensus/ChangeView.cs diff --git a/neo/Consensus/ChangeViewReason.cs b/src/neo/Consensus/ChangeViewReason.cs similarity index 100% rename from neo/Consensus/ChangeViewReason.cs rename to src/neo/Consensus/ChangeViewReason.cs diff --git a/neo/Consensus/Commit.cs b/src/neo/Consensus/Commit.cs similarity index 100% rename from neo/Consensus/Commit.cs rename to src/neo/Consensus/Commit.cs diff --git a/neo/Consensus/ConsensusContext.cs b/src/neo/Consensus/ConsensusContext.cs similarity index 100% rename from neo/Consensus/ConsensusContext.cs rename to src/neo/Consensus/ConsensusContext.cs diff --git a/neo/Consensus/ConsensusMessage.cs b/src/neo/Consensus/ConsensusMessage.cs similarity index 100% rename from neo/Consensus/ConsensusMessage.cs rename to src/neo/Consensus/ConsensusMessage.cs diff --git a/neo/Consensus/ConsensusMessageType.cs b/src/neo/Consensus/ConsensusMessageType.cs similarity index 100% rename from neo/Consensus/ConsensusMessageType.cs rename to src/neo/Consensus/ConsensusMessageType.cs diff --git a/neo/Consensus/ConsensusService.cs b/src/neo/Consensus/ConsensusService.cs similarity index 100% rename from neo/Consensus/ConsensusService.cs rename to src/neo/Consensus/ConsensusService.cs diff --git a/neo/Consensus/PrepareRequest.cs b/src/neo/Consensus/PrepareRequest.cs similarity index 100% rename from neo/Consensus/PrepareRequest.cs rename to src/neo/Consensus/PrepareRequest.cs diff --git a/neo/Consensus/PrepareResponse.cs b/src/neo/Consensus/PrepareResponse.cs similarity index 100% rename from neo/Consensus/PrepareResponse.cs rename to src/neo/Consensus/PrepareResponse.cs diff --git a/neo/Consensus/RecoveryMessage.ChangeViewPayloadCompact.cs b/src/neo/Consensus/RecoveryMessage.ChangeViewPayloadCompact.cs similarity index 100% rename from neo/Consensus/RecoveryMessage.ChangeViewPayloadCompact.cs rename to src/neo/Consensus/RecoveryMessage.ChangeViewPayloadCompact.cs diff --git a/neo/Consensus/RecoveryMessage.CommitPayloadCompact.cs b/src/neo/Consensus/RecoveryMessage.CommitPayloadCompact.cs similarity index 100% rename from neo/Consensus/RecoveryMessage.CommitPayloadCompact.cs rename to src/neo/Consensus/RecoveryMessage.CommitPayloadCompact.cs diff --git a/neo/Consensus/RecoveryMessage.PreparationPayloadCompact.cs b/src/neo/Consensus/RecoveryMessage.PreparationPayloadCompact.cs similarity index 100% rename from neo/Consensus/RecoveryMessage.PreparationPayloadCompact.cs rename to src/neo/Consensus/RecoveryMessage.PreparationPayloadCompact.cs diff --git a/neo/Consensus/RecoveryMessage.cs b/src/neo/Consensus/RecoveryMessage.cs similarity index 100% rename from neo/Consensus/RecoveryMessage.cs rename to src/neo/Consensus/RecoveryMessage.cs diff --git a/neo/Consensus/RecoveryRequest.cs b/src/neo/Consensus/RecoveryRequest.cs similarity index 100% rename from neo/Consensus/RecoveryRequest.cs rename to src/neo/Consensus/RecoveryRequest.cs diff --git a/neo/Cryptography/Base58.cs b/src/neo/Cryptography/Base58.cs similarity index 100% rename from neo/Cryptography/Base58.cs rename to src/neo/Cryptography/Base58.cs diff --git a/neo/Cryptography/BloomFilter.cs b/src/neo/Cryptography/BloomFilter.cs similarity index 100% rename from neo/Cryptography/BloomFilter.cs rename to src/neo/Cryptography/BloomFilter.cs diff --git a/neo/Cryptography/Crypto.cs b/src/neo/Cryptography/Crypto.cs similarity index 100% rename from neo/Cryptography/Crypto.cs rename to src/neo/Cryptography/Crypto.cs diff --git a/neo/Cryptography/ECC/ECCurve.cs b/src/neo/Cryptography/ECC/ECCurve.cs similarity index 100% rename from neo/Cryptography/ECC/ECCurve.cs rename to src/neo/Cryptography/ECC/ECCurve.cs diff --git a/neo/Cryptography/ECC/ECDsa.cs b/src/neo/Cryptography/ECC/ECDsa.cs similarity index 100% rename from neo/Cryptography/ECC/ECDsa.cs rename to src/neo/Cryptography/ECC/ECDsa.cs diff --git a/neo/Cryptography/ECC/ECFieldElement.cs b/src/neo/Cryptography/ECC/ECFieldElement.cs similarity index 100% rename from neo/Cryptography/ECC/ECFieldElement.cs rename to src/neo/Cryptography/ECC/ECFieldElement.cs diff --git a/neo/Cryptography/ECC/ECPoint.cs b/src/neo/Cryptography/ECC/ECPoint.cs similarity index 100% rename from neo/Cryptography/ECC/ECPoint.cs rename to src/neo/Cryptography/ECC/ECPoint.cs diff --git a/neo/Cryptography/Helper.cs b/src/neo/Cryptography/Helper.cs similarity index 100% rename from neo/Cryptography/Helper.cs rename to src/neo/Cryptography/Helper.cs diff --git a/neo/Cryptography/MerkleTree.cs b/src/neo/Cryptography/MerkleTree.cs similarity index 100% rename from neo/Cryptography/MerkleTree.cs rename to src/neo/Cryptography/MerkleTree.cs diff --git a/neo/Cryptography/MerkleTreeNode.cs b/src/neo/Cryptography/MerkleTreeNode.cs similarity index 100% rename from neo/Cryptography/MerkleTreeNode.cs rename to src/neo/Cryptography/MerkleTreeNode.cs diff --git a/neo/Cryptography/Murmur3.cs b/src/neo/Cryptography/Murmur3.cs similarity index 100% rename from neo/Cryptography/Murmur3.cs rename to src/neo/Cryptography/Murmur3.cs diff --git a/neo/Cryptography/RIPEMD160Managed.cs b/src/neo/Cryptography/RIPEMD160Managed.cs similarity index 100% rename from neo/Cryptography/RIPEMD160Managed.cs rename to src/neo/Cryptography/RIPEMD160Managed.cs diff --git a/neo/Cryptography/SCrypt.cs b/src/neo/Cryptography/SCrypt.cs similarity index 100% rename from neo/Cryptography/SCrypt.cs rename to src/neo/Cryptography/SCrypt.cs diff --git a/neo/Helper.cs b/src/neo/Helper.cs similarity index 100% rename from neo/Helper.cs rename to src/neo/Helper.cs diff --git a/neo/IO/Actors/Idle.cs b/src/neo/IO/Actors/Idle.cs similarity index 100% rename from neo/IO/Actors/Idle.cs rename to src/neo/IO/Actors/Idle.cs diff --git a/neo/IO/Actors/PriorityMailbox.cs b/src/neo/IO/Actors/PriorityMailbox.cs similarity index 100% rename from neo/IO/Actors/PriorityMailbox.cs rename to src/neo/IO/Actors/PriorityMailbox.cs diff --git a/neo/IO/Actors/PriorityMessageQueue.cs b/src/neo/IO/Actors/PriorityMessageQueue.cs similarity index 100% rename from neo/IO/Actors/PriorityMessageQueue.cs rename to src/neo/IO/Actors/PriorityMessageQueue.cs diff --git a/neo/IO/ByteArrayComparer.cs b/src/neo/IO/ByteArrayComparer.cs similarity index 100% rename from neo/IO/ByteArrayComparer.cs rename to src/neo/IO/ByteArrayComparer.cs diff --git a/neo/IO/Caching/Cache.cs b/src/neo/IO/Caching/Cache.cs similarity index 100% rename from neo/IO/Caching/Cache.cs rename to src/neo/IO/Caching/Cache.cs diff --git a/neo/IO/Caching/CloneCache.cs b/src/neo/IO/Caching/CloneCache.cs similarity index 100% rename from neo/IO/Caching/CloneCache.cs rename to src/neo/IO/Caching/CloneCache.cs diff --git a/neo/IO/Caching/CloneMetaCache.cs b/src/neo/IO/Caching/CloneMetaCache.cs similarity index 100% rename from neo/IO/Caching/CloneMetaCache.cs rename to src/neo/IO/Caching/CloneMetaCache.cs diff --git a/neo/IO/Caching/DataCache.cs b/src/neo/IO/Caching/DataCache.cs similarity index 100% rename from neo/IO/Caching/DataCache.cs rename to src/neo/IO/Caching/DataCache.cs diff --git a/neo/IO/Caching/FIFOCache.cs b/src/neo/IO/Caching/FIFOCache.cs similarity index 100% rename from neo/IO/Caching/FIFOCache.cs rename to src/neo/IO/Caching/FIFOCache.cs diff --git a/neo/IO/Caching/FIFOSet.cs b/src/neo/IO/Caching/FIFOSet.cs similarity index 100% rename from neo/IO/Caching/FIFOSet.cs rename to src/neo/IO/Caching/FIFOSet.cs diff --git a/neo/IO/Caching/MetaDataCache.cs b/src/neo/IO/Caching/MetaDataCache.cs similarity index 100% rename from neo/IO/Caching/MetaDataCache.cs rename to src/neo/IO/Caching/MetaDataCache.cs diff --git a/neo/IO/Caching/OrderedDictionary.cs b/src/neo/IO/Caching/OrderedDictionary.cs similarity index 100% rename from neo/IO/Caching/OrderedDictionary.cs rename to src/neo/IO/Caching/OrderedDictionary.cs diff --git a/neo/IO/Caching/ReflectionCache.cs b/src/neo/IO/Caching/ReflectionCache.cs similarity index 100% rename from neo/IO/Caching/ReflectionCache.cs rename to src/neo/IO/Caching/ReflectionCache.cs diff --git a/neo/IO/Caching/ReflectionCacheAttribute.cs b/src/neo/IO/Caching/ReflectionCacheAttribute.cs similarity index 100% rename from neo/IO/Caching/ReflectionCacheAttribute.cs rename to src/neo/IO/Caching/ReflectionCacheAttribute.cs diff --git a/neo/IO/Caching/RelayCache.cs b/src/neo/IO/Caching/RelayCache.cs similarity index 100% rename from neo/IO/Caching/RelayCache.cs rename to src/neo/IO/Caching/RelayCache.cs diff --git a/neo/IO/Caching/TrackState.cs b/src/neo/IO/Caching/TrackState.cs similarity index 100% rename from neo/IO/Caching/TrackState.cs rename to src/neo/IO/Caching/TrackState.cs diff --git a/neo/IO/Data/LevelDB/DB.cs b/src/neo/IO/Data/LevelDB/DB.cs similarity index 100% rename from neo/IO/Data/LevelDB/DB.cs rename to src/neo/IO/Data/LevelDB/DB.cs diff --git a/neo/IO/Data/LevelDB/Helper.cs b/src/neo/IO/Data/LevelDB/Helper.cs similarity index 100% rename from neo/IO/Data/LevelDB/Helper.cs rename to src/neo/IO/Data/LevelDB/Helper.cs diff --git a/neo/IO/Data/LevelDB/Iterator.cs b/src/neo/IO/Data/LevelDB/Iterator.cs similarity index 100% rename from neo/IO/Data/LevelDB/Iterator.cs rename to src/neo/IO/Data/LevelDB/Iterator.cs diff --git a/neo/IO/Data/LevelDB/LevelDBException.cs b/src/neo/IO/Data/LevelDB/LevelDBException.cs similarity index 100% rename from neo/IO/Data/LevelDB/LevelDBException.cs rename to src/neo/IO/Data/LevelDB/LevelDBException.cs diff --git a/neo/IO/Data/LevelDB/Native.cs b/src/neo/IO/Data/LevelDB/Native.cs similarity index 100% rename from neo/IO/Data/LevelDB/Native.cs rename to src/neo/IO/Data/LevelDB/Native.cs diff --git a/neo/IO/Data/LevelDB/Options.cs b/src/neo/IO/Data/LevelDB/Options.cs similarity index 100% rename from neo/IO/Data/LevelDB/Options.cs rename to src/neo/IO/Data/LevelDB/Options.cs diff --git a/neo/IO/Data/LevelDB/ReadOptions.cs b/src/neo/IO/Data/LevelDB/ReadOptions.cs similarity index 100% rename from neo/IO/Data/LevelDB/ReadOptions.cs rename to src/neo/IO/Data/LevelDB/ReadOptions.cs diff --git a/neo/IO/Data/LevelDB/Slice.cs b/src/neo/IO/Data/LevelDB/Slice.cs similarity index 100% rename from neo/IO/Data/LevelDB/Slice.cs rename to src/neo/IO/Data/LevelDB/Slice.cs diff --git a/neo/IO/Data/LevelDB/SliceBuilder.cs b/src/neo/IO/Data/LevelDB/SliceBuilder.cs similarity index 100% rename from neo/IO/Data/LevelDB/SliceBuilder.cs rename to src/neo/IO/Data/LevelDB/SliceBuilder.cs diff --git a/neo/IO/Data/LevelDB/Snapshot.cs b/src/neo/IO/Data/LevelDB/Snapshot.cs similarity index 100% rename from neo/IO/Data/LevelDB/Snapshot.cs rename to src/neo/IO/Data/LevelDB/Snapshot.cs diff --git a/neo/IO/Data/LevelDB/WriteBatch.cs b/src/neo/IO/Data/LevelDB/WriteBatch.cs similarity index 100% rename from neo/IO/Data/LevelDB/WriteBatch.cs rename to src/neo/IO/Data/LevelDB/WriteBatch.cs diff --git a/neo/IO/Data/LevelDB/WriteOptions.cs b/src/neo/IO/Data/LevelDB/WriteOptions.cs similarity index 100% rename from neo/IO/Data/LevelDB/WriteOptions.cs rename to src/neo/IO/Data/LevelDB/WriteOptions.cs diff --git a/neo/IO/Helper.cs b/src/neo/IO/Helper.cs similarity index 100% rename from neo/IO/Helper.cs rename to src/neo/IO/Helper.cs diff --git a/neo/IO/ICloneable.cs b/src/neo/IO/ICloneable.cs similarity index 100% rename from neo/IO/ICloneable.cs rename to src/neo/IO/ICloneable.cs diff --git a/neo/IO/ISerializable.cs b/src/neo/IO/ISerializable.cs similarity index 100% rename from neo/IO/ISerializable.cs rename to src/neo/IO/ISerializable.cs diff --git a/neo/IO/Json/JArray.cs b/src/neo/IO/Json/JArray.cs similarity index 100% rename from neo/IO/Json/JArray.cs rename to src/neo/IO/Json/JArray.cs diff --git a/neo/IO/Json/JBoolean.cs b/src/neo/IO/Json/JBoolean.cs similarity index 100% rename from neo/IO/Json/JBoolean.cs rename to src/neo/IO/Json/JBoolean.cs diff --git a/neo/IO/Json/JNumber.cs b/src/neo/IO/Json/JNumber.cs similarity index 100% rename from neo/IO/Json/JNumber.cs rename to src/neo/IO/Json/JNumber.cs diff --git a/neo/IO/Json/JObject.cs b/src/neo/IO/Json/JObject.cs similarity index 100% rename from neo/IO/Json/JObject.cs rename to src/neo/IO/Json/JObject.cs diff --git a/neo/IO/Json/JString.cs b/src/neo/IO/Json/JString.cs similarity index 100% rename from neo/IO/Json/JString.cs rename to src/neo/IO/Json/JString.cs diff --git a/neo/IO/Wrappers/SerializableWrapper.cs b/src/neo/IO/Wrappers/SerializableWrapper.cs similarity index 100% rename from neo/IO/Wrappers/SerializableWrapper.cs rename to src/neo/IO/Wrappers/SerializableWrapper.cs diff --git a/neo/IO/Wrappers/UInt32Wrapper.cs b/src/neo/IO/Wrappers/UInt32Wrapper.cs similarity index 100% rename from neo/IO/Wrappers/UInt32Wrapper.cs rename to src/neo/IO/Wrappers/UInt32Wrapper.cs diff --git a/neo/Ledger/Blockchain.ApplicationExecuted.cs b/src/neo/Ledger/Blockchain.ApplicationExecuted.cs similarity index 100% rename from neo/Ledger/Blockchain.ApplicationExecuted.cs rename to src/neo/Ledger/Blockchain.ApplicationExecuted.cs diff --git a/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs similarity index 100% rename from neo/Ledger/Blockchain.cs rename to src/neo/Ledger/Blockchain.cs diff --git a/neo/Ledger/ContractState.cs b/src/neo/Ledger/ContractState.cs similarity index 100% rename from neo/Ledger/ContractState.cs rename to src/neo/Ledger/ContractState.cs diff --git a/neo/Ledger/HashIndexState.cs b/src/neo/Ledger/HashIndexState.cs similarity index 100% rename from neo/Ledger/HashIndexState.cs rename to src/neo/Ledger/HashIndexState.cs diff --git a/neo/Ledger/HeaderHashList.cs b/src/neo/Ledger/HeaderHashList.cs similarity index 100% rename from neo/Ledger/HeaderHashList.cs rename to src/neo/Ledger/HeaderHashList.cs diff --git a/neo/Ledger/MemoryPool.cs b/src/neo/Ledger/MemoryPool.cs similarity index 100% rename from neo/Ledger/MemoryPool.cs rename to src/neo/Ledger/MemoryPool.cs diff --git a/neo/Ledger/PoolItem.cs b/src/neo/Ledger/PoolItem.cs similarity index 100% rename from neo/Ledger/PoolItem.cs rename to src/neo/Ledger/PoolItem.cs diff --git a/neo/Ledger/RelayResultReason.cs b/src/neo/Ledger/RelayResultReason.cs similarity index 100% rename from neo/Ledger/RelayResultReason.cs rename to src/neo/Ledger/RelayResultReason.cs diff --git a/neo/Ledger/SendersFeeMonitor.cs b/src/neo/Ledger/SendersFeeMonitor.cs similarity index 100% rename from neo/Ledger/SendersFeeMonitor.cs rename to src/neo/Ledger/SendersFeeMonitor.cs diff --git a/neo/Ledger/StorageFlags.cs b/src/neo/Ledger/StorageFlags.cs similarity index 100% rename from neo/Ledger/StorageFlags.cs rename to src/neo/Ledger/StorageFlags.cs diff --git a/neo/Ledger/StorageItem.cs b/src/neo/Ledger/StorageItem.cs similarity index 100% rename from neo/Ledger/StorageItem.cs rename to src/neo/Ledger/StorageItem.cs diff --git a/neo/Ledger/StorageKey.cs b/src/neo/Ledger/StorageKey.cs similarity index 100% rename from neo/Ledger/StorageKey.cs rename to src/neo/Ledger/StorageKey.cs diff --git a/neo/Ledger/TransactionState.cs b/src/neo/Ledger/TransactionState.cs similarity index 100% rename from neo/Ledger/TransactionState.cs rename to src/neo/Ledger/TransactionState.cs diff --git a/neo/Ledger/TrimmedBlock.cs b/src/neo/Ledger/TrimmedBlock.cs similarity index 100% rename from neo/Ledger/TrimmedBlock.cs rename to src/neo/Ledger/TrimmedBlock.cs diff --git a/neo/NeoSystem.cs b/src/neo/NeoSystem.cs similarity index 100% rename from neo/NeoSystem.cs rename to src/neo/NeoSystem.cs diff --git a/neo/Network/P2P/Capabilities/FullNodeCapability.cs b/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs similarity index 100% rename from neo/Network/P2P/Capabilities/FullNodeCapability.cs rename to src/neo/Network/P2P/Capabilities/FullNodeCapability.cs diff --git a/neo/Network/P2P/Capabilities/NodeCapability.cs b/src/neo/Network/P2P/Capabilities/NodeCapability.cs similarity index 100% rename from neo/Network/P2P/Capabilities/NodeCapability.cs rename to src/neo/Network/P2P/Capabilities/NodeCapability.cs diff --git a/neo/Network/P2P/Capabilities/NodeCapabilityType.cs b/src/neo/Network/P2P/Capabilities/NodeCapabilityType.cs similarity index 100% rename from neo/Network/P2P/Capabilities/NodeCapabilityType.cs rename to src/neo/Network/P2P/Capabilities/NodeCapabilityType.cs diff --git a/neo/Network/P2P/Capabilities/ServerCapability.cs b/src/neo/Network/P2P/Capabilities/ServerCapability.cs similarity index 100% rename from neo/Network/P2P/Capabilities/ServerCapability.cs rename to src/neo/Network/P2P/Capabilities/ServerCapability.cs diff --git a/neo/Network/P2P/ChannelsConfig.cs b/src/neo/Network/P2P/ChannelsConfig.cs similarity index 100% rename from neo/Network/P2P/ChannelsConfig.cs rename to src/neo/Network/P2P/ChannelsConfig.cs diff --git a/neo/Network/P2P/Connection.cs b/src/neo/Network/P2P/Connection.cs similarity index 100% rename from neo/Network/P2P/Connection.cs rename to src/neo/Network/P2P/Connection.cs diff --git a/neo/Network/P2P/Helper.cs b/src/neo/Network/P2P/Helper.cs similarity index 100% rename from neo/Network/P2P/Helper.cs rename to src/neo/Network/P2P/Helper.cs diff --git a/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs similarity index 100% rename from neo/Network/P2P/LocalNode.cs rename to src/neo/Network/P2P/LocalNode.cs diff --git a/neo/Network/P2P/Message.cs b/src/neo/Network/P2P/Message.cs similarity index 100% rename from neo/Network/P2P/Message.cs rename to src/neo/Network/P2P/Message.cs diff --git a/neo/Network/P2P/MessageCommand.cs b/src/neo/Network/P2P/MessageCommand.cs similarity index 100% rename from neo/Network/P2P/MessageCommand.cs rename to src/neo/Network/P2P/MessageCommand.cs diff --git a/neo/Network/P2P/MessageFlags.cs b/src/neo/Network/P2P/MessageFlags.cs similarity index 100% rename from neo/Network/P2P/MessageFlags.cs rename to src/neo/Network/P2P/MessageFlags.cs diff --git a/neo/Network/P2P/Payloads/AddrPayload.cs b/src/neo/Network/P2P/Payloads/AddrPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/AddrPayload.cs rename to src/neo/Network/P2P/Payloads/AddrPayload.cs diff --git a/neo/Network/P2P/Payloads/Block.cs b/src/neo/Network/P2P/Payloads/Block.cs similarity index 100% rename from neo/Network/P2P/Payloads/Block.cs rename to src/neo/Network/P2P/Payloads/Block.cs diff --git a/neo/Network/P2P/Payloads/BlockBase.cs b/src/neo/Network/P2P/Payloads/BlockBase.cs similarity index 100% rename from neo/Network/P2P/Payloads/BlockBase.cs rename to src/neo/Network/P2P/Payloads/BlockBase.cs diff --git a/neo/Network/P2P/Payloads/ConsensusData.cs b/src/neo/Network/P2P/Payloads/ConsensusData.cs similarity index 100% rename from neo/Network/P2P/Payloads/ConsensusData.cs rename to src/neo/Network/P2P/Payloads/ConsensusData.cs diff --git a/neo/Network/P2P/Payloads/ConsensusPayload.cs b/src/neo/Network/P2P/Payloads/ConsensusPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/ConsensusPayload.cs rename to src/neo/Network/P2P/Payloads/ConsensusPayload.cs diff --git a/neo/Network/P2P/Payloads/Cosigner.cs b/src/neo/Network/P2P/Payloads/Cosigner.cs similarity index 100% rename from neo/Network/P2P/Payloads/Cosigner.cs rename to src/neo/Network/P2P/Payloads/Cosigner.cs diff --git a/neo/Network/P2P/Payloads/FilterAddPayload.cs b/src/neo/Network/P2P/Payloads/FilterAddPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/FilterAddPayload.cs rename to src/neo/Network/P2P/Payloads/FilterAddPayload.cs diff --git a/neo/Network/P2P/Payloads/FilterLoadPayload.cs b/src/neo/Network/P2P/Payloads/FilterLoadPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/FilterLoadPayload.cs rename to src/neo/Network/P2P/Payloads/FilterLoadPayload.cs diff --git a/neo/Network/P2P/Payloads/GetBlockDataPayload.cs b/src/neo/Network/P2P/Payloads/GetBlockDataPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/GetBlockDataPayload.cs rename to src/neo/Network/P2P/Payloads/GetBlockDataPayload.cs diff --git a/neo/Network/P2P/Payloads/GetBlocksPayload.cs b/src/neo/Network/P2P/Payloads/GetBlocksPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/GetBlocksPayload.cs rename to src/neo/Network/P2P/Payloads/GetBlocksPayload.cs diff --git a/neo/Network/P2P/Payloads/Header.cs b/src/neo/Network/P2P/Payloads/Header.cs similarity index 100% rename from neo/Network/P2P/Payloads/Header.cs rename to src/neo/Network/P2P/Payloads/Header.cs diff --git a/neo/Network/P2P/Payloads/HeadersPayload.cs b/src/neo/Network/P2P/Payloads/HeadersPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/HeadersPayload.cs rename to src/neo/Network/P2P/Payloads/HeadersPayload.cs diff --git a/neo/Network/P2P/Payloads/IInventory.cs b/src/neo/Network/P2P/Payloads/IInventory.cs similarity index 100% rename from neo/Network/P2P/Payloads/IInventory.cs rename to src/neo/Network/P2P/Payloads/IInventory.cs diff --git a/neo/Network/P2P/Payloads/IVerifiable.cs b/src/neo/Network/P2P/Payloads/IVerifiable.cs similarity index 100% rename from neo/Network/P2P/Payloads/IVerifiable.cs rename to src/neo/Network/P2P/Payloads/IVerifiable.cs diff --git a/neo/Network/P2P/Payloads/InvPayload.cs b/src/neo/Network/P2P/Payloads/InvPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/InvPayload.cs rename to src/neo/Network/P2P/Payloads/InvPayload.cs diff --git a/neo/Network/P2P/Payloads/InventoryType.cs b/src/neo/Network/P2P/Payloads/InventoryType.cs similarity index 100% rename from neo/Network/P2P/Payloads/InventoryType.cs rename to src/neo/Network/P2P/Payloads/InventoryType.cs diff --git a/neo/Network/P2P/Payloads/MerkleBlockPayload.cs b/src/neo/Network/P2P/Payloads/MerkleBlockPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/MerkleBlockPayload.cs rename to src/neo/Network/P2P/Payloads/MerkleBlockPayload.cs diff --git a/neo/Network/P2P/Payloads/NetworkAddressWithTime.cs b/src/neo/Network/P2P/Payloads/NetworkAddressWithTime.cs similarity index 100% rename from neo/Network/P2P/Payloads/NetworkAddressWithTime.cs rename to src/neo/Network/P2P/Payloads/NetworkAddressWithTime.cs diff --git a/neo/Network/P2P/Payloads/PingPayload.cs b/src/neo/Network/P2P/Payloads/PingPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/PingPayload.cs rename to src/neo/Network/P2P/Payloads/PingPayload.cs diff --git a/neo/Network/P2P/Payloads/Transaction.cs b/src/neo/Network/P2P/Payloads/Transaction.cs similarity index 100% rename from neo/Network/P2P/Payloads/Transaction.cs rename to src/neo/Network/P2P/Payloads/Transaction.cs diff --git a/neo/Network/P2P/Payloads/TransactionAttribute.cs b/src/neo/Network/P2P/Payloads/TransactionAttribute.cs similarity index 100% rename from neo/Network/P2P/Payloads/TransactionAttribute.cs rename to src/neo/Network/P2P/Payloads/TransactionAttribute.cs diff --git a/neo/Network/P2P/Payloads/TransactionAttributeUsage.cs b/src/neo/Network/P2P/Payloads/TransactionAttributeUsage.cs similarity index 100% rename from neo/Network/P2P/Payloads/TransactionAttributeUsage.cs rename to src/neo/Network/P2P/Payloads/TransactionAttributeUsage.cs diff --git a/neo/Network/P2P/Payloads/VersionPayload.cs b/src/neo/Network/P2P/Payloads/VersionPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/VersionPayload.cs rename to src/neo/Network/P2P/Payloads/VersionPayload.cs diff --git a/neo/Network/P2P/Payloads/Witness.cs b/src/neo/Network/P2P/Payloads/Witness.cs similarity index 100% rename from neo/Network/P2P/Payloads/Witness.cs rename to src/neo/Network/P2P/Payloads/Witness.cs diff --git a/neo/Network/P2P/Payloads/WitnessScope.cs b/src/neo/Network/P2P/Payloads/WitnessScope.cs similarity index 100% rename from neo/Network/P2P/Payloads/WitnessScope.cs rename to src/neo/Network/P2P/Payloads/WitnessScope.cs diff --git a/neo/Network/P2P/Peer.cs b/src/neo/Network/P2P/Peer.cs similarity index 100% rename from neo/Network/P2P/Peer.cs rename to src/neo/Network/P2P/Peer.cs diff --git a/neo/Network/P2P/ProtocolHandler.cs b/src/neo/Network/P2P/ProtocolHandler.cs similarity index 100% rename from neo/Network/P2P/ProtocolHandler.cs rename to src/neo/Network/P2P/ProtocolHandler.cs diff --git a/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs similarity index 100% rename from neo/Network/P2P/RemoteNode.cs rename to src/neo/Network/P2P/RemoteNode.cs diff --git a/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs similarity index 100% rename from neo/Network/P2P/TaskManager.cs rename to src/neo/Network/P2P/TaskManager.cs diff --git a/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs similarity index 100% rename from neo/Network/P2P/TaskSession.cs rename to src/neo/Network/P2P/TaskSession.cs diff --git a/neo/Network/RPC/ContractClient.cs b/src/neo/Network/RPC/ContractClient.cs similarity index 100% rename from neo/Network/RPC/ContractClient.cs rename to src/neo/Network/RPC/ContractClient.cs diff --git a/neo/Network/RPC/Helper.cs b/src/neo/Network/RPC/Helper.cs similarity index 100% rename from neo/Network/RPC/Helper.cs rename to src/neo/Network/RPC/Helper.cs diff --git a/neo/Network/RPC/Models/RpcBlock.cs b/src/neo/Network/RPC/Models/RpcBlock.cs similarity index 100% rename from neo/Network/RPC/Models/RpcBlock.cs rename to src/neo/Network/RPC/Models/RpcBlock.cs diff --git a/neo/Network/RPC/Models/RpcBlockHeader.cs b/src/neo/Network/RPC/Models/RpcBlockHeader.cs similarity index 100% rename from neo/Network/RPC/Models/RpcBlockHeader.cs rename to src/neo/Network/RPC/Models/RpcBlockHeader.cs diff --git a/neo/Network/RPC/Models/RpcInvokeResult.cs b/src/neo/Network/RPC/Models/RpcInvokeResult.cs similarity index 100% rename from neo/Network/RPC/Models/RpcInvokeResult.cs rename to src/neo/Network/RPC/Models/RpcInvokeResult.cs diff --git a/neo/Network/RPC/Models/RpcNep5Balances.cs b/src/neo/Network/RPC/Models/RpcNep5Balances.cs similarity index 100% rename from neo/Network/RPC/Models/RpcNep5Balances.cs rename to src/neo/Network/RPC/Models/RpcNep5Balances.cs diff --git a/neo/Network/RPC/Models/RpcNep5TokenInfo.cs b/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs similarity index 100% rename from neo/Network/RPC/Models/RpcNep5TokenInfo.cs rename to src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs diff --git a/neo/Network/RPC/Models/RpcPeers.cs b/src/neo/Network/RPC/Models/RpcPeers.cs similarity index 100% rename from neo/Network/RPC/Models/RpcPeers.cs rename to src/neo/Network/RPC/Models/RpcPeers.cs diff --git a/neo/Network/RPC/Models/RpcPlugin.cs b/src/neo/Network/RPC/Models/RpcPlugin.cs similarity index 100% rename from neo/Network/RPC/Models/RpcPlugin.cs rename to src/neo/Network/RPC/Models/RpcPlugin.cs diff --git a/neo/Network/RPC/Models/RpcRawMemPool.cs b/src/neo/Network/RPC/Models/RpcRawMemPool.cs similarity index 100% rename from neo/Network/RPC/Models/RpcRawMemPool.cs rename to src/neo/Network/RPC/Models/RpcRawMemPool.cs diff --git a/neo/Network/RPC/Models/RpcRequest.cs b/src/neo/Network/RPC/Models/RpcRequest.cs similarity index 100% rename from neo/Network/RPC/Models/RpcRequest.cs rename to src/neo/Network/RPC/Models/RpcRequest.cs diff --git a/neo/Network/RPC/Models/RpcResponse.cs b/src/neo/Network/RPC/Models/RpcResponse.cs similarity index 100% rename from neo/Network/RPC/Models/RpcResponse.cs rename to src/neo/Network/RPC/Models/RpcResponse.cs diff --git a/neo/Network/RPC/Models/RpcTransaction.cs b/src/neo/Network/RPC/Models/RpcTransaction.cs similarity index 100% rename from neo/Network/RPC/Models/RpcTransaction.cs rename to src/neo/Network/RPC/Models/RpcTransaction.cs diff --git a/neo/Network/RPC/Models/RpcValidateAddressResult.cs b/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs similarity index 100% rename from neo/Network/RPC/Models/RpcValidateAddressResult.cs rename to src/neo/Network/RPC/Models/RpcValidateAddressResult.cs diff --git a/neo/Network/RPC/Models/RpcValidator.cs b/src/neo/Network/RPC/Models/RpcValidator.cs similarity index 100% rename from neo/Network/RPC/Models/RpcValidator.cs rename to src/neo/Network/RPC/Models/RpcValidator.cs diff --git a/neo/Network/RPC/Models/RpcVersion.cs b/src/neo/Network/RPC/Models/RpcVersion.cs similarity index 100% rename from neo/Network/RPC/Models/RpcVersion.cs rename to src/neo/Network/RPC/Models/RpcVersion.cs diff --git a/neo/Network/RPC/Nep5API.cs b/src/neo/Network/RPC/Nep5API.cs similarity index 100% rename from neo/Network/RPC/Nep5API.cs rename to src/neo/Network/RPC/Nep5API.cs diff --git a/neo/Network/RPC/PolicyAPI.cs b/src/neo/Network/RPC/PolicyAPI.cs similarity index 100% rename from neo/Network/RPC/PolicyAPI.cs rename to src/neo/Network/RPC/PolicyAPI.cs diff --git a/neo/Network/RPC/RpcClient.cs b/src/neo/Network/RPC/RpcClient.cs similarity index 100% rename from neo/Network/RPC/RpcClient.cs rename to src/neo/Network/RPC/RpcClient.cs diff --git a/neo/Network/RPC/RpcException.cs b/src/neo/Network/RPC/RpcException.cs similarity index 100% rename from neo/Network/RPC/RpcException.cs rename to src/neo/Network/RPC/RpcException.cs diff --git a/neo/Network/RPC/RpcServer.cs b/src/neo/Network/RPC/RpcServer.cs similarity index 100% rename from neo/Network/RPC/RpcServer.cs rename to src/neo/Network/RPC/RpcServer.cs diff --git a/neo/Network/RPC/TransactionManager.cs b/src/neo/Network/RPC/TransactionManager.cs similarity index 100% rename from neo/Network/RPC/TransactionManager.cs rename to src/neo/Network/RPC/TransactionManager.cs diff --git a/neo/Network/RPC/WalletAPI.cs b/src/neo/Network/RPC/WalletAPI.cs similarity index 100% rename from neo/Network/RPC/WalletAPI.cs rename to src/neo/Network/RPC/WalletAPI.cs diff --git a/neo/Network/UPnP.cs b/src/neo/Network/UPnP.cs similarity index 100% rename from neo/Network/UPnP.cs rename to src/neo/Network/UPnP.cs diff --git a/neo/Persistence/ClonedView.cs b/src/neo/Persistence/ClonedView.cs similarity index 100% rename from neo/Persistence/ClonedView.cs rename to src/neo/Persistence/ClonedView.cs diff --git a/neo/Persistence/IReadOnlyStore.cs b/src/neo/Persistence/IReadOnlyStore.cs similarity index 100% rename from neo/Persistence/IReadOnlyStore.cs rename to src/neo/Persistence/IReadOnlyStore.cs diff --git a/neo/Persistence/ISnapshot.cs b/src/neo/Persistence/ISnapshot.cs similarity index 100% rename from neo/Persistence/ISnapshot.cs rename to src/neo/Persistence/ISnapshot.cs diff --git a/neo/Persistence/IStore.cs b/src/neo/Persistence/IStore.cs similarity index 100% rename from neo/Persistence/IStore.cs rename to src/neo/Persistence/IStore.cs diff --git a/neo/Persistence/LevelDB/Snapshot.cs b/src/neo/Persistence/LevelDB/Snapshot.cs similarity index 100% rename from neo/Persistence/LevelDB/Snapshot.cs rename to src/neo/Persistence/LevelDB/Snapshot.cs diff --git a/neo/Persistence/LevelDB/Store.cs b/src/neo/Persistence/LevelDB/Store.cs similarity index 100% rename from neo/Persistence/LevelDB/Store.cs rename to src/neo/Persistence/LevelDB/Store.cs diff --git a/neo/Persistence/Memory/ByteArrayEqualityComparer.cs b/src/neo/Persistence/Memory/ByteArrayEqualityComparer.cs similarity index 100% rename from neo/Persistence/Memory/ByteArrayEqualityComparer.cs rename to src/neo/Persistence/Memory/ByteArrayEqualityComparer.cs diff --git a/neo/Persistence/Memory/Helper.cs b/src/neo/Persistence/Memory/Helper.cs similarity index 100% rename from neo/Persistence/Memory/Helper.cs rename to src/neo/Persistence/Memory/Helper.cs diff --git a/neo/Persistence/Memory/Snapshot.cs b/src/neo/Persistence/Memory/Snapshot.cs similarity index 100% rename from neo/Persistence/Memory/Snapshot.cs rename to src/neo/Persistence/Memory/Snapshot.cs diff --git a/neo/Persistence/Memory/Store.cs b/src/neo/Persistence/Memory/Store.cs similarity index 100% rename from neo/Persistence/Memory/Store.cs rename to src/neo/Persistence/Memory/Store.cs diff --git a/neo/Persistence/Prefixes.cs b/src/neo/Persistence/Prefixes.cs similarity index 100% rename from neo/Persistence/Prefixes.cs rename to src/neo/Persistence/Prefixes.cs diff --git a/neo/Persistence/RawView.cs b/src/neo/Persistence/RawView.cs similarity index 100% rename from neo/Persistence/RawView.cs rename to src/neo/Persistence/RawView.cs diff --git a/neo/Persistence/SnapshotView.cs b/src/neo/Persistence/SnapshotView.cs similarity index 100% rename from neo/Persistence/SnapshotView.cs rename to src/neo/Persistence/SnapshotView.cs diff --git a/neo/Persistence/StoreDataCache.cs b/src/neo/Persistence/StoreDataCache.cs similarity index 100% rename from neo/Persistence/StoreDataCache.cs rename to src/neo/Persistence/StoreDataCache.cs diff --git a/neo/Persistence/StoreMetaDataCache.cs b/src/neo/Persistence/StoreMetaDataCache.cs similarity index 100% rename from neo/Persistence/StoreMetaDataCache.cs rename to src/neo/Persistence/StoreMetaDataCache.cs diff --git a/neo/Persistence/StoreView.cs b/src/neo/Persistence/StoreView.cs similarity index 100% rename from neo/Persistence/StoreView.cs rename to src/neo/Persistence/StoreView.cs diff --git a/neo/Plugins/ILogPlugin.cs b/src/neo/Plugins/ILogPlugin.cs similarity index 100% rename from neo/Plugins/ILogPlugin.cs rename to src/neo/Plugins/ILogPlugin.cs diff --git a/neo/Plugins/IMemoryPoolTxObserverPlugin.cs b/src/neo/Plugins/IMemoryPoolTxObserverPlugin.cs similarity index 100% rename from neo/Plugins/IMemoryPoolTxObserverPlugin.cs rename to src/neo/Plugins/IMemoryPoolTxObserverPlugin.cs diff --git a/neo/Plugins/IP2PPlugin.cs b/src/neo/Plugins/IP2PPlugin.cs similarity index 100% rename from neo/Plugins/IP2PPlugin.cs rename to src/neo/Plugins/IP2PPlugin.cs diff --git a/neo/Plugins/IPersistencePlugin.cs b/src/neo/Plugins/IPersistencePlugin.cs similarity index 100% rename from neo/Plugins/IPersistencePlugin.cs rename to src/neo/Plugins/IPersistencePlugin.cs diff --git a/neo/Plugins/IRpcPlugin.cs b/src/neo/Plugins/IRpcPlugin.cs similarity index 100% rename from neo/Plugins/IRpcPlugin.cs rename to src/neo/Plugins/IRpcPlugin.cs diff --git a/neo/Plugins/LogLevel.cs b/src/neo/Plugins/LogLevel.cs similarity index 100% rename from neo/Plugins/LogLevel.cs rename to src/neo/Plugins/LogLevel.cs diff --git a/neo/Plugins/MemoryPoolTxRemovalReason.cs b/src/neo/Plugins/MemoryPoolTxRemovalReason.cs similarity index 100% rename from neo/Plugins/MemoryPoolTxRemovalReason.cs rename to src/neo/Plugins/MemoryPoolTxRemovalReason.cs diff --git a/neo/Plugins/Plugin.cs b/src/neo/Plugins/Plugin.cs similarity index 100% rename from neo/Plugins/Plugin.cs rename to src/neo/Plugins/Plugin.cs diff --git a/neo/Properties/AssemblyInfo.cs b/src/neo/Properties/AssemblyInfo.cs similarity index 100% rename from neo/Properties/AssemblyInfo.cs rename to src/neo/Properties/AssemblyInfo.cs diff --git a/neo/ProtocolSettings.cs b/src/neo/ProtocolSettings.cs similarity index 100% rename from neo/ProtocolSettings.cs rename to src/neo/ProtocolSettings.cs diff --git a/neo/SmartContract/ApplicationEngine.OpCodePrices.cs b/src/neo/SmartContract/ApplicationEngine.OpCodePrices.cs similarity index 100% rename from neo/SmartContract/ApplicationEngine.OpCodePrices.cs rename to src/neo/SmartContract/ApplicationEngine.OpCodePrices.cs diff --git a/neo/SmartContract/ApplicationEngine.cs b/src/neo/SmartContract/ApplicationEngine.cs similarity index 100% rename from neo/SmartContract/ApplicationEngine.cs rename to src/neo/SmartContract/ApplicationEngine.cs diff --git a/neo/SmartContract/ContainerPlaceholder.cs b/src/neo/SmartContract/ContainerPlaceholder.cs similarity index 100% rename from neo/SmartContract/ContainerPlaceholder.cs rename to src/neo/SmartContract/ContainerPlaceholder.cs diff --git a/neo/SmartContract/Contract.cs b/src/neo/SmartContract/Contract.cs similarity index 100% rename from neo/SmartContract/Contract.cs rename to src/neo/SmartContract/Contract.cs diff --git a/neo/SmartContract/ContractParameter.cs b/src/neo/SmartContract/ContractParameter.cs similarity index 100% rename from neo/SmartContract/ContractParameter.cs rename to src/neo/SmartContract/ContractParameter.cs diff --git a/neo/SmartContract/ContractParameterType.cs b/src/neo/SmartContract/ContractParameterType.cs similarity index 100% rename from neo/SmartContract/ContractParameterType.cs rename to src/neo/SmartContract/ContractParameterType.cs diff --git a/neo/SmartContract/ContractParametersContext.cs b/src/neo/SmartContract/ContractParametersContext.cs similarity index 100% rename from neo/SmartContract/ContractParametersContext.cs rename to src/neo/SmartContract/ContractParametersContext.cs diff --git a/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs b/src/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs similarity index 100% rename from neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs rename to src/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs diff --git a/neo/SmartContract/Enumerators/IEnumerator.cs b/src/neo/SmartContract/Enumerators/IEnumerator.cs similarity index 100% rename from neo/SmartContract/Enumerators/IEnumerator.cs rename to src/neo/SmartContract/Enumerators/IEnumerator.cs diff --git a/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs b/src/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs similarity index 100% rename from neo/SmartContract/Enumerators/IteratorKeysWrapper.cs rename to src/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs diff --git a/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs b/src/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs similarity index 100% rename from neo/SmartContract/Enumerators/IteratorValuesWrapper.cs rename to src/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs diff --git a/neo/SmartContract/ExecutionContextState.cs b/src/neo/SmartContract/ExecutionContextState.cs similarity index 100% rename from neo/SmartContract/ExecutionContextState.cs rename to src/neo/SmartContract/ExecutionContextState.cs diff --git a/neo/SmartContract/Helper.cs b/src/neo/SmartContract/Helper.cs similarity index 100% rename from neo/SmartContract/Helper.cs rename to src/neo/SmartContract/Helper.cs diff --git a/neo/SmartContract/IInteroperable.cs b/src/neo/SmartContract/IInteroperable.cs similarity index 100% rename from neo/SmartContract/IInteroperable.cs rename to src/neo/SmartContract/IInteroperable.cs diff --git a/neo/SmartContract/InteropDescriptor.cs b/src/neo/SmartContract/InteropDescriptor.cs similarity index 100% rename from neo/SmartContract/InteropDescriptor.cs rename to src/neo/SmartContract/InteropDescriptor.cs diff --git a/neo/SmartContract/InteropService.NEO.cs b/src/neo/SmartContract/InteropService.NEO.cs similarity index 100% rename from neo/SmartContract/InteropService.NEO.cs rename to src/neo/SmartContract/InteropService.NEO.cs diff --git a/neo/SmartContract/InteropService.cs b/src/neo/SmartContract/InteropService.cs similarity index 100% rename from neo/SmartContract/InteropService.cs rename to src/neo/SmartContract/InteropService.cs diff --git a/neo/SmartContract/Iterators/ArrayWrapper.cs b/src/neo/SmartContract/Iterators/ArrayWrapper.cs similarity index 100% rename from neo/SmartContract/Iterators/ArrayWrapper.cs rename to src/neo/SmartContract/Iterators/ArrayWrapper.cs diff --git a/neo/SmartContract/Iterators/ConcatenatedIterator.cs b/src/neo/SmartContract/Iterators/ConcatenatedIterator.cs similarity index 100% rename from neo/SmartContract/Iterators/ConcatenatedIterator.cs rename to src/neo/SmartContract/Iterators/ConcatenatedIterator.cs diff --git a/neo/SmartContract/Iterators/IIterator.cs b/src/neo/SmartContract/Iterators/IIterator.cs similarity index 100% rename from neo/SmartContract/Iterators/IIterator.cs rename to src/neo/SmartContract/Iterators/IIterator.cs diff --git a/neo/SmartContract/Iterators/MapWrapper.cs b/src/neo/SmartContract/Iterators/MapWrapper.cs similarity index 100% rename from neo/SmartContract/Iterators/MapWrapper.cs rename to src/neo/SmartContract/Iterators/MapWrapper.cs diff --git a/neo/SmartContract/Iterators/StorageIterator.cs b/src/neo/SmartContract/Iterators/StorageIterator.cs similarity index 100% rename from neo/SmartContract/Iterators/StorageIterator.cs rename to src/neo/SmartContract/Iterators/StorageIterator.cs diff --git a/neo/SmartContract/JsonSerializer.cs b/src/neo/SmartContract/JsonSerializer.cs similarity index 100% rename from neo/SmartContract/JsonSerializer.cs rename to src/neo/SmartContract/JsonSerializer.cs diff --git a/neo/SmartContract/LogEventArgs.cs b/src/neo/SmartContract/LogEventArgs.cs similarity index 100% rename from neo/SmartContract/LogEventArgs.cs rename to src/neo/SmartContract/LogEventArgs.cs diff --git a/neo/SmartContract/Manifest/ContractAbi.cs b/src/neo/SmartContract/Manifest/ContractAbi.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractAbi.cs rename to src/neo/SmartContract/Manifest/ContractAbi.cs diff --git a/neo/SmartContract/Manifest/ContractEventDescriptor.cs b/src/neo/SmartContract/Manifest/ContractEventDescriptor.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractEventDescriptor.cs rename to src/neo/SmartContract/Manifest/ContractEventDescriptor.cs diff --git a/neo/SmartContract/Manifest/ContractFeatures.cs b/src/neo/SmartContract/Manifest/ContractFeatures.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractFeatures.cs rename to src/neo/SmartContract/Manifest/ContractFeatures.cs diff --git a/neo/SmartContract/Manifest/ContractGroup.cs b/src/neo/SmartContract/Manifest/ContractGroup.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractGroup.cs rename to src/neo/SmartContract/Manifest/ContractGroup.cs diff --git a/neo/SmartContract/Manifest/ContractManifest.cs b/src/neo/SmartContract/Manifest/ContractManifest.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractManifest.cs rename to src/neo/SmartContract/Manifest/ContractManifest.cs diff --git a/neo/SmartContract/Manifest/ContractMethodDescriptor.cs b/src/neo/SmartContract/Manifest/ContractMethodDescriptor.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractMethodDescriptor.cs rename to src/neo/SmartContract/Manifest/ContractMethodDescriptor.cs diff --git a/neo/SmartContract/Manifest/ContractParameterDefinition.cs b/src/neo/SmartContract/Manifest/ContractParameterDefinition.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractParameterDefinition.cs rename to src/neo/SmartContract/Manifest/ContractParameterDefinition.cs diff --git a/neo/SmartContract/Manifest/ContractPermission.cs b/src/neo/SmartContract/Manifest/ContractPermission.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractPermission.cs rename to src/neo/SmartContract/Manifest/ContractPermission.cs diff --git a/neo/SmartContract/Manifest/ContractPermissionDescriptor.cs b/src/neo/SmartContract/Manifest/ContractPermissionDescriptor.cs similarity index 100% rename from neo/SmartContract/Manifest/ContractPermissionDescriptor.cs rename to src/neo/SmartContract/Manifest/ContractPermissionDescriptor.cs diff --git a/neo/SmartContract/Manifest/WildCardContainer.cs b/src/neo/SmartContract/Manifest/WildCardContainer.cs similarity index 100% rename from neo/SmartContract/Manifest/WildCardContainer.cs rename to src/neo/SmartContract/Manifest/WildCardContainer.cs diff --git a/neo/SmartContract/Native/ContractMethodAttribute.cs b/src/neo/SmartContract/Native/ContractMethodAttribute.cs similarity index 100% rename from neo/SmartContract/Native/ContractMethodAttribute.cs rename to src/neo/SmartContract/Native/ContractMethodAttribute.cs diff --git a/neo/SmartContract/Native/ContractMethodMetadata.cs b/src/neo/SmartContract/Native/ContractMethodMetadata.cs similarity index 100% rename from neo/SmartContract/Native/ContractMethodMetadata.cs rename to src/neo/SmartContract/Native/ContractMethodMetadata.cs diff --git a/neo/SmartContract/Native/NativeContract.cs b/src/neo/SmartContract/Native/NativeContract.cs similarity index 100% rename from neo/SmartContract/Native/NativeContract.cs rename to src/neo/SmartContract/Native/NativeContract.cs diff --git a/neo/SmartContract/Native/PolicyContract.cs b/src/neo/SmartContract/Native/PolicyContract.cs similarity index 100% rename from neo/SmartContract/Native/PolicyContract.cs rename to src/neo/SmartContract/Native/PolicyContract.cs diff --git a/neo/SmartContract/Native/Tokens/GasToken.cs b/src/neo/SmartContract/Native/Tokens/GasToken.cs similarity index 100% rename from neo/SmartContract/Native/Tokens/GasToken.cs rename to src/neo/SmartContract/Native/Tokens/GasToken.cs diff --git a/neo/SmartContract/Native/Tokens/NeoToken.cs b/src/neo/SmartContract/Native/Tokens/NeoToken.cs similarity index 100% rename from neo/SmartContract/Native/Tokens/NeoToken.cs rename to src/neo/SmartContract/Native/Tokens/NeoToken.cs diff --git a/neo/SmartContract/Native/Tokens/Nep5AccountState.cs b/src/neo/SmartContract/Native/Tokens/Nep5AccountState.cs similarity index 100% rename from neo/SmartContract/Native/Tokens/Nep5AccountState.cs rename to src/neo/SmartContract/Native/Tokens/Nep5AccountState.cs diff --git a/neo/SmartContract/Native/Tokens/Nep5Token.cs b/src/neo/SmartContract/Native/Tokens/Nep5Token.cs similarity index 100% rename from neo/SmartContract/Native/Tokens/Nep5Token.cs rename to src/neo/SmartContract/Native/Tokens/Nep5Token.cs diff --git a/neo/SmartContract/NefFile.cs b/src/neo/SmartContract/NefFile.cs similarity index 100% rename from neo/SmartContract/NefFile.cs rename to src/neo/SmartContract/NefFile.cs diff --git a/neo/SmartContract/NotifyEventArgs.cs b/src/neo/SmartContract/NotifyEventArgs.cs similarity index 100% rename from neo/SmartContract/NotifyEventArgs.cs rename to src/neo/SmartContract/NotifyEventArgs.cs diff --git a/neo/SmartContract/StackItemType.cs b/src/neo/SmartContract/StackItemType.cs similarity index 100% rename from neo/SmartContract/StackItemType.cs rename to src/neo/SmartContract/StackItemType.cs diff --git a/neo/SmartContract/StorageContext.cs b/src/neo/SmartContract/StorageContext.cs similarity index 100% rename from neo/SmartContract/StorageContext.cs rename to src/neo/SmartContract/StorageContext.cs diff --git a/neo/SmartContract/TriggerType.cs b/src/neo/SmartContract/TriggerType.cs similarity index 100% rename from neo/SmartContract/TriggerType.cs rename to src/neo/SmartContract/TriggerType.cs diff --git a/neo/TimeProvider.cs b/src/neo/TimeProvider.cs similarity index 100% rename from neo/TimeProvider.cs rename to src/neo/TimeProvider.cs diff --git a/neo/UInt160.cs b/src/neo/UInt160.cs similarity index 100% rename from neo/UInt160.cs rename to src/neo/UInt160.cs diff --git a/neo/UInt256.cs b/src/neo/UInt256.cs similarity index 100% rename from neo/UInt256.cs rename to src/neo/UInt256.cs diff --git a/neo/UIntBase.cs b/src/neo/UIntBase.cs similarity index 100% rename from neo/UIntBase.cs rename to src/neo/UIntBase.cs diff --git a/neo/Utility.cs b/src/neo/Utility.cs similarity index 100% rename from neo/Utility.cs rename to src/neo/Utility.cs diff --git a/neo/VM/Helper.cs b/src/neo/VM/Helper.cs similarity index 100% rename from neo/VM/Helper.cs rename to src/neo/VM/Helper.cs diff --git a/neo/Wallets/AssetDescriptor.cs b/src/neo/Wallets/AssetDescriptor.cs similarity index 100% rename from neo/Wallets/AssetDescriptor.cs rename to src/neo/Wallets/AssetDescriptor.cs diff --git a/neo/Wallets/Helper.cs b/src/neo/Wallets/Helper.cs similarity index 100% rename from neo/Wallets/Helper.cs rename to src/neo/Wallets/Helper.cs diff --git a/neo/Wallets/KeyPair.cs b/src/neo/Wallets/KeyPair.cs similarity index 100% rename from neo/Wallets/KeyPair.cs rename to src/neo/Wallets/KeyPair.cs diff --git a/neo/Wallets/NEP6/NEP6Account.cs b/src/neo/Wallets/NEP6/NEP6Account.cs similarity index 100% rename from neo/Wallets/NEP6/NEP6Account.cs rename to src/neo/Wallets/NEP6/NEP6Account.cs diff --git a/neo/Wallets/NEP6/NEP6Contract.cs b/src/neo/Wallets/NEP6/NEP6Contract.cs similarity index 100% rename from neo/Wallets/NEP6/NEP6Contract.cs rename to src/neo/Wallets/NEP6/NEP6Contract.cs diff --git a/neo/Wallets/NEP6/NEP6Wallet.cs b/src/neo/Wallets/NEP6/NEP6Wallet.cs similarity index 100% rename from neo/Wallets/NEP6/NEP6Wallet.cs rename to src/neo/Wallets/NEP6/NEP6Wallet.cs diff --git a/neo/Wallets/NEP6/ScryptParameters.cs b/src/neo/Wallets/NEP6/ScryptParameters.cs similarity index 100% rename from neo/Wallets/NEP6/ScryptParameters.cs rename to src/neo/Wallets/NEP6/ScryptParameters.cs diff --git a/neo/Wallets/NEP6/WalletLocker.cs b/src/neo/Wallets/NEP6/WalletLocker.cs similarity index 100% rename from neo/Wallets/NEP6/WalletLocker.cs rename to src/neo/Wallets/NEP6/WalletLocker.cs diff --git a/neo/Wallets/SQLite/Account.cs b/src/neo/Wallets/SQLite/Account.cs similarity index 100% rename from neo/Wallets/SQLite/Account.cs rename to src/neo/Wallets/SQLite/Account.cs diff --git a/neo/Wallets/SQLite/Address.cs b/src/neo/Wallets/SQLite/Address.cs similarity index 100% rename from neo/Wallets/SQLite/Address.cs rename to src/neo/Wallets/SQLite/Address.cs diff --git a/neo/Wallets/SQLite/Contract.cs b/src/neo/Wallets/SQLite/Contract.cs similarity index 100% rename from neo/Wallets/SQLite/Contract.cs rename to src/neo/Wallets/SQLite/Contract.cs diff --git a/neo/Wallets/SQLite/Key.cs b/src/neo/Wallets/SQLite/Key.cs similarity index 100% rename from neo/Wallets/SQLite/Key.cs rename to src/neo/Wallets/SQLite/Key.cs diff --git a/neo/Wallets/SQLite/UserWallet.cs b/src/neo/Wallets/SQLite/UserWallet.cs similarity index 100% rename from neo/Wallets/SQLite/UserWallet.cs rename to src/neo/Wallets/SQLite/UserWallet.cs diff --git a/neo/Wallets/SQLite/UserWalletAccount.cs b/src/neo/Wallets/SQLite/UserWalletAccount.cs similarity index 100% rename from neo/Wallets/SQLite/UserWalletAccount.cs rename to src/neo/Wallets/SQLite/UserWalletAccount.cs diff --git a/neo/Wallets/SQLite/VerificationContract.cs b/src/neo/Wallets/SQLite/VerificationContract.cs similarity index 100% rename from neo/Wallets/SQLite/VerificationContract.cs rename to src/neo/Wallets/SQLite/VerificationContract.cs diff --git a/neo/Wallets/SQLite/WalletDataContext.cs b/src/neo/Wallets/SQLite/WalletDataContext.cs similarity index 100% rename from neo/Wallets/SQLite/WalletDataContext.cs rename to src/neo/Wallets/SQLite/WalletDataContext.cs diff --git a/neo/Wallets/TransferOutput.cs b/src/neo/Wallets/TransferOutput.cs similarity index 100% rename from neo/Wallets/TransferOutput.cs rename to src/neo/Wallets/TransferOutput.cs diff --git a/neo/Wallets/Wallet.cs b/src/neo/Wallets/Wallet.cs similarity index 100% rename from neo/Wallets/Wallet.cs rename to src/neo/Wallets/Wallet.cs diff --git a/neo/Wallets/WalletAccount.cs b/src/neo/Wallets/WalletAccount.cs similarity index 100% rename from neo/Wallets/WalletAccount.cs rename to src/neo/Wallets/WalletAccount.cs diff --git a/neo/neo.csproj b/src/neo/neo.csproj similarity index 100% rename from neo/neo.csproj rename to src/neo/neo.csproj diff --git a/neo.UnitTests/Consensus/UT_Consensus.cs b/tests/neo.UnitTests/Consensus/UT_Consensus.cs similarity index 100% rename from neo.UnitTests/Consensus/UT_Consensus.cs rename to tests/neo.UnitTests/Consensus/UT_Consensus.cs diff --git a/neo.UnitTests/Consensus/UT_ConsensusContext.cs b/tests/neo.UnitTests/Consensus/UT_ConsensusContext.cs similarity index 100% rename from neo.UnitTests/Consensus/UT_ConsensusContext.cs rename to tests/neo.UnitTests/Consensus/UT_ConsensusContext.cs diff --git a/neo.UnitTests/Consensus/UT_ConsensusServiceMailbox.cs b/tests/neo.UnitTests/Consensus/UT_ConsensusServiceMailbox.cs similarity index 100% rename from neo.UnitTests/Consensus/UT_ConsensusServiceMailbox.cs rename to tests/neo.UnitTests/Consensus/UT_ConsensusServiceMailbox.cs diff --git a/neo.UnitTests/Cryptography/ECC/UT_ECDsa.cs b/tests/neo.UnitTests/Cryptography/ECC/UT_ECDsa.cs similarity index 100% rename from neo.UnitTests/Cryptography/ECC/UT_ECDsa.cs rename to tests/neo.UnitTests/Cryptography/ECC/UT_ECDsa.cs diff --git a/neo.UnitTests/Cryptography/ECC/UT_ECFieldElement.cs b/tests/neo.UnitTests/Cryptography/ECC/UT_ECFieldElement.cs similarity index 100% rename from neo.UnitTests/Cryptography/ECC/UT_ECFieldElement.cs rename to tests/neo.UnitTests/Cryptography/ECC/UT_ECFieldElement.cs diff --git a/neo.UnitTests/Cryptography/ECC/UT_ECPoint.cs b/tests/neo.UnitTests/Cryptography/ECC/UT_ECPoint.cs similarity index 100% rename from neo.UnitTests/Cryptography/ECC/UT_ECPoint.cs rename to tests/neo.UnitTests/Cryptography/ECC/UT_ECPoint.cs diff --git a/neo.UnitTests/Cryptography/UT_Base58.cs b/tests/neo.UnitTests/Cryptography/UT_Base58.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_Base58.cs rename to tests/neo.UnitTests/Cryptography/UT_Base58.cs diff --git a/neo.UnitTests/Cryptography/UT_BloomFilter.cs b/tests/neo.UnitTests/Cryptography/UT_BloomFilter.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_BloomFilter.cs rename to tests/neo.UnitTests/Cryptography/UT_BloomFilter.cs diff --git a/neo.UnitTests/Cryptography/UT_Crypto.cs b/tests/neo.UnitTests/Cryptography/UT_Crypto.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_Crypto.cs rename to tests/neo.UnitTests/Cryptography/UT_Crypto.cs diff --git a/neo.UnitTests/Cryptography/UT_Cryptography_Helper.cs b/tests/neo.UnitTests/Cryptography/UT_Cryptography_Helper.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_Cryptography_Helper.cs rename to tests/neo.UnitTests/Cryptography/UT_Cryptography_Helper.cs diff --git a/neo.UnitTests/Cryptography/UT_MerkleTree.cs b/tests/neo.UnitTests/Cryptography/UT_MerkleTree.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_MerkleTree.cs rename to tests/neo.UnitTests/Cryptography/UT_MerkleTree.cs diff --git a/neo.UnitTests/Cryptography/UT_MerkleTreeNode.cs b/tests/neo.UnitTests/Cryptography/UT_MerkleTreeNode.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_MerkleTreeNode.cs rename to tests/neo.UnitTests/Cryptography/UT_MerkleTreeNode.cs diff --git a/neo.UnitTests/Cryptography/UT_Murmur3.cs b/tests/neo.UnitTests/Cryptography/UT_Murmur3.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_Murmur3.cs rename to tests/neo.UnitTests/Cryptography/UT_Murmur3.cs diff --git a/neo.UnitTests/Cryptography/UT_SCrypt.cs b/tests/neo.UnitTests/Cryptography/UT_SCrypt.cs similarity index 100% rename from neo.UnitTests/Cryptography/UT_SCrypt.cs rename to tests/neo.UnitTests/Cryptography/UT_SCrypt.cs diff --git a/neo.UnitTests/Extensions/NativeContractExtensions.cs b/tests/neo.UnitTests/Extensions/NativeContractExtensions.cs similarity index 100% rename from neo.UnitTests/Extensions/NativeContractExtensions.cs rename to tests/neo.UnitTests/Extensions/NativeContractExtensions.cs diff --git a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs b/tests/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs similarity index 100% rename from neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs rename to tests/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs diff --git a/neo.UnitTests/IO/Caching/UT_Cache.cs b/tests/neo.UnitTests/IO/Caching/UT_Cache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_Cache.cs rename to tests/neo.UnitTests/IO/Caching/UT_Cache.cs diff --git a/neo.UnitTests/IO/Caching/UT_CloneCache.cs b/tests/neo.UnitTests/IO/Caching/UT_CloneCache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_CloneCache.cs rename to tests/neo.UnitTests/IO/Caching/UT_CloneCache.cs diff --git a/neo.UnitTests/IO/Caching/UT_CloneMetaCache.cs b/tests/neo.UnitTests/IO/Caching/UT_CloneMetaCache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_CloneMetaCache.cs rename to tests/neo.UnitTests/IO/Caching/UT_CloneMetaCache.cs diff --git a/neo.UnitTests/IO/Caching/UT_DataCache.cs b/tests/neo.UnitTests/IO/Caching/UT_DataCache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_DataCache.cs rename to tests/neo.UnitTests/IO/Caching/UT_DataCache.cs diff --git a/neo.UnitTests/IO/Caching/UT_FIFOSet.cs b/tests/neo.UnitTests/IO/Caching/UT_FIFOSet.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_FIFOSet.cs rename to tests/neo.UnitTests/IO/Caching/UT_FIFOSet.cs diff --git a/neo.UnitTests/IO/Caching/UT_MetaDataCache.cs b/tests/neo.UnitTests/IO/Caching/UT_MetaDataCache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_MetaDataCache.cs rename to tests/neo.UnitTests/IO/Caching/UT_MetaDataCache.cs diff --git a/neo.UnitTests/IO/Caching/UT_OrderedDictionary.cs b/tests/neo.UnitTests/IO/Caching/UT_OrderedDictionary.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_OrderedDictionary.cs rename to tests/neo.UnitTests/IO/Caching/UT_OrderedDictionary.cs diff --git a/neo.UnitTests/IO/Caching/UT_ReflectionCache.cs b/tests/neo.UnitTests/IO/Caching/UT_ReflectionCache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_ReflectionCache.cs rename to tests/neo.UnitTests/IO/Caching/UT_ReflectionCache.cs diff --git a/neo.UnitTests/IO/Caching/UT_RelayCache.cs b/tests/neo.UnitTests/IO/Caching/UT_RelayCache.cs similarity index 100% rename from neo.UnitTests/IO/Caching/UT_RelayCache.cs rename to tests/neo.UnitTests/IO/Caching/UT_RelayCache.cs diff --git a/neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs b/tests/neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs similarity index 100% rename from neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs rename to tests/neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs diff --git a/neo.UnitTests/IO/Json/UT_JArray.cs b/tests/neo.UnitTests/IO/Json/UT_JArray.cs similarity index 100% rename from neo.UnitTests/IO/Json/UT_JArray.cs rename to tests/neo.UnitTests/IO/Json/UT_JArray.cs diff --git a/neo.UnitTests/IO/Json/UT_JBoolean.cs b/tests/neo.UnitTests/IO/Json/UT_JBoolean.cs similarity index 100% rename from neo.UnitTests/IO/Json/UT_JBoolean.cs rename to tests/neo.UnitTests/IO/Json/UT_JBoolean.cs diff --git a/neo.UnitTests/IO/Json/UT_JNumber.cs b/tests/neo.UnitTests/IO/Json/UT_JNumber.cs similarity index 100% rename from neo.UnitTests/IO/Json/UT_JNumber.cs rename to tests/neo.UnitTests/IO/Json/UT_JNumber.cs diff --git a/neo.UnitTests/IO/Json/UT_JObject.cs b/tests/neo.UnitTests/IO/Json/UT_JObject.cs similarity index 100% rename from neo.UnitTests/IO/Json/UT_JObject.cs rename to tests/neo.UnitTests/IO/Json/UT_JObject.cs diff --git a/neo.UnitTests/IO/Json/UT_JString.cs b/tests/neo.UnitTests/IO/Json/UT_JString.cs similarity index 100% rename from neo.UnitTests/IO/Json/UT_JString.cs rename to tests/neo.UnitTests/IO/Json/UT_JString.cs diff --git a/neo.UnitTests/IO/UT_ByteArrayComparer.cs b/tests/neo.UnitTests/IO/UT_ByteArrayComparer.cs similarity index 100% rename from neo.UnitTests/IO/UT_ByteArrayComparer.cs rename to tests/neo.UnitTests/IO/UT_ByteArrayComparer.cs diff --git a/neo.UnitTests/IO/UT_IOHelper.cs b/tests/neo.UnitTests/IO/UT_IOHelper.cs similarity index 100% rename from neo.UnitTests/IO/UT_IOHelper.cs rename to tests/neo.UnitTests/IO/UT_IOHelper.cs diff --git a/neo.UnitTests/IO/Wrappers/UT_SerializableWrapper.cs b/tests/neo.UnitTests/IO/Wrappers/UT_SerializableWrapper.cs similarity index 100% rename from neo.UnitTests/IO/Wrappers/UT_SerializableWrapper.cs rename to tests/neo.UnitTests/IO/Wrappers/UT_SerializableWrapper.cs diff --git a/neo.UnitTests/IO/Wrappers/UT_UInt32Wrapper.cs b/tests/neo.UnitTests/IO/Wrappers/UT_UInt32Wrapper.cs similarity index 100% rename from neo.UnitTests/IO/Wrappers/UT_UInt32Wrapper.cs rename to tests/neo.UnitTests/IO/Wrappers/UT_UInt32Wrapper.cs diff --git a/neo.UnitTests/Ledger/UT_Blockchain.cs b/tests/neo.UnitTests/Ledger/UT_Blockchain.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_Blockchain.cs rename to tests/neo.UnitTests/Ledger/UT_Blockchain.cs diff --git a/neo.UnitTests/Ledger/UT_ContractState.cs b/tests/neo.UnitTests/Ledger/UT_ContractState.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_ContractState.cs rename to tests/neo.UnitTests/Ledger/UT_ContractState.cs diff --git a/neo.UnitTests/Ledger/UT_HashIndexState.cs b/tests/neo.UnitTests/Ledger/UT_HashIndexState.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_HashIndexState.cs rename to tests/neo.UnitTests/Ledger/UT_HashIndexState.cs diff --git a/neo.UnitTests/Ledger/UT_HeaderHashList.cs b/tests/neo.UnitTests/Ledger/UT_HeaderHashList.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_HeaderHashList.cs rename to tests/neo.UnitTests/Ledger/UT_HeaderHashList.cs diff --git a/neo.UnitTests/Ledger/UT_MemoryPool.cs b/tests/neo.UnitTests/Ledger/UT_MemoryPool.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_MemoryPool.cs rename to tests/neo.UnitTests/Ledger/UT_MemoryPool.cs diff --git a/neo.UnitTests/Ledger/UT_PoolItem.cs b/tests/neo.UnitTests/Ledger/UT_PoolItem.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_PoolItem.cs rename to tests/neo.UnitTests/Ledger/UT_PoolItem.cs diff --git a/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs b/tests/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs rename to tests/neo.UnitTests/Ledger/UT_SendersFeeMonitor.cs diff --git a/neo.UnitTests/Ledger/UT_StorageItem.cs b/tests/neo.UnitTests/Ledger/UT_StorageItem.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_StorageItem.cs rename to tests/neo.UnitTests/Ledger/UT_StorageItem.cs diff --git a/neo.UnitTests/Ledger/UT_StorageKey.cs b/tests/neo.UnitTests/Ledger/UT_StorageKey.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_StorageKey.cs rename to tests/neo.UnitTests/Ledger/UT_StorageKey.cs diff --git a/neo.UnitTests/Ledger/UT_TransactionState.cs b/tests/neo.UnitTests/Ledger/UT_TransactionState.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_TransactionState.cs rename to tests/neo.UnitTests/Ledger/UT_TransactionState.cs diff --git a/neo.UnitTests/Ledger/UT_TrimmedBlock.cs b/tests/neo.UnitTests/Ledger/UT_TrimmedBlock.cs similarity index 100% rename from neo.UnitTests/Ledger/UT_TrimmedBlock.cs rename to tests/neo.UnitTests/Ledger/UT_TrimmedBlock.cs diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Block.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Block.cs similarity index 100% rename from neo.UnitTests/Network/P2P/Payloads/UT_Block.cs rename to tests/neo.UnitTests/Network/P2P/Payloads/UT_Block.cs diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Cosigner.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Cosigner.cs similarity index 100% rename from neo.UnitTests/Network/P2P/Payloads/UT_Cosigner.cs rename to tests/neo.UnitTests/Network/P2P/Payloads/UT_Cosigner.cs diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Header.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Header.cs similarity index 100% rename from neo.UnitTests/Network/P2P/Payloads/UT_Header.cs rename to tests/neo.UnitTests/Network/P2P/Payloads/UT_Header.cs diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs similarity index 100% rename from neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs rename to tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Witness.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Witness.cs similarity index 100% rename from neo.UnitTests/Network/P2P/Payloads/UT_Witness.cs rename to tests/neo.UnitTests/Network/P2P/Payloads/UT_Witness.cs diff --git a/neo.UnitTests/Network/P2P/UT_Message.cs b/tests/neo.UnitTests/Network/P2P/UT_Message.cs similarity index 100% rename from neo.UnitTests/Network/P2P/UT_Message.cs rename to tests/neo.UnitTests/Network/P2P/UT_Message.cs diff --git a/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs b/tests/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs similarity index 100% rename from neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs rename to tests/neo.UnitTests/Network/P2P/UT_ProtocolHandler.cs diff --git a/neo.UnitTests/Network/P2P/UT_ProtocolHandlerMailbox.cs b/tests/neo.UnitTests/Network/P2P/UT_ProtocolHandlerMailbox.cs similarity index 100% rename from neo.UnitTests/Network/P2P/UT_ProtocolHandlerMailbox.cs rename to tests/neo.UnitTests/Network/P2P/UT_ProtocolHandlerMailbox.cs diff --git a/neo.UnitTests/Network/P2P/UT_RemoteNode.cs b/tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs similarity index 100% rename from neo.UnitTests/Network/P2P/UT_RemoteNode.cs rename to tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs diff --git a/neo.UnitTests/Network/P2P/UT_RemoteNodeMailbox.cs b/tests/neo.UnitTests/Network/P2P/UT_RemoteNodeMailbox.cs similarity index 100% rename from neo.UnitTests/Network/P2P/UT_RemoteNodeMailbox.cs rename to tests/neo.UnitTests/Network/P2P/UT_RemoteNodeMailbox.cs diff --git a/neo.UnitTests/Network/P2P/UT_TaskManagerMailbox.cs b/tests/neo.UnitTests/Network/P2P/UT_TaskManagerMailbox.cs similarity index 100% rename from neo.UnitTests/Network/P2P/UT_TaskManagerMailbox.cs rename to tests/neo.UnitTests/Network/P2P/UT_TaskManagerMailbox.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs diff --git a/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs similarity index 100% rename from neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs rename to tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs diff --git a/neo.UnitTests/Network/RPC/UT_ContractClient.cs b/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_ContractClient.cs rename to tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs diff --git a/neo.UnitTests/Network/RPC/UT_Helper.cs b/tests/neo.UnitTests/Network/RPC/UT_Helper.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_Helper.cs rename to tests/neo.UnitTests/Network/RPC/UT_Helper.cs diff --git a/neo.UnitTests/Network/RPC/UT_Nep5API.cs b/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_Nep5API.cs rename to tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs diff --git a/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs b/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_PolicyAPI.cs rename to tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs diff --git a/neo.UnitTests/Network/RPC/UT_RpcClient.cs b/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_RpcClient.cs rename to tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs diff --git a/neo.UnitTests/Network/RPC/UT_RpcServer.cs b/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_RpcServer.cs rename to tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs diff --git a/neo.UnitTests/Network/RPC/UT_TransactionManager.cs b/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_TransactionManager.cs rename to tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs diff --git a/neo.UnitTests/Network/RPC/UT_WalletAPI.cs b/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs similarity index 100% rename from neo.UnitTests/Network/RPC/UT_WalletAPI.cs rename to tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs diff --git a/neo.UnitTests/Plugins/TestLogPlugin.cs b/tests/neo.UnitTests/Plugins/TestLogPlugin.cs similarity index 100% rename from neo.UnitTests/Plugins/TestLogPlugin.cs rename to tests/neo.UnitTests/Plugins/TestLogPlugin.cs diff --git a/neo.UnitTests/Plugins/UT_Plugin.cs b/tests/neo.UnitTests/Plugins/UT_Plugin.cs similarity index 100% rename from neo.UnitTests/Plugins/UT_Plugin.cs rename to tests/neo.UnitTests/Plugins/UT_Plugin.cs diff --git a/neo.UnitTests/README.md b/tests/neo.UnitTests/README.md similarity index 100% rename from neo.UnitTests/README.md rename to tests/neo.UnitTests/README.md diff --git a/neo.UnitTests/SmartContract/Enumerators/UT_ConcatenatedEnumerator.cs b/tests/neo.UnitTests/SmartContract/Enumerators/UT_ConcatenatedEnumerator.cs similarity index 100% rename from neo.UnitTests/SmartContract/Enumerators/UT_ConcatenatedEnumerator.cs rename to tests/neo.UnitTests/SmartContract/Enumerators/UT_ConcatenatedEnumerator.cs diff --git a/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs b/tests/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs similarity index 100% rename from neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs rename to tests/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs diff --git a/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs b/tests/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs similarity index 100% rename from neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs rename to tests/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs diff --git a/neo.UnitTests/SmartContract/Iterators/UT_ArrayWrapper.cs b/tests/neo.UnitTests/SmartContract/Iterators/UT_ArrayWrapper.cs similarity index 100% rename from neo.UnitTests/SmartContract/Iterators/UT_ArrayWrapper.cs rename to tests/neo.UnitTests/SmartContract/Iterators/UT_ArrayWrapper.cs diff --git a/neo.UnitTests/SmartContract/Iterators/UT_ConcatenatedIterator.cs b/tests/neo.UnitTests/SmartContract/Iterators/UT_ConcatenatedIterator.cs similarity index 100% rename from neo.UnitTests/SmartContract/Iterators/UT_ConcatenatedIterator.cs rename to tests/neo.UnitTests/SmartContract/Iterators/UT_ConcatenatedIterator.cs diff --git a/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs b/tests/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs similarity index 100% rename from neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs rename to tests/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs diff --git a/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs b/tests/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs similarity index 100% rename from neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs rename to tests/neo.UnitTests/SmartContract/Iterators/UT_StorageIterator.cs diff --git a/neo.UnitTests/SmartContract/Manifest/UT_ContractEventDescriptor.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractEventDescriptor.cs similarity index 100% rename from neo.UnitTests/SmartContract/Manifest/UT_ContractEventDescriptor.cs rename to tests/neo.UnitTests/SmartContract/Manifest/UT_ContractEventDescriptor.cs diff --git a/neo.UnitTests/SmartContract/Manifest/UT_ContractGroup.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractGroup.cs similarity index 100% rename from neo.UnitTests/SmartContract/Manifest/UT_ContractGroup.cs rename to tests/neo.UnitTests/SmartContract/Manifest/UT_ContractGroup.cs diff --git a/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs similarity index 100% rename from neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs rename to tests/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs diff --git a/neo.UnitTests/SmartContract/Manifest/UT_ContractPermission.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractPermission.cs similarity index 100% rename from neo.UnitTests/SmartContract/Manifest/UT_ContractPermission.cs rename to tests/neo.UnitTests/SmartContract/Manifest/UT_ContractPermission.cs diff --git a/neo.UnitTests/SmartContract/Manifest/UT_ContractPermissionDescriptor.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractPermissionDescriptor.cs similarity index 100% rename from neo.UnitTests/SmartContract/Manifest/UT_ContractPermissionDescriptor.cs rename to tests/neo.UnitTests/SmartContract/Manifest/UT_ContractPermissionDescriptor.cs diff --git a/neo.UnitTests/SmartContract/Manifest/UT_WildCardContainer.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_WildCardContainer.cs similarity index 100% rename from neo.UnitTests/SmartContract/Manifest/UT_WildCardContainer.cs rename to tests/neo.UnitTests/SmartContract/Manifest/UT_WildCardContainer.cs diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs similarity index 100% rename from neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs rename to tests/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs similarity index 100% rename from neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs rename to tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs similarity index 100% rename from neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs rename to tests/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs diff --git a/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs b/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs similarity index 100% rename from neo.UnitTests/SmartContract/Native/UT_NativeContract.cs rename to tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs diff --git a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs b/tests/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs similarity index 100% rename from neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs rename to tests/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs diff --git a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs b/tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_ApplicationEngine.cs rename to tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs diff --git a/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs b/tests/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs rename to tests/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs diff --git a/neo.UnitTests/SmartContract/UT_Contract.cs b/tests/neo.UnitTests/SmartContract/UT_Contract.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_Contract.cs rename to tests/neo.UnitTests/SmartContract/UT_Contract.cs diff --git a/neo.UnitTests/SmartContract/UT_ContractParameter.cs b/tests/neo.UnitTests/SmartContract/UT_ContractParameter.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_ContractParameter.cs rename to tests/neo.UnitTests/SmartContract/UT_ContractParameter.cs diff --git a/neo.UnitTests/SmartContract/UT_ContractParameterContext.cs b/tests/neo.UnitTests/SmartContract/UT_ContractParameterContext.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_ContractParameterContext.cs rename to tests/neo.UnitTests/SmartContract/UT_ContractParameterContext.cs diff --git a/neo.UnitTests/SmartContract/UT_InteropDescriptor.cs b/tests/neo.UnitTests/SmartContract/UT_InteropDescriptor.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_InteropDescriptor.cs rename to tests/neo.UnitTests/SmartContract/UT_InteropDescriptor.cs diff --git a/neo.UnitTests/SmartContract/UT_InteropPrices.cs b/tests/neo.UnitTests/SmartContract/UT_InteropPrices.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_InteropPrices.cs rename to tests/neo.UnitTests/SmartContract/UT_InteropPrices.cs diff --git a/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs b/tests/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_InteropService.NEO.cs rename to tests/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs diff --git a/neo.UnitTests/SmartContract/UT_InteropService.cs b/tests/neo.UnitTests/SmartContract/UT_InteropService.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_InteropService.cs rename to tests/neo.UnitTests/SmartContract/UT_InteropService.cs diff --git a/neo.UnitTests/SmartContract/UT_JsonSerializer.cs b/tests/neo.UnitTests/SmartContract/UT_JsonSerializer.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_JsonSerializer.cs rename to tests/neo.UnitTests/SmartContract/UT_JsonSerializer.cs diff --git a/neo.UnitTests/SmartContract/UT_LogEventArgs.cs b/tests/neo.UnitTests/SmartContract/UT_LogEventArgs.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_LogEventArgs.cs rename to tests/neo.UnitTests/SmartContract/UT_LogEventArgs.cs diff --git a/neo.UnitTests/SmartContract/UT_NefFile.cs b/tests/neo.UnitTests/SmartContract/UT_NefFile.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_NefFile.cs rename to tests/neo.UnitTests/SmartContract/UT_NefFile.cs diff --git a/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs b/tests/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs rename to tests/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs diff --git a/neo.UnitTests/SmartContract/UT_OpCodePrices.cs b/tests/neo.UnitTests/SmartContract/UT_OpCodePrices.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_OpCodePrices.cs rename to tests/neo.UnitTests/SmartContract/UT_OpCodePrices.cs diff --git a/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs b/tests/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_SmartContractHelper.cs rename to tests/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs diff --git a/neo.UnitTests/SmartContract/UT_StorageContext.cs b/tests/neo.UnitTests/SmartContract/UT_StorageContext.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_StorageContext.cs rename to tests/neo.UnitTests/SmartContract/UT_StorageContext.cs diff --git a/neo.UnitTests/SmartContract/UT_Syscalls.cs b/tests/neo.UnitTests/SmartContract/UT_Syscalls.cs similarity index 100% rename from neo.UnitTests/SmartContract/UT_Syscalls.cs rename to tests/neo.UnitTests/SmartContract/UT_Syscalls.cs diff --git a/neo.UnitTests/TestBlockchain.cs b/tests/neo.UnitTests/TestBlockchain.cs similarity index 100% rename from neo.UnitTests/TestBlockchain.cs rename to tests/neo.UnitTests/TestBlockchain.cs diff --git a/neo.UnitTests/TestUtils.cs b/tests/neo.UnitTests/TestUtils.cs similarity index 100% rename from neo.UnitTests/TestUtils.cs rename to tests/neo.UnitTests/TestUtils.cs diff --git a/neo.UnitTests/TestVerifiable.cs b/tests/neo.UnitTests/TestVerifiable.cs similarity index 100% rename from neo.UnitTests/TestVerifiable.cs rename to tests/neo.UnitTests/TestVerifiable.cs diff --git a/neo.UnitTests/TestWalletAccount.cs b/tests/neo.UnitTests/TestWalletAccount.cs similarity index 100% rename from neo.UnitTests/TestWalletAccount.cs rename to tests/neo.UnitTests/TestWalletAccount.cs diff --git a/neo.UnitTests/UT_BigDecimal.cs b/tests/neo.UnitTests/UT_BigDecimal.cs similarity index 100% rename from neo.UnitTests/UT_BigDecimal.cs rename to tests/neo.UnitTests/UT_BigDecimal.cs diff --git a/neo.UnitTests/UT_Culture.cs b/tests/neo.UnitTests/UT_Culture.cs similarity index 100% rename from neo.UnitTests/UT_Culture.cs rename to tests/neo.UnitTests/UT_Culture.cs diff --git a/neo.UnitTests/UT_DataCache.cs b/tests/neo.UnitTests/UT_DataCache.cs similarity index 100% rename from neo.UnitTests/UT_DataCache.cs rename to tests/neo.UnitTests/UT_DataCache.cs diff --git a/neo.UnitTests/UT_Helper.cs b/tests/neo.UnitTests/UT_Helper.cs similarity index 100% rename from neo.UnitTests/UT_Helper.cs rename to tests/neo.UnitTests/UT_Helper.cs diff --git a/neo.UnitTests/UT_NeoSystem.cs b/tests/neo.UnitTests/UT_NeoSystem.cs similarity index 100% rename from neo.UnitTests/UT_NeoSystem.cs rename to tests/neo.UnitTests/UT_NeoSystem.cs diff --git a/neo.UnitTests/UT_ProtocolSettings.cs b/tests/neo.UnitTests/UT_ProtocolSettings.cs similarity index 100% rename from neo.UnitTests/UT_ProtocolSettings.cs rename to tests/neo.UnitTests/UT_ProtocolSettings.cs diff --git a/neo.UnitTests/UT_UInt160.cs b/tests/neo.UnitTests/UT_UInt160.cs similarity index 100% rename from neo.UnitTests/UT_UInt160.cs rename to tests/neo.UnitTests/UT_UInt160.cs diff --git a/neo.UnitTests/UT_UInt256.cs b/tests/neo.UnitTests/UT_UInt256.cs similarity index 100% rename from neo.UnitTests/UT_UInt256.cs rename to tests/neo.UnitTests/UT_UInt256.cs diff --git a/neo.UnitTests/UT_UIntBase.cs b/tests/neo.UnitTests/UT_UIntBase.cs similarity index 100% rename from neo.UnitTests/UT_UIntBase.cs rename to tests/neo.UnitTests/UT_UIntBase.cs diff --git a/neo.UnitTests/UT_UIntBenchmarks.cs b/tests/neo.UnitTests/UT_UIntBenchmarks.cs similarity index 100% rename from neo.UnitTests/UT_UIntBenchmarks.cs rename to tests/neo.UnitTests/UT_UIntBenchmarks.cs diff --git a/neo.UnitTests/UT_Utility.cs b/tests/neo.UnitTests/UT_Utility.cs similarity index 100% rename from neo.UnitTests/UT_Utility.cs rename to tests/neo.UnitTests/UT_Utility.cs diff --git a/neo.UnitTests/VM/UT_Helper.cs b/tests/neo.UnitTests/VM/UT_Helper.cs similarity index 100% rename from neo.UnitTests/VM/UT_Helper.cs rename to tests/neo.UnitTests/VM/UT_Helper.cs diff --git a/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs b/tests/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs similarity index 100% rename from neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs rename to tests/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs diff --git a/neo.UnitTests/Wallets/NEP6/UT_NEP6Contract.cs b/tests/neo.UnitTests/Wallets/NEP6/UT_NEP6Contract.cs similarity index 100% rename from neo.UnitTests/Wallets/NEP6/UT_NEP6Contract.cs rename to tests/neo.UnitTests/Wallets/NEP6/UT_NEP6Contract.cs diff --git a/neo.UnitTests/Wallets/NEP6/UT_NEP6Wallet.cs b/tests/neo.UnitTests/Wallets/NEP6/UT_NEP6Wallet.cs similarity index 100% rename from neo.UnitTests/Wallets/NEP6/UT_NEP6Wallet.cs rename to tests/neo.UnitTests/Wallets/NEP6/UT_NEP6Wallet.cs diff --git a/neo.UnitTests/Wallets/NEP6/UT_ScryptParameters.cs b/tests/neo.UnitTests/Wallets/NEP6/UT_ScryptParameters.cs similarity index 100% rename from neo.UnitTests/Wallets/NEP6/UT_ScryptParameters.cs rename to tests/neo.UnitTests/Wallets/NEP6/UT_ScryptParameters.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_Account.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_Account.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_Account.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_Account.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_Address.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_Address.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_Address.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_Address.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_Contract.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_Contract.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_Contract.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_Contract.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_Key.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_Key.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_Key.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_Key.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_UserWallet.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_UserWallet.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_UserWallet.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_UserWallet.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_UserWalletAccount.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_UserWalletAccount.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_UserWalletAccount.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_UserWalletAccount.cs diff --git a/neo.UnitTests/Wallets/SQLite/UT_VerificationContract.cs b/tests/neo.UnitTests/Wallets/SQLite/UT_VerificationContract.cs similarity index 100% rename from neo.UnitTests/Wallets/SQLite/UT_VerificationContract.cs rename to tests/neo.UnitTests/Wallets/SQLite/UT_VerificationContract.cs diff --git a/neo.UnitTests/Wallets/UT_AssetDescriptor.cs b/tests/neo.UnitTests/Wallets/UT_AssetDescriptor.cs similarity index 100% rename from neo.UnitTests/Wallets/UT_AssetDescriptor.cs rename to tests/neo.UnitTests/Wallets/UT_AssetDescriptor.cs diff --git a/neo.UnitTests/Wallets/UT_KeyPair.cs b/tests/neo.UnitTests/Wallets/UT_KeyPair.cs similarity index 100% rename from neo.UnitTests/Wallets/UT_KeyPair.cs rename to tests/neo.UnitTests/Wallets/UT_KeyPair.cs diff --git a/neo.UnitTests/Wallets/UT_Wallet.cs b/tests/neo.UnitTests/Wallets/UT_Wallet.cs similarity index 100% rename from neo.UnitTests/Wallets/UT_Wallet.cs rename to tests/neo.UnitTests/Wallets/UT_Wallet.cs diff --git a/neo.UnitTests/Wallets/UT_WalletAccount.cs b/tests/neo.UnitTests/Wallets/UT_WalletAccount.cs similarity index 100% rename from neo.UnitTests/Wallets/UT_WalletAccount.cs rename to tests/neo.UnitTests/Wallets/UT_WalletAccount.cs diff --git a/neo.UnitTests/Wallets/UT_Wallets_Helper.cs b/tests/neo.UnitTests/Wallets/UT_Wallets_Helper.cs similarity index 100% rename from neo.UnitTests/Wallets/UT_Wallets_Helper.cs rename to tests/neo.UnitTests/Wallets/UT_Wallets_Helper.cs diff --git a/neo.UnitTests/neo.UnitTests.csproj b/tests/neo.UnitTests/neo.UnitTests.csproj similarity index 94% rename from neo.UnitTests/neo.UnitTests.csproj rename to tests/neo.UnitTests/neo.UnitTests.csproj index da3694e024..5857ea504f 100644 --- a/neo.UnitTests/neo.UnitTests.csproj +++ b/tests/neo.UnitTests/neo.UnitTests.csproj @@ -25,7 +25,7 @@ - + diff --git a/neo.UnitTests/protocol.json b/tests/neo.UnitTests/protocol.json similarity index 100% rename from neo.UnitTests/protocol.json rename to tests/neo.UnitTests/protocol.json From 6d9be4fe5c2c7d1a85cc0c551b790217c20ebbe0 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 26 Nov 2019 00:28:24 +0800 Subject: [PATCH 6/8] Rename --- src/neo/Ledger/Blockchain.cs | 22 +++++++++---------- src/neo/Network/P2P/ProtocolHandler.cs | 6 ++--- src/neo/Network/RPC/RpcServer.cs | 22 +++++++++---------- .../{RawView.cs => ReadOnlyView.cs} | 4 ++-- 4 files changed, 27 insertions(+), 27 deletions(-) rename src/neo/Persistence/{RawView.cs => ReadOnlyView.cs} (94%) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 9adffbff5b..366264eaa9 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -65,7 +65,7 @@ public class FillCompleted { } private SnapshotView currentSnapshot; public IStore Store { get; } - public RawView RawView { get; } + public ReadOnlyView View { get; } public MemoryPool MemPool { get; } public uint Height => currentSnapshot.Height; public uint HeaderHeight => currentSnapshot.HeaderHeight; @@ -101,23 +101,23 @@ public Blockchain(NeoSystem system, IStore store) this.system = system; this.MemPool = new MemoryPool(system, ProtocolSettings.Default.MemoryPoolMaxTransactions); this.Store = store; - this.RawView = new RawView(store); + this.View = new ReadOnlyView(store); lock (lockObj) { if (singleton != null) throw new InvalidOperationException(); - header_index.AddRange(RawView.HeaderHashList.Find().OrderBy(p => (uint)p.Key).SelectMany(p => p.Value.Hashes)); + header_index.AddRange(View.HeaderHashList.Find().OrderBy(p => (uint)p.Key).SelectMany(p => p.Value.Hashes)); stored_header_count += (uint)header_index.Count; if (stored_header_count == 0) { - header_index.AddRange(RawView.Blocks.Find().OrderBy(p => p.Value.Index).Select(p => p.Key)); + header_index.AddRange(View.Blocks.Find().OrderBy(p => p.Value.Index).Select(p => p.Key)); } else { - HashIndexState hashIndex = RawView.HeaderHashIndex.Get(); + HashIndexState hashIndex = View.HeaderHashIndex.Get(); if (hashIndex.Index >= stored_header_count) { - DataCache cache = RawView.Blocks; + DataCache cache = View.Blocks; for (UInt256 hash = hashIndex.Hash; hash != header_index[(int)stored_header_count - 1];) { header_index.Insert((int)stored_header_count, hash); @@ -141,13 +141,13 @@ public Blockchain(NeoSystem system, IStore store) public bool ContainsBlock(UInt256 hash) { if (block_cache.ContainsKey(hash)) return true; - return RawView.ContainsBlock(hash); + return View.ContainsBlock(hash); } public bool ContainsTransaction(UInt256 hash) { if (MemPool.ContainsKey(hash)) return true; - return RawView.ContainsTransaction(hash); + return View.ContainsTransaction(hash); } private static Transaction DeployNativeContracts() @@ -181,7 +181,7 @@ public Block GetBlock(UInt256 hash) { if (block_cache.TryGetValue(hash, out Block block)) return block; - return RawView.GetBlock(hash); + return View.GetBlock(hash); } public UInt256 GetBlockHash(uint index) @@ -204,7 +204,7 @@ public Transaction GetTransaction(UInt256 hash) { if (MemPool.TryGetValue(hash, out Transaction transaction)) return transaction; - return RawView.GetTransaction(hash); + return View.GetTransaction(hash); } private void OnImport(IEnumerable blocks) @@ -239,7 +239,7 @@ private void OnFillMemoryPool(IEnumerable transactions) // Add the transactions to the memory pool foreach (var tx in transactions) { - if (RawView.ContainsTransaction(tx.Hash)) + if (View.ContainsTransaction(tx.Hash)) continue; if (!NativeContract.Policy.CheckPolicy(tx, currentSnapshot)) continue; diff --git a/src/neo/Network/P2P/ProtocolHandler.cs b/src/neo/Network/P2P/ProtocolHandler.cs index 3e9a4b2cfc..5093659219 100644 --- a/src/neo/Network/P2P/ProtocolHandler.cs +++ b/src/neo/Network/P2P/ProtocolHandler.cs @@ -162,7 +162,7 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) { UInt256 hash = payload.HashStart; int count = payload.Count < 0 || payload.Count > InvPayload.MaxHashesCount ? InvPayload.MaxHashesCount : payload.Count; - TrimmedBlock state = Blockchain.Singleton.RawView.Blocks.TryGet(hash); + TrimmedBlock state = Blockchain.Singleton.View.Blocks.TryGet(hash); if (state == null) return; List hashes = new List(); for (uint i = 1; i <= count; i++) @@ -182,7 +182,7 @@ private void OnGetBlockDataMessageReceived(GetBlockDataPayload payload) { for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) { - Block block = Blockchain.Singleton.RawView.GetBlock(i); + Block block = Blockchain.Singleton.View.GetBlock(i); if (block == null) break; @@ -237,7 +237,7 @@ private void OnGetHeadersMessageReceived(GetBlocksPayload payload) { UInt256 hash = payload.HashStart; int count = payload.Count < 0 || payload.Count > HeadersPayload.MaxHeadersCount ? HeadersPayload.MaxHeadersCount : payload.Count; - DataCache cache = Blockchain.Singleton.RawView.Blocks; + DataCache cache = Blockchain.Singleton.View.Blocks; TrimmedBlock state = cache.TryGet(hash); if (state == null) return; List
headers = new List
(); diff --git a/src/neo/Network/RPC/RpcServer.cs b/src/neo/Network/RPC/RpcServer.cs index 4e334b811c..1294a7351d 100644 --- a/src/neo/Network/RPC/RpcServer.cs +++ b/src/neo/Network/RPC/RpcServer.cs @@ -435,12 +435,12 @@ private JObject GetBlock(JObject key, bool verbose) if (key is JNumber) { uint index = uint.Parse(key.AsString()); - block = Blockchain.Singleton.RawView.GetBlock(index); + block = Blockchain.Singleton.View.GetBlock(index); } else { UInt256 hash = UInt256.Parse(key.AsString()); - block = Blockchain.Singleton.RawView.GetBlock(hash); + block = Blockchain.Singleton.View.GetBlock(hash); } if (block == null) throw new RpcException(-100, "Unknown block"); @@ -448,7 +448,7 @@ private JObject GetBlock(JObject key, bool verbose) { JObject json = block.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - block.Index + 1; - UInt256 hash = Blockchain.Singleton.RawView.GetNextBlockHash(block.Hash); + UInt256 hash = Blockchain.Singleton.View.GetNextBlockHash(block.Hash); if (hash != null) json["nextblockhash"] = hash.ToString(); return json; @@ -476,12 +476,12 @@ private JObject GetBlockHeader(JObject key, bool verbose) if (key is JNumber) { uint height = uint.Parse(key.AsString()); - header = Blockchain.Singleton.RawView.GetHeader(height); + header = Blockchain.Singleton.View.GetHeader(height); } else { UInt256 hash = UInt256.Parse(key.AsString()); - header = Blockchain.Singleton.RawView.GetHeader(hash); + header = Blockchain.Singleton.View.GetHeader(hash); } if (header == null) throw new RpcException(-100, "Unknown block"); @@ -490,7 +490,7 @@ private JObject GetBlockHeader(JObject key, bool verbose) { JObject json = header.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; - UInt256 hash = Blockchain.Singleton.RawView.GetNextBlockHash(header.Hash); + UInt256 hash = Blockchain.Singleton.View.GetNextBlockHash(header.Hash); if (hash != null) json["nextblockhash"] = hash.ToString(); return json; @@ -516,7 +516,7 @@ private JObject GetConnectionCount() private JObject GetContractState(UInt160 script_hash) { - ContractState contract = Blockchain.Singleton.RawView.Contracts.TryGet(script_hash); + ContractState contract = Blockchain.Singleton.View.Contracts.TryGet(script_hash); return contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract"); } @@ -564,10 +564,10 @@ private JObject GetRawTransaction(UInt256 hash, bool verbose) if (verbose) { JObject json = tx.ToJson(); - TransactionState txState = Blockchain.Singleton.RawView.Transactions.TryGet(hash); + TransactionState txState = Blockchain.Singleton.View.Transactions.TryGet(hash); if (txState != null) { - Header header = Blockchain.Singleton.RawView.GetHeader(txState.BlockIndex); + Header header = Blockchain.Singleton.View.GetHeader(txState.BlockIndex); json["blockhash"] = header.Hash.ToString(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; json["blocktime"] = header.Timestamp; @@ -580,7 +580,7 @@ private JObject GetRawTransaction(UInt256 hash, bool verbose) private JObject GetStorage(UInt160 script_hash, byte[] key) { - StorageItem item = Blockchain.Singleton.RawView.Storages.TryGet(new StorageKey + StorageItem item = Blockchain.Singleton.View.Storages.TryGet(new StorageKey { ScriptHash = script_hash, Key = key @@ -590,7 +590,7 @@ private JObject GetStorage(UInt160 script_hash, byte[] key) private JObject GetTransactionHeight(UInt256 hash) { - uint? height = Blockchain.Singleton.RawView.Transactions.TryGet(hash)?.BlockIndex; + uint? height = Blockchain.Singleton.View.Transactions.TryGet(hash)?.BlockIndex; if (height.HasValue) return height.Value; throw new RpcException(-100, "Unknown transaction"); } diff --git a/src/neo/Persistence/RawView.cs b/src/neo/Persistence/ReadOnlyView.cs similarity index 94% rename from src/neo/Persistence/RawView.cs rename to src/neo/Persistence/ReadOnlyView.cs index 686dcbe652..f138b616c1 100644 --- a/src/neo/Persistence/RawView.cs +++ b/src/neo/Persistence/ReadOnlyView.cs @@ -8,7 +8,7 @@ namespace Neo.Persistence /// /// Provide a read-only for accessing directly from database instead of from snapshot. /// - public class RawView : StoreView + public class ReadOnlyView : StoreView { private readonly IReadOnlyStore store; @@ -20,7 +20,7 @@ public class RawView : StoreView public override MetaDataCache BlockHashIndex => new StoreMetaDataCache(store, Prefixes.IX_CurrentBlock); public override MetaDataCache HeaderHashIndex => new StoreMetaDataCache(store, Prefixes.IX_CurrentHeader); - public RawView(IReadOnlyStore store) + public ReadOnlyView(IReadOnlyStore store) { this.store = store; } From fec14ab89a942b868482ee378516100d13973566 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 26 Nov 2019 19:00:34 +0800 Subject: [PATCH 7/8] Use ConcurrentDictionary --- src/neo/Persistence/Memory/Snapshot.cs | 20 +++++++------------- src/neo/Persistence/Memory/Store.cs | 22 ++++++---------------- 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/src/neo/Persistence/Memory/Snapshot.cs b/src/neo/Persistence/Memory/Snapshot.cs index 0d1b4ad98a..82455ddea8 100644 --- a/src/neo/Persistence/Memory/Snapshot.cs +++ b/src/neo/Persistence/Memory/Snapshot.cs @@ -1,40 +1,34 @@ using Neo.IO; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Threading; namespace Neo.Persistence.Memory { internal class Snapshot : ISnapshot { - private readonly ReaderWriterLockSlim readerWriterLock; - private readonly Dictionary[] innerData; + private readonly ConcurrentDictionary[] innerData; private readonly ImmutableDictionary[] immutableData; - private readonly Dictionary[] writeBatch; + private readonly ConcurrentDictionary[] writeBatch; - public Snapshot(Dictionary[] innerData, ReaderWriterLockSlim readerWriterLock) + public Snapshot(ConcurrentDictionary[] innerData) { - this.readerWriterLock = readerWriterLock; this.innerData = innerData; - readerWriterLock.EnterReadLock(); this.immutableData = innerData.Select(p => p.ToImmutableDictionary(ByteArrayEqualityComparer.Default)).ToArray(); - readerWriterLock.ExitReadLock(); - this.writeBatch = new Dictionary[innerData.Length]; + this.writeBatch = new ConcurrentDictionary[innerData.Length]; for (int i = 0; i < writeBatch.Length; i++) - writeBatch[i] = new Dictionary(ByteArrayEqualityComparer.Default); + writeBatch[i] = new ConcurrentDictionary(ByteArrayEqualityComparer.Default); } public void Commit() { - readerWriterLock.EnterWriteLock(); for (int i = 0; i < writeBatch.Length; i++) foreach (var pair in writeBatch[i]) if (pair.Value is null) - innerData[i].Remove(pair.Key); + innerData[i].TryRemove(pair.Key, out _); else innerData[i][pair.Key] = pair.Value; - readerWriterLock.ExitWriteLock(); } public void Delete(byte table, byte[] key) diff --git a/src/neo/Persistence/Memory/Store.cs b/src/neo/Persistence/Memory/Store.cs index 39944b903d..5e2d11eeb9 100644 --- a/src/neo/Persistence/Memory/Store.cs +++ b/src/neo/Persistence/Memory/Store.cs @@ -1,33 +1,29 @@ using Neo.IO; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Threading; namespace Neo.Persistence.Memory { public class Store : IStore { - private readonly ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim(); - private readonly Dictionary[] innerData; + private readonly ConcurrentDictionary[] innerData; public Store() { - innerData = new Dictionary[256]; + innerData = new ConcurrentDictionary[256]; for (int i = 0; i < innerData.Length; i++) - innerData[i] = new Dictionary(ByteArrayEqualityComparer.Default); + innerData[i] = new ConcurrentDictionary(ByteArrayEqualityComparer.Default); } public void Delete(byte table, byte[] key) { - readerWriterLock.EnterWriteLock(); - innerData[table].Remove(key.EnsureNotNull()); - readerWriterLock.ExitWriteLock(); + innerData[table].TryRemove(key.EnsureNotNull(), out _); } public void Dispose() { - readerWriterLock.Dispose(); } public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) @@ -36,15 +32,13 @@ public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) if (prefix?.Length > 0) records = records.Where(p => p.Key.Length >= prefix.Length && p.Key.Take(prefix.Length).SequenceEqual(prefix)); records = records.OrderBy(p => p.Key, ByteArrayComparer.Default); - readerWriterLock.EnterReadLock(); foreach (var pair in records) yield return (pair.Key, pair.Value); - readerWriterLock.ExitReadLock(); } public ISnapshot GetSnapshot() { - return new Snapshot(innerData, readerWriterLock); + return new Snapshot(innerData); } public void Put(byte table, byte[] key, byte[] value) @@ -54,16 +48,12 @@ public void Put(byte table, byte[] key, byte[] value) public void PutSync(byte table, byte[] key, byte[] value) { - readerWriterLock.EnterWriteLock(); innerData[table][key.EnsureNotNull()] = value; - readerWriterLock.ExitWriteLock(); } public byte[] TryGet(byte table, byte[] key) { - readerWriterLock.EnterReadLock(); innerData[table].TryGetValue(key.EnsureNotNull(), out byte[] value); - readerWriterLock.ExitReadLock(); return value; } } From 3553f62b8f1fe9a36d81c07811b1f660c807a5ea Mon Sep 17 00:00:00 2001 From: erikzhang Date: Wed, 27 Nov 2019 11:17:37 +0800 Subject: [PATCH 8/8] Decouple --- src/neo/Ledger/Blockchain.cs | 30 ++++++++++++++++++++++++++ src/neo/Network/P2P/ProtocolHandler.cs | 2 +- src/neo/Network/RPC/RpcServer.cs | 10 ++++----- src/neo/Persistence/StoreView.cs | 23 -------------------- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index d7bdf81120..14b38860cf 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -177,6 +177,14 @@ private static Transaction DeployNativeContracts() }; } + public Block GetBlock(uint index) + { + if (index == 0) return GenesisBlock; + UInt256 hash = GetBlockHash(index); + if (hash == null) return null; + return GetBlock(hash); + } + public Block GetBlock(UInt256 hash) { if (block_cache.TryGetValue(hash, out Block block)) @@ -195,6 +203,28 @@ public static UInt160 GetConsensusAddress(ECPoint[] validators) return Contract.CreateMultiSigRedeemScript(validators.Length - (validators.Length - 1) / 3, validators).ToScriptHash(); } + public Header GetHeader(uint index) + { + if (index == 0) return GenesisBlock.Header; + UInt256 hash = GetBlockHash(index); + if (hash == null) return null; + return GetHeader(hash); + } + + public Header GetHeader(UInt256 hash) + { + if (block_cache.TryGetValue(hash, out Block block)) + return block.Header; + return View.GetHeader(hash); + } + + public UInt256 GetNextBlockHash(UInt256 hash) + { + Header header = GetHeader(hash); + if (header == null) return null; + return GetBlockHash(header.Index + 1); + } + public SnapshotView GetSnapshot() { return new SnapshotView(Store); diff --git a/src/neo/Network/P2P/ProtocolHandler.cs b/src/neo/Network/P2P/ProtocolHandler.cs index 5093659219..e16d7f238c 100644 --- a/src/neo/Network/P2P/ProtocolHandler.cs +++ b/src/neo/Network/P2P/ProtocolHandler.cs @@ -182,7 +182,7 @@ private void OnGetBlockDataMessageReceived(GetBlockDataPayload payload) { for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) { - Block block = Blockchain.Singleton.View.GetBlock(i); + Block block = Blockchain.Singleton.GetBlock(i); if (block == null) break; diff --git a/src/neo/Network/RPC/RpcServer.cs b/src/neo/Network/RPC/RpcServer.cs index 1294a7351d..953783b5ed 100644 --- a/src/neo/Network/RPC/RpcServer.cs +++ b/src/neo/Network/RPC/RpcServer.cs @@ -435,7 +435,7 @@ private JObject GetBlock(JObject key, bool verbose) if (key is JNumber) { uint index = uint.Parse(key.AsString()); - block = Blockchain.Singleton.View.GetBlock(index); + block = Blockchain.Singleton.GetBlock(index); } else { @@ -448,7 +448,7 @@ private JObject GetBlock(JObject key, bool verbose) { JObject json = block.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - block.Index + 1; - UInt256 hash = Blockchain.Singleton.View.GetNextBlockHash(block.Hash); + UInt256 hash = Blockchain.Singleton.GetNextBlockHash(block.Hash); if (hash != null) json["nextblockhash"] = hash.ToString(); return json; @@ -476,7 +476,7 @@ private JObject GetBlockHeader(JObject key, bool verbose) if (key is JNumber) { uint height = uint.Parse(key.AsString()); - header = Blockchain.Singleton.View.GetHeader(height); + header = Blockchain.Singleton.GetHeader(height); } else { @@ -490,7 +490,7 @@ private JObject GetBlockHeader(JObject key, bool verbose) { JObject json = header.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; - UInt256 hash = Blockchain.Singleton.View.GetNextBlockHash(header.Hash); + UInt256 hash = Blockchain.Singleton.GetNextBlockHash(header.Hash); if (hash != null) json["nextblockhash"] = hash.ToString(); return json; @@ -567,7 +567,7 @@ private JObject GetRawTransaction(UInt256 hash, bool verbose) TransactionState txState = Blockchain.Singleton.View.Transactions.TryGet(hash); if (txState != null) { - Header header = Blockchain.Singleton.View.GetHeader(txState.BlockIndex); + Header header = Blockchain.Singleton.GetHeader(txState.BlockIndex); json["blockhash"] = header.Hash.ToString(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; json["blocktime"] = header.Timestamp; diff --git a/src/neo/Persistence/StoreView.cs b/src/neo/Persistence/StoreView.cs index f7dbcd7592..c23e000ff2 100644 --- a/src/neo/Persistence/StoreView.cs +++ b/src/neo/Persistence/StoreView.cs @@ -53,14 +53,6 @@ public bool ContainsTransaction(UInt256 hash) return state != null; } - public Block GetBlock(uint index) - { - if (index == 0) return Blockchain.GenesisBlock; - UInt256 hash = Blockchain.Singleton.GetBlockHash(index); - if (hash == null) return null; - return GetBlock(hash); - } - public Block GetBlock(UInt256 hash) { TrimmedBlock state = Blocks.TryGet(hash); @@ -69,26 +61,11 @@ public Block GetBlock(UInt256 hash) return state.GetBlock(Transactions); } - public Header GetHeader(uint index) - { - if (index == 0) return Blockchain.GenesisBlock.Header; - UInt256 hash = Blockchain.Singleton.GetBlockHash(index); - if (hash == null) return null; - return GetHeader(hash); - } - public Header GetHeader(UInt256 hash) { return Blocks.TryGet(hash)?.Header; } - public UInt256 GetNextBlockHash(UInt256 hash) - { - TrimmedBlock state = Blocks.TryGet(hash); - if (state == null) return null; - return Blockchain.Singleton.GetBlockHash(state.Index + 1); - } - public Transaction GetTransaction(UInt256 hash) { return Transactions.TryGet(hash)?.Transaction;