From 70c516d93e9fbe29b100c85d5bba61edeb69b895 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Mon, 13 Nov 2023 14:09:51 +0100 Subject: [PATCH] Ensure that merkle root of single element is compressed --- poseidon2/merkle.nim | 2 +- tests/poseidon2/testMerkle.nim | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/poseidon2/merkle.nim b/poseidon2/merkle.nim index 0c4465f..6ca894c 100644 --- a/poseidon2/merkle.nim +++ b/poseidon2/merkle.nim @@ -15,7 +15,7 @@ func merkleRoot*(xs: openArray[F], isBottomLayer: static bool = true) : F = let b = high(xs) let m = b-a+1 - if m==1: + if m==1 and not isBottomLayer: return xs[a] else: diff --git a/tests/poseidon2/testMerkle.nim b/tests/poseidon2/testMerkle.nim index 178d568..203ae2c 100644 --- a/tests/poseidon2/testMerkle.nim +++ b/tests/poseidon2/testMerkle.nim @@ -48,6 +48,14 @@ suite "merkle root": let b = a & @[0.toF] check not bool(merkleRoot(a) == merkleRoot(b)) + test "merkle root of single element does not equal the element": + check not bool(merkleRoot([1.toF]) == 1.toF) + + test "merkle root differs from merkle root of merkle root": + let a = 1.toF + let b = 2.toF + check not bool(merkleRoot([a, b]) == merkleRoot([merkleRoot([a, b])])) + test "merkle root of bytes": let bytes = toSeq 1'u8..80'u8 let root = merkleRoot(bytes)