Skip to content

Commit 7b4011c

Browse files
tac0turtletac0turtle
authored andcommitted
ammendments from commnets
1 parent e505b36 commit 7b4011c

11 files changed

Lines changed: 56 additions & 32 deletions

File tree

block/internal/common/replay.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,19 @@ func (s *Replayer) replayBlock(ctx context.Context, height uint64) error {
150150
// Get the previous state
151151
var prevState types.State
152152
if height == s.genesis.InitialHeight {
153-
// For the first block, use genesis state.
153+
// For the first block, use genesis state. Mirror Syncer.initializeState():
154+
// prefer the execution layer's view of the next proposer, fall back to genesis.
155+
nextProposer := append([]byte(nil), s.genesis.ProposerAddress...)
156+
if info, infoErr := s.exec.GetExecutionInfo(ctx); infoErr == nil && len(info.NextProposerAddress) > 0 {
157+
nextProposer = append([]byte(nil), info.NextProposerAddress...)
158+
}
154159
prevState = types.State{
155160
ChainID: s.genesis.ChainID,
156161
InitialHeight: s.genesis.InitialHeight,
157162
LastBlockHeight: s.genesis.InitialHeight - 1,
158163
LastBlockTime: s.genesis.StartTime,
159164
AppHash: header.AppHash, // Genesis app hash (input to first block execution)
160-
NextProposerAddress: append([]byte(nil), s.genesis.ProposerAddress...),
165+
NextProposerAddress: nextProposer,
161166
}
162167
} else {
163168
// GetStateAtHeight(height-1) returns the state AFTER block height-1 was executed,

block/internal/submitting/da_submitter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ func (s *DASubmitter) setCachedEnvelope(height uint64, envelope []byte) {
425425
}
426426

427427
// SubmitData submits pending data to DA layer
428-
func (s *DASubmitter) SubmitData(ctx context.Context, unsignedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error {
428+
func (s *DASubmitter) SubmitData(ctx context.Context, unsignedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error {
429429
if len(unsignedDataList) == 0 {
430430
return nil
431431
}
@@ -435,7 +435,7 @@ func (s *DASubmitter) SubmitData(ctx context.Context, unsignedDataList []*types.
435435
}
436436

437437
// Sign the data (cache returns unsigned SignedData structs)
438-
signedDataList, signedDataListBz, err := s.signData(ctx, unsignedDataList, marshalledData, signer, genesis)
438+
signedDataList, signedDataListBz, err := s.signData(ctx, unsignedDataList, marshalledData, signer)
439439
if err != nil {
440440
return fmt.Errorf("failed to sign data: %w", err)
441441
}
@@ -469,7 +469,7 @@ func (s *DASubmitter) SubmitData(ctx context.Context, unsignedDataList []*types.
469469
}
470470

471471
// signData signs unsigned SignedData structs returned from cache
472-
func (s *DASubmitter) signData(ctx context.Context, unsignedDataList []*types.SignedData, unsignedDataListBz [][]byte, signer signer.Signer, _ genesis.Genesis) ([]*types.SignedData, [][]byte, error) {
472+
func (s *DASubmitter) signData(ctx context.Context, unsignedDataList []*types.SignedData, unsignedDataListBz [][]byte, signer signer.Signer) ([]*types.SignedData, [][]byte, error) {
473473
if signer == nil {
474474
return nil, nil, fmt.Errorf("signer is nil")
475475
}

block/internal/submitting/da_submitter_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func TestDASubmitter_SubmitHeadersAndData_MarksInclusionAndUpdatesLastSubmitted(
105105

106106
dataList, marshalledData, err := cm.GetPendingData(context.Background())
107107
require.NoError(t, err)
108-
require.NoError(t, daSubmitter.SubmitData(context.Background(), dataList, marshalledData, cm, n, gen))
108+
require.NoError(t, daSubmitter.SubmitData(context.Background(), dataList, marshalledData, cm, n))
109109

110110
// After submission, inclusion markers should be set
111111
_, ok := cm.GetHeaderDAIncludedByHeight(1)

block/internal/submitting/da_submitter_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ func TestDASubmitter_SubmitData_Success(t *testing.T) {
333333
// Get data from cache and submit
334334
signedDataList, marshalledData, err := cm.GetPendingData(ctx)
335335
require.NoError(t, err)
336-
err = submitter.SubmitData(ctx, signedDataList, marshalledData, cm, signer, gen)
336+
err = submitter.SubmitData(ctx, signedDataList, marshalledData, cm, signer)
337337
require.NoError(t, err)
338338

339339
// Verify data is marked as DA included
@@ -387,7 +387,7 @@ func TestDASubmitter_SubmitData_SkipsEmptyData(t *testing.T) {
387387
// Get data from cache and submit
388388
signedDataList, marshalledData, err := cm.GetPendingData(ctx)
389389
require.NoError(t, err)
390-
err = submitter.SubmitData(ctx, signedDataList, marshalledData, cm, signer, gen)
390+
err = submitter.SubmitData(ctx, signedDataList, marshalledData, cm, signer)
391391
require.NoError(t, err)
392392
mockDA.AssertNotCalled(t, "Submit", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)
393393

@@ -397,7 +397,7 @@ func TestDASubmitter_SubmitData_SkipsEmptyData(t *testing.T) {
397397
}
398398

399399
func TestDASubmitter_SubmitData_NoPendingData(t *testing.T) {
400-
submitter, _, cm, mockDA, gen := setupDASubmitterTest(t)
400+
submitter, _, cm, mockDA, _ := setupDASubmitterTest(t)
401401
ctx := context.Background()
402402

403403
// Create test signer
@@ -406,7 +406,7 @@ func TestDASubmitter_SubmitData_NoPendingData(t *testing.T) {
406406
// Get data from cache (should be empty) and submit
407407
dataList, marshalledData, err := cm.GetPendingData(ctx)
408408
require.NoError(t, err)
409-
err = submitter.SubmitData(ctx, dataList, marshalledData, cm, signer, gen)
409+
err = submitter.SubmitData(ctx, dataList, marshalledData, cm, signer)
410410
require.NoError(t, err) // Should succeed with no action
411411
mockDA.AssertNotCalled(t, "Submit", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)
412412
}
@@ -447,7 +447,7 @@ func TestDASubmitter_SubmitData_NilSigner(t *testing.T) {
447447
// Get data from cache and submit with nil signer - should fail
448448
signedDataList, marshalledData, err := cm.GetPendingData(ctx)
449449
require.NoError(t, err)
450-
err = submitter.SubmitData(ctx, signedDataList, marshalledData, cm, nil, gen)
450+
err = submitter.SubmitData(ctx, signedDataList, marshalledData, cm, nil)
451451
require.Error(t, err)
452452
assert.Contains(t, err.Error(), "signer is nil")
453453
mockDA.AssertNotCalled(t, "Submit", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)
@@ -503,7 +503,7 @@ func TestDASubmitter_SignData(t *testing.T) {
503503
}
504504

505505
// Create signed data
506-
resultData, resultDataBz, err := submitter.signData(t.Context(), dataList, dataListBz, signer, gen)
506+
resultData, resultDataBz, err := submitter.signData(t.Context(), dataList, dataListBz, signer)
507507
require.NoError(t, err)
508508

509509
// Should have 2 items (empty data skipped)
@@ -542,7 +542,7 @@ func TestDASubmitter_SignData_NilSigner(t *testing.T) {
542542
}
543543

544544
// Create signed data with nil signer - should fail
545-
_, _, err := submitter.signData(t.Context(), dataList, dataListBz, nil, gen)
545+
_, _, err := submitter.signData(t.Context(), dataList, dataListBz, nil)
546546
require.Error(t, err)
547547
assert.Contains(t, err.Error(), "signer is nil")
548548
}

block/internal/submitting/da_submitter_tracing.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"go.opentelemetry.io/otel/trace"
1010

1111
"github.com/evstack/ev-node/block/internal/cache"
12-
"github.com/evstack/ev-node/pkg/genesis"
1312
"github.com/evstack/ev-node/pkg/signer"
1413
"github.com/evstack/ev-node/types"
1514
)
@@ -63,7 +62,7 @@ func (t *tracedDASubmitter) SubmitHeaders(ctx context.Context, headers []*types.
6362
return nil
6463
}
6564

66-
func (t *tracedDASubmitter) SubmitData(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error {
65+
func (t *tracedDASubmitter) SubmitData(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error {
6766
ctx, span := t.tracer.Start(ctx, "DASubmitter.SubmitData",
6867
trace.WithAttributes(
6968
attribute.Int("data.count", len(signedDataList)),
@@ -86,7 +85,7 @@ func (t *tracedDASubmitter) SubmitData(ctx context.Context, signedDataList []*ty
8685
)
8786
}
8887

89-
err := t.inner.SubmitData(ctx, signedDataList, marshalledData, cache, signer, genesis)
88+
err := t.inner.SubmitData(ctx, signedDataList, marshalledData, cache, signer)
9089
if err != nil {
9190
span.RecordError(err)
9291
span.SetStatus(codes.Error, err.Error())

block/internal/submitting/da_submitter_tracing_test.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@ import (
1212
"go.opentelemetry.io/otel/sdk/trace/tracetest"
1313

1414
"github.com/evstack/ev-node/block/internal/cache"
15-
"github.com/evstack/ev-node/pkg/genesis"
1615
"github.com/evstack/ev-node/pkg/signer"
1716
"github.com/evstack/ev-node/pkg/telemetry/testutil"
1817
"github.com/evstack/ev-node/types"
1918
)
2019

2120
type mockDASubmitterAPI struct {
2221
submitHeadersFn func(ctx context.Context, headers []*types.SignedHeader, marshalledHeaders [][]byte, cache cache.Manager, signer signer.Signer) error
23-
submitDataFn func(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error
22+
submitDataFn func(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error
2423
}
2524

2625
func (m *mockDASubmitterAPI) SubmitHeaders(ctx context.Context, headers []*types.SignedHeader, marshalledHeaders [][]byte, cache cache.Manager, signer signer.Signer) error {
@@ -30,9 +29,9 @@ func (m *mockDASubmitterAPI) SubmitHeaders(ctx context.Context, headers []*types
3029
return nil
3130
}
3231

33-
func (m *mockDASubmitterAPI) SubmitData(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error {
32+
func (m *mockDASubmitterAPI) SubmitData(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error {
3433
if m.submitDataFn != nil {
35-
return m.submitDataFn(ctx, signedDataList, marshalledData, cache, signer, genesis)
34+
return m.submitDataFn(ctx, signedDataList, marshalledData, cache, signer)
3635
}
3736
return nil
3837
}
@@ -131,7 +130,7 @@ func TestTracedDASubmitter_SubmitHeaders_Empty(t *testing.T) {
131130

132131
func TestTracedDASubmitter_SubmitData_Success(t *testing.T) {
133132
mock := &mockDASubmitterAPI{
134-
submitDataFn: func(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error {
133+
submitDataFn: func(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error {
135134
return nil
136135
},
137136
}
@@ -147,7 +146,7 @@ func TestTracedDASubmitter_SubmitData_Success(t *testing.T) {
147146
[]byte("data2data2"),
148147
}
149148

150-
err := submitter.SubmitData(ctx, signedDataList, marshalledData, nil, nil, genesis.Genesis{})
149+
err := submitter.SubmitData(ctx, signedDataList, marshalledData, nil, nil)
151150
require.NoError(t, err)
152151

153152
spans := sr.Ended()
@@ -166,7 +165,7 @@ func TestTracedDASubmitter_SubmitData_Success(t *testing.T) {
166165
func TestTracedDASubmitter_SubmitData_Error(t *testing.T) {
167166
expectedErr := errors.New("data submission failed")
168167
mock := &mockDASubmitterAPI{
169-
submitDataFn: func(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error {
168+
submitDataFn: func(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error {
170169
return expectedErr
171170
},
172171
}
@@ -178,7 +177,7 @@ func TestTracedDASubmitter_SubmitData_Error(t *testing.T) {
178177
}
179178
marshalledData := [][]byte{[]byte("data1")}
180179

181-
err := submitter.SubmitData(ctx, signedDataList, marshalledData, nil, nil, genesis.Genesis{})
180+
err := submitter.SubmitData(ctx, signedDataList, marshalledData, nil, nil)
182181
require.Error(t, err)
183182
require.Equal(t, expectedErr, err)
184183

block/internal/submitting/submitter.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
// DASubmitterAPI defines minimal methods needed by Submitter for DA submissions.
2727
type DASubmitterAPI interface {
2828
SubmitHeaders(ctx context.Context, headers []*types.SignedHeader, marshalledHeaders [][]byte, cache cache.Manager, signer signer.Signer) error
29-
SubmitData(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer, genesis genesis.Genesis) error
29+
SubmitData(ctx context.Context, signedDataList []*types.SignedData, marshalledData [][]byte, cache cache.Manager, signer signer.Signer) error
3030
}
3131

3232
// Submitter handles DA submission and inclusion processing for both sync and aggregator nodes
@@ -291,7 +291,7 @@ func (s *Submitter) daSubmissionLoop() {
291291
Dur("time_since_last", timeSinceLastSubmit).
292292
Msg("batching strategy triggered data submission")
293293

294-
if err := s.daSubmitter.SubmitData(s.ctx, signedDataList, marshalledData, s.cache, s.signer, s.genesis); err != nil {
294+
if err := s.daSubmitter.SubmitData(s.ctx, signedDataList, marshalledData, s.cache, s.signer); err != nil {
295295
// Check for unrecoverable errors that indicate a critical issue
296296
if errors.Is(err, common.ErrOversizedItem) {
297297
s.logger.Error().Err(err).

block/internal/submitting/submitter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ func (f *fakeDASubmitter) SubmitHeaders(ctx context.Context, _ []*types.SignedHe
429429
return nil
430430
}
431431

432-
func (f *fakeDASubmitter) SubmitData(ctx context.Context, _ []*types.SignedData, _ [][]byte, _ cache.Manager, _ signer.Signer, _ genesis.Genesis) error {
432+
func (f *fakeDASubmitter) SubmitData(ctx context.Context, _ []*types.SignedData, _ [][]byte, _ cache.Manager, _ signer.Signer) error {
433433
select {
434434
case f.chData <- struct{}{}:
435435
default:

block/internal/syncing/p2p_handler.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ func (h *P2PHandler) ProcessHeight(ctx context.Context, height uint64, heightInC
8181
}
8282
return err
8383
}
84+
if got := p2pHeader.SignedHeader.Height(); got != height {
85+
err := fmt.Errorf("header height mismatch: requested %d, got %d", height, got)
86+
h.logger.Warn().Uint64("requested_height", height).Uint64("header_height", got).Err(err).Msg("discarding mismatched header from P2P")
87+
return err
88+
}
8489

8590
p2pData, err := h.dataStore.GetByHeight(ctx, height)
8691
if err != nil {
@@ -89,6 +94,11 @@ func (h *P2PHandler) ProcessHeight(ctx context.Context, height uint64, heightInC
8994
}
9095
return err
9196
}
97+
if got := p2pData.Height(); got != height {
98+
err := fmt.Errorf("data height mismatch: requested %d, got %d", height, got)
99+
h.logger.Warn().Uint64("requested_height", height).Uint64("data_height", got).Err(err).Msg("discarding mismatched data from P2P")
100+
return err
101+
}
92102
dataCommitment := p2pData.DACommitment()
93103
if !bytes.Equal(p2pHeader.DataHash[:], dataCommitment[:]) {
94104
err := fmt.Errorf("data hash mismatch: header %x, data %x", p2pHeader.DataHash, dataCommitment)

block/internal/syncing/syncer.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,11 @@ func (s *Syncer) initializeState() error {
331331
}
332332
if len(state.NextProposerAddress) == 0 {
333333
state.NextProposerAddress = s.initialProposerAddress(s.ctx)
334+
if state.LastBlockHeight > s.genesis.InitialHeight-1 {
335+
s.logger.Warn().
336+
Uint64("height", state.LastBlockHeight).
337+
Msg("loaded state without NextProposerAddress; repaired from execution/genesis. Verify chain has not rotated proposer before this upgrade")
338+
}
334339
}
335340
if state.DAHeight != 0 && state.DAHeight < s.genesis.DAStartHeight {
336341
return fmt.Errorf("DA height (%d) is lower than DA start height (%d)", state.DAHeight, s.genesis.DAStartHeight)

0 commit comments

Comments
 (0)