Example #1
0
        public void TestFromReplica()
        {
            var l = MPTNode.NewLeaf(new byte[] { 0x00 });
            var n = MPTNode.NewBranch();

            n.Children[1] = l;
            var r = new MPTNode();

            r.FromReplica(n);
            Assert.AreEqual(n.Hash, r.Hash);
            Assert.AreEqual(NodeType.HashNode, r.Children[1].Type);
            Assert.AreEqual(l.Hash, r.Children[1].Hash);
        }
Example #2
0
        public void TestInit()
        {
            var r = new ExtensionNode();

            r.Key = "0a0c".HexToBytes();
            var b  = new BranchNode();
            var l1 = new ExtensionNode();

            l1.Key = new byte[] { 0x01 };
            var l2 = new ExtensionNode();

            l2.Key = new byte[] { 0x09 };
            var v1 = new LeafNode();

            v1.Value = "abcd".HexToBytes();
            var v2 = new LeafNode();

            v2.Value = "2222".HexToBytes();
            var v3 = new LeafNode();

            v3.Value = Encoding.ASCII.GetBytes("hello");
            var h1 = new HashNode();

            h1.Hash = v3.GetHash();
            var l3 = new ExtensionNode();

            l3.Next = h1;
            l3.Key  = "0e".HexToBytes();


            r.Next         = b;
            b.Children[0]  = l1;
            l1.Next        = v1;
            b.Children[9]  = l2;
            l2.Next        = v2;
            b.Children[10] = l3;
            root           = r;
            var store = new MemoryStore();
            var db    = new MPTDb(store);

            this.rootHash = root.GetHash();
            db.Put(r);
            db.Put(b);
            db.Put(l1);
            db.Put(l2);
            db.Put(l3);
            db.Put(v1);
            db.Put(v2);
            db.Put(v3);
            this.mptdb = store;
        }
Example #3
0
        public void TestReference2()
        {
            var l        = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("leaf"));
            var store    = new MemoryStore();
            var snapshot = store.GetSnapshot();
            var cache    = new MPTCache(snapshot, Prefix);

            cache.PutNode(l);
            cache.PutNode(l);
            cache.DeleteNode(l.Hash);
            var rl = cache.Resolve(l.Hash);

            Assert.AreEqual(1, rl.Reference);
        }
Example #4
0
        public void TestResolveExtension()
        {
            var e     = MPTNode.NewExtension(new byte[] { 0x01 }, new MPTNode());
            var store = new MemoryStore();

            store.Put(Prefix, e.Hash.ToArray(), e.ToArray());
            var snapshot = store.GetSnapshot();
            var cache    = new MPTCache(snapshot, Prefix);
            var re       = cache.Resolve(e.Hash);

            Assert.AreEqual(e.Hash, re.Hash);
            Assert.AreEqual(e.Key.ToHexString(), re.Key.ToHexString());
            Assert.IsTrue(re.Next.IsEmpty);
        }
Example #5
0
        public void TestBranchSerializeAsChild()
        {
            var n    = MPTNode.NewBranch();
            var data = new List <byte>();

            data.Add(0x00);
            for (int i = 0; i < MPTNode.BranchChildCount; i++)
            {
                data.Add(0x04);
            }
            var expect = "03" + Crypto.Hash256(data.ToArray()).ToHexString();

            Assert.AreEqual(expect, NodeToArrayAsChild(n).ToHexString());
        }
Example #6
0
        public void TestSize()
        {
            var n = new MPTNode();

            Assert.AreEqual(1, n.Size);
            n = MPTNode.NewBranch();
            Assert.AreEqual(19, n.Size);
            n = MPTNode.NewExtension(new byte[] { 0x00 }, new MPTNode());
            Assert.AreEqual(5, n.Size);
            n = MPTNode.NewLeaf(new byte[] { 0x00 });
            Assert.AreEqual(4, n.Size);
            n = MPTNode.NewHash(UInt256.Zero);
            Assert.AreEqual(33, n.Size);
        }
Example #7
0
        public void TestGetProof()
        {
            var b  = MPTNode.NewBranch();
            var r  = MPTNode.NewExtension("0a0c".HexToBytes(), b);
            var v1 = MPTNode.NewLeaf("abcd".HexToBytes());                 //key=ac01
            var v2 = MPTNode.NewLeaf("2222".HexToBytes());                 //key=ac
            var v3 = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("existing")); //key=acae
            var v4 = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("missing"));
            var h3 = MPTNode.NewHash(v3.Hash);
            var e1 = MPTNode.NewExtension(new byte[] { 0x01 }, v1);
            var e3 = MPTNode.NewExtension(new byte[] { 0x0e }, h3);
            var e4 = MPTNode.NewExtension(new byte[] { 0x01 }, v4);

            b.Children[0]  = e1;
            b.Children[10] = e3;
            b.Children[16] = v2;
            b.Children[15] = MPTNode.NewHash(e4.Hash);

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

            Assert.AreEqual(r.Hash.ToString(), mpt.Root.Hash.ToString());
            HashSet <byte[]> proof = mpt.GetProof("ac01".HexToBytes());

            Assert.AreEqual(4, proof.Count);
            Assert.IsTrue(proof.Contains(b.ToArrayWithoutReference()));
            Assert.IsTrue(proof.Contains(r.ToArrayWithoutReference()));
            Assert.IsTrue(proof.Contains(e1.ToArrayWithoutReference()));
            Assert.IsTrue(proof.Contains(v1.ToArrayWithoutReference()));

            proof = mpt.GetProof("ac".HexToBytes());
            Assert.AreEqual(3, proof.Count());

            proof = mpt.GetProof("ac10".HexToBytes());
            Assert.IsNull(proof);

            proof = mpt.GetProof("acae".HexToBytes());
            Assert.AreEqual(4, proof.Count());

            proof = mpt.GetProof(Array.Empty <byte>());
            Assert.IsNull(proof);

            proof = mpt.GetProof("ac0100".HexToBytes());
            Assert.IsNull(proof);

            Assert.ThrowsException <InvalidOperationException>(() => mpt.GetProof("acf1".HexToBytes()));
        }
Example #8
0
        public void TestGetAndChangedLeaf()
        {
            var l     = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("leaf"));
            var store = new MemoryStore();

            store.Put(Prefix, l.Hash.ToArray(), l.ToArray());
            var snapshot = store.GetSnapshot();
            var cache    = new MPTCache(snapshot, Prefix);
            var rl       = cache.Resolve(l.Hash);

            Assert.AreEqual(l.Hash, rl.Hash);
            Assert.AreEqual("leaf", Encoding.ASCII.GetString(rl.Value));
            rl.Value = new byte[] { 0x01 };
            rl.SetDirty();
            var rl1 = cache.Resolve(l.Hash);

            Assert.AreEqual(l.Hash, rl1.Hash);
            Assert.AreEqual("leaf", Encoding.ASCII.GetString(rl1.Value));
        }
Example #9
0
        public void TestResolveBranch()
        {
            var l = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("leaf"));
            var b = MPTNode.NewBranch();

            b.Children[1] = l;
            var store = new MemoryStore();

            store.Put(Prefix, b.Hash.ToArray(), b.ToArray());
            store.Put(Prefix, l.Hash.ToArray(), l.ToArray());
            var snapshot   = store.GetSnapshot();
            var cache      = new MPTCache(snapshot, Prefix);
            var resolved_b = cache.Resolve(b.Hash);

            Assert.AreEqual(b.Hash, resolved_b.Hash);
            Assert.AreEqual(l.Hash, resolved_b.Children[1].Hash);
            var resolved_l = cache.Resolve(l.Hash);

            Assert.AreEqual(l.Value.ToHexString(), resolved_l.Value.ToHexString());
        }
Example #10
0
        public void TestInit()
        {
            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 v3 = new LeafNode {
                Value = Encoding.ASCII.GetBytes("hello")
            };
            var h1 = new HashNode(v3.Hash);
            var l1 = new ExtensionNode {
                Key = new byte[] { 0x01 }, Next = v1
            };
            var l2 = new ExtensionNode {
                Key = new byte[] { 0x09 }, Next = v2
            };
            var l3 = new ExtensionNode {
                Key = "0e".HexToBytes(), Next = h1
            };

            b.Children[0]  = l1;
            b.Children[9]  = l2;
            b.Children[10] = l3;
            this.root      = r;
            this.mptdb     = new MemoryStore();
            PutToStore(r);
            PutToStore(b);
            PutToStore(l1);
            PutToStore(l2);
            PutToStore(l3);
            PutToStore(v1);
            PutToStore(v2);
            PutToStore(v3);
        }
Example #11
0
        public void TestReference1()
        {
            var l        = MPTNode.NewLeaf(Encoding.ASCII.GetBytes("leaf"));
            var store    = new MemoryStore();
            var snapshot = store.GetSnapshot();
            var cache    = new MPTCache(snapshot, Prefix);

            cache.PutNode(l);
            cache.Commit();
            snapshot.Commit();
            var snapshot1 = store.GetSnapshot();
            var cache1    = new MPTCache(snapshot1, Prefix);

            cache1.PutNode(l);
            cache1.Commit();
            snapshot1.Commit();
            var snapshot2 = store.GetSnapshot();
            var cache2    = new MPTCache(snapshot2, Prefix);
            var rl        = cache2.Resolve(l.Hash);

            Assert.AreEqual(2, rl.Reference);
        }
Example #12
0
        public void TestFromNibblesException()
        {
            var b  = MPTNode.NewBranch();
            var r  = MPTNode.NewExtension("0c".HexToBytes(), b);
            var v1 = MPTNode.NewLeaf("abcd".HexToBytes()); //key=ac01
            var v2 = MPTNode.NewLeaf("2222".HexToBytes()); //key=ac
            var e1 = MPTNode.NewExtension(new byte[] { 0x01 }, v1);

            b.Children[0]  = e1;
            b.Children[16] = v2;
            var store = new MemoryStore();

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

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

            Assert.ThrowsException <FormatException>(() => mpt.Find(Array.Empty <byte>()).Count());
        }
Example #13
0
        public void TestFindCantResolve()
        {
            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.Find("ac".HexToBytes()).Count());
        }
Example #14
0
        public void TestPutAndChangedExtension()
        {
            var e        = MPTNode.NewExtension(new byte[] { 0x01 }, new MPTNode());
            var h        = e.Hash;
            var store    = new MemoryStore();
            var snapshot = store.GetSnapshot();
            var cache    = new MPTCache(snapshot, Prefix);

            cache.PutNode(e);
            var re = cache.Resolve(e.Hash);

            Assert.AreEqual(e.Hash, re.Hash);
            Assert.AreEqual(e.Key.ToHexString(), re.Key.ToHexString());
            Assert.IsTrue(re.Next.IsEmpty);
            e.Key  = new byte[] { 0x02 };
            e.Next = e;
            e.SetDirty();
            var re1 = cache.Resolve(h);

            Assert.AreEqual(h, re1.Hash);
            Assert.AreEqual("01", re1.Key.ToHexString());
            Assert.IsTrue(re1.Next.IsEmpty);
        }
Example #15
0
 private void PutToStore(IStore store, MPTNode node)
 {
     store.Put(0xf0, node.Hash.ToArray(), node.ToArray());
 }
Example #16
0
 public void TestNewLeafException()
 {
     Assert.ThrowsException <ArgumentNullException>(() => MPTNode.NewLeaf(null));
     Assert.ThrowsException <InvalidOperationException>(() => MPTNode.NewLeaf(Array.Empty <byte>()));
 }
Example #17
0
 public void TestNewHashException()
 {
     Assert.ThrowsException <ArgumentNullException>(() => MPTNode.NewHash(null));
 }
Example #18
0
 public void TestNewExtensionException()
 {
     Assert.ThrowsException <ArgumentNullException>(() => MPTNode.NewExtension(null, new MPTNode()));
     Assert.ThrowsException <ArgumentNullException>(() => MPTNode.NewExtension(new byte[] { 0x01 }, null));
     Assert.ThrowsException <InvalidOperationException>(() => MPTNode.NewExtension(Array.Empty <byte>(), new MPTNode()));
 }
Example #19
0
 private void PutToStore(MPTNode node)
 {
     mptdb.Put(0xf0, node.Hash.ToArray(), node.Encode());
 }
Example #20
0
 private void PutToStore(IStore store, MPTNode node)
 {
     store.Put(Concat(new byte[] { 0xf0 }, node.Hash.ToArray()), node.ToArray());
 }