mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-02-25 18:35:32 +00:00
* Nimbus folder environment update details: * Integrated `CoreDbRef` for the sources in the `nimbus` sub-folder. * The `nimbus` program does not compile yet as it needs the updates in the parallel `stateless` sub-folder. * Stateless environment update details: * Integrated `CoreDbRef` for the sources in the `stateless` sub-folder. * The `nimbus` program compiles now. * Premix environment update details: * Integrated `CoreDbRef` for the sources in the `premix` sub-folder. * Fluffy environment update details: * Integrated `CoreDbRef` for the sources in the `fluffy` sub-folder. * Tools environment update details: * Integrated `CoreDbRef` for the sources in the `tools` sub-folder. * Nodocker environment update details: * Integrated `CoreDbRef` for the sources in the `hive_integration/nodocker` sub-folder. * Tests environment update details: * Integrated `CoreDbRef` for the sources in the `tests` sub-folder. * The unit tests compile and run cleanly now. * Generalise `CoreDbRef` to any `select_backend` supported database why: Generalisation was just missed due to overcoming some compiler oddity which was tied to rocksdb for testing. * Suppress compiler warning for `newChainDB()` why: Warning was added to this function which must be wrapped so that any `CatchableError` is re-raised as `Defect`. * Split off persistent `CoreDbRef` constructor into separate file why: This allows to compile a memory only database version without linking the backend library. * Use memory `CoreDbRef` database by default detail: Persistent DB constructor needs to import `db/core_db/persistent why: Most tests use memory DB anyway. This avoids linking `-lrocksdb` or any other backend by default. * fix `toLegacyBackend()` availability check why: got garbled after memory/persistent split. * Clarify raw access to MPT for snap sync handler why: Logically, `kvt` is not the raw access for the hexary trie (although this holds for the legacy database)
111 lines
3.6 KiB
Nim
111 lines
3.6 KiB
Nim
# nimbus-eth1
|
|
# Copyright (c) 2021 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
|
|
chronicles,
|
|
eth/[common, p2p],
|
|
../../range_desc,
|
|
"."/[hexary_desc, hexary_error, snapdb_desc, snapdb_persistent]
|
|
|
|
logScope:
|
|
topics = "snap-db"
|
|
|
|
type
|
|
SnapDbContractsRef* = ref object of SnapDbBaseRef
|
|
peer: Peer ## For log messages
|
|
|
|
const
|
|
extraTraceMessages = false or true
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Private helpers
|
|
# ------------------------------------------------------------------------------
|
|
|
|
template noExceptionOops(info: static[string]; code: untyped) =
|
|
try:
|
|
code
|
|
except CatchableError as e:
|
|
raiseAssert "Not possible -- " & info & ": " & e.msg
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Private functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc persistentContracts(
|
|
ps: SnapDbContractsRef; ## Base descriptor on `CoreDbRef`
|
|
data: seq[(NodeKey,Blob)]; ## Contract code items
|
|
): Result[void,HexaryError]
|
|
{.gcsafe, raises: [OSError,IOError,KeyError].} =
|
|
## Store contract codes onto permanent database
|
|
if ps.rockDb.isNil:
|
|
let rc = data.persistentContractPut ps.kvDb
|
|
if rc.isErr:
|
|
return rc
|
|
else:
|
|
let rc = data.persistentContractPut ps.rockDb
|
|
if rc.isErr:
|
|
return rc
|
|
ok()
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Public constructor
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc init*(
|
|
T: type SnapDbContractsRef;
|
|
pv: SnapDbRef;
|
|
peer: Peer = nil
|
|
): T =
|
|
## Constructor, starts a new accounts session.
|
|
new result
|
|
result.init(pv, NodeKey.default)
|
|
result.peer = peer
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Public functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc getContractsFn*(desc: SnapDbBaseRef|SnapDbRef): HexaryGetFn =
|
|
## Return `HexaryGetFn` closure.
|
|
let getFn = desc.kvDb.persistentContractsGetFn()
|
|
return proc(key: openArray[byte]): Blob = getFn(key)
|
|
|
|
|
|
proc importContracts*(
|
|
ps: SnapDbContractsRef; ## Re-usable session descriptor
|
|
data: seq[(NodeKey,Blob)]; ## Contract code items
|
|
): Result[void,HexaryError] =
|
|
## Store contract codes onto permanent database
|
|
try:
|
|
result = ps.persistentContracts data
|
|
except RlpError:
|
|
return err(RlpEncoding)
|
|
except KeyError as e:
|
|
raiseAssert "Not possible @ importAccounts(KeyError): " & e.msg
|
|
except OSError as e:
|
|
error "Import Accounts exception", peer=ps.peer, name=($e.name), msg=e.msg
|
|
return err(OSErrorException)
|
|
except CatchableError as e:
|
|
raiseAssert "Not possible @ importAccounts(" & $e.name & "):" & e.msg
|
|
|
|
proc importContracts*(
|
|
pv: SnapDbRef; ## Base descriptor on `CoreDbRef`
|
|
peer: Peer; ## For log messages
|
|
data: seq[(NodeKey,Blob)]; ## Contract code items
|
|
): Result[void,HexaryError] =
|
|
## Variant of `importAccounts()` for presistent storage, only.
|
|
SnapDbContractsRef.init(pv, peer).importContracts(data)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# End
|
|
# ------------------------------------------------------------------------------
|