コード例 #1
0
        public void Tload_same_address_same_index_different_values_restore(int snapshot)
        {
            Context         ctx      = new();
            StorageProvider provider = BuildStorageProvider(ctx);

            Snapshot.Storage[] snapshots = new Snapshot.Storage[4];
            snapshots[0] = ((IStorageProvider)provider).TakeSnapshot();
            provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[1]);
            snapshots[1] = ((IStorageProvider)provider).TakeSnapshot();
            provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[2]);
            snapshots[2] = ((IStorageProvider)provider).TakeSnapshot();
            provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[3]);
            snapshots[3] = ((IStorageProvider)provider).TakeSnapshot();

            Assert.AreEqual(snapshots[snapshot + 1].TransientStorageSnapshot, snapshot);
            // Persistent storage is unimpacted by transient storage
            Assert.AreEqual(snapshots[snapshot + 1].PersistentStorageSnapshot, -1);
            provider.Restore(snapshots[snapshot + 1]);

            Assert.AreEqual(_values[snapshot + 1], provider.GetTransientState(new StorageCell(ctx.Address1, 1)));
        }
コード例 #2
0
        public void Persistent_state_restores_independent_of_transient_state(int snapshot)
        {
            Context         ctx      = new();
            StorageProvider provider = BuildStorageProvider(ctx);

            Snapshot.Storage[] snapshots = new Snapshot.Storage[4];

            // No updates
            snapshots[0] = ((IStorageProvider)provider).TakeSnapshot();

            // Only update persistent
            provider.Set(new StorageCell(ctx.Address1, 1), _values[1]);
            snapshots[1] = ((IStorageProvider)provider).TakeSnapshot();

            // Update both
            provider.Set(new StorageCell(ctx.Address1, 1), _values[2]);
            provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[9]);
            snapshots[2] = ((IStorageProvider)provider).TakeSnapshot();

            // Only update transient
            provider.SetTransientState(new StorageCell(ctx.Address1, 1), _values[8]);
            snapshots[3] = ((IStorageProvider)provider).TakeSnapshot();

            provider.Restore(snapshots[snapshot + 1]);

            // Since we didn't update persistent on the 3rd snapshot
            if (snapshot == 2)
            {
                snapshot--;
            }

            snapshots.Should().Equal(
                Snapshot.Storage.Empty,
                new Snapshot.Storage(0, Snapshot.EmptyPosition),
                new Snapshot.Storage(1, 0),
                new Snapshot.Storage(1, 1));

            _values[snapshot + 1].Should().BeEquivalentTo(provider.Get(new StorageCell(ctx.Address1, 1)));
        }
コード例 #3
0
 public void Restore(Snapshot.Storage snapshot)
 {
     _persistentStorageProvider.Restore(snapshot.PersistentStorageSnapshot);
     _transientStorageProvider.Restore(snapshot.TransientStorageSnapshot);
 }
コード例 #4
0
 public Snapshot TakeSnapshot(bool newTransactionStart = false)
 {
     Snapshot.Storage storageSnapshot = StorageProvider.TakeSnapshot(newTransactionStart);
     return(new (StateProvider.TakeSnapshot(), storageSnapshot));
 }