Skip to content

Commit 4834564

Browse files
committed
remove panic and store cmd
1 parent b628459 commit 4834564

File tree

6 files changed

+0
-291
lines changed

6 files changed

+0
-291
lines changed

apps/evm/single/main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ func main() {
3131
rollcmd.VersionCmd,
3232
rollcmd.NetInfoCmd,
3333
rollcmd.StoreUnsafeCleanCmd,
34-
rollcmd.StoreP2PInspectCmd,
3534
rollcmd.KeysCmd(),
3635
)
3736

apps/grpc/single/main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ the Evolve execution gRPC interface.`,
3030
evcmd.VersionCmd,
3131
evcmd.NetInfoCmd,
3232
evcmd.StoreUnsafeCleanCmd,
33-
evcmd.StoreP2PInspectCmd,
3433
evcmd.KeysCmd(),
3534
)
3635

apps/testapp/main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ func main() {
1919
rollcmd.VersionCmd,
2020
rollcmd.NetInfoCmd,
2121
rollcmd.StoreUnsafeCleanCmd,
22-
rollcmd.StoreP2PInspectCmd,
2322
rollcmd.KeysCmd(),
2423
cmds.NewRollbackCmd(),
2524
initCmd,

pkg/cmd/store.go

Lines changed: 0 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,13 @@
11
package cmd
22

33
import (
4-
"context"
5-
"errors"
64
"fmt"
75
"os"
86
"path/filepath"
9-
"time"
107

11-
goheader "github.com/celestiaorg/go-header"
12-
goheaderstore "github.com/celestiaorg/go-header/store"
13-
ds "github.com/ipfs/go-datastore"
14-
kt "github.com/ipfs/go-datastore/keytransform"
158
"github.com/spf13/cobra"
169

17-
"github.com/evstack/ev-node/node"
1810
"github.com/evstack/ev-node/pkg/config"
19-
"github.com/evstack/ev-node/pkg/store"
20-
"github.com/evstack/ev-node/types"
2111
)
2212

2313
// UnsafeCleanDataDir removes all contents of the specified data directory.
@@ -66,175 +56,6 @@ This operation is unsafe and cannot be undone. Use with caution!`,
6656
},
6757
}
6858

69-
// StoreP2PInspectCmd reports head/tail information for the go-header stores used by P2P sync.
70-
var StoreP2PInspectCmd = &cobra.Command{
71-
Use: "store-info",
72-
Short: "Inspect the go-header (P2P) stores and display their tail/head entries",
73-
Long: `Opens the datastore used by the node's go-header services and reports
74-
the current height, head, and tail information for both the header and data stores.`,
75-
RunE: func(cmd *cobra.Command, args []string) error {
76-
nodeConfig, err := ParseConfig(cmd)
77-
if err != nil {
78-
return fmt.Errorf("error parsing config: %w", err)
79-
}
80-
81-
ctx := cmd.Context()
82-
if ctx == nil {
83-
ctx = context.Background()
84-
}
85-
86-
dbName := resolveDBName(cmd)
87-
88-
rawStore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, dbName)
89-
if err != nil {
90-
return fmt.Errorf("failed to open datastore: %w", err)
91-
}
92-
defer func() {
93-
if closeErr := rawStore.Close(); closeErr != nil {
94-
cmd.PrintErrf("warning: failed to close datastore: %v\n", closeErr)
95-
}
96-
}()
97-
98-
mainStore := kt.Wrap(rawStore, &kt.PrefixTransform{
99-
Prefix: ds.NewKey(node.EvPrefix),
100-
})
101-
102-
headerSnapshot, err := inspectP2PStore[*types.SignedHeader](ctx, mainStore, headerStorePrefix, "Header Store")
103-
if err != nil {
104-
return fmt.Errorf("failed to inspect header store: %w", err)
105-
}
106-
107-
dataSnapshot, err := inspectP2PStore[*types.Data](ctx, mainStore, dataStorePrefix, "Data Store")
108-
if err != nil {
109-
return fmt.Errorf("failed to inspect data store: %w", err)
110-
}
111-
112-
storePath := resolveStorePath(nodeConfig.RootDir, nodeConfig.DBPath, dbName)
113-
114-
out := cmd.OutOrStdout()
115-
fmt.Fprintf(out, "Inspecting go-header stores at %s\n", storePath)
116-
printP2PStoreSnapshot(cmd, headerSnapshot)
117-
printP2PStoreSnapshot(cmd, dataSnapshot)
118-
119-
return nil
120-
},
121-
}
122-
123-
const (
124-
headerStorePrefix = "headerSync"
125-
dataStorePrefix = "dataSync"
126-
)
127-
128-
type p2pStoreSnapshot struct {
129-
Label string
130-
Prefix string
131-
Height uint64
132-
HeadHeight uint64
133-
HeadHash string
134-
HeadTime time.Time
135-
TailHeight uint64
136-
TailHash string
137-
TailTime time.Time
138-
HeadPresent bool
139-
TailPresent bool
140-
Empty bool
141-
}
142-
143-
func inspectP2PStore[H goheader.Header[H]](
144-
ctx context.Context,
145-
datastore ds.Batching,
146-
prefix string,
147-
label string,
148-
) (p2pStoreSnapshot, error) {
149-
storeImpl, err := goheaderstore.NewStore[H](
150-
datastore,
151-
goheaderstore.WithStorePrefix(prefix),
152-
goheaderstore.WithMetrics(),
153-
)
154-
if err != nil {
155-
return p2pStoreSnapshot{}, fmt.Errorf("failed to open %s: %w", label, err)
156-
}
157-
158-
if err := storeImpl.Start(ctx); err != nil {
159-
return p2pStoreSnapshot{}, fmt.Errorf("failed to start %s: %w", label, err)
160-
}
161-
defer func() {
162-
_ = storeImpl.Stop(context.Background())
163-
}()
164-
165-
snapshot := p2pStoreSnapshot{
166-
Label: label,
167-
Prefix: prefix,
168-
Height: storeImpl.Height(),
169-
}
170-
171-
if err := populateSnapshot(ctx, storeImpl, &snapshot); err != nil {
172-
return p2pStoreSnapshot{}, err
173-
}
174-
175-
return snapshot, nil
176-
}
177-
178-
func populateSnapshot[H goheader.Header[H]](
179-
ctx context.Context,
180-
storeImpl *goheaderstore.Store[H],
181-
snapshot *p2pStoreSnapshot,
182-
) error {
183-
head, err := storeImpl.Head(ctx)
184-
switch {
185-
case err == nil:
186-
snapshot.HeadPresent = true
187-
snapshot.HeadHeight = head.Height()
188-
snapshot.HeadHash = head.Hash().String()
189-
snapshot.HeadTime = head.Time()
190-
case errors.Is(err, goheader.ErrEmptyStore), errors.Is(err, goheader.ErrNotFound):
191-
// store not initialized yet
192-
default:
193-
return fmt.Errorf("failed to read %s head: %w", snapshot.Label, err)
194-
}
195-
196-
tail, err := storeImpl.Tail(ctx)
197-
switch {
198-
case err == nil:
199-
snapshot.TailPresent = true
200-
snapshot.TailHeight = tail.Height()
201-
snapshot.TailHash = tail.Hash().String()
202-
snapshot.TailTime = tail.Time()
203-
case errors.Is(err, goheader.ErrEmptyStore), errors.Is(err, goheader.ErrNotFound):
204-
default:
205-
return fmt.Errorf("failed to read %s tail: %w", snapshot.Label, err)
206-
}
207-
208-
snapshot.Empty = !snapshot.HeadPresent && !snapshot.TailPresent
209-
210-
return nil
211-
}
212-
213-
func printP2PStoreSnapshot(cmd *cobra.Command, snapshot p2pStoreSnapshot) {
214-
out := cmd.OutOrStdout()
215-
fmt.Fprintf(out, "\n[%s]\n", snapshot.Label)
216-
fmt.Fprintf(out, "prefix: %s\n", snapshot.Prefix)
217-
fmt.Fprintf(out, "height: %d\n", snapshot.Height)
218-
if snapshot.Empty {
219-
fmt.Fprintln(out, "status: empty (no entries found)")
220-
return
221-
}
222-
223-
if snapshot.TailPresent {
224-
fmt.Fprintf(out, "tail: height=%d hash=%s%s\n", snapshot.TailHeight, snapshot.TailHash, formatTime(snapshot.TailTime))
225-
}
226-
if snapshot.HeadPresent {
227-
fmt.Fprintf(out, "head: height=%d hash=%s%s\n", snapshot.HeadHeight, snapshot.HeadHash, formatTime(snapshot.HeadTime))
228-
}
229-
}
230-
231-
func formatTime(t time.Time) string {
232-
if t.IsZero() {
233-
return ""
234-
}
235-
return fmt.Sprintf(" time=%s", t.UTC().Format(time.RFC3339))
236-
}
237-
23859
func resolveDBName(cmd *cobra.Command) string {
23960
if cmd == nil {
24061
return config.ConfigFileName

pkg/cmd/store_test.go

Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,13 @@ package cmd
22

33
import (
44
"bytes"
5-
"context"
6-
cryptoRand "crypto/rand"
75
"fmt"
86
"os"
97
"path/filepath"
108
"testing"
119

12-
goheaderstore "github.com/celestiaorg/go-header/store"
13-
ds "github.com/ipfs/go-datastore"
14-
kt "github.com/ipfs/go-datastore/keytransform"
15-
"github.com/libp2p/go-libp2p/core/crypto"
1610
"github.com/spf13/cobra"
1711
"github.com/stretchr/testify/require"
18-
19-
"github.com/evstack/ev-node/node"
20-
"github.com/evstack/ev-node/pkg/config"
21-
"github.com/evstack/ev-node/pkg/signer/noop"
22-
"github.com/evstack/ev-node/pkg/store"
23-
"github.com/evstack/ev-node/types"
2412
)
2513

2614
func TestUnsafeCleanDataDir(t *testing.T) {
@@ -97,87 +85,3 @@ func TestStoreUnsafeCleanCmd(t *testing.T) {
9785
// Check output message (optional)
9886
require.Contains(t, buf.String(), fmt.Sprintf("All contents of the data directory at %s have been removed.", dataDir))
9987
}
100-
101-
func TestStoreP2PInspectCmd(t *testing.T) {
102-
tempDir := t.TempDir()
103-
const appName = "testapp"
104-
105-
// Seed the header store with a couple of entries.
106-
seedHeaderStore(t, tempDir, appName)
107-
108-
rootCmd := &cobra.Command{Use: appName}
109-
rootCmd.PersistentFlags().String(config.FlagRootDir, tempDir, "root directory")
110-
rootCmd.AddCommand(StoreP2PInspectCmd)
111-
112-
buf := new(bytes.Buffer)
113-
rootCmd.SetOut(buf)
114-
rootCmd.SetErr(buf)
115-
rootCmd.SetArgs([]string{"store-info"})
116-
117-
err := rootCmd.Execute()
118-
require.NoError(t, err)
119-
120-
output := buf.String()
121-
require.Contains(t, output, "Inspecting go-header stores")
122-
require.Contains(t, output, "[Header Store]")
123-
require.Contains(t, output, "tail: height=1")
124-
require.Contains(t, output, "head: height=2")
125-
require.Contains(t, output, "[Data Store]")
126-
require.Contains(t, output, "status: empty")
127-
}
128-
129-
func seedHeaderStore(t *testing.T, rootDir, dbName string) {
130-
t.Helper()
131-
132-
rawStore, err := store.NewDefaultKVStore(rootDir, "data", dbName)
133-
require.NoError(t, err)
134-
135-
mainStore := kt.Wrap(rawStore, &kt.PrefixTransform{
136-
Prefix: ds.NewKey(node.EvPrefix),
137-
})
138-
139-
headerStore, err := goheaderstore.NewStore[*types.SignedHeader](
140-
mainStore,
141-
goheaderstore.WithStorePrefix(headerStorePrefix),
142-
goheaderstore.WithMetrics(),
143-
)
144-
require.NoError(t, err)
145-
146-
ctx := context.Background()
147-
require.NoError(t, headerStore.Start(ctx))
148-
149-
defer func() {
150-
require.NoError(t, headerStore.Stop(ctx))
151-
require.NoError(t, rawStore.Close())
152-
}()
153-
154-
pk, _, err := crypto.GenerateEd25519Key(cryptoRand.Reader)
155-
require.NoError(t, err)
156-
noopSigner, err := noop.NewNoopSigner(pk)
157-
require.NoError(t, err)
158-
159-
chainID := "test-chain"
160-
headerCfg := types.HeaderConfig{
161-
Height: 1,
162-
DataHash: types.GetRandomBytes(32),
163-
AppHash: types.GetRandomBytes(32),
164-
Signer: noopSigner,
165-
}
166-
167-
first, err := types.GetRandomSignedHeaderCustom(&headerCfg, chainID)
168-
require.NoError(t, err)
169-
require.NoError(t, headerStore.Append(ctx, first))
170-
171-
next := &types.SignedHeader{
172-
Header: types.GetRandomNextHeader(first.Header, chainID),
173-
Signer: first.Signer,
174-
}
175-
payload, err := next.Header.MarshalBinary()
176-
require.NoError(t, err)
177-
signature, err := noopSigner.Sign(payload)
178-
require.NoError(t, err)
179-
next.Signature = signature
180-
181-
require.NoError(t, headerStore.Append(ctx, next))
182-
require.NoError(t, headerStore.Sync(ctx))
183-
}

pkg/sync/sync_service.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -154,18 +154,6 @@ func (syncService *SyncService[H]) WriteToStoreAndBroadcast(ctx context.Context,
154154
}
155155
}
156156

157-
hh, err := syncService.store.Head(ctx)
158-
if err != nil {
159-
return fmt.Errorf("failed to get head from store: %w", err)
160-
}
161-
syncService.logger.Info().Uint64("height", hh.Height()).
162-
Uint64("header_or_data", headerOrData.Height()).
163-
Msg("writing to store and broadcasting")
164-
165-
if err := hh.Verify(headerOrData); err != nil {
166-
panic(fmt.Errorf("header verification failed: %w", err))
167-
}
168-
169157
// Broadcast for subscribers
170158
if err := syncService.sub.Broadcast(ctx, headerOrData, opts...); err != nil {
171159
// for the first block when starting the app, broadcast error is expected
@@ -181,7 +169,6 @@ func (syncService *SyncService[H]) WriteToStoreAndBroadcast(ctx context.Context,
181169
}
182170

183171
syncService.logger.Error().Err(err).Msg("failed to broadcast")
184-
panic(err)
185172
}
186173

187174
return nil

0 commit comments

Comments
 (0)