2023-11-01 03:32:09 +00:00
|
|
|
# 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
|
2023-11-01 03:32:09 +00:00
|
|
|
# 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.
|
|
|
|
|
2023-10-18 19:27:22 +00:00
|
|
|
# The point of this file is just to give a little more type-safety
|
|
|
|
# and clarity to our use of SecureHexaryTrie, by having distinct
|
|
|
|
# types for the big trie containing all the accounts and the little
|
|
|
|
# tries containing the storage for an individual account.
|
|
|
|
#
|
|
|
|
# It's nice to have all the accesses go through "getAccountBytes"
|
|
|
|
# rather than just "get" (which is hard to search for). Plus we
|
|
|
|
# may want to put in assertions to make sure that the nodes for
|
|
|
|
# the account are all present (in stateless mode), etc.
|
|
|
|
|
|
|
|
{.push raises: [].}
|
|
|
|
|
2023-10-25 14:03:09 +00:00
|
|
|
## Re-write of `distinct_tries.nim` to be imported into `accounts_ledger.nim`
|
2023-10-18 19:27:22 +00:00
|
|
|
## for using new database API.
|
|
|
|
##
|
|
|
|
|
|
|
|
import
|
2023-10-25 14:03:09 +00:00
|
|
|
std/[algorithm, sequtils, strutils, tables, typetraits],
|
|
|
|
chronicles,
|
2023-10-18 19:27:22 +00:00
|
|
|
eth/common,
|
|
|
|
results,
|
2023-10-25 14:03:09 +00:00
|
|
|
".."/[core_db, storage_types]
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
AccountLedger* = distinct CoreDxAccRef
|
|
|
|
StorageLedger* = distinct CoreDxPhkRef
|
|
|
|
SomeLedger* = AccountLedger | StorageLedger
|
|
|
|
|
2024-04-03 15:48:35 +00:00
|
|
|
const
|
|
|
|
EnableMptDump = false # or true
|
|
|
|
## Provide database dumper. Note that the dump function needs to link
|
|
|
|
## against the `rocksdb` library. The# dependency lies in import of
|
|
|
|
## `aristo_debug`.
|
|
|
|
|
2023-10-25 14:03:09 +00:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Public debugging helpers
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
proc toSvp*(sl: StorageLedger): seq[(UInt256,UInt256)] =
|
|
|
|
## Dump as slot id-value pair sequence
|
|
|
|
let
|
|
|
|
db = sl.distinctBase.parent
|
|
|
|
save = db.trackNewApi
|
|
|
|
db.trackNewApi = false
|
|
|
|
defer: db.trackNewApi = save
|
|
|
|
let kvt = db.newKvt
|
|
|
|
var kvp: Table[UInt256,UInt256]
|
|
|
|
try:
|
|
|
|
for (slotHash,val) in sl.distinctBase.toMpt.pairs:
|
|
|
|
let rc = kvt.get(slotHashToSlotKey(slotHash).toOpenArray)
|
|
|
|
if rc.isErr:
|
|
|
|
warn "StorageLedger.dump()", slotHash, error=($$rc.error)
|
|
|
|
else:
|
|
|
|
kvp[rlp.decode(rc.value,UInt256)] = rlp.decode(val,UInt256)
|
|
|
|
except CatchableError as e:
|
|
|
|
raiseAssert "Ooops(" & $e.name & "): " & e.msg
|
|
|
|
kvp.keys.toSeq.sorted.mapIt((it,kvp.getOrDefault(it,high UInt256)))
|
|
|
|
|
|
|
|
proc toStr*(w: seq[(UInt256,UInt256)]): string =
|
|
|
|
"[" & w.mapIt("(" & it[0].toHex & "," & it[1].toHex & ")").join(", ") & "]"
|
|
|
|
|
2024-04-03 15:48:35 +00:00
|
|
|
when EnableMptDump:
|
|
|
|
import
|
|
|
|
eth/trie,
|
|
|
|
stew/byteutils,
|
|
|
|
../aristo,
|
|
|
|
../aristo/aristo_debug
|
|
|
|
|
|
|
|
proc dump*(led: SomeLedger): string =
|
|
|
|
## Dump database (beware of large backend)
|
|
|
|
let db = led.distinctBase.parent
|
|
|
|
if db.dbType notin CoreDbPersistentTypes:
|
|
|
|
# Memory based storage only
|
|
|
|
let be = led.distinctBase.backend
|
|
|
|
|
|
|
|
if db.isAristo:
|
|
|
|
let adb = be.toAristo()
|
|
|
|
if not adb.isNil:
|
|
|
|
return adb.pp(kMapOk=false,backendOK=true)
|
|
|
|
|
|
|
|
# Oops
|
|
|
|
"<" & $db.dbType & ">"
|
|
|
|
|
2023-10-25 14:03:09 +00:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Public helpers
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
2024-02-20 03:07:38 +00:00
|
|
|
proc db*(led: SomeLedger): CoreDbRef =
|
|
|
|
led.distinctBase.parent
|
2023-10-18 19:27:22 +00:00
|
|
|
|
2024-04-19 18:37:27 +00:00
|
|
|
proc state*(led: SomeLedger): Hash256 =
|
2024-03-22 17:31:56 +00:00
|
|
|
when SomeLedger is AccountLedger:
|
2024-04-19 18:37:27 +00:00
|
|
|
const info = "AccountLedger/state(): "
|
2024-03-22 17:31:56 +00:00
|
|
|
else:
|
2024-04-19 18:37:27 +00:00
|
|
|
const info = "StorageLedger/state(): "
|
|
|
|
let rc = led.distinctBase.getColumn().state()
|
2024-02-08 16:32:16 +00:00
|
|
|
if rc.isErr:
|
|
|
|
raiseAssert info & $$rc.error
|
|
|
|
rc.value
|
2023-10-18 19:27:22 +00:00
|
|
|
|
2024-04-19 18:37:27 +00:00
|
|
|
proc getColumn*(led: SomeLedger): CoreDbColRef =
|
|
|
|
led.distinctBase.getColumn()
|
2023-10-18 19:27:22 +00:00
|
|
|
|
2023-10-25 14:03:09 +00:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Public functions: accounts ledger
|
|
|
|
# ------------------------------------------------------------------------------
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc init*(
|
|
|
|
T: type AccountLedger;
|
|
|
|
db: CoreDbRef;
|
2024-02-02 20:23:04 +00:00
|
|
|
root: Hash256;
|
|
|
|
pruneOk = true;
|
2023-10-18 19:27:22 +00:00
|
|
|
): T =
|
2024-03-22 17:31:56 +00:00
|
|
|
const
|
|
|
|
info = "AccountLedger.init(): "
|
|
|
|
let
|
|
|
|
ctx = db.ctx
|
|
|
|
trie = block:
|
2024-04-19 18:37:27 +00:00
|
|
|
let rc = ctx.newColumn(CtAccounts, root)
|
2024-03-22 17:31:56 +00:00
|
|
|
if rc.isErr:
|
|
|
|
raiseAssert info & $$rc.error
|
|
|
|
rc.value
|
|
|
|
mpt = block:
|
|
|
|
let rc = ctx.getAcc(trie)
|
|
|
|
if rc.isErr:
|
|
|
|
raiseAssert info & $$rc.error
|
|
|
|
rc.value
|
|
|
|
mpt.T
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc fetch*(al: AccountLedger; eAddr: EthAddress): Result[CoreDbAccount,void] =
|
|
|
|
## Using `fetch()` for trie data retrieval
|
2024-02-08 16:32:16 +00:00
|
|
|
let rc = al.distinctBase.fetch(eAddr)
|
|
|
|
if rc.isErr:
|
|
|
|
return err()
|
|
|
|
ok rc.value
|
2023-10-18 19:27:22 +00:00
|
|
|
|
2024-02-02 20:23:04 +00:00
|
|
|
proc merge*(al: AccountLedger; account: CoreDbAccount) =
|
2023-10-18 19:27:22 +00:00
|
|
|
## Using `merge()` for trie data storage
|
2024-02-08 16:32:16 +00:00
|
|
|
const info = "AccountLedger/merge(): "
|
|
|
|
al.distinctBase.merge(account).isOkOr:
|
|
|
|
raiseAssert info & $$error
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc delete*(al: AccountLedger, eAddr: EthAddress) =
|
2024-02-08 16:32:16 +00:00
|
|
|
const info = "AccountLedger/delete()"
|
2024-02-12 19:37:00 +00:00
|
|
|
# Flush associated storage trie
|
|
|
|
al.distinctBase.stoFlush(eAddr).isOkOr:
|
|
|
|
raiseAssert info & $$error
|
|
|
|
# Clear account
|
2024-02-08 16:32:16 +00:00
|
|
|
al.distinctBase.delete(eAddr).isOkOr:
|
|
|
|
if error.error == MptNotFound:
|
|
|
|
return
|
|
|
|
raiseAssert info & $$error
|
2023-10-18 19:27:22 +00:00
|
|
|
|
2023-10-25 14:03:09 +00:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Public functions: storage ledger
|
|
|
|
# ------------------------------------------------------------------------------
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc init*(
|
|
|
|
T: type StorageLedger;
|
|
|
|
al: AccountLedger;
|
|
|
|
account: CoreDbAccount;
|
2024-02-02 20:23:04 +00:00
|
|
|
reHashOk = true;
|
|
|
|
pruneOk = false;
|
2023-10-18 19:27:22 +00:00
|
|
|
): T =
|
2023-10-25 14:03:09 +00:00
|
|
|
## Storage trie constructor.
|
|
|
|
##
|
2024-02-02 20:23:04 +00:00
|
|
|
## Note that the argument `pruneOk` should be left `false` on the legacy
|
2023-10-25 14:03:09 +00:00
|
|
|
## `CoreDb` backend. Otherwise, pruning might kill some unwanted entries from
|
|
|
|
## storage tries ending up with an unstable database leading to crashes (see
|
|
|
|
## https://github.com/status-im/nimbus-eth1/issues/932.)
|
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
|
|
|
const
|
|
|
|
info = "StorageLedger/init(): "
|
|
|
|
let
|
2024-02-02 20:23:04 +00:00
|
|
|
db = al.distinctBase.parent
|
2024-04-19 18:37:27 +00:00
|
|
|
stt = account.storage
|
2024-02-02 20:23:04 +00:00
|
|
|
if not stt.isNil and reHashOk:
|
2024-04-19 18:37:27 +00:00
|
|
|
let rc = al.distinctBase.getColumn.state()
|
2024-02-02 20:23:04 +00:00
|
|
|
if rc.isErr:
|
|
|
|
raiseAssert "re-hash oops, error=" & $$rc.error
|
|
|
|
let
|
2024-03-18 19:40:23 +00:00
|
|
|
ctx = db.ctx
|
2024-04-19 18:37:27 +00:00
|
|
|
trie = if stt.isNil: ctx.newColumn(account.address) else: stt
|
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
|
|
|
mpt = block:
|
2024-03-18 19:40:23 +00:00
|
|
|
let rc = ctx.getMpt(trie, pruneOk)
|
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
|
|
|
if rc.isErr:
|
|
|
|
raiseAssert info & $$rc.error
|
|
|
|
rc.value
|
|
|
|
mpt.toPhk.T
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc fetch*(sl: StorageLedger, slot: UInt256): Result[Blob,void] =
|
2024-05-24 09:27:17 +00:00
|
|
|
var rc = sl.distinctBase.fetch(slot.toBytesBE)
|
2024-02-08 16:32:16 +00:00
|
|
|
if rc.isErr:
|
|
|
|
return err()
|
2024-05-24 09:27:17 +00:00
|
|
|
ok move(rc.value)
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc merge*(sl: StorageLedger, slot: UInt256, value: openArray[byte]) =
|
2024-02-08 16:32:16 +00:00
|
|
|
const info = "StorageLedger/merge(): "
|
|
|
|
sl.distinctBase.merge(slot.toBytesBE, value).isOkOr:
|
|
|
|
raiseAssert info & $$error
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
proc delete*(sl: StorageLedger, slot: UInt256) =
|
2024-02-08 16:32:16 +00:00
|
|
|
const info = "StorageLedger/delete(): "
|
|
|
|
sl.distinctBase.delete(slot.toBytesBE).isOkOr:
|
|
|
|
if error.error == MptNotFound:
|
|
|
|
return
|
|
|
|
raiseAssert info & $$error
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
iterator storage*(
|
|
|
|
al: AccountLedger;
|
|
|
|
account: CoreDbAccount;
|
2024-05-20 10:17:51 +00:00
|
|
|
): (Blob,Blob) =
|
2023-10-18 19:27:22 +00:00
|
|
|
## For given account, iterate over storage slots
|
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
|
|
|
const
|
|
|
|
info = "storage(): "
|
2024-04-19 18:37:27 +00:00
|
|
|
let col = account.storage
|
|
|
|
if not col.isNil:
|
|
|
|
let mpt = al.distinctBase.parent.ctx.getMpt(col).valueOr:
|
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
|
|
|
raiseAssert info & $$error
|
2024-02-02 20:23:04 +00:00
|
|
|
for (key,val) in mpt.pairs:
|
|
|
|
yield (key,val)
|
2023-10-18 19:27:22 +00:00
|
|
|
|
2023-10-25 14:03:09 +00:00
|
|
|
# ------------------------------------------------------------------------------
|
2023-10-18 19:27:22 +00:00
|
|
|
# End
|
2023-10-25 14:03:09 +00:00
|
|
|
# ------------------------------------------------------------------------------
|