mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-09 19:51:47 +00:00
* linter * Add markdown linter * add env * only check markdown * Add token * Update .github/workflows/test-suite.yml * Markdown linter * Exit code * Update script * rename * mdlint * Add an empty line after end of file * Testing disable * add text * update mdlint.sh * ori validator inclusion * Add config yml file * Remove MD041 and fix advanced-datadir file * FIx validator inclusion file conflict * Merge branch 'unstable' into markdown-linter * change files * Merge branch 'markdown-linter' of https://github.com/chong-he/lighthouse into markdown-linter * mdlint * Remove MD025 * Remove MD036 * Remove MD045 * Removr MD001 * Set MD028 to false * Remove MD024 * Remove MD055 * Remove MD029 * Remove MD040 * Set MD040 to false * Set MD033 to false * Set MD013 to false * Rearrange yml file * Update mdlint.sh and test * Test remove fix * Test with fix * Test with space * Fix summary indentation * Test mdlint.sh * Update mdlint.sh * Test * Update * Test fix * Test again * Fix * merge into check-code * Update scripts/mdlint.sh Co-authored-by: Mac L <mjladson@pm.me> * Update scripts/mdlint.sh Co-authored-by: Mac L <mjladson@pm.me> * Remove set -e * Add comment * Merge pull request #7 from chong-he/unstable Merge unstable to markdown branch * mdlint * Merge branch 'unstable' into markdown-linter * mdlint
89 lines
5.5 KiB
Markdown
89 lines
5.5 KiB
Markdown
# Database Configuration
|
||
|
||
Lighthouse uses an efficient "split" database schema, whereby finalized states are stored separately
|
||
from recent, unfinalized states. We refer to the portion of the database storing finalized states as
|
||
the _freezer_ or _cold DB_, and the portion storing recent states as the _hot DB_.
|
||
|
||
In both the hot and cold DBs, full `BeaconState` data structures are only stored periodically, and
|
||
intermediate states are reconstructed by quickly replaying blocks on top of the nearest state. For
|
||
example, to fetch a state at slot 7 the database might fetch a full state from slot 0, and replay
|
||
blocks from slots 1-7 while omitting redundant signature checks and Merkle root calculations. The
|
||
full states upon which blocks are replayed are referred to as _restore points_ in the case of the
|
||
freezer DB, and _epoch boundary states_ in the case of the hot DB.
|
||
|
||
The frequency at which the hot database stores full `BeaconState`s is fixed to one-state-per-epoch
|
||
in order to keep loads of recent states performant. For the freezer DB, the frequency is
|
||
configurable via the `--slots-per-restore-point` CLI flag, which is the topic of the next section.
|
||
|
||
## Freezer DB Space-time Trade-offs
|
||
|
||
Frequent restore points use more disk space but accelerate the loading of historical states.
|
||
Conversely, infrequent restore points use much less space, but cause the loading of historical
|
||
states to slow down dramatically. A lower _slots per restore point_ value (SPRP) corresponds to more
|
||
frequent restore points, while a higher SPRP corresponds to less frequent. The table below shows
|
||
some example values.
|
||
|
||
| Use Case | SPRP | Yearly Disk Usage*| Load Historical State |
|
||
|----------------------------|------|-------------------|-----------------------|
|
||
| Research | 32 | more than 10 TB | 155 ms |
|
||
| Enthusiast (prev. default) | 2048 | hundreds of GB | 10.2 s |
|
||
| Validator only (default) | 8192 | tens of GB | 41 s |
|
||
|
||
*Last update: Dec 2023.
|
||
|
||
As we can see, it's a high-stakes trade-off! The relationships to disk usage and historical state
|
||
load time are both linear – doubling SPRP halves disk usage and doubles load time. The minimum SPRP
|
||
is 32, and the maximum is 8192.
|
||
|
||
The default value is 8192 for databases synced from scratch using Lighthouse v2.2.0 or later, or
|
||
2048 for prior versions. Please see the section on [Defaults](#defaults) below.
|
||
|
||
The values shown in the table are approximate, calculated using a simple heuristic: each
|
||
`BeaconState` consumes around 145MB of disk space, and each block replayed takes around 5ms. The
|
||
**Yearly Disk Usage** column shows the approximate size of the freezer DB _alone_ (hot DB not included), calculated proportionally using the total freezer database disk usage.
|
||
The **Load Historical State** time is the worst-case load time for a state in the last slot
|
||
before a restore point.
|
||
|
||
To run a full archival node with fast access to beacon states and a SPRP of 32, the disk usage will be more than 10 TB per year, which is impractical for many users. As such, users may consider running the [tree-states](https://github.com/sigp/lighthouse/releases/tag/v5.0.111-exp) release, which only uses less than 200 GB for a full archival node. The caveat is that it is currently experimental and in alpha release (as of Dec 2023), thus not recommended for running mainnet validators. Nevertheless, it is suitable to be used for analysis purposes, and if you encounter any issues in tree-states, we do appreciate any feedback. We plan to have a stable release of tree-states in 1H 2024.
|
||
|
||
### Defaults
|
||
|
||
As of Lighthouse v2.2.0, the default slots-per-restore-point value has been increased from 2048
|
||
to 8192 in order to conserve disk space. Existing nodes will continue to use SPRP=2048 unless
|
||
re-synced. Note that it is currently not possible to change the SPRP without re-syncing, although
|
||
fast re-syncing may be achieved with [Checkpoint Sync](./checkpoint-sync.md).
|
||
|
||
### CLI Configuration
|
||
|
||
To configure your Lighthouse node's database with a non-default SPRP, run your Beacon Node with
|
||
the `--slots-per-restore-point` flag:
|
||
|
||
```bash
|
||
lighthouse beacon_node --slots-per-restore-point 32
|
||
```
|
||
|
||
### Historic state cache
|
||
|
||
Lighthouse includes a cache to avoid repeatedly replaying blocks when loading historic states. Lighthouse will cache a limited number of reconstructed states and will re-use them when serving requests for subsequent states at higher slots. This greatly reduces the cost of requesting several states in order, and we recommend that applications like block explorers take advantage of this cache.
|
||
|
||
The historical state cache size can be specified with the flag `--historic-state-cache-size` (default value is 1):
|
||
|
||
```bash
|
||
lighthouse beacon_node --historic-state-cache-size 4
|
||
```
|
||
|
||
> Note: This feature will cause high memory usage.
|
||
|
||
## Glossary
|
||
|
||
* _Freezer DB_: part of the database storing finalized states. States are stored in a sparser
|
||
format, and usually less frequently than in the hot DB.
|
||
* _Cold DB_: see _Freezer DB_.
|
||
* _Hot DB_: part of the database storing recent states, all blocks, and other runtime data. Full
|
||
states are stored every epoch.
|
||
* _Restore Point_: a full `BeaconState` stored periodically in the freezer DB.
|
||
* _Slots Per Restore Point (SPRP)_: the number of slots between restore points in the freezer DB.
|
||
* _Split Slot_: the slot at which states are divided between the hot and the cold DBs. All states
|
||
from slots less than the split slot are in the freezer, while all states with slots greater than
|
||
or equal to the split slot are in the hot DB.
|