public void Repository_CacheDoesntCarryOver() { const string testContractType = "A String"; ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); byte[] initialRoot = repository.Root; IStateRepository txTrack = repository.StartTracking(); txTrack.CreateAccount(testAddress); txTrack.SetStorageValue(testAddress, dog, cat); txTrack.SetContractType(testAddress, testContractType); txTrack.Commit(); repository.Commit(); byte[] postChangesRoot = repository.Root; IStateRepositoryRoot repository2 = repository.GetSnapshotTo(initialRoot); Assert.Null(repository2.GetAccountState(testAddress)); repository2.SetContractType(testAddress, "Something Else"); repository2.SyncToRoot(postChangesRoot); Assert.Equal(testContractType, repository2.GetContractType(testAddress)); }
public void Repository_CommitAndRollbackTest() { ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); IStateRepository txTrack = repository.StartTracking(); txTrack.CreateAccount(testAddress); txTrack.SetStorageValue(testAddress, dog, cat); txTrack.Commit(); repository.Commit(); byte[] root1 = repository.Root; IStateRepository txTrack2 = repository.StartTracking(); txTrack2.SetStorageValue(testAddress, dog, fish); txTrack2.Rollback(); IStateRepository txTrack3 = repository.StartTracking(); txTrack3.SetStorageValue(testAddress, dodecahedron, bird); txTrack3.Commit(); repository.Commit(); byte[] upToDateRoot = repository.Root; Assert.Equal(cat, repository.GetStorageValue(testAddress, dog)); Assert.Equal(bird, repository.GetStorageValue(testAddress, dodecahedron)); IStateRepository snapshot = repository.GetSnapshotTo(root1); repository.SyncToRoot(root1); Assert.Equal(cat, snapshot.GetStorageValue(testAddress, dog)); Assert.Null(snapshot.GetStorageValue(testAddress, dodecahedron)); }
public void ReflectionVirtualMachineFeature_OnInitialize_RulesAdded() { Network network = KnownNetworks.StratisRegTest; var chain = new ConcurrentChain(network); var contractState = new StateRepositoryRoot(); var executorFactory = new Mock <IContractExecutorFactory>(); var loggerFactory = new ExtendedLoggerFactory(); var dateTimeProvider = new DateTimeProvider(); var consensusRules = new SmartContractPowConsensusRuleEngine( chain, new Mock <ICheckpoints>().Object, new Configuration.Settings.ConsensusSettings(), DateTimeProvider.Default, executorFactory.Object, loggerFactory, network, new Base.Deployments.NodeDeployments(network, chain), contractState, new Mock <IReceiptRepository>().Object, new Mock <ISenderRetriever>().Object, new Mock <ICoinView>().Object, new Mock <IChainState>().Object, new InvalidBlockHashStore(dateTimeProvider), new NodeStats(dateTimeProvider)); var feature = new ReflectionVirtualMachineFeature(loggerFactory, network); feature.InitializeAsync().GetAwaiter().GetResult(); Assert.Single(network.Consensus.FullValidationRules.Where(r => r.GetType() == typeof(SmartContractFormatRule))); }
public void Repository_CommitPushesToUnderlyingSource() { ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); IStateRepository txTrack = repository.StartTracking(); txTrack.CreateAccount(testAddress); txTrack.SetStorageValue(testAddress, dog, cat); Assert.Null(repository.GetStorageValue(testAddress, dog)); txTrack.Commit(); Assert.Equal(cat, repository.GetStorageValue(testAddress, dog)); }
public void Test20DBreeze() { DBreezeEngine engine = new DBreezeEngine(DbreezeTestLocation); using (DBreeze.Transactions.Transaction t = engine.GetTransaction()) { t.RemoveAllKeys(DbreezeTestDb, true); t.Commit(); } ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new DBreezeByteStore(engine, DbreezeTestDb)); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); byte[] root = repository.Root; uint160 cowAddress = new uint160(cow); uint160 horseAddress = new uint160(horse); IStateRepository track2 = repository.StartTracking(); //repository track2.SetStorageValue(cowAddress, cowKey1, cowVal1); track2.SetStorageValue(horseAddress, horseKey1, horseVal1); track2.Commit(); repository.Commit(); byte[] root2 = repository.Root; track2 = repository.StartTracking(); //repository track2.SetStorageValue(cowAddress, cowKey2, cowVal0); track2.SetStorageValue(horseAddress, horseKey2, horseVal0); track2.Commit(); repository.Commit(); byte[] root3 = repository.Root; IStateRepository snapshot = new StateRepositoryRoot(stateDB, root); Assert.Null(snapshot.GetStorageValue(cowAddress, cowKey1)); Assert.Null(snapshot.GetStorageValue(cowAddress, cowKey2)); Assert.Null(snapshot.GetStorageValue(horseAddress, horseKey1)); Assert.Null(snapshot.GetStorageValue(horseAddress, horseKey2)); snapshot = new StateRepositoryRoot(stateDB, root2); Assert.Equal(cowVal1, snapshot.GetStorageValue(cowAddress, cowKey1)); Assert.Null(snapshot.GetStorageValue(cowAddress, cowKey2)); Assert.Equal(horseVal1, snapshot.GetStorageValue(horseAddress, horseKey1)); Assert.Null(snapshot.GetStorageValue(horseAddress, horseKey2)); snapshot = new StateRepositoryRoot(stateDB, root3); Assert.Equal(cowVal1, snapshot.GetStorageValue(cowAddress, cowKey1)); Assert.Equal(cowVal0, snapshot.GetStorageValue(cowAddress, cowKey2)); Assert.Equal(horseVal1, snapshot.GetStorageValue(horseAddress, horseKey1)); Assert.Equal(horseVal0, snapshot.GetStorageValue(horseAddress, horseKey2)); }
public void Test4() { MemoryDictionarySource source = new MemoryDictionarySource(); StateRepositoryRoot root = new StateRepositoryRoot(source); IStateRepository repository = root.StartTracking(); repository.SetStorageValue(new uint160(cow), cowKey, cowValue); repository.SetStorageValue(new uint160(horse), horseKey, horseValue); repository.Commit(); Assert.Equal(cowValue, root.GetStorageValue(new uint160(cow), cowKey)); Assert.Equal(horseValue, root.GetStorageValue(new uint160(horse), horseKey)); }
public void Test12() { StateRepositoryRoot repository = new StateRepositoryRoot(new MemoryDictionarySource()); IStateRepository track = repository.StartTracking(); track.SetCode(new uint160(cow), cowCode); track.SetCode(new uint160(horse), horseCode); Assert.Equal(cowCode, track.GetCode(new uint160(cow))); Assert.Equal(horseCode, track.GetCode(new uint160(horse))); track.Rollback(); Assert.Null(repository.GetCode(new uint160(cow))); Assert.Null(repository.GetCode(new uint160(horse))); }
public void Test3() { StateRepositoryRoot repository = new StateRepositoryRoot(new MemoryDictionarySource()); uint160 cow = 100; uint160 horse = 2000; byte[] cowCode = "A1A2A3".HexToByteArray(); byte[] horseCode = "B1B2B3".HexToByteArray(); repository.SetCode(cow, cowCode); repository.SetCode(horse, horseCode); Assert.Equal(cowCode, repository.GetCode(cow)); Assert.Equal(horseCode, repository.GetCode(horse)); }
public void Test20() { ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); byte[] root = repository.Root; uint160 cowAddress = new uint160(cow); uint160 horseAddress = new uint160(horse); IStateRepository track2 = repository.StartTracking(); //repository track2.SetStorageValue(cowAddress, cowKey1, cowVal1); track2.SetStorageValue(horseAddress, horseKey1, horseVal1); track2.Commit(); repository.Commit(); byte[] root2 = repository.Root; track2 = repository.StartTracking(); //repository track2.SetStorageValue(cowAddress, cowKey2, cowVal0); track2.SetStorageValue(horseAddress, horseKey2, horseVal0); track2.Commit(); repository.Commit(); byte[] root3 = repository.Root; IStateRepository snapshot = new StateRepositoryRoot(stateDB, root); Assert.Null(snapshot.GetStorageValue(cowAddress, cowKey1)); Assert.Null(snapshot.GetStorageValue(cowAddress, cowKey2)); Assert.Null(snapshot.GetStorageValue(horseAddress, horseKey1)); Assert.Null(snapshot.GetStorageValue(horseAddress, horseKey2)); snapshot = new StateRepositoryRoot(stateDB, root2); Assert.Equal(cowVal1, snapshot.GetStorageValue(cowAddress, cowKey1)); Assert.Null(snapshot.GetStorageValue(cowAddress, cowKey2)); Assert.Equal(horseVal1, snapshot.GetStorageValue(horseAddress, horseKey1)); Assert.Null(snapshot.GetStorageValue(horseAddress, horseKey2)); snapshot = new StateRepositoryRoot(stateDB, root3); Assert.Equal(cowVal1, snapshot.GetStorageValue(cowAddress, cowKey1)); Assert.Equal(cowVal0, snapshot.GetStorageValue(cowAddress, cowKey2)); Assert.Equal(horseVal1, snapshot.GetStorageValue(horseAddress, horseKey1)); Assert.Equal(horseVal0, snapshot.GetStorageValue(horseAddress, horseKey2)); }
public void Repository_Null_Is_Stored_As_Null() { // Demonstrates that our repository stores null and returns null ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); repository.CreateAccount(testAddress); repository.SetStorageValue(testAddress, dog, null); Assert.Null(repository.GetStorageValue(testAddress, dog)); repository.Commit(); // We have pushed null to the kv store. Should come back as null StateRepositoryRoot repository2 = new StateRepositoryRoot(stateDB, repository.Root); Assert.Null(repository2.GetStorageValue(testAddress, dog)); }
public void Repository_Bytes0VsNull() { // Demonstrates that our repository treats byte[0] and null as the same. ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); repository.CreateAccount(testAddress); repository.SetStorageValue(testAddress, dog, new byte[0]); Assert.Equal(new byte[0], repository.GetStorageValue(testAddress, dog)); repository.Commit(); // We have pushed byte[0] to the kv store. Should come back as byte[0] right? StateRepositoryRoot repository2 = new StateRepositoryRoot(stateDB, repository.Root); // Nope, comes back null... Assert.Null(repository2.GetStorageValue(testAddress, dog)); }
public void Repository_Empty_String_Is_Stored_As_Null() { // Demonstrates that our repository stores null and returns null ISource <byte[], byte[]> stateDB = new NoDeleteSource <byte[], byte[]>(new MemoryDictionarySource()); StateRepositoryRoot repository = new StateRepositoryRoot(stateDB); repository.CreateAccount(testAddress); var emptyString = Encoding.UTF8.GetBytes(string.Empty); Assert.Empty(empty); // Empty string is empty byte array repository.SetStorageValue(testAddress, dog, emptyString); Assert.Equal(emptyString, repository.GetStorageValue(testAddress, dog)); repository.Commit(); // We have pushed null to the kv store. Should come back as null StateRepositoryRoot repository2 = new StateRepositoryRoot(stateDB, repository.Root); Assert.Null(repository2.GetStorageValue(testAddress, dog)); }