feat: tests added for insertion correctness + commitment caching
This commit is contained in:
parent
13e8f65a93
commit
17f52bbfc0
|
@ -29,6 +29,9 @@ proc run(args, path: string) =
|
||||||
if (NimMajor, NimMinor) > (1, 6):
|
if (NimMajor, NimMinor) > (1, 6):
|
||||||
build args & " --mm:refc -r", path
|
build args & " --mm:refc -r", path
|
||||||
|
|
||||||
task test, "Run all tests":
|
task testAll, "Run all tests":
|
||||||
for threads in ["--threads:off", "--threads:on"]:
|
for threads in ["--threads:off", "--threads:on"]:
|
||||||
run threads, "tests/test_all"
|
run threads, "tests/test_all"
|
||||||
|
|
||||||
|
task testTree, "Run Tree Tests":
|
||||||
|
run "", "tests/test_tree"
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
# Nimbus
|
||||||
|
# Copyright (c) 2021-2023 Status Research & Development GmbH
|
||||||
|
# Licensed and distributed under either of
|
||||||
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
||||||
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
||||||
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
|
## The main module. Provides some tests.
|
||||||
|
|
||||||
|
import
|
||||||
|
unittest,
|
||||||
|
../eth_verkle/math,
|
||||||
|
../eth_verkle/tree/[tree, operations, commitment],
|
||||||
|
../constantine/constantine/serialization/codecs
|
||||||
|
|
||||||
|
const
|
||||||
|
testValue = fromHex(
|
||||||
|
Bytes32,
|
||||||
|
"0x0123456789abcdef0123456789abcdef"
|
||||||
|
)
|
||||||
|
zeroKeyTest = fromHex(
|
||||||
|
Bytes32,
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
)
|
||||||
|
oneKeyTest = fromHex(
|
||||||
|
Bytes32,
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000001"
|
||||||
|
)
|
||||||
|
# forkOneKeyTest = fromHex(
|
||||||
|
# Bytes32,
|
||||||
|
# "0x0001000000000000000000000000000000000000000000000000000000000001"
|
||||||
|
# )
|
||||||
|
fourtyKeyTest = fromHex(
|
||||||
|
Bytes32,
|
||||||
|
"0x4000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
)
|
||||||
|
ffx32KeyTest = fromHex(
|
||||||
|
Bytes32,
|
||||||
|
"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
suite "Tree Insertion Tests":
|
||||||
|
|
||||||
|
test "Insertion Into Root":
|
||||||
|
var tree = newBranchesNode()
|
||||||
|
tree.setValue(zeroKeyTest, testValue)
|
||||||
|
check testValue == ((ValuesNode)tree.branches[0]).values[zeroKeyTest[31]][]
|
||||||
|
|
||||||
|
test "Insert Two Leaves":
|
||||||
|
var tree = newBranchesNode()
|
||||||
|
tree.setValue(zeroKeyTest, testValue)
|
||||||
|
tree.setValue(ffx32KeyTest, testValue)
|
||||||
|
check testValue == ((ValuesNode)tree.branches[0]).values[zeroKeyTest[31]][]
|
||||||
|
check testValue == ((ValuesNode)tree.branches[255]).values[255][]
|
||||||
|
|
||||||
|
test "Insert Two Leaves Last Level":
|
||||||
|
var tree = newBranchesNode()
|
||||||
|
tree.setValue(zeroKeyTest, testValue)
|
||||||
|
tree.setValue(oneKeyTest, testValue)
|
||||||
|
check testValue == ((ValuesNode)tree.branches[0]).values[1][]
|
||||||
|
check testValue == ((ValuesNode)tree.branches[0]).values[0][]
|
||||||
|
|
||||||
|
suite "Commitment Tests":
|
||||||
|
|
||||||
|
test "Cached Commitment Test":
|
||||||
|
|
||||||
|
var
|
||||||
|
key1: Bytes32 = fromHex(Bytes32, "0x0105000000000000000000000000000000000000000000000000000000000000")
|
||||||
|
key2: Bytes32 = fromHex(Bytes32, "0x0107000000000000000000000000000000000000000000000000000000000000")
|
||||||
|
key3: Bytes32 = fromHex(Bytes32, "0x0405000000000000000000000000000000000000000000000000000000000000")
|
||||||
|
key4: Bytes32 = fromHex(Bytes32, "0x0407000000000000000000000000000000000000000000000000000000000000")
|
||||||
|
|
||||||
|
var tree = newBranchesNode()
|
||||||
|
|
||||||
|
tree.setValue(key1, fourtyKeyTest)
|
||||||
|
tree.setValue(key2, fourtyKeyTest)
|
||||||
|
tree.setValue(key3, fourtyKeyTest)
|
||||||
|
tree.updateAllCommitments()
|
||||||
|
|
||||||
|
var oldRoot = tree.commitment
|
||||||
|
var oldInternal = ((ValuesNode)tree.branches[4]).commitment
|
||||||
|
|
||||||
|
|
||||||
|
tree.setValue(key4, fourtyKeyTest)
|
||||||
|
tree.updateAllCommitments()
|
||||||
|
|
||||||
|
var newRoot = tree.commitment
|
||||||
|
var newInternal = ((BranchesNode)tree.branches[4]).commitment
|
||||||
|
|
||||||
|
doAssert oldRoot.serializePoint() != newRoot.serializePoint(), "root has stale commitment"
|
||||||
|
doAssert oldInternal.serializePoint() != newInternal.serializePoint(), "internal node has stale commitment"
|
||||||
|
|
||||||
|
# TODO: make the nil check work
|
||||||
|
# doAssert isNil(BranchesNode(tree.branches[1]).commitment), "internal node has mistakenly cleared cached commitment"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue