Skip to content

Commit e30a4fd

Browse files
Integrate state-diff into State()
1 parent 2f067c4 commit e30a4fd

File tree

6 files changed

+289
-14
lines changed

6 files changed

+289
-14
lines changed

beacon-chain/db/kv/state.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ func (s *Store) State(ctx context.Context, blockRoot [32]byte) (state.BeaconStat
2828
ctx, span := trace.StartSpan(ctx, "BeaconDB.State")
2929
defer span.End()
3030
startTime := time.Now()
31+
32+
// If state diff is enabled, we get the state from the state-diff db.
33+
if features.Get().EnableStateDiff {
34+
st, err := s.getStateUsingStateDiff(ctx, blockRoot)
35+
if err != nil {
36+
return nil, err
37+
}
38+
stateReadingTime.Observe(float64(time.Since(startTime).Milliseconds()))
39+
return st, nil
40+
}
41+
3142
enc, err := s.stateBytes(ctx, blockRoot)
3243
if err != nil {
3344
return nil, err
@@ -1031,3 +1042,34 @@ func (s *Store) isStateValidatorMigrationOver() (bool, error) {
10311042
}
10321043
return returnFlag, nil
10331044
}
1045+
1046+
func (s *Store) getStateUsingStateDiff(ctx context.Context, blockRoot [32]byte) (state.BeaconState, error) {
1047+
var slot primitives.Slot
1048+
1049+
stateSummary, err := s.StateSummary(ctx, blockRoot)
1050+
if err != nil {
1051+
return nil, err
1052+
}
1053+
if stateSummary == nil {
1054+
blk, err := s.Block(ctx, blockRoot)
1055+
if err != nil {
1056+
return nil, err
1057+
}
1058+
if blk == nil || blk.IsNil() {
1059+
return nil, errors.New("neither state summary nor block found")
1060+
}
1061+
slot = blk.Block().Slot()
1062+
} else {
1063+
slot = stateSummary.Slot
1064+
}
1065+
1066+
st, err := s.stateByDiff(ctx, slot)
1067+
if err != nil {
1068+
return nil, err
1069+
}
1070+
if st == nil || st.IsNil() {
1071+
return nil, errors.New("state not found")
1072+
}
1073+
1074+
return st, nil
1075+
}

beacon-chain/db/kv/state_diff_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
)
2121

2222
func TestStateDiff_LoadOrInitOffset(t *testing.T) {
23-
setDefaultExponents()
23+
setDefaultStateDiffExponents()
2424

2525
db := setupDB(t)
2626
err := setOffsetInDB(db, 10)
@@ -36,7 +36,7 @@ func TestStateDiff_LoadOrInitOffset(t *testing.T) {
3636

3737
func TestStateDiff_ComputeLevel(t *testing.T) {
3838
db := setupDB(t)
39-
setDefaultExponents()
39+
setDefaultStateDiffExponents()
4040

4141
err := setOffsetInDB(db, 0)
4242
require.NoError(t, err)
@@ -118,7 +118,7 @@ func TestStateDiff_ComputeLevel(t *testing.T) {
118118
}
119119

120120
func TestStateDiff_SaveFullSnapshot(t *testing.T) {
121-
setDefaultExponents()
121+
setDefaultStateDiffExponents()
122122

123123
for v := range version.All() {
124124
t.Run(version.String(v), func(t *testing.T) {
@@ -151,7 +151,7 @@ func TestStateDiff_SaveFullSnapshot(t *testing.T) {
151151
}
152152

153153
func TestStateDiff_SaveAndReadFullSnapshot(t *testing.T) {
154-
setDefaultExponents()
154+
setDefaultStateDiffExponents()
155155

156156
for v := range version.All() {
157157
t.Run(version.String(v), func(t *testing.T) {
@@ -179,7 +179,7 @@ func TestStateDiff_SaveAndReadFullSnapshot(t *testing.T) {
179179
}
180180

181181
func TestStateDiff_SaveDiff(t *testing.T) {
182-
setDefaultExponents()
182+
setDefaultStateDiffExponents()
183183

184184
for v := range version.All() {
185185
t.Run(version.String(v), func(t *testing.T) {
@@ -245,7 +245,7 @@ func TestStateDiff_SaveDiff(t *testing.T) {
245245
}
246246

247247
func TestStateDiff_SaveAndReadDiff(t *testing.T) {
248-
setDefaultExponents()
248+
setDefaultStateDiffExponents()
249249

250250
for v := range version.All() {
251251
t.Run(version.String(v), func(t *testing.T) {
@@ -279,7 +279,7 @@ func TestStateDiff_SaveAndReadDiff(t *testing.T) {
279279
}
280280

281281
func TestStateDiff_SaveAndReadDiff_MultipleLevels(t *testing.T) {
282-
setDefaultExponents()
282+
setDefaultStateDiffExponents()
283283

284284
for v := range version.All() {
285285
t.Run(version.String(v), func(t *testing.T) {
@@ -345,7 +345,7 @@ func TestStateDiff_SaveAndReadDiff_MultipleLevels(t *testing.T) {
345345
}
346346

347347
func TestStateDiff_SaveAndReadDiffForkTransition(t *testing.T) {
348-
setDefaultExponents()
348+
setDefaultStateDiffExponents()
349349

350350
for v := range version.All()[:len(version.All())-1] {
351351
t.Run(version.String(v), func(t *testing.T) {
@@ -379,7 +379,7 @@ func TestStateDiff_SaveAndReadDiffForkTransition(t *testing.T) {
379379
}
380380

381381
func TestStateDiff_OffsetCache(t *testing.T) {
382-
setDefaultExponents()
382+
setDefaultStateDiffExponents()
383383

384384
// test for slot numbers 0 and 1 for every version
385385
for slotNum := range 2 {
@@ -410,7 +410,7 @@ func TestStateDiff_OffsetCache(t *testing.T) {
410410
}
411411

412412
func TestStateDiff_AnchorCache(t *testing.T) {
413-
setDefaultExponents()
413+
setDefaultStateDiffExponents()
414414

415415
for v := range version.All() {
416416
t.Run(version.String(v), func(t *testing.T) {
@@ -614,7 +614,7 @@ func setOffsetInDB(s *Store, offset uint64) error {
614614
return nil
615615
}
616616

617-
func setDefaultExponents() {
617+
func setDefaultStateDiffExponents() {
618618
globalFlags := flags.GlobalFlags{
619619
StateDiffExponents: []int{21, 18, 16, 13, 11, 9, 5},
620620
}

0 commit comments

Comments
 (0)