Exemple #1
0
        public void TestBranchNodeRemainValue()
        {
            var store = new MemoryStore();
            var mpt   = new MPTTrie <TestKey, TestValue>(store.GetSnapshot(), null);

            Assert.IsTrue(mpt.Put("ac11".HexToBytes(), "ac11".HexToBytes()));
            Assert.IsTrue(mpt.Put("ac22".HexToBytes(), "ac22".HexToBytes()));
            Assert.IsTrue(mpt.Put("ac".HexToBytes(), "ac".HexToBytes()));
            Assert.IsTrue(mpt.Delete("ac11".HexToBytes()));
            mpt.Delete("ac22".HexToBytes());
            Assert.IsNotNull(mpt["ac".HexToBytes()]);
        }
Exemple #2
0
        public void TestBranchDeleteDirty()
        {
            var snapshot = new TestSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, null);

            mpt.Put("10".HexToBytes(), "01".HexToBytes());
            mpt.Put("20".HexToBytes(), "02".HexToBytes());
            mpt.Put("30".HexToBytes(), "03".HexToBytes());
            mpt.Commit();
            Assert.AreEqual(7, snapshot.Size);
            var mpt1 = new MPTTrie <TestKey, TestValue>(snapshot, mpt.Root.Hash);

            mpt1.Delete("10".HexToBytes());
            mpt1.Commit();
            Assert.AreEqual(5, snapshot.Size);
            var mpt2 = new MPTTrie <TestKey, TestValue>(snapshot, mpt1.Root.Hash);

            mpt2.Delete("20".HexToBytes());
            mpt2.Commit();
            Assert.AreEqual(2, snapshot.Size);
            var mpt3 = new MPTTrie <TestKey, TestValue>(snapshot, mpt2.Root.Hash);

            mpt3.Delete("30".HexToBytes());
            mpt3.Commit();
            Assert.AreEqual(0, snapshot.Size);
        }
Exemple #3
0
        public void TestReference2()
        {
            var snapshot = new TestSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, null);

            mpt.Put("a101".HexToBytes(), "01".HexToBytes());
            mpt.Put("a201".HexToBytes(), "01".HexToBytes());
            mpt.Put("a301".HexToBytes(), "01".HexToBytes());
            mpt.Commit();
            Assert.AreEqual(4, snapshot.Size);
            mpt.Delete("a301".HexToBytes());
            mpt.Commit();
            Assert.AreEqual(4, snapshot.Size);
            mpt.Delete("a201".HexToBytes());
            mpt.Commit();
            Assert.AreEqual(2, snapshot.Size);
            Assert.AreEqual("01", mpt["a101".HexToBytes()].ToArray().ToHexString());
        }
Exemple #4
0
        public void TestBranchNodeRemainValue()
        {
            var snapshot = new TestSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, null);

            Assert.IsTrue(mpt.Put("ac11".HexToBytes(), "ac11".HexToBytes()));
            Assert.IsTrue(mpt.Put("ac22".HexToBytes(), "ac22".HexToBytes()));
            Assert.IsTrue(mpt.Put("ac".HexToBytes(), "ac".HexToBytes()));
            mpt.Commit();
            Assert.AreEqual(7, snapshot.Size);
            Assert.IsTrue(mpt.Delete("ac11".HexToBytes()));
            mpt.Commit();
            Assert.AreEqual(5, snapshot.Size);
            Assert.IsTrue(mpt.Delete("ac22".HexToBytes()));
            Assert.IsNotNull(mpt["ac".HexToBytes()]);
            mpt.Commit();
            Assert.AreEqual(2, snapshot.Size);
        }
Exemple #5
0
        public void TestDeleteRemainCanResolve()
        {
            var store    = new MemoryStore();
            var snapshot = store.GetSnapshot();
            var mpt1     = new MPTTrie <TestKey, TestValue>(snapshot, null);

            Assert.IsTrue(mpt1.Put("ac00".HexToBytes(), "abcd".HexToBytes()));
            Assert.IsTrue(mpt1.Put("ac10".HexToBytes(), "abcd".HexToBytes()));
            mpt1.Commit();
            snapshot.Commit();
            var snapshot2 = store.GetSnapshot();
            var mpt2      = new MPTTrie <TestKey, TestValue>(snapshot2, mpt1.Root.Hash);

            Assert.IsTrue(mpt2.Delete("ac00".HexToBytes()));
            mpt2.Commit();
            snapshot2.Commit();
            Assert.IsTrue(mpt2.Delete("ac10".HexToBytes()));
        }
Exemple #6
0
        public void TestTryDelete()
        {
            var b = new BranchNode();
            var r = new ExtensionNode {
                Key = "0a0c".HexToBytes(), Next = b
            };
            var v1 = new LeafNode {
                Value = "abcd".HexToBytes()
            };
            var v2 = new LeafNode {
                Value = "2222".HexToBytes()
            };
            var r1 = new ExtensionNode {
                Key = "0a0c0001".HexToBytes(), Next = v1
            };
            var l1 = new ExtensionNode {
                Key = new byte[] { 0x01 }, Next = v1
            };
            var l2 = new ExtensionNode {
                Key = new byte[] { 0x09 }, Next = v2
            };

            b.Children[0] = l1;
            b.Children[9] = l2;

            Assert.AreEqual("0xdea3ab46e9461e885ed7091c1e533e0a8030b248d39cbc638962394eaca0fbb3", r1.Hash.ToString());
            Assert.AreEqual("0x93e8e1ffe2f83dd92fca67330e273bcc811bf64b8f8d9d1b25d5e7366b47d60d", r.Hash.ToString());

            var mpt = new MPTTrie <TestKey, TestValue>(mptdb.GetSnapshot(), root.Hash);

            Assert.IsNotNull(mpt["ac99".HexToBytes()]);
            bool result = mpt.Delete("ac99".HexToBytes());

            Assert.IsTrue(result);
            result = mpt.Delete("acae".HexToBytes());
            Assert.IsTrue(result);
            Assert.AreEqual("0xdea3ab46e9461e885ed7091c1e533e0a8030b248d39cbc638962394eaca0fbb3", mpt.Root.Hash.ToString());
        }
Exemple #7
0
        public void TestTryDelete()
        {
            var mpt = new MPTTrie <TestKey, TestValue>(mptdb.GetSnapshot(), root.Hash);

            Assert.IsNotNull(mpt["ac".HexToBytes()]);
            Assert.IsFalse(mpt.Delete("0c99".HexToBytes()));
            Assert.IsFalse(mpt.Delete(Array.Empty <byte>()));
            Assert.IsFalse(mpt.Delete("ac20".HexToBytes()));
            Assert.ThrowsException <InvalidOperationException>(() => mpt.Delete("acf1".HexToBytes()));
            Assert.IsTrue(mpt.Delete("ac".HexToBytes()));
            Assert.IsFalse(mpt.Delete("acae01".HexToBytes()));
            Assert.IsTrue(mpt.Delete("acae".HexToBytes()));
            Assert.AreEqual("0xcb06925428b7c727375c7fdd943a302fe2c818cf2e2eaf63a7932e3fd6cb3408", mpt.Root.Hash.ToString());
        }
Exemple #8
0
        public void TestDeleteSameValue()
        {
            var store    = new MemoryStore();
            var snapshot = store.GetSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, null);

            Assert.IsTrue(mpt.Put("ac01".HexToBytes(), "abcd".HexToBytes()));
            Assert.IsTrue(mpt.Put("ac02".HexToBytes(), "abcd".HexToBytes()));
            Assert.IsNotNull(mpt["ac01".HexToBytes()]);
            Assert.IsNotNull(mpt["ac02".HexToBytes()]);
            mpt.Delete("ac01".HexToBytes());
            Assert.IsNotNull(mpt["ac02".HexToBytes()]);
            mpt.Commit();
            snapshot.Commit();
            var mpt0 = new MPTTrie <TestKey, TestValue>(store.GetSnapshot(), mpt.Root.Hash);

            Assert.IsNotNull(mpt0["ac02".HexToBytes()]);
        }
Exemple #9
0
        public void TestExtensionDeleteDirty()
        {
            var snapshot = new TestSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, null);

            mpt.Put("a1".HexToBytes(), "01".HexToBytes());
            mpt.Put("a2".HexToBytes(), "02".HexToBytes());
            mpt.Commit();
            Assert.AreEqual(4, snapshot.Size);
            var mpt1 = new MPTTrie <TestKey, TestValue>(snapshot, mpt.Root.Hash);

            mpt1.Delete("a1".HexToBytes());
            mpt1.Commit();
            Assert.AreEqual(2, snapshot.Size);
            var mpt2 = new MPTTrie <TestKey, TestValue>(snapshot, mpt1.Root.Hash);

            mpt2.Delete("a2".HexToBytes());
            mpt2.Commit();
            Assert.AreEqual(0, snapshot.Size);
        }
Exemple #10
0
        public void TestReference1()
        {
            var store    = new MemoryStore();
            var snapshot = store.GetSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, null);

            mpt.Put("a101".HexToBytes(), "01".HexToBytes());
            mpt.Put("a201".HexToBytes(), "01".HexToBytes());
            mpt.Put("a301".HexToBytes(), "01".HexToBytes());
            mpt.Commit();
            snapshot.Commit();
            var snapshot1 = store.GetSnapshot();
            var mpt1      = new MPTTrie <TestKey, TestValue>(snapshot1, mpt.Root.Hash);

            mpt1.Delete("a301".HexToBytes());
            mpt1.Commit();
            snapshot1.Commit();
            var snapshot2 = store.GetSnapshot();
            var mpt2      = new MPTTrie <TestKey, TestValue>(snapshot2, mpt1.Root.Hash);

            mpt2.Delete("a201".HexToBytes());
            Assert.AreEqual("01", mpt2["a101".HexToBytes()]?.ToArray().ToHexString());
        }
Exemple #11
0
        public void TestDeleteRemainCantResolve()
        {
            var b  = MPTNode.NewBranch();
            var r  = MPTNode.NewExtension("0a0c".HexToBytes(), b);
            var v1 = MPTNode.NewLeaf("abcd".HexToBytes());//key=ac01
            var v4 = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("missing"));
            var e1 = MPTNode.NewExtension(new byte[] { 0x01 }, v1);
            var e4 = MPTNode.NewExtension(new byte[] { 0x01 }, v4);

            b.Children[0]  = e1;
            b.Children[15] = MPTNode.NewHash(e4.Hash);
            var store = new MemoryStore();

            PutToStore(store, r);
            PutToStore(store, b);
            PutToStore(store, e1);
            PutToStore(store, v1);

            var snapshot = store.GetSnapshot();
            var mpt      = new MPTTrie <TestKey, TestValue>(snapshot, r.Hash);

            Assert.ThrowsException <InvalidOperationException>(() => mpt.Delete("ac01".HexToBytes()));
        }