Skip to content

Commit f79548b

Browse files
auricomjulienrbrt
andauthored
feat(apps): wire rollback command to evm simple, align testapp command (#2622)
## Overview ref: #2590 Wire rollback command to evm simple, align testapp command. Co-authored-by: Julien Robert <[email protected]>
1 parent 393ba74 commit f79548b

File tree

4 files changed

+217
-97
lines changed

4 files changed

+217
-97
lines changed

apps/evm/single/cmd/rollback.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package cmd
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
ds "github.com/ipfs/go-datastore"
8+
kt "github.com/ipfs/go-datastore/keytransform"
9+
"github.com/spf13/cobra"
10+
11+
goheaderstore "github.com/celestiaorg/go-header/store"
12+
"github.com/evstack/ev-node/node"
13+
rollcmd "github.com/evstack/ev-node/pkg/cmd"
14+
"github.com/evstack/ev-node/pkg/store"
15+
"github.com/evstack/ev-node/types"
16+
)
17+
18+
// NewRollbackCmd creates a command to rollback ev-node state by one height.
19+
func NewRollbackCmd() *cobra.Command {
20+
var height uint64
21+
22+
cmd := &cobra.Command{
23+
Use: "rollback",
24+
Short: "rollback ev-node state by one height. Pass --height to specify another height to rollback to.",
25+
RunE: func(cmd *cobra.Command, args []string) error {
26+
nodeConfig, err := rollcmd.ParseConfig(cmd)
27+
if err != nil {
28+
return err
29+
}
30+
31+
goCtx := cmd.Context()
32+
if goCtx == nil {
33+
goCtx = context.Background()
34+
}
35+
36+
// evolve db
37+
rawEvolveDB, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, "evm-single")
38+
if err != nil {
39+
return err
40+
}
41+
42+
defer func() {
43+
if closeErr := rawEvolveDB.Close(); closeErr != nil {
44+
fmt.Printf("Warning: failed to close evolve database: %v\n", closeErr)
45+
}
46+
}()
47+
48+
// prefixed evolve db
49+
evolveDB := kt.Wrap(rawEvolveDB, &kt.PrefixTransform{
50+
Prefix: ds.NewKey(node.EvPrefix),
51+
})
52+
53+
evolveStore := store.New(evolveDB)
54+
if height == 0 {
55+
currentHeight, err := evolveStore.Height(goCtx)
56+
if err != nil {
57+
return err
58+
}
59+
60+
height = currentHeight - 1
61+
}
62+
63+
// rollback ev-node main state
64+
if err := evolveStore.Rollback(goCtx, height); err != nil {
65+
return fmt.Errorf("failed to rollback ev-node state: %w", err)
66+
}
67+
68+
// rollback ev-node goheader state
69+
headerStore, err := goheaderstore.NewStore[*types.SignedHeader](
70+
evolveDB,
71+
goheaderstore.WithStorePrefix("headerSync"),
72+
goheaderstore.WithMetrics(),
73+
)
74+
if err != nil {
75+
return err
76+
}
77+
78+
dataStore, err := goheaderstore.NewStore[*types.Data](
79+
evolveDB,
80+
goheaderstore.WithStorePrefix("dataSync"),
81+
goheaderstore.WithMetrics(),
82+
)
83+
if err != nil {
84+
return err
85+
}
86+
87+
if err := headerStore.Start(goCtx); err != nil {
88+
return err
89+
}
90+
defer headerStore.Stop(goCtx)
91+
92+
if err := dataStore.Start(goCtx); err != nil {
93+
return err
94+
}
95+
defer dataStore.Stop(goCtx)
96+
97+
if err := headerStore.DeleteTo(goCtx, height); err != nil {
98+
return fmt.Errorf("failed to rollback header sync service state: %w", err)
99+
}
100+
101+
if err := dataStore.DeleteTo(goCtx, height); err != nil {
102+
return fmt.Errorf("failed to rollback data sync service state: %w", err)
103+
}
104+
105+
fmt.Printf("Rolled back state to height %d\n", height)
106+
return nil
107+
},
108+
}
109+
110+
cmd.Flags().Uint64Var(&height, "height", 0, "rollback to a specific height")
111+
return cmd
112+
}

apps/evm/single/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ replace (
1414
)
1515

1616
require (
17+
github.com/celestiaorg/go-header v0.7.1
1718
github.com/ethereum/go-ethereum v1.16.2
1819
github.com/evstack/ev-node v0.14.2-0.20250317130407-e9e0a1b0485e
1920
github.com/evstack/ev-node/core v0.0.0-20250317130407-e9e0a1b0485e
2021
github.com/evstack/ev-node/da v0.0.0-20250317130407-e9e0a1b0485e
2122
github.com/evstack/ev-node/execution/evm v0.0.0-00010101000000-000000000000
2223
github.com/evstack/ev-node/sequencers/single v0.0.0-00010101000000-000000000000
24+
github.com/ipfs/go-datastore v0.8.3
2325
github.com/spf13/cobra v1.9.1
2426
)
2527

@@ -53,7 +55,6 @@ require (
5355
github.com/beorn7/perks v1.0.1 // indirect
5456
github.com/bits-and-blooms/bitset v1.20.0 // indirect
5557
github.com/buger/goterm v1.0.4 // indirect
56-
github.com/celestiaorg/go-header v0.7.1 // indirect
5758
github.com/celestiaorg/go-libp2p-messenger v0.2.2 // indirect
5859
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
5960
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
@@ -147,7 +148,6 @@ require (
147148
github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect
148149
github.com/ipfs/boxo v0.33.1 // indirect
149150
github.com/ipfs/go-cid v0.5.0 // indirect
150-
github.com/ipfs/go-datastore v0.8.3 // indirect
151151
github.com/ipfs/go-ds-badger4 v0.1.8 // indirect
152152
github.com/ipfs/go-log/v2 v2.8.0 // indirect
153153
github.com/ipld/go-ipld-prime v0.21.0 // indirect

apps/testapp/cmd/rollback.go

Lines changed: 102 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package cmd
33
import (
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
}

apps/testapp/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func main() {
2020
rollcmd.NetInfoCmd,
2121
rollcmd.StoreUnsafeCleanCmd,
2222
rollcmd.KeysCmd(),
23-
cmds.RollbackCmd,
23+
cmds.NewRollbackCmd(),
2424
initCmd,
2525
)
2626

0 commit comments

Comments
 (0)