Nimbus-eth1 -- Ethereum execution layer database architecture ============================================================= Last update: 2024-03-08 The following diagram gives a simplified view how components relate with regards to the data storage management. An arrow between components **a** and **b** (as in *a->b*) is meant to be read as **a** relies directly on **b**, or **a** is served by **b**. For classifying the functional type of a component in the below diagram, the abstraction type is enclosed in brackets after the name of a component. * *(application)*
This is a group of software modules at the top level of the hierarchy. In the diagram below, the **EVM** is used as an example. Another application might be the **RPC** service. * *(API)*
The *API* classification is used for a thin software layer hiding a set of different drivers where only one driver is active for the same *API* instance. It servers as sort of a logical switch. * *(concentrator)*
The *concentrator* merges several sub-module instances and provides their collected services as a single unified instance. There is not much additional logic implemented besides what the sub-modules provide. * *(driver)*
The *driver* instances are sort of the lower layer workhorses. The implement logic for solving a particular problem, providing a typically well defined service, etc. * *(engine)*
This is a bottom level *driver* in the below diagram. +-------------------+ | EVM (application) | +-------------------+ | | v | +-------------------------+ | | State DB (concentrator) | | +-------------------------+ | | | | | v | | | +----------------------------+ | | | | Ledger (API) | | | | +----------------------------+ | | | | | | | | v v | | | +--------------+ +--------------+ | | | | legacy cache | | ledger cache | | | | | (driver) | | (driver) | | | | +--------------+ +--------------+ | | | | | v | | | | +----------------+ | | | | | Common | | | | | | (concentrator) | | | | | +----------------+ | | | | | | | v v v v v +---------------------------------------------------------------------+ | Core DB (API) | +---------------------------------------------------------------------+ | | v v +--------------------------+ +--------------------------------------+ | legacy DB (concentrator) | | Aristo DB (driver,concentrator) | +--------------------------+ +--------------------------------------+ | | | | v | v v +--------------------+ | +--------------+ +---------------------+ | Hexary DB (driver) | | | Kvt (driver) | | Aristo MPT (driver) | +--------------------+ | +--------------+ +---------------------+ | | | | v v | | +--------------------------+ | | | Key-value table (driver) | | | +--------------------------+ | | | | | v v v +---------------------------------------------------------------------+ | Rocks DB (engine) | +---------------------------------------------------------------------+ Here is a list of path references for the components with some explanation. The sources for the components are not always complete but indicate the main locations where to start looking at. * *Aristo DB (driver)* + Sources:
./nimbus/db/core_db/backend/aristo_*
+ Synopsis:
Combines both, the *Kvt* and the *Aristo* driver sub-modules providing an interface similar to the [legacy DB (concentrator)](#ldc) module. * *Aristo MPT (driver)* + Sources:
./nimbus/db/aristo* + Synopsis:
Revamped implementation of a hexary *Merkle Patricia Tree*. * *Common (concentrator)* * Sources:
./nimbus/common*
* Synopsis:
Collected information for running block chain execution layer applications. * *Core DB (API)* * Sources:
./nimbus/db/core_db* * Synopsis:
Database abstraction layer. Unless for legacy applications, there should be no need to reach out to the layers below. * *EVM (application)* + Sources:
./nimbus/core/executor/* ./nimbus/evm/* + Synopsis:
An implementation of the *Ethereum Virtual Machine*. * *Hexary DB (driver)* + Sources:
./vendor/nim-eth/eth/trie/hexary.nim
+ Synopsis:
Implementation of an MPT, see [compact Merkle Patricia Tree](http://archive.is/TinyK). * *Key-value table (driver)* + Sources:
./vendor/nim-eth/eth/trie/db.nim
+ Synopsis:
Key value table interface to be used directly for key-value storage or by the [Hexary DB (driver)](#hdd) module for storage. Some magic is applied in order to treat hexary data accordingly (based on key length.) * *Kvt (driver)* + Sources:
./nimbus/db/kvt* + Synopsis:
Key value table interface for the [Aristo DB (driver)](#add) module. Contrary to the [Key-value table (driver)](#kvtd), it is not used for MPT data. * *Ledger (API)* + Sources:
./nimbus/db/ledger* + Synopsis:
Abstraction layer for either the [legacy cache (driver)](#lgcd) accounts cache (which works with the [legacy DB (driver)](#ldd) backend only) or the [ledger cache (driver)](#ldcd) re-write which is supposed to work with all [Core DB (API)](#cda) backends. * *ledger cache (driver)* + Sources:
./nimbus/db/ledger/accounts_ledger.nim
./nimbus/db/ledger/backend/accounts_ledger*
./nimbus/db/ledger/distinct_ledgers.nim + Synopsis:
Management of accounts and storage data. This is a re-write of the [legacy DB (driver)](#lgdd) which is supposed to work with all [Core DB (API)](#cda) backends. * *legacy cache (driver)* + Sources:
./nimbus/db/distinct_tries.nim
./nimbus/db/ledger/accounts_cache.nim
./nimbus/db/ledger/backend/accounts_cache* + Synopsis:
Management of accounts and storage data. It works only for the legacy driver of the [Core DB (API)](#cda) backend. * *legacy DB (concentrator)* + Sources:
./nimbus/db/core_db/backend/legacy_* + Synopsis:
Legacy database abstraction. It mostly forwards requests directly to the to the [Key-value table (driver)](#kvtd) and/or the [hexary DB (driver)](#hdd). * *Rocks DB (engine)* + Sources:
./vendor/nim-rocksdb/* + Synopsis:
Persistent storage engine. * *State DB (concentrator)* + Sources:
./nimbus/evm/state.nim
./nimbus/evm/types.nim + Synopsis:
Integrated collection of modules and methods relevant for the EVM.