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); }
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; }
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); }
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); }
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()); }
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); }
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())); }
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)); }
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()); }
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); }
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); }
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()); }
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()); }
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); }
private void PutToStore(IStore store, MPTNode node) { store.Put(0xf0, node.Hash.ToArray(), node.ToArray()); }
public void TestNewLeafException() { Assert.ThrowsException <ArgumentNullException>(() => MPTNode.NewLeaf(null)); Assert.ThrowsException <InvalidOperationException>(() => MPTNode.NewLeaf(Array.Empty <byte>())); }
public void TestNewHashException() { Assert.ThrowsException <ArgumentNullException>(() => MPTNode.NewHash(null)); }
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())); }
private void PutToStore(MPTNode node) { mptdb.Put(0xf0, node.Hash.ToArray(), node.Encode()); }
private void PutToStore(IStore store, MPTNode node) { store.Put(Concat(new byte[] { 0xf0 }, node.Hash.ToArray()), node.ToArray()); }