From 73b324612a8fd52f01c9b85528ea297d26edf102 Mon Sep 17 00:00:00 2001 From: Shargon Date: Wed, 6 Nov 2019 18:58:43 +0100 Subject: [PATCH 1/3] Optimize MerkleTree --- neo/Cryptography/MerkleTree.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/neo/Cryptography/MerkleTree.cs b/neo/Cryptography/MerkleTree.cs index 0d8e617f3f..ee2afcca91 100644 --- a/neo/Cryptography/MerkleTree.cs +++ b/neo/Cryptography/MerkleTree.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; namespace Neo.Cryptography { @@ -25,6 +26,8 @@ private static MerkleTreeNode Build(MerkleTreeNode[] leaves) { if (leaves.Length == 0) throw new ArgumentException(); if (leaves.Length == 1) return leaves[0]; + + var buffer = new byte[64]; MerkleTreeNode[] parents = new MerkleTreeNode[(leaves.Length + 1) / 2]; for (int i = 0; i < parents.Length; i++) { @@ -40,11 +43,20 @@ private static MerkleTreeNode Build(MerkleTreeNode[] leaves) parents[i].RightChild = leaves[i * 2 + 1]; leaves[i * 2 + 1].Parent = parents[i]; } - parents[i].Hash = new UInt256(Crypto.Default.Hash256(parents[i].LeftChild.Hash.ToArray().Concat(parents[i].RightChild.Hash.ToArray()).ToArray())); + parents[i].Hash = Concat(buffer, parents[i].LeftChild.Hash, parents[i].RightChild.Hash); } return Build(parents); //TailCall } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static UInt256 Concat(byte[] buffer, UInt256 hash1, UInt256 hash2) + { + Array.Copy(hash1.ToArray(), 0, buffer, 0, 32); + Array.Copy(hash2.ToArray(), 0, buffer, 32, 32); + + return new UInt256(Crypto.Default.Hash256(buffer)); + } + public static UInt256 ComputeRoot(IReadOnlyList hashes) { if (hashes.Count == 0) throw new ArgumentException(); From 19fce9453b81e1d027b7529ff5e14800d20a1bb0 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Thu, 7 Nov 2019 12:00:33 +0800 Subject: [PATCH 2/3] Update MerkleTree.cs --- neo/Cryptography/MerkleTree.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neo/Cryptography/MerkleTree.cs b/neo/Cryptography/MerkleTree.cs index ee2afcca91..25be98acda 100644 --- a/neo/Cryptography/MerkleTree.cs +++ b/neo/Cryptography/MerkleTree.cs @@ -51,8 +51,8 @@ private static MerkleTreeNode Build(MerkleTreeNode[] leaves) [MethodImpl(MethodImplOptions.AggressiveInlining)] private static UInt256 Concat(byte[] buffer, UInt256 hash1, UInt256 hash2) { - Array.Copy(hash1.ToArray(), 0, buffer, 0, 32); - Array.Copy(hash2.ToArray(), 0, buffer, 32, 32); + Buffer.BlockCopy(hash1.ToArray(), 0, buffer, 0, 32); + Buffer.BlockCopy(hash2.ToArray(), 0, buffer, 32, 32); return new UInt256(Crypto.Default.Hash256(buffer)); } From 0f8da759f7213aac5e02438aaf8c23efc7442396 Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 7 Nov 2019 12:50:49 +0100 Subject: [PATCH 3/3] Update MerkleTree.cs --- neo/Cryptography/MerkleTree.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/Cryptography/MerkleTree.cs b/neo/Cryptography/MerkleTree.cs index 25be98acda..348c439350 100644 --- a/neo/Cryptography/MerkleTree.cs +++ b/neo/Cryptography/MerkleTree.cs @@ -8,7 +8,7 @@ namespace Neo.Cryptography { public class MerkleTree { - private MerkleTreeNode root; + private readonly MerkleTreeNode root; public int Depth { get; private set; }