-
Notifications
You must be signed in to change notification settings - Fork 264
Expand file tree
/
Copy pathrollback.go
More file actions
123 lines (101 loc) · 3.16 KB
/
rollback.go
File metadata and controls
123 lines (101 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package cmd
import (
"context"
"errors"
"fmt"
ds "github.com/ipfs/go-datastore"
kt "github.com/ipfs/go-datastore/keytransform"
"github.com/spf13/cobra"
goheaderstore "github.com/celestiaorg/go-header/store"
"github.com/evstack/ev-node/node"
rollcmd "github.com/evstack/ev-node/pkg/cmd"
"github.com/evstack/ev-node/pkg/store"
"github.com/evstack/ev-node/types"
)
// NewRollbackCmd creates a command to rollback ev-node state by one height.
func NewRollbackCmd() *cobra.Command {
var (
height uint64
syncNode bool
)
cmd := &cobra.Command{
Use: "rollback",
Short: "rollback ev-node state by one height. Pass --height to specify another height to rollback to.",
RunE: func(cmd *cobra.Command, args []string) error {
nodeConfig, err := rollcmd.ParseConfig(cmd)
if err != nil {
return err
}
goCtx := cmd.Context()
if goCtx == nil {
goCtx = context.Background()
}
// evolve db
rawEvolveDB, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, "evm-single")
if err != nil {
return err
}
defer func() {
if closeErr := rawEvolveDB.Close(); closeErr != nil {
fmt.Printf("Warning: failed to close evolve database: %v\n", closeErr)
}
}()
// prefixed evolve db
evolveDB := kt.Wrap(rawEvolveDB, &kt.PrefixTransform{
Prefix: ds.NewKey(node.EvPrefix),
})
evolveStore := store.New(evolveDB)
if height == 0 {
currentHeight, err := evolveStore.Height(goCtx)
if err != nil {
return err
}
height = currentHeight - 1
}
// rollback ev-node main state
if err := evolveStore.Rollback(goCtx, height, !syncNode); err != nil {
return fmt.Errorf("failed to rollback ev-node state: %w", err)
}
// rollback ev-node goheader state
headerStore, err := goheaderstore.NewStore[*types.SignedHeader](
evolveDB,
goheaderstore.WithStorePrefix("headerSync"),
goheaderstore.WithMetrics(),
)
if err != nil {
return err
}
dataStore, err := goheaderstore.NewStore[*types.Data](
evolveDB,
goheaderstore.WithStorePrefix("dataSync"),
goheaderstore.WithMetrics(),
)
if err != nil {
return err
}
if err := headerStore.Start(goCtx); err != nil {
return fmt.Errorf("failed to start header store: %w", err)
}
defer headerStore.Stop(goCtx)
if err := dataStore.Start(goCtx); err != nil {
return fmt.Errorf("failed to start data store: %w", err)
}
defer dataStore.Stop(goCtx)
var errs error
if err := headerStore.DeleteRange(goCtx, height+1, headerStore.Height()); err != nil {
errs = errors.Join(errs, fmt.Errorf("failed to rollback header sync service state: %w", err))
}
if err := dataStore.DeleteRange(goCtx, height+1, dataStore.Height()); err != nil {
errs = errors.Join(errs, fmt.Errorf("failed to rollback data sync service state: %w", err))
}
fmt.Printf("Rolled back ev-node state to height %d\n", height)
if syncNode {
fmt.Println("Restart the node with the `--clear-cache` flag")
}
return errs
},
}
cmd.Flags().Uint64Var(&height, "height", 0, "rollback to a specific height")
cmd.Flags().BoolVar(&syncNode, "sync-node", false, "sync node (no aggregator)")
return cmd
}