From 9b9be47357e9065de524005755212ed54c3f6a11 Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 22 May 2025 05:36:11 +0200 Subject: [PATCH] [`ut`] 100% Coverage Trie.Get (#3952) * 100% Coverage Trie.Get * fix ut --- .../Cryptography/MPTTrie/Trie.Delete.cs | 24 +-- .../Cryptography/MPTTrie/Trie.Find.cs | 6 +- .../Cryptography/MPTTrie/Trie.Get.cs | 6 +- .../Cryptography/MPTTrie/Trie.Proof.cs | 4 +- .../Cryptography/MPTTrie/Trie.Put.cs | 30 ++-- .../Cryptography/MPTTrie/Trie.cs | 24 +-- .../Cryptography/MPTTrie/UT_Trie.cs | 163 ++++++++++-------- 7 files changed, 136 insertions(+), 121 deletions(-) diff --git a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Delete.cs b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Delete.cs index 97d2b78b01..15f06ed8fa 100644 --- a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Delete.cs +++ b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Delete.cs @@ -23,7 +23,7 @@ public bool Delete(byte[] key) throw new ArgumentException("could not be empty", nameof(key)); if (path.Length > Node.MaxKeyLength) throw new ArgumentException("exceeds limit", nameof(key)); - return TryDelete(ref root, path); + return TryDelete(ref _root, path); } private bool TryDelete(ref Node node, ReadOnlySpan path) @@ -34,7 +34,7 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) { if (path.IsEmpty) { - if (!full) cache.DeleteNode(node.Hash); + if (!_full) _cache.DeleteNode(node.Hash); node = new Node(); return true; } @@ -47,7 +47,7 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) var oldHash = node.Hash; var result = TryDelete(ref node.Next, path[node.Key.Length..]); if (!result) return false; - if (!full) cache.DeleteNode(oldHash); + if (!_full) _cache.DeleteNode(oldHash); if (node.Next.IsEmpty) { node = node.Next; @@ -55,12 +55,12 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) } if (node.Next.Type == NodeType.ExtensionNode) { - if (!full) cache.DeleteNode(node.Next.Hash); + if (!_full) _cache.DeleteNode(node.Next.Hash); node.Key = new([.. node.Key.Span, .. node.Next.Key.Span]); node.Next = node.Next.Next; } node.SetDirty(); - cache.PutNode(node); + _cache.PutNode(node); return true; } return false; @@ -78,7 +78,7 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) result = TryDelete(ref node.Children[path[0]], path[1..]); } if (!result) return false; - if (!full) cache.DeleteNode(oldHash); + if (!_full) _cache.DeleteNode(oldHash); List childrenIndexes = new List(Node.BranchChildCount); for (int i = 0; i < Node.BranchChildCount; i++) { @@ -88,7 +88,7 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) if (childrenIndexes.Count > 1) { node.SetDirty(); - cache.PutNode(node); + _cache.PutNode(node); return true; } var lastChildIndex = childrenIndexes[0]; @@ -100,20 +100,20 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) } if (lastChild.Type == NodeType.HashNode) { - lastChild = cache.Resolve(lastChild.Hash); + lastChild = _cache.Resolve(lastChild.Hash); if (lastChild is null) throw new InvalidOperationException("Internal error, can't resolve hash"); } if (lastChild.Type == NodeType.ExtensionNode) { - if (!full) cache.DeleteNode(lastChild.Hash); + if (!_full) _cache.DeleteNode(lastChild.Hash); lastChild.Key = new([.. childrenIndexes.ToArray(), .. lastChild.Key.Span]); lastChild.SetDirty(); - cache.PutNode(lastChild); + _cache.PutNode(lastChild); node = lastChild; return true; } node = Node.NewExtension(childrenIndexes.ToArray(), lastChild); - cache.PutNode(node); + _cache.PutNode(node); return true; } case NodeType.Empty: @@ -122,7 +122,7 @@ private bool TryDelete(ref Node node, ReadOnlySpan path) } case NodeType.HashNode: { - var newNode = cache.Resolve(node.Hash); + var newNode = _cache.Resolve(node.Hash); if (newNode is null) throw new InvalidOperationException("Internal error, can't resolve hash when mpt delete"); node = newNode; return TryDelete(ref node, path); diff --git a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Find.cs b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Find.cs index 0132adbcb7..4becbd2496 100644 --- a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Find.cs +++ b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Find.cs @@ -34,7 +34,7 @@ private ReadOnlySpan Seek(ref Node node, ReadOnlySpan path, out Node break; case NodeType.HashNode: { - var newNode = cache.Resolve(node.Hash); + var newNode = _cache.Resolve(node.Hash); if (newNode is null) throw new InvalidOperationException("Internal error, can't resolve hash when mpt seek"); node = newNode; return Seek(ref node, path, out start); @@ -84,7 +84,7 @@ private ReadOnlySpan Seek(ref Node node, ReadOnlySpan path, out Node } if (path.Length > Node.MaxKeyLength || from.Length > Node.MaxKeyLength) throw new ArgumentException("exceeds limit"); - path = Seek(ref root, path, out Node start).ToArray(); + path = Seek(ref _root, path, out Node start).ToArray(); if (from.Length > 0) { for (int i = 0; i < from.Length && i < path.Length; i++) @@ -120,7 +120,7 @@ private ReadOnlySpan Seek(ref Node node, ReadOnlySpan path, out Node break; case NodeType.HashNode: { - var newNode = cache.Resolve(node.Hash); + var newNode = _cache.Resolve(node.Hash); if (newNode is null) throw new InvalidOperationException("Internal error, can't resolve hash when mpt find"); node = newNode; foreach (var item in Travers(node, path, from, offset)) diff --git a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Get.cs b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Get.cs index 4ff6b431db..3193637087 100644 --- a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Get.cs +++ b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Get.cs @@ -25,7 +25,7 @@ public byte[] this[byte[] key] throw new ArgumentException("could not be empty", nameof(key)); if (path.Length > Node.MaxKeyLength) throw new ArgumentException("exceeds limit", nameof(key)); - var result = TryGet(ref root, path, out var value); + var result = TryGet(ref _root, path, out var value); return result ? value.ToArray() : throw new KeyNotFoundException(); } } @@ -38,7 +38,7 @@ public bool TryGetValue(byte[] key, out byte[] value) throw new ArgumentException("could not be empty", nameof(key)); if (path.Length > Node.MaxKeyLength) throw new ArgumentException("exceeds limit", nameof(key)); - var result = TryGet(ref root, path, out var val); + var result = TryGet(ref _root, path, out var val); if (result) value = val.ToArray(); return result; @@ -61,7 +61,7 @@ private bool TryGet(ref Node node, ReadOnlySpan path, out ReadOnlySpan proof) if (path.Length > Node.MaxKeyLength) throw new ArgumentException("exceeds limit", nameof(key)); proof = new HashSet(ByteArrayEqualityComparer.Default); - return GetProof(ref root, path, proof); + return GetProof(ref _root, path, proof); } private bool GetProof(ref Node node, ReadOnlySpan path, HashSet set) @@ -46,7 +46,7 @@ private bool GetProof(ref Node node, ReadOnlySpan path, HashSet se break; case NodeType.HashNode: { - var newNode = cache.Resolve(node.Hash); + var newNode = _cache.Resolve(node.Hash); if (newNode is null) throw new InvalidOperationException("Internal error, can't resolve hash when mpt getproof"); node = newNode; return GetProof(ref node, path, set); diff --git a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Put.cs b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Put.cs index fb335df98f..409bbf2d15 100644 --- a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Put.cs +++ b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.Put.cs @@ -38,7 +38,7 @@ public void Put(byte[] key, byte[] value) if (val.Length > Node.MaxValueLength) throw new ArgumentException("exceed limit", nameof(value)); var n = Node.NewLeaf(val); - Put(ref root, path, n); + Put(ref _root, path, n); } private void Put(ref Node node, ReadOnlySpan path, Node val) @@ -49,15 +49,15 @@ private void Put(ref Node node, ReadOnlySpan path, Node val) { if (path.IsEmpty) { - if (!full) cache.DeleteNode(node.Hash); + if (!_full) _cache.DeleteNode(node.Hash); node = val; - cache.PutNode(node); + _cache.PutNode(node); return; } var branch = Node.NewBranch(); branch.Children[Node.BranchChildCount - 1] = node; Put(ref branch.Children[path[0]], path[1..], val); - cache.PutNode(branch); + _cache.PutNode(branch); node = branch; break; } @@ -67,12 +67,12 @@ private void Put(ref Node node, ReadOnlySpan path, Node val) { var oldHash = node.Hash; Put(ref node.Next, path[node.Key.Length..], val); - if (!full) cache.DeleteNode(oldHash); + if (!_full) _cache.DeleteNode(oldHash); node.SetDirty(); - cache.PutNode(node); + _cache.PutNode(node); return; } - if (!full) cache.DeleteNode(node.Hash); + if (!_full) _cache.DeleteNode(node.Hash); var prefix = CommonPrefix(node.Key.Span, path); var pathRemain = path[prefix.Length..]; var keyRemain = node.Key.Span[prefix.Length..]; @@ -85,7 +85,7 @@ private void Put(ref Node node, ReadOnlySpan path, Node val) else { var exNode = Node.NewExtension(keyRemain[1..].ToArray(), node.Next); - cache.PutNode(exNode); + _cache.PutNode(exNode); child.Children[keyRemain[0]] = exNode; } if (pathRemain.IsEmpty) @@ -98,11 +98,11 @@ private void Put(ref Node node, ReadOnlySpan path, Node val) Put(ref grandChild, pathRemain[1..], val); child.Children[pathRemain[0]] = grandChild; } - cache.PutNode(child); + _cache.PutNode(child); if (prefix.Length > 0) { var exNode = Node.NewExtension(prefix.ToArray(), child); - cache.PutNode(exNode); + _cache.PutNode(exNode); node = exNode; } else @@ -122,9 +122,9 @@ private void Put(ref Node node, ReadOnlySpan path, Node val) { Put(ref node.Children[path[0]], path[1..], val); } - if (!full) cache.DeleteNode(oldHash); + if (!_full) _cache.DeleteNode(oldHash); node.SetDirty(); - cache.PutNode(node); + _cache.PutNode(node); break; } case NodeType.Empty: @@ -137,15 +137,15 @@ private void Put(ref Node node, ReadOnlySpan path, Node val) else { newNode = Node.NewExtension(path.ToArray(), val); - cache.PutNode(newNode); + _cache.PutNode(newNode); } node = newNode; - if (val.Type == NodeType.LeafNode) cache.PutNode(val); + if (val.Type == NodeType.LeafNode) _cache.PutNode(val); break; } case NodeType.HashNode: { - Node newNode = cache.Resolve(node.Hash); + Node newNode = _cache.Resolve(node.Hash); if (newNode is null) throw new InvalidOperationException("Internal error, can't resolve hash when mpt put"); node = newNode; Put(ref node, path, val); diff --git a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.cs b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.cs index 4e5890f5ac..7a48f2dc0a 100644 --- a/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.cs +++ b/src/Neo.Cryptography.MPTTrie/Cryptography/MPTTrie/Trie.cs @@ -17,24 +17,24 @@ namespace Neo.Cryptography.MPTTrie public partial class Trie { private const byte Prefix = 0xf0; - private readonly bool full; - private readonly IStoreSnapshot store; - private Node root; - private readonly Cache cache; - public Node Root => root; + private readonly bool _full; + private readonly IStoreSnapshot _store; + private Node _root; + private readonly Cache _cache; + public Node Root => _root; public Trie(IStoreSnapshot store, UInt256 root, bool full_state = false) { - this.store = store ?? throw new ArgumentNullException(nameof(store)); - cache = new Cache(store, Prefix); - this.root = root is null ? new Node() : Node.NewHash(root); - full = full_state; + _store = store ?? throw new ArgumentNullException(nameof(store)); + _cache = new Cache(store, Prefix); + _root = root is null ? new Node() : Node.NewHash(root); + _full = full_state; } private static byte[] ToNibbles(ReadOnlySpan path) { var result = new byte[path.Length * 2]; - for (int i = 0; i < path.Length; i++) + for (var i = 0; i < path.Length; i++) { result[i * 2] = (byte)(path[i] >> 4); result[i * 2 + 1] = (byte)(path[i] & 0x0F); @@ -46,7 +46,7 @@ private static byte[] FromNibbles(ReadOnlySpan path) { if (path.Length % 2 != 0) throw new FormatException($"MPTTrie.FromNibbles invalid path."); var key = new byte[path.Length / 2]; - for (int i = 0; i < key.Length; i++) + for (var i = 0; i < key.Length; i++) { key[i] = (byte)(path[i * 2] << 4); key[i] |= path[i * 2 + 1]; @@ -56,7 +56,7 @@ private static byte[] FromNibbles(ReadOnlySpan path) public void Commit() { - cache.Commit(); + _cache.Commit(); } } } diff --git a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs index a420bc5265..a5fe1290bb 100644 --- a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs +++ b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs @@ -22,21 +22,21 @@ namespace Neo.Cryptography.MPTTrie.Tests { class TestSnapshot : IStoreSnapshot { - public Dictionary store = new Dictionary(ByteArrayEqualityComparer.Default); + public Dictionary _store = new(ByteArrayEqualityComparer.Default); - private byte[] StoreKey(byte[] key) + private static byte[] StoreKey(byte[] key) { return [.. key]; } public void Put(byte[] key, byte[] value) { - store[key] = value; + _store[key] = value; } public void Delete(byte[] key) { - store.Remove(StoreKey(key)); + _store.Remove(StoreKey(key)); } public IStore Store => throw new NotImplementedException(); @@ -49,26 +49,26 @@ public void Delete(byte[] key) public byte[] TryGet(byte[] key) { - var result = store.TryGetValue(StoreKey(key), out byte[] value); + var result = _store.TryGetValue(StoreKey(key), out byte[] value); if (result) return value; return null; } public bool TryGet(byte[] key, out byte[] value) { - return store.TryGetValue(StoreKey(key), out value); + return _store.TryGetValue(StoreKey(key), out value); } public void Dispose() { throw new NotImplementedException(); } - public int Size => store.Count; + public int Size => _store.Count; } [TestClass] public class UT_Trie { - private Node root; - private IStore mptdb; + private Node _root; + private IStore _mptdb; private void PutToStore(IStore store, Node node) { @@ -85,31 +85,47 @@ public void TestInit() var v3 = Node.NewLeaf(Encoding.ASCII.GetBytes("existing"));//key=acae var v4 = Node.NewLeaf(Encoding.ASCII.GetBytes("missing")); var h3 = Node.NewHash(v3.Hash); - var e1 = Node.NewExtension(new byte[] { 0x01 }, v1); - var e3 = Node.NewExtension(new byte[] { 0x0e }, h3); - var e4 = Node.NewExtension(new byte[] { 0x01 }, v4); + var e1 = Node.NewExtension([0x01], v1); + var e3 = Node.NewExtension([0x0e], h3); + var e4 = Node.NewExtension([0x01], v4); b.Children[0] = e1; b.Children[10] = e3; b.Children[16] = v2; b.Children[15] = Node.NewHash(e4.Hash); - root = r; - mptdb = new MemoryStore(); - PutToStore(mptdb, r); - PutToStore(mptdb, b); - PutToStore(mptdb, e1); - PutToStore(mptdb, e3); - PutToStore(mptdb, v1); - PutToStore(mptdb, v2); - PutToStore(mptdb, v3); + _root = r; + _mptdb = new MemoryStore(); + PutToStore(_mptdb, r); + PutToStore(_mptdb, b); + PutToStore(_mptdb, e1); + PutToStore(_mptdb, e3); + PutToStore(_mptdb, v1); + PutToStore(_mptdb, v2); + PutToStore(_mptdb, v3); } [TestMethod] public void TestTryGet() { - var mpt = new Trie(mptdb.GetSnapshot(), root.Hash); - Assert.ThrowsExactly(() => _ = mpt[Array.Empty()]); + var mpt = new Trie(_mptdb.GetSnapshot(), _root.Hash); + + // Errors + Assert.ThrowsExactly(() => _ = mpt[[]]); + Assert.ThrowsExactly(() => _ = mpt[new byte[255]]); + Assert.ThrowsExactly(() => _ = mpt.TryGetValue([], out _)); + Assert.ThrowsExactly(() => _ = mpt.TryGetValue(new byte[255], out _)); + + //Get Assert.AreEqual("abcd", mpt["ac01".HexToBytes()].ToHexString()); Assert.AreEqual("2222", mpt["ac".HexToBytes()].ToHexString()); + + //TryGet + Assert.IsTrue(mpt.TryGetValue("ac01".HexToBytes(), out var value)); + Assert.AreEqual("abcd", value.ToHexString()); + Assert.IsTrue(mpt.TryGetValue("ac".HexToBytes(), out value)); + Assert.AreEqual("2222", value.ToHexString()); + Assert.IsFalse(mpt.TryGetValue("000102".HexToBytes(), out value)); + Assert.IsNull(value); + Assert.ThrowsExactly(() => _ = mpt["ab99".HexToBytes()]); Assert.ThrowsExactly(() => _ = mpt["ac39".HexToBytes()]); Assert.ThrowsExactly(() => _ = mpt["ac02".HexToBytes()]); @@ -121,7 +137,7 @@ public void TestTryGet() [TestMethod] public void TestTryGetResolve() { - var mpt = new Trie(mptdb.GetSnapshot(), root.Hash); + var mpt = new Trie(_mptdb.GetSnapshot(), _root.Hash); Assert.AreEqual(Encoding.ASCII.GetBytes("existing").ToHexString(), mpt["acae".HexToBytes()].ToHexString()); } @@ -134,10 +150,10 @@ public void TestTryPut() mpt.Put("ac".HexToBytes(), "2222".HexToBytes()); mpt.Put("acae".HexToBytes(), Encoding.ASCII.GetBytes("existing")); mpt.Put("acf1".HexToBytes(), Encoding.ASCII.GetBytes("missing")); - Assert.AreEqual(root.Hash.ToString(), mpt.Root.Hash.ToString()); - Assert.ThrowsExactly(() => mpt.Put(Array.Empty(), "01".HexToBytes())); - mpt.Put("01".HexToBytes(), Array.Empty()); - Assert.ThrowsExactly(() => mpt.Put(new byte[Node.MaxKeyLength / 2 + 1], Array.Empty())); + Assert.AreEqual(_root.Hash.ToString(), mpt.Root.Hash.ToString()); + Assert.ThrowsExactly(() => mpt.Put([], "01".HexToBytes())); + mpt.Put("01".HexToBytes(), []); + Assert.ThrowsExactly(() => mpt.Put(new byte[Node.MaxKeyLength / 2 + 1], [])); Assert.ThrowsExactly(() => mpt.Put("01".HexToBytes(), new byte[Node.MaxValueLength + 1])); mpt.Put("ac01".HexToBytes(), "ab".HexToBytes()); } @@ -145,17 +161,17 @@ public void TestTryPut() [TestMethod] public void TestPutCantResolve() { - var mpt = new Trie(mptdb.GetSnapshot(), root.Hash); - Assert.ThrowsExactly(() => mpt.Put("acf111".HexToBytes(), new byte[] { 1 })); + var mpt = new Trie(_mptdb.GetSnapshot(), _root.Hash); + Assert.ThrowsExactly(() => mpt.Put("acf111".HexToBytes(), [1])); } [TestMethod] public void TestTryDelete() { - var mpt = new Trie(mptdb.GetSnapshot(), root.Hash); + var mpt = new Trie(_mptdb.GetSnapshot(), _root.Hash); Assert.IsNotNull(mpt["ac".HexToBytes()]); Assert.IsFalse(mpt.Delete("0c99".HexToBytes())); - Assert.ThrowsExactly(() => _ = mpt.Delete(Array.Empty())); + Assert.ThrowsExactly(() => _ = mpt.Delete([])); Assert.IsFalse(mpt.Delete("ac20".HexToBytes())); Assert.ThrowsExactly(() => _ = mpt.Delete("acf1".HexToBytes())); Assert.IsTrue(mpt.Delete("ac".HexToBytes())); @@ -189,8 +205,8 @@ public void TestDeleteRemainCantResolve() var r = Node.NewExtension("0a0c".HexToBytes(), b); var v1 = Node.NewLeaf("abcd".HexToBytes());//key=ac01 var v4 = Node.NewLeaf(Encoding.ASCII.GetBytes("missing")); - var e1 = Node.NewExtension(new byte[] { 0x01 }, v1); - var e4 = Node.NewExtension(new byte[] { 0x01 }, v4); + var e1 = Node.NewExtension([0x01], v1); + var e4 = Node.NewExtension([0x01], v4); b.Children[0] = e1; b.Children[15] = Node.NewHash(e4.Hash); var store = new MemoryStore(); @@ -204,7 +220,6 @@ public void TestDeleteRemainCantResolve() Assert.ThrowsExactly(() => _ = mpt.Delete("ac01".HexToBytes())); } - [TestMethod] public void TestDeleteSameValue() { @@ -252,15 +267,15 @@ public void TestGetProof() var v3 = Node.NewLeaf(Encoding.ASCII.GetBytes("existing"));//key=acae var v4 = Node.NewLeaf(Encoding.ASCII.GetBytes("missing")); var h3 = Node.NewHash(v3.Hash); - var e1 = Node.NewExtension(new byte[] { 0x01 }, v1); - var e3 = Node.NewExtension(new byte[] { 0x0e }, h3); - var e4 = Node.NewExtension(new byte[] { 0x01 }, v4); + var e1 = Node.NewExtension([0x01], v1); + var e3 = Node.NewExtension([0x0e], h3); + var e4 = Node.NewExtension([0x01], v4); b.Children[0] = e1; b.Children[10] = e3; b.Children[16] = v2; b.Children[15] = Node.NewHash(e4.Hash); - var mpt = new Trie(mptdb.GetSnapshot(), r.Hash); + var mpt = new Trie(_mptdb.GetSnapshot(), r.Hash); Assert.AreEqual(r.Hash.ToString(), mpt.Root.Hash.ToString()); var result = mpt.TryGetProof("ac01".HexToBytes(), out var proof); Assert.IsTrue(result); @@ -279,7 +294,7 @@ public void TestGetProof() result = mpt.TryGetProof("acae".HexToBytes(), out proof); Assert.AreEqual(4, proof.Count); - Assert.ThrowsExactly(() => _ = mpt.TryGetProof(Array.Empty(), out proof)); + Assert.ThrowsExactly(() => _ = mpt.TryGetProof([], out proof)); result = mpt.TryGetProof("ac0100".HexToBytes(), out proof); Assert.IsFalse(result); @@ -290,12 +305,12 @@ public void TestGetProof() [TestMethod] public void TestVerifyProof() { - var mpt = new Trie(mptdb.GetSnapshot(), root.Hash); + var mpt = new Trie(_mptdb.GetSnapshot(), _root.Hash); var result = mpt.TryGetProof("ac01".HexToBytes(), out var proof); Assert.IsTrue(result); - var value = Trie.VerifyProof(root.Hash, "ac01".HexToBytes(), proof); + var value = Trie.VerifyProof(_root.Hash, "ac01".HexToBytes(), proof); Assert.IsNotNull(value); - Assert.AreEqual(value.ToHexString(), "abcd"); + Assert.AreEqual("abcd", value.ToHexString()); } [TestMethod] @@ -304,9 +319,9 @@ public void TestAddLongerKey() var store = new MemoryStore(); var snapshot = store.GetSnapshot(); var mpt = new Trie(snapshot, null); - mpt.Put(new byte[] { 0xab }, new byte[] { 0x01 }); - mpt.Put(new byte[] { 0xab, 0xcd }, new byte[] { 0x02 }); - Assert.AreEqual("01", mpt[new byte[] { 0xab }].ToHexString()); + mpt.Put([0xab], [0x01]); + mpt.Put([0xab, 0xcd], [0x02]); + Assert.AreEqual("01", mpt[[0xab]].ToHexString()); } [TestMethod] @@ -315,15 +330,15 @@ public void TestSplitKey() var store = new MemoryStore(); var snapshot = store.GetSnapshot(); var mpt1 = new Trie(snapshot, null); - mpt1.Put(new byte[] { 0xab, 0xcd }, new byte[] { 0x01 }); - mpt1.Put(new byte[] { 0xab }, new byte[] { 0x02 }); - var r = mpt1.TryGetProof(new byte[] { 0xab, 0xcd }, out var set1); + mpt1.Put([0xab, 0xcd], [0x01]); + mpt1.Put([0xab], [0x02]); + var r = mpt1.TryGetProof([0xab, 0xcd], out var set1); Assert.IsTrue(r); Assert.AreEqual(4, set1.Count); var mpt2 = new Trie(snapshot, null); - mpt2.Put(new byte[] { 0xab }, new byte[] { 0x02 }); - mpt2.Put(new byte[] { 0xab, 0xcd }, new byte[] { 0x01 }); - r = mpt2.TryGetProof(new byte[] { 0xab, 0xcd }, out var set2); + mpt2.Put([0xab], [0x02]); + mpt2.Put([0xab, 0xcd], [0x01]); + r = mpt2.TryGetProof([0xab, 0xcd], out var set2); Assert.IsTrue(r); Assert.AreEqual(4, set2.Count); Assert.AreEqual(mpt1.Root.Hash, mpt2.Root.Hash); @@ -335,21 +350,21 @@ public void TestFind() var store = new MemoryStore(); var snapshot = store.GetSnapshot(); var mpt1 = new Trie(snapshot, null); - var results = mpt1.Find(ReadOnlySpan.Empty).ToArray(); + var results = mpt1.Find([]).ToArray(); Assert.AreEqual(0, results.Length); var mpt2 = new Trie(snapshot, null); - mpt2.Put(new byte[] { 0xab, 0xcd, 0xef }, new byte[] { 0x01 }); - mpt2.Put(new byte[] { 0xab, 0xcd, 0xe1 }, new byte[] { 0x02 }); - mpt2.Put(new byte[] { 0xab }, new byte[] { 0x03 }); - results = mpt2.Find(ReadOnlySpan.Empty).ToArray(); + mpt2.Put([0xab, 0xcd, 0xef], [0x01]); + mpt2.Put([0xab, 0xcd, 0xe1], [0x02]); + mpt2.Put([0xab], [0x03]); + results = [.. mpt2.Find([])]; Assert.AreEqual(3, results.Length); - results = mpt2.Find(new byte[] { 0xab }).ToArray(); + results = [.. mpt2.Find([0xab])]; Assert.AreEqual(3, results.Length); - results = mpt2.Find(new byte[] { 0xab, 0xcd }).ToArray(); + results = [.. mpt2.Find([0xab, 0xcd])]; Assert.AreEqual(2, results.Length); - results = mpt2.Find(new byte[] { 0xac }).ToArray(); + results = [.. mpt2.Find([0xac])]; Assert.AreEqual(0, results.Length); - results = mpt2.Find(new byte[] { 0xab, 0xcd, 0xef, 0x00 }).ToArray(); + results = [.. mpt2.Find([0xab, 0xcd, 0xef, 0x00])]; Assert.AreEqual(0, results.Length); } @@ -360,8 +375,8 @@ public void TestFindCantResolve() var r = Node.NewExtension("0a0c".HexToBytes(), b); var v1 = Node.NewLeaf("abcd".HexToBytes());//key=ac01 var v4 = Node.NewLeaf(Encoding.ASCII.GetBytes("missing")); - var e1 = Node.NewExtension(new byte[] { 0x01 }, v1); - var e4 = Node.NewExtension(new byte[] { 0x01 }, v4); + var e1 = Node.NewExtension([0x01], v1); + var e4 = Node.NewExtension([0x01], v4); b.Children[0] = e1; b.Children[15] = Node.NewHash(e4.Hash); var store = new MemoryStore(); @@ -381,12 +396,12 @@ public void TestFindLeadNode() // r.Key = 0x0a0c // b.Key = 0x00 // l1.Key = 0x01 - var mpt = new Trie(mptdb.GetSnapshot(), root.Hash); + var mpt = new Trie(_mptdb.GetSnapshot(), _root.Hash); var prefix = new byte[] { 0xac, 0x01 }; // = FromNibbles(path = { 0x0a, 0x0c, 0x00, 0x01 }); var results = mpt.Find(prefix).ToArray(); - Assert.AreEqual(1, results.Count()); + Assert.AreEqual(1, results.Length); - prefix = new byte[] { 0xac }; // = FromNibbles(path = { 0x0a, 0x0c }); + prefix = [0xac]; // = FromNibbles(path = { 0x0a, 0x0c }); Assert.ThrowsExactly(() => _ = mpt.Find(prefix).ToArray()); } @@ -397,7 +412,7 @@ public void TestFromNibblesException() var r = Node.NewExtension("0c".HexToBytes(), b); var v1 = Node.NewLeaf("abcd".HexToBytes());//key=ac01 var v2 = Node.NewLeaf("2222".HexToBytes());//key=ac - var e1 = Node.NewExtension(new byte[] { 0x01 }, v1); + var e1 = Node.NewExtension([0x01], v1); b.Children[0] = e1; b.Children[16] = v2; var store = new MemoryStore(); @@ -409,7 +424,7 @@ public void TestFromNibblesException() var snapshot = store.GetSnapshot(); var mpt = new Trie(snapshot, r.Hash); - Assert.ThrowsExactly(() => _ = mpt.Find(Array.Empty()).Count()); + Assert.ThrowsExactly(() => _ = mpt.Find([]).Count()); } [TestMethod] @@ -533,7 +548,7 @@ public void TestEmptyValueIssue633() var key = "01".HexToBytes(); var snapshot = new TestSnapshot(); var mpt = new Trie(snapshot, null); - mpt.Put(key, Array.Empty()); + mpt.Put(key, []); var val = mpt[key]; Assert.IsNotNull(val); Assert.AreEqual(0, val.Length); @@ -554,11 +569,11 @@ public void TestFindWithFrom() mpt.Put("aa50".HexToBytes(), "04".HexToBytes()); var r = mpt.Find("aa".HexToBytes()).ToList(); Assert.AreEqual(3, r.Count); - r = mpt.Find("aa".HexToBytes(), "aa30".HexToBytes()).ToList(); + r = [.. mpt.Find("aa".HexToBytes(), "aa30".HexToBytes())]; Assert.AreEqual(1, r.Count); - r = mpt.Find("aa".HexToBytes(), "aa60".HexToBytes()).ToList(); + r = [.. mpt.Find("aa".HexToBytes(), "aa60".HexToBytes())]; Assert.AreEqual(0, r.Count); - r = mpt.Find("aa".HexToBytes(), "aa10".HexToBytes()).ToList(); + r = [.. mpt.Find("aa".HexToBytes(), "aa10".HexToBytes())]; Assert.AreEqual(1, r.Count); } @@ -571,9 +586,9 @@ public void TestFindStatesIssue652() mpt.Put("abc3".HexToBytes(), "02".HexToBytes()); var r = mpt.Find("ab".HexToBytes(), "abd2".HexToBytes()).ToList(); Assert.AreEqual(0, r.Count); - r = mpt.Find("ab".HexToBytes(), "abb2".HexToBytes()).ToList(); + r = [.. mpt.Find("ab".HexToBytes(), "abb2".HexToBytes())]; Assert.AreEqual(2, r.Count); - r = mpt.Find("ab".HexToBytes(), "abc2".HexToBytes()).ToList(); + r = [.. mpt.Find("ab".HexToBytes(), "abc2".HexToBytes())]; Assert.AreEqual(1, r.Count); } }