Skip to content

Commit 5ea4d48

Browse files
committed
feat: Initial V2 scaffolds - working lint and tests
1 parent 10a3b7f commit 5ea4d48

File tree

10 files changed

+96
-50
lines changed

10 files changed

+96
-50
lines changed

.vscode/launch.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "Launch Package",
9+
"type": "go",
10+
"request": "launch",
11+
"mode": "debug",
12+
"env": {
13+
"ENV_PATH": "../../.env",
14+
"EIGENDA_PROXY_EIGENDA_CERT_VERIFICATION_DISABLED": "true",
15+
"EIGENDA_PROXY_EIGENDA_TARGET_KZG_G1_PATH": "../../resources/g1.point",
16+
"EIGENDA_PROXY_EIGENDA_TARGET_KZG_G2_POWER_OF_2_PATH": "../../resources/g2.point.powerOf2"
17+
},
18+
"program": "cmd/server"
19+
}
20+
]
21+
}

flags/eigendaflags/cli.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func withEnvPrefix(envPrefix, s string) string {
6060

6161
// CLIFlags ... used for EigenDA client configuration
6262
func CLIFlags(envPrefix, category string) []cli.Flag {
63-
return []cli.Flag{
63+
return append([]cli.Flag{
6464
&cli.StringFlag{
6565
Name: DisperserRPCFlagName,
6666
Usage: "RPC endpoint of the EigenDA disperser.",
@@ -181,6 +181,13 @@ func CLIFlags(envPrefix, category string) []cli.Flag {
181181
EnvVars: []string{withEnvPrefix(envPrefix, "PUT_RETRIES")},
182182
Category: category,
183183
},
184+
},
185+
v2Flags(envPrefix, category)...,
186+
)
187+
}
188+
189+
func v2Flags(envPrefix, category string) []cli.Flag {
190+
return []cli.Flag{
184191
// EigenDA V2 specific flags //
185192
&cli.BoolFlag{
186193
Name: V2Enabled,
@@ -244,13 +251,13 @@ func ReadV2DispersalConfig(ctx *cli.Context) v2_clients.PayloadDisperserConfig {
244251
payCfg := readPayloadClientConfig(ctx)
245252

246253
return v2_clients.PayloadDisperserConfig{
247-
SignerPaymentKey: ctx.String(SignerPrivateKeyHexFlagName),
254+
SignerPaymentKey: ctx.String(SignerPrivateKeyHexFlagName),
248255
PayloadClientConfig: payCfg,
249256
DisperseBlobTimeout: ctx.Duration(ResponseTimeoutFlagName),
250257
// TODO: Explore making these user defined
251258
BlobCertifiedTimeout: time.Second * 2,
252259
BlobStatusPollInterval: time.Second * 1,
253-
Quorums: []uint8{0,1},
260+
Quorums: []uint8{0, 1},
254261
}
255262
}
256263

server/config.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ func (cfg *Config) Check() error {
108108
if dc.EigenDACertVerifierAddr == "" {
109109
return fmt.Errorf("cert verifier contract address is required for interacting with EigenDA V2")
110110
}
111-
112111
}
113112

114113
return cfg.StorageConfig.Check()

server/handlers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ func (svr *Server) handlePostShared(w http.ResponseWriter, r *http.Request, comm
209209
return err
210210
}
211211

212-
responseCommit, err := commitments.EncodeCommitment(commitment, meta.Mode, commitments.EigenDACommit(meta.Version))
212+
responseCommit, err := commitments.EncodeCommitment(commitment, meta.Mode, meta.Version)
213213
if err != nil {
214214
err = MetaError{
215215
Err: fmt.Errorf("failed to encode commitment %v (commitment mode %v): %w", commitment, meta.Mode, err),

server/handlers_test.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import (
2626

2727
var (
2828
testLogger = logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{})
29+
testCfg = Config{
30+
Host: "localhost",
31+
Port: 0,
32+
}
2933
)
3034

3135
const (
@@ -98,7 +102,7 @@ func TestHandlerGet(t *testing.T) {
98102
// we need to create a router through which we can pass the request.
99103
r := mux.NewRouter()
100104
// enable this logger to help debug tests
101-
server := NewServer("localhost", 0, mockStorageMgr, testLogger, metrics.NoopMetrics)
105+
server := NewServer(&testCfg, mockStorageMgr, testLogger, metrics.NoopMetrics)
102106
server.registerRoutes(r)
103107
r.ServeHTTP(rec, req)
104108

@@ -169,7 +173,7 @@ func TestHandlerPutSuccess(t *testing.T) {
169173
// we need to create a router through which we can pass the request.
170174
r := mux.NewRouter()
171175
// enable this logger to help debug tests
172-
server := NewServer("localhost", 0, mockStorageMgr, testLogger, metrics.NoopMetrics)
176+
server := NewServer(&testCfg, mockStorageMgr, testLogger, metrics.NoopMetrics)
173177
server.registerRoutes(r)
174178
r.ServeHTTP(rec, req)
175179

@@ -254,7 +258,7 @@ func TestHandlerPutErrors(t *testing.T) {
254258
// we need to create a router through which we can pass the request.
255259
r := mux.NewRouter()
256260
// enable this logger to help debug tests
257-
server := NewServer("localhost", 0, mockStorageMgr, testLogger, metrics.NoopMetrics)
261+
server := NewServer(&testCfg, mockStorageMgr, testLogger, metrics.NoopMetrics)
258262
server.registerRoutes(r)
259263
r.ServeHTTP(rec, req)
260264

server/load_store.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/Layr-Labs/eigenda-proxy/metrics"
1111
"github.com/Layr-Labs/eigenda-proxy/store"
1212
"github.com/Layr-Labs/eigenda-proxy/store/generated_key/eigenda"
13-
"github.com/Layr-Labs/eigenda-proxy/store/generated_key/eigenda_v2"
13+
eigendav2 "github.com/Layr-Labs/eigenda-proxy/store/generated_key/eigenda_v2"
1414
"github.com/Layr-Labs/eigenda-proxy/store/generated_key/memstore"
1515
"github.com/Layr-Labs/eigenda-proxy/store/precomputed_key/redis"
1616
"github.com/Layr-Labs/eigenda-proxy/store/precomputed_key/s3"
@@ -50,7 +50,7 @@ func loadBackends(targets []string, s3 common.PrecomputedKeyStore, redis *redis.
5050
}
5151
stores[i] = s3
5252

53-
case common.EigenDABackendType, common.MemoryBackendType:
53+
case common.EigenDABackendType, common.MemoryBackendType, common.EigenDAV2BackendType:
5454
panic(fmt.Sprintf("Invalid target for fallback: %s", f))
5555

5656
case common.UnknownBackendType:
@@ -64,7 +64,7 @@ func loadBackends(targets []string, s3 common.PrecomputedKeyStore, redis *redis.
6464
return stores
6565
}
6666

67-
func loadEigenDAV2Store(ctx context.Context, cfg CLIConfig, log logging.Logger) (*eigenda_v2.Store, error) {
67+
func loadEigenDAV2Store(ctx context.Context, cfg CLIConfig, log logging.Logger) (*eigendav2.Store, error) {
6868
// TODO: Replace with real logger once dependency PRs are merged
6969

7070
gethCfg := geth.EthClientConfig{
@@ -113,8 +113,8 @@ func loadEigenDAV2Store(ctx context.Context, cfg CLIConfig, log logging.Logger)
113113
return nil, err
114114
}
115115

116+
// TODO: Sanitize properly
116117
splits := strings.Split(cfg.EigenDAConfig.EdaV1ClientConfig.RPC, ":")
117-
println(fmt.Sprintf("%v", splits))
118118

119119
cfg.EigenDAConfig.V2DispersalConfig.SignerPaymentKey = cfg.EigenDAConfig.EdaV1ClientConfig.SignerPrivateKeyHex
120120

@@ -139,17 +139,17 @@ func loadEigenDAV2Store(ctx context.Context, cfg CLIConfig, log logging.Logger)
139139
return nil, err
140140
}
141141

142-
verifier, err := verification.NewCertVerifier(log, ethClient, cfg.EigenDAConfig.V2DispersalConfig.EigenDACertVerifierAddr, time.Second * 1)
142+
verifier, err := verification.NewCertVerifier(log, ethClient, cfg.EigenDAConfig.V2DispersalConfig.EigenDACertVerifierAddr, time.Second*1)
143143
if err != nil {
144144
return nil, err
145145
}
146146

147-
return eigenda_v2.NewStore(nil, &eigenda_v2.Config{
147+
return eigendav2.NewStore(nil, &eigendav2.Config{
148148
ServiceManagerAddr: cfg.EigenDAConfig.EdaV1ClientConfig.SvcManagerAddr,
149149
MaxBlobSizeBytes: cfg.EigenDAConfig.MemstoreConfig.MaxBlobSizeBytes,
150150
StatusQueryTimeout: cfg.EigenDAConfig.EdaV1ClientConfig.StatusQueryTimeout,
151151
PutRetries: cfg.EigenDAConfig.PutRetries,
152-
}, ethClient, disperser, retriever, verifier)
152+
}, disperser, retriever, verifier)
153153
}
154154

155155
// LoadStoreManager ... creates storage backend clients and instruments them into a storage routing abstraction
@@ -158,7 +158,7 @@ func LoadStoreManager(ctx context.Context, cfg CLIConfig, log logging.Logger, m
158158
var err error
159159
var s3Store *s3.Store
160160
var redisStore *redis.Store
161-
var eigenDAV2Store *eigenda_v2.Store
161+
var eigenDAV2Store *eigendav2.Store
162162

163163
// TODO: Replace with real logger once dependency PRs are merged
164164

server/routing_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestRouting(t *testing.T) {
2020
mockRouter := mocks.NewMockIManager(ctrl)
2121

2222
m := metrics.NewMetrics("default")
23-
server := NewServer("localhost", 8080, mockRouter, testLogger, m)
23+
server := NewServer(&testCfg, mockRouter, testLogger, m)
2424
err := server.Start()
2525
require.NoError(t, err)
2626

server/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func parseVersionByte(w http.ResponseWriter, r *http.Request) (byte, error) {
139139

140140
case byte(commitments.CertV1):
141141
return versionByte[0], nil
142-
142+
143143
default:
144144
http.Error(w, fmt.Sprintf("unsupported version byte %x", versionByte), http.StatusBadRequest)
145145
return 0, fmt.Errorf("unsupported version byte %x", versionByte)

store/generated_key/eigenda_v2/eigenda.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package eigenda_v2
1+
package eigendav2
22

33
import (
44
"context"
@@ -12,7 +12,6 @@ import (
1212

1313
"github.com/Layr-Labs/eigenda/api/clients/v2"
1414
"github.com/Layr-Labs/eigenda/api/clients/v2/verification"
15-
eigenda_common "github.com/Layr-Labs/eigenda/common"
1615
"github.com/ethereum/go-ethereum/log"
1716
"github.com/ethereum/go-ethereum/rlp"
1817
)
@@ -43,9 +42,8 @@ type Store struct {
4342

4443
var _ common.GeneratedKeyStore = (*Store)(nil)
4544

46-
func NewStore(log log.Logger, cfg *Config, ethClient eigenda_common.EthClient,
45+
func NewStore(log log.Logger, cfg *Config,
4746
disperser *clients.PayloadDisperser, retriever clients.PayloadRetriever, verifier verification.ICertVerifier) (*Store, error) {
48-
4947
return &Store{
5048
log: log,
5149
cfg: cfg,
@@ -63,7 +61,7 @@ func (e Store) Get(ctx context.Context, key []byte) ([]byte, error) {
6361
if err != nil {
6462
return nil, fmt.Errorf("RLP decoding EigenDA v2 cert: %w", err)
6563
}
66-
64+
6765
payload, err := e.retriever.GetPayload(ctx, &cert)
6866
if err != nil {
6967
return nil, fmt.Errorf("getting payload: %w", err)
@@ -78,7 +76,7 @@ func (e Store) Get(ctx context.Context, key []byte) ([]byte, error) {
7876
// Mapping status codes to 503 failover
7977
func (e Store) Put(ctx context.Context, value []byte) ([]byte, error) {
8078
salt := uint32(0)
81-
log.Info("Put EigenDA V2 backend")
79+
e.log.Debug("Dispersing payload for EigenDA V2 network")
8280

8381
// TODO: Verify this retry or failover code for correctness against V2
8482
// protocol
@@ -135,7 +133,8 @@ func (e Store) BackendType() common.BackendType {
135133

136134
// Key is used to recover certificate fields and that verifies blob
137135
// against commitment to ensure data is valid and non-tampered.
138-
func (e Store) Verify(ctx context.Context, key []byte, value []byte) error {
136+
// TODO: tap into actual verification
137+
func (e Store) Verify(_ context.Context, _ []byte, _ []byte) error {
139138
// var cert verification.EigenDACert
140139
// err := rlp.DecodeBytes(key, cert)
141140
// if err != nil {

store/manager.go

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ func (m *Manager) Get(ctx context.Context, key []byte, cm commitments.Commitment
7474
return nil, errors.New("expected EigenDA backend for DA commitment type, but none configured")
7575
}
7676

77-
7877
var err error
7978
var data []byte
8079

@@ -89,32 +88,14 @@ func (m *Manager) Get(ctx context.Context, key []byte, cm commitments.Commitment
8988
m.log.Warn("Failed to read from cache targets", "err", err)
9089
}
9190

92-
if version == commitments.CertV0 {
93-
m.log.Debug("Reading blob from EigenDA")
94-
// 2 - read blob from EigenDA v1
95-
data, err := m.eigenda.Get(ctx, key)
96-
if err == nil {
97-
// verify v1 (payload, cert)
98-
err = m.eigenda.Verify(ctx, key, data)
99-
if err != nil {
100-
return nil, err
101-
}
102-
return data, nil
103-
}
104-
} else if version == commitments.CertV1 {
105-
m.log.Debug("Reading blob from EigenDAV2")
106-
data, err := m.eigendaV2.Get(ctx, key)
107-
if err == nil {
108-
// verify v2 (payload, cert)
109-
err = m.eigendaV2.Verify(ctx, key, data)
110-
if err != nil {
111-
return nil, err
112-
}
113-
m.log.Debug(fmt.Sprintf("%s", data))
114-
return data, nil
115-
}
91+
// 2 - read blob from EigenDA
92+
data, err = m.getEigenDAMode(ctx, version, data)
93+
if err == nil {
94+
return data, nil
11695
}
11796

97+
m.log.Error(err.Error())
98+
11899
// 3 - read blob from fallbacks if enabled and data is non-retrievable from EigenDA
119100
if m.secondary.FallbackEnabled() {
120101
data, err = m.secondary.MultiSourceRead(ctx, key, true, m.eigenda.Verify)
@@ -187,6 +168,41 @@ func (m *Manager) putEigenDAMode(ctx context.Context, value []byte) ([]byte, err
187168
return nil, errors.New("no DA storage backend found")
188169
}
189170

171+
func (m *Manager) getEigenDAMode(ctx context.Context, v commitments.EigenDACommit, key []byte) ([]byte, error) {
172+
switch v {
173+
case commitments.CertV0:
174+
m.log.Debug("Reading blob from EigenDAV1 backend")
175+
data, err := m.eigenda.Get(ctx, key)
176+
if err == nil {
177+
// verify v1 (payload, cert)
178+
err = m.eigenda.Verify(ctx, key, data)
179+
if err != nil {
180+
return nil, err
181+
}
182+
return data, nil
183+
}
184+
185+
return nil, err
186+
187+
case commitments.CertV1:
188+
m.log.Debug("Reading blob from EigenDAV2 backend")
189+
data, err := m.eigendaV2.Get(ctx, key)
190+
if err == nil {
191+
// verify v2 (payload, cert)
192+
err = m.eigendaV2.Verify(ctx, key, data)
193+
if err != nil {
194+
return nil, err
195+
}
196+
return data, nil
197+
}
198+
199+
return nil, err
200+
201+
default:
202+
return nil, fmt.Errorf("commitment version unknown: %b", v)
203+
}
204+
}
205+
190206
// putKeccak256Mode ... put blob into S3 compatible backend
191207
func (m *Manager) putKeccak256Mode(ctx context.Context, key []byte, value []byte) ([]byte, error) {
192208
if m.s3 == nil {

0 commit comments

Comments
 (0)