2023-12-21 06:41:43 +00:00
|
|
|
import std/unittest
|
|
|
|
import std/sequtils
|
|
|
|
import std/sugar
|
|
|
|
|
2024-10-28 15:52:21 +00:00
|
|
|
import pkg/chronos
|
2023-12-21 06:41:43 +00:00
|
|
|
import pkg/poseidon2
|
|
|
|
import pkg/poseidon2/io
|
|
|
|
import pkg/questionable/results
|
|
|
|
import pkg/results
|
|
|
|
import pkg/stew/byteutils
|
|
|
|
import pkg/stew/arrayops
|
|
|
|
import constantine/math/arithmetic
|
|
|
|
import constantine/math/io/io_bigints
|
|
|
|
import pkg/constantine/math/io/io_fields
|
|
|
|
import pkg/constantine/platforms/abstractions
|
|
|
|
|
|
|
|
import pkg/codex/merkletree
|
|
|
|
|
|
|
|
import ./generictreetests
|
|
|
|
import ./helpers
|
|
|
|
|
|
|
|
const
|
|
|
|
data =
|
2024-10-28 15:52:21 +00:00
|
|
|
@[
|
2023-12-21 06:41:43 +00:00
|
|
|
"0000000000000000000000000000001".toBytes,
|
|
|
|
"0000000000000000000000000000002".toBytes,
|
|
|
|
"0000000000000000000000000000003".toBytes,
|
|
|
|
"0000000000000000000000000000004".toBytes,
|
|
|
|
"0000000000000000000000000000005".toBytes,
|
|
|
|
"0000000000000000000000000000006".toBytes,
|
|
|
|
"0000000000000000000000000000007".toBytes,
|
|
|
|
"0000000000000000000000000000008".toBytes,
|
2024-01-08 22:52:46 +00:00
|
|
|
"0000000000000000000000000000009".toBytes, # note one less to account for padding of field elements
|
2023-12-21 06:41:43 +00:00
|
|
|
]
|
|
|
|
|
2024-01-08 22:52:46 +00:00
|
|
|
suite "Test Poseidon2Tree":
|
2024-10-28 15:52:21 +00:00
|
|
|
proc Poseidon2TreeInit(leaves: seq[Poseidon2Hash]): ?!Poseidon2Tree =
|
|
|
|
waitFor Poseidon2Tree.init(leaves)
|
|
|
|
|
|
|
|
proc Poseidon2TreeInit(leaves: seq[array[31, byte]]): ?!Poseidon2Tree =
|
|
|
|
waitFor Poseidon2Tree.init(leaves)
|
|
|
|
|
2023-12-21 06:41:43 +00:00
|
|
|
var
|
|
|
|
expectedLeaves: seq[Poseidon2Hash]
|
|
|
|
|
|
|
|
setup:
|
|
|
|
expectedLeaves = toSeq( data.concat().elements(Poseidon2Hash) )
|
|
|
|
|
|
|
|
test "Should fail init tree from empty leaves":
|
|
|
|
check:
|
2024-10-28 15:52:21 +00:00
|
|
|
Poseidon2TreeInit( leaves = newSeq[Poseidon2Hash](0) ).isErr
|
2023-12-21 06:41:43 +00:00
|
|
|
|
|
|
|
test "Init tree from poseidon2 leaves":
|
|
|
|
let
|
2024-10-28 15:52:21 +00:00
|
|
|
tree = Poseidon2TreeInit( leaves = expectedLeaves ).tryGet
|
2023-12-21 06:41:43 +00:00
|
|
|
|
|
|
|
check:
|
|
|
|
tree.leaves == expectedLeaves
|
|
|
|
|
|
|
|
test "Init tree from byte leaves":
|
|
|
|
let
|
2024-10-28 15:52:21 +00:00
|
|
|
tree = Poseidon2TreeInit(
|
2024-01-08 22:52:46 +00:00
|
|
|
leaves = expectedLeaves.mapIt(
|
|
|
|
array[31, byte].initCopyFrom( it.toBytes )
|
2023-12-21 06:41:43 +00:00
|
|
|
)).tryGet
|
|
|
|
|
|
|
|
check:
|
|
|
|
tree.leaves == expectedLeaves
|
|
|
|
|
|
|
|
test "Should build from nodes":
|
|
|
|
let
|
2024-10-28 15:52:21 +00:00
|
|
|
tree = Poseidon2TreeInit(leaves = expectedLeaves).tryGet
|
2023-12-21 06:41:43 +00:00
|
|
|
fromNodes = Poseidon2Tree.fromNodes(
|
|
|
|
nodes = toSeq(tree.nodes),
|
|
|
|
nleaves = tree.leavesCount).tryGet
|
|
|
|
|
|
|
|
check:
|
|
|
|
tree == fromNodes
|
|
|
|
|
|
|
|
let
|
|
|
|
compressor = proc(
|
|
|
|
x, y: Poseidon2Hash,
|
|
|
|
key: PoseidonKeysEnum): Poseidon2Hash {.noSideEffect.} =
|
|
|
|
compress(x, y, key.toKey)
|
|
|
|
|
|
|
|
makeTree = proc(data: seq[Poseidon2Hash]): Poseidon2Tree =
|
2024-10-28 15:52:21 +00:00
|
|
|
(waitFor Poseidon2Tree.init(leaves = data)).tryGet
|
2023-12-21 06:41:43 +00:00
|
|
|
|
|
|
|
testGenericTree(
|
|
|
|
"Poseidon2Tree",
|
|
|
|
toSeq( data.concat().elements(Poseidon2Hash) ),
|
|
|
|
zero,
|
|
|
|
compressor,
|
|
|
|
makeTree)
|