nimbus-eth1/tests/test_aristo/test_merge_proof.nim

158 lines
4.0 KiB
Nim

# Nimbus
# Copyright (c) 2023-2024 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
# http://www.apache.org/licenses/LICENSE-2.0)
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
# http://opensource.org/licenses/MIT)
# at your option. This file may not be copied, modified, or
# distributed except according to those terms.
import
eth/common,
results,
unittest2,
../../nimbus/db/opts,
../../nimbus/db/core_db/backend/aristo_rocksdb,
../../nimbus/db/aristo/[
aristo_check,
aristo_desc,
aristo_init/persistent,
aristo_part,
aristo_part/part_debug,
aristo_tx],
../replay/xcheck,
./test_helpers
const
testRootVid = VertexID(2)
## Need to reconfigure for the test, root ID 1 cannot be deleted as a trie
# ------------------------------------------------------------------------------
# Private helper
# ------------------------------------------------------------------------------
proc innerCleanUp(ps: var PartStateRef) =
if not ps.isNil:
ps.db.finish(eradicate=true)
ps = PartStateRef(nil)
# -----------------------
proc saveToBackend(
tx: var AristoTxRef;
noisy: bool;
debugID: int;
): bool =
var db = tx.to(AristoDbRef)
# Verify context: nesting level must be 2 (i.e. two transactions)
xCheck tx.level == 2
# Commit and hashify the current layer
block:
let rc = tx.commit()
xCheckRc rc.error == 0
block:
let rc = db.txTop()
xCheckRc rc.error == 0
tx = rc.value
# Verify context: nesting level must be 1 (i.e. one transaction)
xCheck tx.level == 1
block:
let rc = db.checkBE()
xCheckRc rc.error == (0,0)
# Commit and save to backend
block:
let rc = tx.commit()
xCheckRc rc.error == 0
block:
let rc = db.txTop()
xCheckErr rc.value.level < 0 # force error
block:
let rc = db.schedStow()
xCheckRc rc.error == 0
# Update layers to original level
tx = db.txBegin().value.to(AristoDbRef).txBegin().value
true
# ------------------------------------------------------------------------------
# Public test function
# ------------------------------------------------------------------------------
proc testMergeProofAndKvpList*(
noisy: bool;
list: openArray[ProofTrieData];
rdbPath: string; # Rocks DB storage directory
idPfx = "";
): bool =
var
ps = PartStateRef(nil)
tx = AristoTxRef(nil)
rootKey: Hash256
defer:
if not ps.isNil:
ps.db.finish(eradicate=true)
for n,w in list:
# Start new database upon request
if w.root != rootKey or w.proof.len == 0:
ps.innerCleanUp()
let db = block:
# New DB with disabled filter slots management
if 0 < rdbPath.len:
let (dbOpts, cfOpts) = DbOptions.init().toRocksDb()
let rc = AristoDbRef.init(RdbBackendRef, rdbPath, dbOpts, cfOpts, [])
xCheckRc rc.error == 0
rc.value()[0]
else:
AristoDbRef.init(MemBackendRef)
ps = PartStateRef.init(db)
# Start transaction (double frame for testing)
tx = ps.db.txBegin().value.to(AristoDbRef).txBegin().value
xCheck tx.isTop()
# Update root
rootKey = w.root
let
db = ps.db
testId = idPfx & "#" & $w.id & "." & $n
if 0 < w.proof.len:
let rc = ps.partPut(w.proof, ForceGenericPayload)
xCheckRc rc.error == 0
block:
let rc = ps.check()
xCheckRc rc.error == (0,0)
for ltp in w.kvpLst:
block:
let rc = ps.partMergeGenericData(
testRootVid, @(ltp.leafTie.path), ltp.payload.rawBlob)
xCheckRc rc.error == 0
block:
let rc = ps.check()
xCheckRc rc.error == (0,0)
block:
let saveBeOk = tx.saveToBackend(noisy=noisy, debugID=n)
xCheck saveBeOk
true
# ------------------------------------------------------------------------------
# End
# ------------------------------------------------------------------------------