@@ -3,7 +3,6 @@ package cmd
33import (
44 "context"
55 "fmt"
6- "strconv"
76
87 kvexecutor "github.com/evstack/ev-node/apps/testapp/kv"
98 "github.com/evstack/ev-node/node"
@@ -17,99 +16,108 @@ import (
1716 "github.com/spf13/cobra"
1817)
1918
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+ )
8880 if err != nil {
89- return fmt . Errorf ( "failed to parse target height: %w" , err )
81+ return err
9082 }
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
115123}
0 commit comments