From d761acaa0660307cd44d62a6514835848b4cdeef Mon Sep 17 00:00:00 2001 From: Delweng Date: Wed, 2 Jul 2025 21:39:02 +0800 Subject: [PATCH] triedb: get the first state block Signed-off-by: Delweng --- triedb/database.go | 10 ++++++++++ triedb/pathdb/database.go | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/triedb/database.go b/triedb/database.go index d2637bd909..a77ddb8c7c 100644 --- a/triedb/database.go +++ b/triedb/database.go @@ -384,3 +384,13 @@ func (db *Database) SnapshotCompleted() bool { } return pdb.SnapshotCompleted() } + +// FirstStateBlock +func (db *Database) FirstStateBlock() (uint64, error) { + pdb, ok := db.backend.(*pathdb.Database) + if !ok { + // Ignore in hash scheme + return 0, nil + } + return pdb.FirstStateBlock() +} diff --git a/triedb/pathdb/database.go b/triedb/pathdb/database.go index ae9574963e..a9c528f8e7 100644 --- a/triedb/pathdb/database.go +++ b/triedb/pathdb/database.go @@ -692,3 +692,25 @@ func (db *Database) SnapshotCompleted() bool { } return db.tree.bottom().genComplete() } + +// FirstStateBlock returns the block number of the oldest state snapshot in the freezer or disk layer. +func (db *Database) FirstStateBlock() (uint64, error) { + var ( + m meta + err error + tailID = db.tree.bottom().stateID() + ) + + if db.stateFreezer != nil { + tailID, err = db.stateFreezer.Tail() + if err != nil { + return 0, err + } + } + + blob := rawdb.ReadStateHistoryMeta(db.diskdb, tailID) + if err := m.decode(blob); err != nil { + return 0, err + } + return m.block, nil +}