-
Notifications
You must be signed in to change notification settings - Fork 260
Expand file tree
/
Copy pathrun.go
More file actions
155 lines (129 loc) · 4.7 KB
/
run.go
File metadata and controls
155 lines (129 loc) · 4.7 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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package cmd
import (
"context"
"fmt"
"path/filepath"
"github.com/ipfs/go-datastore"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
kvexecutor "github.com/evstack/ev-node/apps/testapp/kv"
"github.com/evstack/ev-node/block"
"github.com/evstack/ev-node/core/execution"
coresequencer "github.com/evstack/ev-node/core/sequencer"
"github.com/evstack/ev-node/node"
"github.com/evstack/ev-node/pkg/cmd"
"github.com/evstack/ev-node/pkg/config"
blobrpc "github.com/evstack/ev-node/pkg/da/jsonrpc"
da "github.com/evstack/ev-node/pkg/da/types"
"github.com/evstack/ev-node/pkg/genesis"
"github.com/evstack/ev-node/pkg/p2p/key"
"github.com/evstack/ev-node/pkg/sequencers/based"
"github.com/evstack/ev-node/pkg/sequencers/single"
"github.com/evstack/ev-node/pkg/store"
)
const testDbName = "testapp"
var RunCmd = &cobra.Command{
Use: "start",
Aliases: []string{"node", "run"},
Short: "Run the testapp node",
RunE: func(command *cobra.Command, args []string) error {
nodeConfig, err := cmd.ParseConfig(command)
if err != nil {
return err
}
logger := cmd.SetupLogger(nodeConfig.Log)
// Get KV endpoint flag
kvEndpoint, _ := command.Flags().GetString(flagKVEndpoint)
if kvEndpoint == "" {
logger.Info().Msg("KV endpoint flag not set, using default from http_server")
}
// Create test implementations
executor, err := kvexecutor.NewKVExecutor(nodeConfig.RootDir, nodeConfig.DBPath)
if err != nil {
return err
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
headerNamespace := da.NamespaceFromString(nodeConfig.DA.GetNamespace())
dataNamespace := da.NamespaceFromString(nodeConfig.DA.GetDataNamespace())
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
nodeKey, err := key.LoadNodeKey(filepath.Dir(nodeConfig.ConfigPath()))
if err != nil {
return err
}
datastore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, testDbName)
if err != nil {
return err
}
// Start the KV executor HTTP server
if kvEndpoint != "" { // Only start if endpoint is provided
httpServer := kvexecutor.NewHTTPServer(executor, kvEndpoint)
err = httpServer.Start(ctx) // Use the main context for lifecycle management
if err != nil {
return fmt.Errorf("failed to start KV executor HTTP server: %w", err)
} else {
logger.Info().Str("endpoint", kvEndpoint).Msg("KV executor HTTP server started")
}
}
genesisPath := filepath.Join(filepath.Dir(nodeConfig.ConfigPath()), "genesis.json")
genesis, err := genesis.LoadGenesis(genesisPath)
if err != nil {
return fmt.Errorf("failed to load genesis: %w", err)
}
if genesis.DAStartHeight == 0 && !nodeConfig.Node.Aggregator {
logger.Warn().Msg("da_start_height is not set in genesis.json, ask your chain developer")
}
// Create sequencer based on configuration
sequencer, err := createSequencer(ctx, logger, datastore, nodeConfig, genesis, executor)
if err != nil {
return err
}
return cmd.StartNode(logger, command, executor, sequencer, nodeKey, datastore, nodeConfig, genesis, node.NodeOptions{})
},
}
// createSequencer creates a sequencer based on the configuration.
// If BasedSequencer is enabled, it creates a based sequencer that fetches transactions from DA.
// Otherwise, it creates a single (traditional) sequencer.
func createSequencer(
ctx context.Context,
logger zerolog.Logger,
datastore datastore.Batching,
nodeConfig config.Config,
genesis genesis.Genesis,
executor execution.Executor,
) (coresequencer.Sequencer, error) {
blobClient, err := blobrpc.NewWSClient(ctx, logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, "")
if err != nil {
return nil, fmt.Errorf("failed to create blob client: %w", err)
}
daClient := block.NewDAClient(blobClient, nodeConfig, logger)
if nodeConfig.Node.BasedSequencer {
// Based sequencer mode - fetch transactions only from DA
if !nodeConfig.Node.Aggregator {
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
}
basedSeq, err := based.NewBasedSequencer(ctx, daClient, nodeConfig, datastore, genesis, logger, executor)
if err != nil {
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
}
logger.Info().
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
Uint64("da_epoch", genesis.DAEpochForcedInclusion).
Msg("based sequencer initialized")
return basedSeq, nil
}
sequencer, err := single.NewSequencer(
logger,
datastore,
daClient,
nodeConfig,
[]byte(genesis.ChainID),
1_000_000,
genesis,
executor,
)
if err != nil {
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
}
return sequencer, nil
}