nimbus-eth1/nimbus/db/ledger/base/validate.nim

69 lines
2.7 KiB
Nim
Raw Normal View History

# Nimbus
Core db update storage root management for sub tries (#1964) * Aristo: Re-phrase `LayerDelta` and `LayerFinal` as object references why: Avoids copying in some cases * Fix copyright header * Aristo: Verify `leafTie.root` function argument for `merge()` proc why: Zero root will lead to inconsistent DB entry * Aristo: Update failure condition for hash labels compiler `hashify()` why: Node need not be rejected as long as links are on the schedule. In that case, `redo[]` is to become `wff.base[]` at a later stage. This amends an earlier fix, part of #1952 by also testing against the target nodes of the `wff.base[]` sets. * Aristo: Add storage root glue record to `hashify()` schedule why: An account leaf node might refer to a non-resolvable storage root ID. Storage root node chains will end up at the storage root. So the link `storage-root->account-leaf` needs an extra item in the schedule. * Aristo: fix error code returned by `fetchPayload()` details: Final error code is implied by the error code form the `hikeUp()` function. * CoreDb: Discard `createOk` argument in API `getRoot()` function why: Not needed for the legacy DB. For the `Arsto` DB, a lazy approach is implemented where a stprage root node is created on-the-fly. * CoreDb: Prevent `$$` logging in some cases why: Logging the function `$$` is not useful when it is used for internal use, i.e. retrieving an an error text for logging. * CoreDb: Add `tryHashFn()` to API for pretty printing why: Pretty printing must not change the hashification status for the `Aristo` DB. So there is an independent API wrapper for getting the node hash which never updated the hashes. * CoreDb: Discard `update` argument in API `hash()` function why: When calling the API function `hash()`, the latest state is always wanted. For a version that uses the current state as-is without checking, the function `tryHash()` was added to the backend. * CoreDb: Update opaque vertex ID objects for the `Aristo` backend why: For `Aristo`, vID objects encapsulate a numeric `VertexID` referencing a vertex (rather than a node hash as used on the legacy backend.) For storage sub-tries, there might be no initial vertex known when the descriptor is created. So opaque vertex ID objects are supported without a valid `VertexID` which will be initalised on-the-fly when the first item is merged. * CoreDb: Add pretty printer for opaque vertex ID objects * Cosmetics, printing profiling data * CoreDb: Fix segfault in `Aristo` backend when creating MPT descriptor why: Missing initialisation error * CoreDb: Allow MPT to inherit shared context on `Aristo` backend why: Creates descriptors with different storage roots for the same shared `Aristo` DB descriptor. * Cosmetics, update diagnostic message items for `Aristo` backend * Fix Copyright year
2024-01-11 19:11:38 +00:00
# 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.
{.push raises: [].}
import
./base_desc
proc validate*(ldg: LedgerRef) =
doAssert ldg.ldgType != LedgerType(0)
Optional accounts cache module for creating genesis (#1897) * Split off `ReadOnlyStateDB` from `AccountStateDB` from `state_db.nim` why: Apart from testing, applications use `ReadOnlyStateDB` as an easy way to access the accounts ledger. This is well supported by the `Aristo` db, but writable mode is only parially supported. The writable AccountStateDB` object for modifying accounts is not used by production code. So, for lecgacy and testing apps, the full support of the previous `AccountStateDB` is now enabled by `import db/state_db/read_write` and the `import db/state_db` provides read-only mode. * Encapsulate `AccountStateDB` as `GenesisLedgerRef` or genesis creation why: `AccountStateDB` has poor support for `Aristo` and is not widely used in favour of `AccountsLedger` (which will be abstracted as `ledger`.) Currently, using other than the `AccountStateDB` ledgers within the `GenesisLedgerRef` wrapper is experimental and test only. Eventually, the wrapper should disappear so that the `Ledger` object (which encapsulates `AccountsCache` and `AccountsLedger`) will prevail. * For the `Ledger`, provide access to raw accounts `MPT` why: This gives to the `CoreDbMptRef` descriptor from the `CoreDb` (which is the legacy version of CoreDxMptRef`.) For the new `ledger` API, the accounts are based on the `CoreDxMAccRef` descriptor which uses a particular sub-system for accounts while legacy applications use the `CoreDbPhkRef` equivalent of the `SecureHexaryTrie`. The only place where this feature will currently be used is the `genesis.nim` source file. * Fix `Aristo` bugs, missing boundary checks, typos, etc. * Verify root vertex in `MPT` and account constructors why: Was missing so far, in particular the accounts constructor must verify `VertexID(1) * Fix include file
2023-11-20 11:51:43 +00:00
doAssert not ldg.extras.getMptFn.isNil
doAssert not ldg.extras.rawRootHashFn.isNil
doAssert not ldg.methods.accessListFn.isNil
doAssert not ldg.methods.accessList2Fn.isNil
doAssert not ldg.methods.accountExistsFn.isNil
doAssert not ldg.methods.addBalanceFn.isNil
doAssert not ldg.methods.addLogEntryFn.isNil
doAssert not ldg.methods.beginSavepointFn.isNil
doAssert not ldg.methods.clearStorageFn.isNil
doAssert not ldg.methods.clearTransientStorageFn.isNil
doAssert not ldg.methods.collectWitnessDataFn.isNil
doAssert not ldg.methods.commitFn.isNil
doAssert not ldg.methods.deleteAccountFn.isNil
doAssert not ldg.methods.disposeFn.isNil
doAssert not ldg.methods.getAndClearLogEntriesFn.isNil
doAssert not ldg.methods.getBalanceFn.isNil
doAssert not ldg.methods.getCodeFn.isNil
doAssert not ldg.methods.getCodeHashFn.isNil
doAssert not ldg.methods.getCodeSizeFn.isNil
doAssert not ldg.methods.getCommittedStorageFn.isNil
doAssert not ldg.methods.getNonceFn.isNil
doAssert not ldg.methods.getStorageFn.isNil
doAssert not ldg.methods.getStorageRootFn.isNil
doAssert not ldg.methods.getTransientStorageFn.isNil
doAssert not ldg.methods.hasCodeOrNonceFn.isNil
doAssert not ldg.methods.inAccessListFn.isNil
doAssert not ldg.methods.inAccessList2Fn.isNil
doAssert not ldg.methods.incNonceFn.isNil
doAssert not ldg.methods.isDeadAccountFn.isNil
doAssert not ldg.methods.isEmptyAccountFn.isNil
doAssert not ldg.methods.isTopLevelCleanFn.isNil
doAssert not ldg.methods.logEntriesFn.isNil
doAssert not ldg.methods.makeMultiKeysFn.isNil
doAssert not ldg.methods.persistFn.isNil
doAssert not ldg.methods.ripemdSpecialFn.isNil
doAssert not ldg.methods.rollbackFn.isNil
doAssert not ldg.methods.rootHashFn.isNil
doAssert not ldg.methods.safeDisposeFn.isNil
doAssert not ldg.methods.selfDestruct6780Fn.isNil
doAssert not ldg.methods.selfDestructFn.isNil
doAssert not ldg.methods.selfDestructLenFn.isNil
doAssert not ldg.methods.setBalanceFn.isNil
doAssert not ldg.methods.setCodeFn.isNil
doAssert not ldg.methods.setNonceFn.isNil
doAssert not ldg.methods.setStorageFn.isNil
doAssert not ldg.methods.setTransientStorageFn.isNil
doAssert not ldg.methods.subBalanceFn.isNil
# End