2023-10-18 19:27:22 +00:00
|
|
|
# Nimbus
|
2023-11-20 20:22:27 +00:00
|
|
|
# Copyright (c) 2023 Status Research & Development GmbH
|
2023-10-18 19:27:22 +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.
|
|
|
|
|
|
|
|
{.push raises: [].}
|
|
|
|
|
|
|
|
import
|
|
|
|
eth/common,
|
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
|
|
|
../../core_db,
|
2023-10-18 19:27:22 +00:00
|
|
|
../../../../stateless/multi_keys
|
|
|
|
|
|
|
|
# Annotation helpers
|
|
|
|
{.pragma: noRaise, gcsafe, raises: [].}
|
|
|
|
|
|
|
|
type
|
|
|
|
LedgerType* = enum
|
|
|
|
Ooops = 0
|
|
|
|
LegacyAccountsCache,
|
|
|
|
LedgerCache
|
|
|
|
|
|
|
|
LedgerSpRef* = ref object of RootRef
|
|
|
|
## Object for check point or save point
|
|
|
|
|
|
|
|
LedgerRef* = ref object of RootRef
|
|
|
|
## Root object with closures
|
|
|
|
ldgType*: LedgerType ## For debugging
|
2023-10-25 14:03:09 +00:00
|
|
|
trackApi*: bool ## For debugging
|
2023-10-18 19:27:22 +00:00
|
|
|
extras*: LedgerExtras ## Support might go away
|
|
|
|
methods*: LedgerFns
|
|
|
|
|
|
|
|
RawRootHashFn* = proc(): Hash256 {.noRaise.}
|
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
|
|
|
GetMptFn* = proc(): CoreDbMptRef {.noRaise.}
|
2023-10-18 19:27:22 +00:00
|
|
|
|
|
|
|
LedgerExtras* = object
|
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
|
|
|
getMptFn*: GetMptFn
|
2023-10-18 19:27:22 +00:00
|
|
|
rawRootHashFn*: RawRootHashFn
|
|
|
|
|
|
|
|
AccessListFn* = proc(eAddr: EthAddress) {.noRaise.}
|
|
|
|
AccessList2Fn* = proc(eAddr: EthAddress, slot: UInt256) {.noRaise.}
|
|
|
|
AccountExistsFn* = proc(eAddr: EthAddress): bool {.noRaise.}
|
|
|
|
AddBalanceFn* = proc(eAddr: EthAddress, delta: UInt256) {.noRaise.}
|
|
|
|
AddLogEntryFn* = proc(log: Log) {.noRaise.}
|
|
|
|
BeginSavepointFn* = proc(): LedgerSpRef {.noRaise.}
|
|
|
|
ClearStorageFn* = proc(eAddr: EthAddress) {.noRaise.}
|
|
|
|
ClearTransientStorageFn* = proc() {.noRaise.}
|
|
|
|
CollectWitnessDataFn* = proc() {.noRaise.}
|
|
|
|
CommitFn* = proc(sp: LedgerSpRef) {.noRaise.}
|
|
|
|
DeleteAccountFn* = proc(eAddr: EthAddress) {.noRaise.}
|
|
|
|
DisposeFn* = proc(sp: LedgerSpRef) {.noRaise.}
|
|
|
|
GetAndClearLogEntriesFn* = proc(): seq[Log] {.noRaise.}
|
|
|
|
GetBalanceFn* = proc(eAddr: EthAddress): UInt256 {.noRaise.}
|
|
|
|
GetCodeFn* = proc(eAddr: EthAddress): Blob {.noRaise.}
|
|
|
|
GetCodeHashFn* = proc(eAddr: EthAddress): Hash256 {.noRaise.}
|
|
|
|
GetCodeSizeFn* = proc(eAddr: EthAddress): int {.noRaise.}
|
|
|
|
GetCommittedStorageFn* =
|
|
|
|
proc(eAddr: EthAddress, slot: UInt256): UInt256 {.noRaise.}
|
|
|
|
GetNonceFn* = proc(eAddr: EthAddress): AccountNonce {.noRaise.}
|
|
|
|
GetStorageFn* = proc(eAddr: EthAddress, slot: UInt256): UInt256 {.noRaise.}
|
|
|
|
GetStorageRootFn* = proc(eAddr: EthAddress): Hash256 {.noRaise.}
|
|
|
|
GetTransientStorageFn* =
|
|
|
|
proc(eAddr: EthAddress, slot: UInt256): UInt256 {.noRaise.}
|
|
|
|
HasCodeOrNonceFn* = proc(eAddr: EthAddress): bool {.noRaise.}
|
|
|
|
InAccessListFn* = proc(eAddr: EthAddress): bool {.noRaise.}
|
|
|
|
InAccessList2Fn* = proc(eAddr: EthAddress, slot: UInt256): bool {.noRaise.}
|
|
|
|
IncNonceFn* = proc(eAddr: EthAddress) {.noRaise.}
|
|
|
|
IsDeadAccountFn* = proc(eAddr: EthAddress): bool {.noRaise.}
|
|
|
|
IsEmptyAccountFn* = proc(eAddr: EthAddress): bool {.noRaise.}
|
|
|
|
IsTopLevelCleanFn* = proc(): bool {.noRaise.}
|
|
|
|
LogEntriesFn* = proc(): seq[Log] {.noRaise.}
|
|
|
|
MakeMultiKeysFn* = proc(): MultikeysRef {.noRaise.}
|
|
|
|
PersistFn* = proc(clearEmptyAccount: bool, clearCache: bool) {.noRaise.}
|
|
|
|
RipemdSpecialFn* = proc() {.noRaise.}
|
|
|
|
RollbackFn* = proc(sp: LedgerSpRef) {.noRaise.}
|
|
|
|
RootHashFn* = proc(): Hash256 {.noRaise.}
|
|
|
|
SafeDisposeFn* = proc(sp: LedgerSpRef) {.noRaise.}
|
|
|
|
SelfDestructFn* = proc(eAddr: EthAddress) {.noRaise.}
|
|
|
|
SelfDestruct6780Fn* = proc(eAddr: EthAddress) {.noRaise.}
|
|
|
|
SelfDestructLenFn* = proc(): int {.noRaise.}
|
|
|
|
SetBalanceFn* = proc(eAddr: EthAddress, balance: UInt256) {.noRaise.}
|
|
|
|
SetCodeFn* = proc(eAddr: EthAddress, code: Blob) {.noRaise.}
|
|
|
|
SetNonceFn* = proc(eAddr: EthAddress, nonce: AccountNonce) {.noRaise.}
|
|
|
|
SetStorageFn* = proc(eAddr: EthAddress, slot, value: UInt256) {.noRaise.}
|
|
|
|
SetTransientStorageFn* =
|
|
|
|
proc(eAddr: EthAddress, slot, val: UInt256) {.noRaise.}
|
|
|
|
SubBalanceFn* = proc(eAddr: EthAddress, delta: UInt256) {.noRaise.}
|
|
|
|
|
|
|
|
LedgerFns* = object
|
|
|
|
accessListFn*: AccessListFn
|
|
|
|
accessList2Fn*: AccessList2Fn
|
|
|
|
accountExistsFn*: AccountExistsFn
|
|
|
|
addBalanceFn*: AddBalanceFn
|
|
|
|
addLogEntryFn*: AddLogEntryFn
|
|
|
|
beginSavepointFn*: BeginSavepointFn
|
|
|
|
clearStorageFn*: ClearStorageFn
|
|
|
|
clearTransientStorageFn*: ClearTransientStorageFn
|
|
|
|
collectWitnessDataFn*: CollectWitnessDataFn
|
|
|
|
commitFn*: CommitFn
|
|
|
|
deleteAccountFn*: DeleteAccountFn
|
|
|
|
disposeFn*: DisposeFn
|
|
|
|
getAndClearLogEntriesFn*: GetAndClearLogEntriesFn
|
|
|
|
getBalanceFn*: GetBalanceFn
|
|
|
|
getCodeFn*: GetCodeFn
|
|
|
|
getCodeHashFn*: GetCodeHashFn
|
|
|
|
getCodeSizeFn*: GetCodeSizeFn
|
|
|
|
getCommittedStorageFn*: GetCommittedStorageFn
|
|
|
|
getNonceFn*: GetNonceFn
|
|
|
|
getStorageFn*: GetStorageFn
|
|
|
|
getStorageRootFn*: GetStorageRootFn
|
|
|
|
getTransientStorageFn*: GetTransientStorageFn
|
|
|
|
hasCodeOrNonceFn*: HasCodeOrNonceFn
|
|
|
|
inAccessListFn*: InAccessListFn
|
|
|
|
inAccessList2Fn*: InAccessList2Fn
|
|
|
|
incNonceFn*: IncNonceFn
|
|
|
|
isDeadAccountFn*: IsDeadAccountFn
|
|
|
|
isEmptyAccountFn*: IsEmptyAccountFn
|
|
|
|
isTopLevelCleanFn*: IsTopLevelCleanFn
|
|
|
|
logEntriesFn*: LogEntriesFn
|
|
|
|
makeMultiKeysFn*: MakeMultiKeysFn
|
|
|
|
persistFn*: PersistFn
|
|
|
|
ripemdSpecialFn*: RipemdSpecialFn
|
|
|
|
rollbackFn*: RollbackFn
|
|
|
|
rootHashFn*: RootHashFn
|
|
|
|
safeDisposeFn*: SafeDisposeFn
|
|
|
|
selfDestruct6780Fn*: SelfDestruct6780Fn
|
|
|
|
selfDestructFn*: SelfDestructFn
|
|
|
|
selfDestructLenFn*: SelfDestructLenFn
|
|
|
|
setBalanceFn*: SetBalanceFn
|
|
|
|
setCodeFn*: SetCodeFn
|
|
|
|
setNonceFn*: SetNonceFn
|
|
|
|
setStorageFn*: SetStorageFn
|
|
|
|
setTransientStorageFn*: SetTransientStorageFn
|
|
|
|
subBalanceFn*: SubBalanceFn
|
|
|
|
|
|
|
|
# End
|