mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-17 07:41:46 +00:00
2c35390bdf
* Aristo: Update error return code why: Failing of `Aristo` function `delete()` might fail because there is no such data item on the db. This must return a single error code as is done with `fetch()`. * Ledger: Better error handling why: The `expect()` clauses have been replaced by raising asserts indicating the error from the database backend. Also, `delete()` failures are legitimate if the item to delete does not exist. * Aristo: Delete function must always leave a label on DB for `hashify()` why: The `hashify()` uses the labels left bu `merge()` and `delete()` to compile (and optimise) a scheduler for subsequent hashing. Originally, the labels were not used for deleted entries and `delete()` still had some edge case where the deletion label was not properly handled. * Aristo: Update `hashify()` scheduler, remove buggy optimisation why: Was left over from version without virtual state roots which did not know about account payload leaf vertices referring to storage roots. * Aristo: Label storage trie account in `delete()` similar to `merge()` details; The `delete()` function applied to a non-static state root (assumed to be a storage root) will check the payload of an accounts leaf and mark its Merkle keys to be re-checked when runninh `hashify()` * Aristo: Clean up and re-org recycled vertex IDs in `hashify()` why: Re-organising the recycled vertex IDs list intends to reduce the size of the list. This list is organised as a LIFO (or stack.) By reorganising it in a way so that the least vertex ID numbers are on top, the list will be kept smaller as observed on some examples (less than 30%.) * CoreDb: Accept storage trie deletion requests in non-initialised state why: Due to lazy initialisation, the root vertex ID might not yet exist. So the `Aristo` database handlers would reject this call with an error and this condition needs to be handled by the API (which realises the lazy feature.) * Cosmetics & code massage, prettify logging * fix missing import
84 lines
2.6 KiB
Nim
84 lines
2.6 KiB
Nim
# nimbus-eth1
|
|
# 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.
|
|
|
|
## Aristo DB -- Obects Retrival Via Traversal Path
|
|
## ===============================================
|
|
##
|
|
{.push raises: [].}
|
|
|
|
import
|
|
eth/trie/nibbles,
|
|
results,
|
|
"."/[aristo_desc, aristo_hike]
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Private functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc fetchPayloadImpl(
|
|
rc: Result[Hike,(VertexID,AristoError,Hike)];
|
|
): Result[PayloadRef,(VertexID,AristoError)] =
|
|
if rc.isErr:
|
|
if rc.error[1] in HikeAcceptableStopsNotFound:
|
|
return err((rc.error[0], FetchPathNotFound))
|
|
return err((rc.error[0], rc.error[1]))
|
|
ok rc.value.legs[^1].wp.vtx.lData
|
|
|
|
proc fetchPayloadImpl(
|
|
db: AristoDbRef;
|
|
root: VertexID;
|
|
path: openArray[byte];
|
|
): Result[PayloadRef,(VertexID,AristoError)] =
|
|
path.initNibbleRange.hikeUp(root, db).fetchPayloadImpl
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Public functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc fetchPayload*(
|
|
db: AristoDbRef;
|
|
key: LeafTie;
|
|
): Result[PayloadRef,(VertexID,AristoError)] =
|
|
## Cascaded attempt to traverse the `Aristo Trie` and fetch the value of a
|
|
## leaf vertex. This function is complementary to `merge()`.
|
|
##
|
|
key.hikeUp(db).fetchPayloadImpl
|
|
|
|
proc fetchPayload*(
|
|
db: AristoDbRef;
|
|
root: VertexID;
|
|
path: openArray[byte];
|
|
): Result[PayloadRef,(VertexID,AristoError)] =
|
|
## Variant of `fetchPayload()`
|
|
##
|
|
if path.len == 0:
|
|
return err((VertexID(0),LeafKeyInvalid))
|
|
db.fetchPayloadImpl(root, path)
|
|
|
|
proc hasPath*(
|
|
db: AristoDbRef; # Database
|
|
root: VertexID;
|
|
path: openArray[byte]; # Key of database record
|
|
): Result[bool,(VertexID,AristoError)] =
|
|
## Variant of `fetchPayload()`
|
|
##
|
|
if path.len == 0:
|
|
return err((VertexID(0),LeafKeyInvalid))
|
|
let rc = db.fetchPayloadImpl(root, path)
|
|
if rc.isOk:
|
|
return ok(true)
|
|
if rc.error[1] == FetchPathNotFound:
|
|
return ok(false)
|
|
err(rc.error)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# End
|
|
# ------------------------------------------------------------------------------
|