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 +}