@@ -3,7 +3,6 @@ package cmd
3
3
import (
4
4
"context"
5
5
"fmt"
6
- "strconv"
7
6
8
7
kvexecutor "github.com/evstack/ev-node/apps/testapp/kv"
9
8
"github.com/evstack/ev-node/node"
@@ -17,99 +16,108 @@ import (
17
16
"github.com/spf13/cobra"
18
17
)
19
18
20
- var RollbackCmd = & cobra.Command {
21
- Use : "rollback <height>" ,
22
- Short : "Rollback the testapp node" ,
23
- Args : cobra .RangeArgs (0 , 1 ),
24
- RunE : func (cmd * cobra.Command , args []string ) error {
25
- nodeConfig , err := rollcmd .ParseConfig (cmd )
26
- if err != nil {
27
- return err
28
- }
29
-
30
- ctx , cancel := context .WithCancel (context .Background ())
31
- defer cancel ()
32
-
33
- datastore , err := store .NewDefaultKVStore (nodeConfig .RootDir , nodeConfig .DBPath , "testapp" )
34
- if err != nil {
35
- return err
36
- }
37
-
38
- // prefixed evolve db
39
- evolveDB := kt .Wrap (datastore , & kt.PrefixTransform {
40
- Prefix : ds .NewKey (node .EvPrefix ),
41
- })
42
-
43
- storeWrapper := store .New (evolveDB )
44
-
45
- executor , err := kvexecutor .NewKVExecutor (nodeConfig .RootDir , nodeConfig .DBPath )
46
- if err != nil {
47
- return err
48
- }
49
-
50
- // rollback ev-node goheader state
51
- headerStore , err := goheaderstore .NewStore [* types.SignedHeader ](
52
- evolveDB ,
53
- goheaderstore .WithStorePrefix ("headerSync" ),
54
- goheaderstore .WithMetrics (),
55
- )
56
- if err != nil {
57
- return err
58
- }
59
-
60
- dataStore , err := goheaderstore .NewStore [* types.Data ](
61
- evolveDB ,
62
- goheaderstore .WithStorePrefix ("dataSync" ),
63
- goheaderstore .WithMetrics (),
64
- )
65
- if err != nil {
66
- return err
67
- }
68
-
69
- if err := headerStore .Start (ctx ); err != nil {
70
- return err
71
- }
72
- defer headerStore .Stop (ctx )
73
-
74
- if err := dataStore .Start (ctx ); err != nil {
75
- return err
76
- }
77
- defer dataStore .Stop (ctx )
78
-
79
- cmd .Println ("Starting rollback operation" )
80
- currentHeight , err := storeWrapper .Height (ctx )
81
- if err != nil {
82
- return fmt .Errorf ("failed to get current height: %w" , err )
83
- }
84
-
85
- var targetHeight uint64 = currentHeight - 1
86
- if len (args ) > 0 {
87
- targetHeight , err = strconv .ParseUint (args [0 ], 10 , 64 )
19
+ // NewRollbackCmd creates a command to rollback ev-node state by one height.
20
+ func NewRollbackCmd () * cobra.Command {
21
+ var height uint64
22
+
23
+ cmd := & cobra.Command {
24
+ Use : "rollback" ,
25
+ Short : "rollback ev-node state by one height. Pass --height to specify another height to rollback to." ,
26
+ RunE : func (cmd * cobra.Command , args []string ) error {
27
+ nodeConfig , err := rollcmd .ParseConfig (cmd )
28
+ if err != nil {
29
+ return err
30
+ }
31
+
32
+ goCtx := cmd .Context ()
33
+ if goCtx == nil {
34
+ goCtx = context .Background ()
35
+ }
36
+
37
+ // evolve db
38
+ rawEvolveDB , err := store .NewDefaultKVStore (nodeConfig .RootDir , nodeConfig .DBPath , "evm-single" )
39
+ if err != nil {
40
+ return err
41
+ }
42
+
43
+ defer func () {
44
+ if closeErr := rawEvolveDB .Close (); closeErr != nil {
45
+ fmt .Printf ("Warning: failed to close evolve database: %v\n " , closeErr )
46
+ }
47
+ }()
48
+
49
+ // prefixed evolve db
50
+ evolveDB := kt .Wrap (rawEvolveDB , & kt.PrefixTransform {
51
+ Prefix : ds .NewKey (node .EvPrefix ),
52
+ })
53
+
54
+ evolveStore := store .New (evolveDB )
55
+ if height == 0 {
56
+ currentHeight , err := evolveStore .Height (goCtx )
57
+ if err != nil {
58
+ return err
59
+ }
60
+
61
+ height = currentHeight - 1
62
+ }
63
+
64
+ executor , err := kvexecutor .NewKVExecutor (nodeConfig .RootDir , nodeConfig .DBPath )
65
+ if err != nil {
66
+ return err
67
+ }
68
+
69
+ // rollback ev-node main state
70
+ if err := evolveStore .Rollback (goCtx , height ); err != nil {
71
+ return fmt .Errorf ("failed to rollback ev-node state: %w" , err )
72
+ }
73
+
74
+ // rollback ev-node goheader state
75
+ headerStore , err := goheaderstore .NewStore [* types.SignedHeader ](
76
+ evolveDB ,
77
+ goheaderstore .WithStorePrefix ("headerSync" ),
78
+ goheaderstore .WithMetrics (),
79
+ )
88
80
if err != nil {
89
- return fmt . Errorf ( "failed to parse target height: %w" , err )
81
+ return err
90
82
}
91
- }
92
-
93
- // rollback ev-node store
94
- if err := storeWrapper .Rollback (ctx , targetHeight ); err != nil {
95
- return fmt .Errorf ("rollback failed: %w" , err )
96
- }
97
-
98
- // rollback sync services
99
- if err := headerStore .DeleteTo (ctx , targetHeight ); err != nil {
100
- return fmt .Errorf ("failed to rollback header sync service state: %w" , err )
101
- }
102
-
103
- if err := dataStore .DeleteTo (ctx , targetHeight ); err != nil {
104
- return fmt .Errorf ("failed to rollback data sync service state: %w" , err )
105
- }
106
-
107
- // rollback execution store
108
- if err := executor .Rollback (ctx , targetHeight ); err != nil {
109
- return fmt .Errorf ("rollback failed: %w" , err )
110
- }
111
-
112
- cmd .Println ("Rollback completed successfully" )
113
- return nil
114
- },
83
+
84
+ dataStore , err := goheaderstore .NewStore [* types.Data ](
85
+ evolveDB ,
86
+ goheaderstore .WithStorePrefix ("dataSync" ),
87
+ goheaderstore .WithMetrics (),
88
+ )
89
+ if err != nil {
90
+ return err
91
+ }
92
+
93
+ if err := headerStore .Start (goCtx ); err != nil {
94
+ return err
95
+ }
96
+ defer headerStore .Stop (goCtx )
97
+
98
+ if err := dataStore .Start (goCtx ); err != nil {
99
+ return err
100
+ }
101
+ defer dataStore .Stop (goCtx )
102
+
103
+ if err := headerStore .DeleteTo (goCtx , height ); err != nil {
104
+ return fmt .Errorf ("failed to rollback header sync service state: %w" , err )
105
+ }
106
+
107
+ if err := dataStore .DeleteTo (goCtx , height ); err != nil {
108
+ return fmt .Errorf ("failed to rollback data sync service state: %w" , err )
109
+ }
110
+
111
+ // rollback execution store
112
+ if err := executor .Rollback (goCtx , height ); err != nil {
113
+ return fmt .Errorf ("rollback failed: %w" , err )
114
+ }
115
+
116
+ fmt .Printf ("Rolled back state to height %d\n " , height )
117
+ return nil
118
+ },
119
+ }
120
+
121
+ cmd .Flags ().Uint64Var (& height , "height" , 0 , "rollback to a specific height" )
122
+ return cmd
115
123
}
0 commit comments