2018-05-07 14:35:06 +03:00
|
|
|
// Copyright 2018 The go-ethereum Authors
|
|
|
|
// This file is part of the go-ethereum library.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package rawdb
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
2022-07-05 11:14:21 +08:00
|
|
|
"math/big"
|
2020-12-11 15:56:00 +01:00
|
|
|
"time"
|
2018-05-07 14:35:06 +03:00
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2018-09-24 15:57:49 +03:00
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
2018-05-07 14:35:06 +03:00
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
|
|
|
)
|
|
|
|
|
2022-07-05 11:14:21 +08:00
|
|
|
// FreezerType enumerator
|
|
|
|
const (
|
|
|
|
EntireFreezerType uint64 = iota // classic ancient type
|
|
|
|
PruneFreezerType // prune ancient type
|
|
|
|
)
|
|
|
|
|
2018-05-07 14:35:06 +03:00
|
|
|
// ReadDatabaseVersion retrieves the version number of the database.
|
all: integrate the freezer with fast sync
* all: freezer style syncing
core, eth, les, light: clean up freezer relative APIs
core, eth, les, trie, ethdb, light: clean a bit
core, eth, les, light: add unit tests
core, light: rewrite setHead function
core, eth: fix downloader unit tests
core: add receipt chain insertion test
core: use constant instead of hardcoding table name
core: fix rollback
core: fix setHead
core/rawdb: remove canonical block first and then iterate side chain
core/rawdb, ethdb: add hasAncient interface
eth/downloader: calculate ancient limit via cht first
core, eth, ethdb: lots of fixes
* eth/downloader: print ancient disable log only for fast sync
2019-04-25 22:59:48 +08:00
|
|
|
func ReadDatabaseVersion(db ethdb.KeyValueReader) *uint64 {
|
2019-01-11 19:49:12 +08:00
|
|
|
var version uint64
|
2018-05-07 14:35:06 +03:00
|
|
|
|
2020-12-11 15:56:00 +01:00
|
|
|
enc, _ := db.Get(databaseVersionKey)
|
2019-01-11 19:49:12 +08:00
|
|
|
if len(enc) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if err := rlp.DecodeBytes(enc, &version); err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
2018-05-07 14:35:06 +03:00
|
|
|
|
2019-01-11 19:49:12 +08:00
|
|
|
return &version
|
2018-05-07 14:35:06 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// WriteDatabaseVersion stores the version number of the database
|
all: integrate the freezer with fast sync
* all: freezer style syncing
core, eth, les, light: clean up freezer relative APIs
core, eth, les, trie, ethdb, light: clean a bit
core, eth, les, light: add unit tests
core, light: rewrite setHead function
core, eth: fix downloader unit tests
core: add receipt chain insertion test
core: use constant instead of hardcoding table name
core: fix rollback
core: fix setHead
core/rawdb: remove canonical block first and then iterate side chain
core/rawdb, ethdb: add hasAncient interface
eth/downloader: calculate ancient limit via cht first
core, eth, ethdb: lots of fixes
* eth/downloader: print ancient disable log only for fast sync
2019-04-25 22:59:48 +08:00
|
|
|
func WriteDatabaseVersion(db ethdb.KeyValueWriter, version uint64) {
|
2019-01-11 19:49:12 +08:00
|
|
|
enc, err := rlp.EncodeToBytes(version)
|
|
|
|
if err != nil {
|
|
|
|
log.Crit("Failed to encode database version", "err", err)
|
|
|
|
}
|
2020-12-11 15:56:00 +01:00
|
|
|
if err = db.Put(databaseVersionKey, enc); err != nil {
|
2018-05-07 14:35:06 +03:00
|
|
|
log.Crit("Failed to store the database version", "err", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadChainConfig retrieves the consensus settings based on the given genesis hash.
|
all: integrate the freezer with fast sync
* all: freezer style syncing
core, eth, les, light: clean up freezer relative APIs
core, eth, les, trie, ethdb, light: clean a bit
core, eth, les, light: add unit tests
core, light: rewrite setHead function
core, eth: fix downloader unit tests
core: add receipt chain insertion test
core: use constant instead of hardcoding table name
core: fix rollback
core: fix setHead
core/rawdb: remove canonical block first and then iterate side chain
core/rawdb, ethdb: add hasAncient interface
eth/downloader: calculate ancient limit via cht first
core, eth, ethdb: lots of fixes
* eth/downloader: print ancient disable log only for fast sync
2019-04-25 22:59:48 +08:00
|
|
|
func ReadChainConfig(db ethdb.KeyValueReader, hash common.Hash) *params.ChainConfig {
|
2018-06-11 21:06:26 +08:00
|
|
|
data, _ := db.Get(configKey(hash))
|
2018-05-07 14:35:06 +03:00
|
|
|
if len(data) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
var config params.ChainConfig
|
|
|
|
if err := json.Unmarshal(data, &config); err != nil {
|
|
|
|
log.Error("Invalid chain config JSON", "hash", hash, "err", err)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &config
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteChainConfig writes the chain config settings to the database.
|
all: integrate the freezer with fast sync
* all: freezer style syncing
core, eth, les, light: clean up freezer relative APIs
core, eth, les, trie, ethdb, light: clean a bit
core, eth, les, light: add unit tests
core, light: rewrite setHead function
core, eth: fix downloader unit tests
core: add receipt chain insertion test
core: use constant instead of hardcoding table name
core: fix rollback
core: fix setHead
core/rawdb: remove canonical block first and then iterate side chain
core/rawdb, ethdb: add hasAncient interface
eth/downloader: calculate ancient limit via cht first
core, eth, ethdb: lots of fixes
* eth/downloader: print ancient disable log only for fast sync
2019-04-25 22:59:48 +08:00
|
|
|
func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.ChainConfig) {
|
2018-05-07 14:35:06 +03:00
|
|
|
if cfg == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
data, err := json.Marshal(cfg)
|
|
|
|
if err != nil {
|
|
|
|
log.Crit("Failed to JSON encode chain config", "err", err)
|
|
|
|
}
|
2018-06-11 21:06:26 +08:00
|
|
|
if err := db.Put(configKey(hash), data); err != nil {
|
2018-05-07 14:35:06 +03:00
|
|
|
log.Crit("Failed to store chain config", "err", err)
|
|
|
|
}
|
|
|
|
}
|
2020-12-11 15:56:00 +01:00
|
|
|
|
2022-08-09 17:44:39 +08:00
|
|
|
// ReadGenesisStateSpec retrieves the genesis state specification based on the
|
2023-02-21 05:18:33 -05:00
|
|
|
// given genesis (block-)hash.
|
|
|
|
func ReadGenesisStateSpec(db ethdb.KeyValueReader, blockhash common.Hash) []byte {
|
|
|
|
data, _ := db.Get(genesisStateSpecKey(blockhash))
|
2022-03-22 17:53:22 +08:00
|
|
|
return data
|
|
|
|
}
|
|
|
|
|
2022-08-09 17:44:39 +08:00
|
|
|
// WriteGenesisStateSpec writes the genesis state specification into the disk.
|
2023-02-21 05:18:33 -05:00
|
|
|
func WriteGenesisStateSpec(db ethdb.KeyValueWriter, blockhash common.Hash, data []byte) {
|
|
|
|
if err := db.Put(genesisStateSpecKey(blockhash), data); err != nil {
|
2022-03-22 17:53:22 +08:00
|
|
|
log.Crit("Failed to store genesis state", "err", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-11 15:56:00 +01:00
|
|
|
// crashList is a list of unclean-shutdown-markers, for rlp-encoding to the
|
|
|
|
// database
|
|
|
|
type crashList struct {
|
|
|
|
Discarded uint64 // how many ucs have we deleted
|
|
|
|
Recent []uint64 // unix timestamps of 10 latest unclean shutdowns
|
|
|
|
}
|
|
|
|
|
|
|
|
const crashesToKeep = 10
|
|
|
|
|
|
|
|
// PushUncleanShutdownMarker appends a new unclean shutdown marker and returns
|
|
|
|
// the previous data
|
|
|
|
// - a list of timestamps
|
|
|
|
// - a count of how many old unclean-shutdowns have been discarded
|
|
|
|
func PushUncleanShutdownMarker(db ethdb.KeyValueStore) ([]uint64, uint64, error) {
|
|
|
|
var uncleanShutdowns crashList
|
|
|
|
// Read old data
|
2023-09-06 18:29:51 +08:00
|
|
|
if data, err := db.Get(uncleanShutdownKey); err == nil {
|
|
|
|
if err := rlp.DecodeBytes(data, &uncleanShutdowns); err != nil {
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
2020-12-11 15:56:00 +01:00
|
|
|
}
|
|
|
|
var discarded = uncleanShutdowns.Discarded
|
|
|
|
var previous = make([]uint64, len(uncleanShutdowns.Recent))
|
|
|
|
copy(previous, uncleanShutdowns.Recent)
|
|
|
|
// Add a new (but cap it)
|
|
|
|
uncleanShutdowns.Recent = append(uncleanShutdowns.Recent, uint64(time.Now().Unix()))
|
|
|
|
if count := len(uncleanShutdowns.Recent); count > crashesToKeep+1 {
|
|
|
|
numDel := count - (crashesToKeep + 1)
|
|
|
|
uncleanShutdowns.Recent = uncleanShutdowns.Recent[numDel:]
|
|
|
|
uncleanShutdowns.Discarded += uint64(numDel)
|
|
|
|
}
|
|
|
|
// And save it again
|
|
|
|
data, _ := rlp.EncodeToBytes(uncleanShutdowns)
|
|
|
|
if err := db.Put(uncleanShutdownKey, data); err != nil {
|
|
|
|
log.Warn("Failed to write unclean-shutdown marker", "err", err)
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
|
|
|
return previous, discarded, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// PopUncleanShutdownMarker removes the last unclean shutdown marker
|
|
|
|
func PopUncleanShutdownMarker(db ethdb.KeyValueStore) {
|
|
|
|
var uncleanShutdowns crashList
|
|
|
|
// Read old data
|
|
|
|
if data, err := db.Get(uncleanShutdownKey); err != nil {
|
|
|
|
log.Warn("Error reading unclean shutdown markers", "error", err)
|
|
|
|
} else if err := rlp.DecodeBytes(data, &uncleanShutdowns); err != nil {
|
|
|
|
log.Error("Error decoding unclean shutdown markers", "error", err) // Should mos def _not_ happen
|
|
|
|
}
|
|
|
|
if l := len(uncleanShutdowns.Recent); l > 0 {
|
|
|
|
uncleanShutdowns.Recent = uncleanShutdowns.Recent[:l-1]
|
|
|
|
}
|
|
|
|
data, _ := rlp.EncodeToBytes(uncleanShutdowns)
|
|
|
|
if err := db.Put(uncleanShutdownKey, data); err != nil {
|
|
|
|
log.Warn("Failed to clear unclean-shutdown marker", "err", err)
|
|
|
|
}
|
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 12:23:02 +01:00
|
|
|
|
2021-12-17 17:48:51 +03:30
|
|
|
// UpdateUncleanShutdownMarker updates the last marker's timestamp to now.
|
|
|
|
func UpdateUncleanShutdownMarker(db ethdb.KeyValueStore) {
|
|
|
|
var uncleanShutdowns crashList
|
|
|
|
// Read old data
|
|
|
|
if data, err := db.Get(uncleanShutdownKey); err != nil {
|
|
|
|
log.Warn("Error reading unclean shutdown markers", "error", err)
|
|
|
|
} else if err := rlp.DecodeBytes(data, &uncleanShutdowns); err != nil {
|
|
|
|
log.Warn("Error decoding unclean shutdown markers", "error", err)
|
|
|
|
}
|
|
|
|
// This shouldn't happen because we push a marker on Backend instantiation
|
|
|
|
count := len(uncleanShutdowns.Recent)
|
|
|
|
if count == 0 {
|
|
|
|
log.Warn("No unclean shutdown marker to update")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
uncleanShutdowns.Recent[count-1] = uint64(time.Now().Unix())
|
|
|
|
data, _ := rlp.EncodeToBytes(uncleanShutdowns)
|
|
|
|
if err := db.Put(uncleanShutdownKey, data); err != nil {
|
|
|
|
log.Warn("Failed to write unclean-shutdown marker", "err", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 12:23:02 +01:00
|
|
|
// ReadTransitionStatus retrieves the eth2 transition status from the database
|
|
|
|
func ReadTransitionStatus(db ethdb.KeyValueReader) []byte {
|
|
|
|
data, _ := db.Get(transitionStatusKey)
|
|
|
|
return data
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteTransitionStatus stores the eth2 transition status to the database
|
|
|
|
func WriteTransitionStatus(db ethdb.KeyValueWriter, data []byte) {
|
|
|
|
if err := db.Put(transitionStatusKey, data); err != nil {
|
|
|
|
log.Crit("Failed to store the eth2 transition status", "err", err)
|
|
|
|
}
|
|
|
|
}
|
2022-07-05 11:14:21 +08:00
|
|
|
|
|
|
|
// ReadOffSetOfCurrentAncientFreezer return prune block start
|
|
|
|
func ReadOffSetOfCurrentAncientFreezer(db ethdb.KeyValueReader) uint64 {
|
|
|
|
offset, _ := db.Get(offSetOfCurrentAncientFreezer)
|
|
|
|
if offset == nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return new(big.Int).SetBytes(offset).Uint64()
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteOffSetOfCurrentAncientFreezer write prune block start
|
|
|
|
func WriteOffSetOfCurrentAncientFreezer(db ethdb.KeyValueWriter, offset uint64) {
|
|
|
|
if err := db.Put(offSetOfCurrentAncientFreezer, new(big.Int).SetUint64(offset).Bytes()); err != nil {
|
2022-07-25 09:56:17 +08:00
|
|
|
log.Crit("Failed to store the current offset of ancient", "err", err)
|
2022-07-05 11:14:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadOffSetOfLastAncientFreezer return last prune block start
|
|
|
|
func ReadOffSetOfLastAncientFreezer(db ethdb.KeyValueReader) uint64 {
|
|
|
|
offset, _ := db.Get(offSetOfLastAncientFreezer)
|
|
|
|
if offset == nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return new(big.Int).SetBytes(offset).Uint64()
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteOffSetOfLastAncientFreezer wirte before prune block start
|
|
|
|
func WriteOffSetOfLastAncientFreezer(db ethdb.KeyValueWriter, offset uint64) {
|
|
|
|
if err := db.Put(offSetOfLastAncientFreezer, new(big.Int).SetUint64(offset).Bytes()); err != nil {
|
2022-07-25 09:56:17 +08:00
|
|
|
log.Crit("Failed to store the old offset of ancient", "err", err)
|
2022-07-05 11:14:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadFrozenOfAncientFreezer return freezer block number
|
|
|
|
func ReadFrozenOfAncientFreezer(db ethdb.KeyValueReader) uint64 {
|
|
|
|
fozen, _ := db.Get(frozenOfAncientDBKey)
|
|
|
|
if fozen == nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return new(big.Int).SetBytes(fozen).Uint64()
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteFrozenOfAncientFreezer write freezer block number
|
|
|
|
func WriteFrozenOfAncientFreezer(db ethdb.KeyValueWriter, frozen uint64) {
|
|
|
|
if err := db.Put(frozenOfAncientDBKey, new(big.Int).SetUint64(frozen).Bytes()); err != nil {
|
2022-07-25 09:56:17 +08:00
|
|
|
log.Crit("Failed to store the ancient frozen number", "err", err)
|
2022-07-05 11:14:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadSafePointBlockNumber return the number of block that roothash save to disk
|
|
|
|
func ReadSafePointBlockNumber(db ethdb.KeyValueReader) uint64 {
|
|
|
|
num, _ := db.Get(LastSafePointBlockKey)
|
|
|
|
if num == nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return new(big.Int).SetBytes(num).Uint64()
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteSafePointBlockNumber write the number of block that roothash save to disk
|
|
|
|
func WriteSafePointBlockNumber(db ethdb.KeyValueWriter, number uint64) {
|
|
|
|
if err := db.Put(LastSafePointBlockKey, new(big.Int).SetUint64(number).Bytes()); err != nil {
|
2022-07-25 09:56:17 +08:00
|
|
|
log.Crit("Failed to store safe point of block number", "err", err)
|
2022-07-05 11:14:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadAncientType return freezer type
|
|
|
|
func ReadAncientType(db ethdb.KeyValueReader) uint64 {
|
|
|
|
data, _ := db.Get(pruneAncientKey)
|
|
|
|
if data == nil {
|
|
|
|
return EntireFreezerType
|
|
|
|
}
|
|
|
|
return new(big.Int).SetBytes(data).Uint64()
|
|
|
|
}
|
|
|
|
|
|
|
|
// WriteAncientType write freezer type
|
|
|
|
func WriteAncientType(db ethdb.KeyValueWriter, flag uint64) {
|
|
|
|
if err := db.Put(pruneAncientKey, new(big.Int).SetUint64(flag).Bytes()); err != nil {
|
2022-07-25 09:56:17 +08:00
|
|
|
log.Crit("Failed to store prune ancient type", "err", err)
|
2022-07-05 11:14:21 +08:00
|
|
|
}
|
|
|
|
}
|