Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
401b1f9
fix(block/syncing): broadcast on sync nodes
julienrbrt Oct 6, 2025
a778aac
wording
julienrbrt Oct 6, 2025
18ec45d
typo
julienrbrt Oct 6, 2025
aaecf39
simplify!!
julienrbrt Oct 6, 2025
2fade27
tests
julienrbrt Oct 6, 2025
1eba937
trusting period + async save
julienrbrt Oct 6, 2025
2991c64
revert to writetostoreandbroadcast
tac0turtle Oct 6, 2025
510de9e
update the syner to ignore empty datahashes
tac0turtle Oct 6, 2025
26a7922
timing hack
tac0turtle Oct 6, 2025
253841c
add source to event for processing
tac0turtle Oct 6, 2025
42d0910
cleanups + fix tests
julienrbrt Oct 6, 2025
894f877
speedup processing
julienrbrt Oct 6, 2025
bc2eb11
prevent double fetching
julienrbrt Oct 6, 2025
75bb6c0
submit p2p heights directly
julienrbrt Oct 7, 2025
f9a9928
fix tests
julienrbrt Oct 7, 2025
76825cd
Merge branch 'main' into julien/sync-p2p
julienrbrt Oct 7, 2025
1a800bf
updates
julienrbrt Oct 7, 2025
a6efeb8
Merge branch 'main' into julien/sync-p2p
julienrbrt Oct 7, 2025
0f8ac38
Merge branch 'main' into julien/sync-p2p
julienrbrt Oct 7, 2025
4f482ae
updates
julienrbrt Oct 8, 2025
5c30004
updares
julienrbrt Oct 8, 2025
50c17d4
align p2p handler with p2p broadcast
julienrbrt Oct 8, 2025
c918bde
align with executor
julienrbrt Oct 8, 2025
104c01f
add last data for empty data
julienrbrt Oct 8, 2025
0b142b3
comment
julienrbrt Oct 8, 2025
6229481
Merge branch 'main' into julien/sync-p2p
julienrbrt Oct 8, 2025
e3f2687
do not broadcast on sync node
julienrbrt Oct 9, 2025
0eb1c76
reduce diff
julienrbrt Oct 9, 2025
d2631e9
Merge branch 'main' into julien/sync-p2p
julienrbrt Oct 9, 2025
576b71a
reduce diff
julienrbrt Oct 9, 2025
ca0f992
temp comment append
julienrbrt Oct 9, 2025
8a4c7d5
Merge branch 'main' into julien/sync-p2p
tac0turtle Oct 9, 2025
31e7659
Merge branch 'main' into julien/sync-p2p
julienrbrt Oct 9, 2025
ff652f3
uncomment append
julienrbrt Oct 9, 2025
2dc46a4
reduce diffsu
julienrbrt Oct 9, 2025
3ec6335
revert to writetostoreandbroadcast
tac0turtle Oct 13, 2025
1d8b50b
check height
tac0turtle Oct 13, 2025
f8a0edb
single interface and fix tests
tac0turtle Oct 13, 2025
1a20eb6
Merge branch 'main' into julien/sync-p2p
tac0turtle Oct 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
single interface and fix tests
  • Loading branch information
tac0turtle committed Oct 13, 2025
commit f8a0edbd6f4ae1fda9ba1ec050249832cbcc5622
12 changes: 12 additions & 0 deletions .mockery.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,15 @@ packages:
dir: ./block/internal/syncing
pkgname: syncing
filename: syncer_mock.go
github.com/evstack/ev-node/block/internal/common:
interfaces:
Broadcaster:
config:
dir: ./block/internal/common
pkgname: common
filename: broadcaster_mock.go
p2pHandler:
config:
dir: ./block/internal/syncing
pkgname: syncing
filename: syncer_mock.go
16 changes: 5 additions & 11 deletions block/components.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import (
"errors"
"fmt"

"github.com/celestiaorg/go-header"
"github.com/rs/zerolog"

"github.com/evstack/ev-node/block/internal/cache"
"github.com/evstack/ev-node/block/internal/common"
"github.com/evstack/ev-node/block/internal/executing"
"github.com/evstack/ev-node/block/internal/reaping"
"github.com/evstack/ev-node/block/internal/submitting"
Expand Down Expand Up @@ -122,12 +122,6 @@ func (bc *Components) Stop() error {
return errs
}

// broadcaster interface for P2P broadcasting
type broadcaster[H header.Header[H]] interface {
WriteToStoreAndBroadcast(ctx context.Context, payload H) error
Store() header.Store[H]
}

// NewSyncComponents creates components for a non-aggregator full node that can only sync blocks.
// Non-aggregator full nodes can sync from P2P and DA but cannot produce blocks or submit to DA.
// They have more sync capabilities than light nodes but no block production. No signer required.
Expand All @@ -137,8 +131,8 @@ func NewSyncComponents(
store store.Store,
exec coreexecutor.Executor,
da coreda.DA,
headerStore broadcaster[*types.SignedHeader],
dataStore broadcaster[*types.Data],
headerStore common.Broadcaster[*types.SignedHeader],
dataStore common.Broadcaster[*types.Data],
logger zerolog.Logger,
metrics *Metrics,
blockOpts BlockOptions,
Expand Down Expand Up @@ -200,8 +194,8 @@ func NewAggregatorComponents(
sequencer coresequencer.Sequencer,
da coreda.DA,
signer signer.Signer,
headerBroadcaster broadcaster[*types.SignedHeader],
dataBroadcaster broadcaster[*types.Data],
headerBroadcaster common.Broadcaster[*types.SignedHeader],
dataBroadcaster common.Broadcaster[*types.Data],
logger zerolog.Logger,
metrics *Metrics,
blockOpts BlockOptions,
Expand Down
142 changes: 142 additions & 0 deletions block/internal/common/broadcaster_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions block/internal/common/expected_interfaces.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package common

import (
"context"

"github.com/celestiaorg/go-header"
)

// broadcaster interface for P2P broadcasting
type Broadcaster[H header.Header[H]] interface {
WriteToStoreAndBroadcast(ctx context.Context, payload H) error
Store() header.Store[H]
}
13 changes: 4 additions & 9 deletions block/internal/executing/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,6 @@ import (
"github.com/evstack/ev-node/types"
)

// broadcaster interface for P2P broadcasting
type broadcaster[T any] interface {
WriteToStoreAndBroadcast(ctx context.Context, payload T) error
}

// Executor handles block production, transaction processing, and state management
type Executor struct {
// Core components
Expand All @@ -42,8 +37,8 @@ type Executor struct {
metrics *common.Metrics

// Broadcasting
headerBroadcaster broadcaster[*types.SignedHeader]
dataBroadcaster broadcaster[*types.Data]
headerBroadcaster common.Broadcaster[*types.SignedHeader]
dataBroadcaster common.Broadcaster[*types.Data]

// Configuration
config config.Config
Expand Down Expand Up @@ -81,8 +76,8 @@ func NewExecutor(
metrics *common.Metrics,
config config.Config,
genesis genesis.Genesis,
headerBroadcaster broadcaster[*types.SignedHeader],
dataBroadcaster broadcaster[*types.Data],
headerBroadcaster common.Broadcaster[*types.SignedHeader],
dataBroadcaster common.Broadcaster[*types.Data],
logger zerolog.Logger,
options common.BlockOptions,
errorCh chan<- error,
Expand Down
12 changes: 8 additions & 4 deletions block/internal/executing/executor_lazy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ func TestLazyMode_ProduceBlockLogic(t *testing.T) {

mockExec := testmocks.NewMockExecutor(t)
mockSeq := testmocks.NewMockSequencer(t)
hb := &mockBroadcaster[*types.SignedHeader]{}
db := &mockBroadcaster[*types.Data]{}
hb := common.NewMockBroadcaster[*types.SignedHeader](t)
hb.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db := common.NewMockBroadcaster[*types.Data](t)
db.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec, err := NewExecutor(
memStore,
Expand Down Expand Up @@ -155,8 +157,10 @@ func TestRegularMode_ProduceBlockLogic(t *testing.T) {

mockExec := testmocks.NewMockExecutor(t)
mockSeq := testmocks.NewMockSequencer(t)
hb := &mockBroadcaster[*types.SignedHeader]{}
db := &mockBroadcaster[*types.Data]{}
hb := common.NewMockBroadcaster[*types.SignedHeader](t)
hb.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db := common.NewMockBroadcaster[*types.Data](t)
db.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec, err := NewExecutor(
memStore,
Expand Down
17 changes: 10 additions & 7 deletions block/internal/executing/executor_logic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,11 @@ func TestProduceBlock_EmptyBatch_SetsEmptyDataHash(t *testing.T) {
mockExec := testmocks.NewMockExecutor(t)
mockSeq := testmocks.NewMockSequencer(t)

// Broadcasters are required by produceBlock; use simple mocks
hb := &mockBroadcaster[*types.SignedHeader]{}
db := &mockBroadcaster[*types.Data]{}
// Broadcasters are required by produceBlock; use generated mocks
hb := common.NewMockBroadcaster[*types.SignedHeader](t)
hb.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db := common.NewMockBroadcaster[*types.Data](t)
db.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec, err := NewExecutor(
memStore,
Expand Down Expand Up @@ -126,8 +128,7 @@ func TestProduceBlock_EmptyBatch_SetsEmptyDataHash(t *testing.T) {
assert.EqualValues(t, common.DataHashForEmptyTxs, sh.DataHash)

// Broadcasters should have been called with the produced header and data
assert.True(t, hb.called)
assert.True(t, db.called)
// The testify mock framework tracks calls automatically
}

func TestPendingLimit_SkipsProduction(t *testing.T) {
Expand All @@ -154,8 +155,10 @@ func TestPendingLimit_SkipsProduction(t *testing.T) {

mockExec := testmocks.NewMockExecutor(t)
mockSeq := testmocks.NewMockSequencer(t)
hb := &mockBroadcaster[*types.SignedHeader]{}
db := &mockBroadcaster[*types.Data]{}
hb := common.NewMockBroadcaster[*types.SignedHeader](t)
hb.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db := common.NewMockBroadcaster[*types.Data](t)
db.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec, err := NewExecutor(
memStore,
Expand Down
27 changes: 17 additions & 10 deletions block/internal/executing/executor_restart_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ func TestExecutor_RestartUsesPendingHeader(t *testing.T) {
// Create first executor instance
mockExec1 := testmocks.NewMockExecutor(t)
mockSeq1 := testmocks.NewMockSequencer(t)
hb1 := &mockBroadcaster[*types.SignedHeader]{}
db1 := &mockBroadcaster[*types.Data]{}
hb1 := common.NewMockBroadcaster[*types.SignedHeader](t)
hb1.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db1 := common.NewMockBroadcaster[*types.Data](t)
db1.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec1, err := NewExecutor(
memStore,
Expand Down Expand Up @@ -165,8 +167,10 @@ func TestExecutor_RestartUsesPendingHeader(t *testing.T) {
// Create second executor instance (restart scenario)
mockExec2 := testmocks.NewMockExecutor(t)
mockSeq2 := testmocks.NewMockSequencer(t)
hb2 := &mockBroadcaster[*types.SignedHeader]{}
db2 := &mockBroadcaster[*types.Data]{}
hb2 := common.NewMockBroadcaster[*types.SignedHeader](t)
hb2.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db2 := common.NewMockBroadcaster[*types.Data](t)
db2.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec2, err := NewExecutor(
memStore, // same store
Expand Down Expand Up @@ -225,8 +229,7 @@ func TestExecutor_RestartUsesPendingHeader(t *testing.T) {
assert.Equal(t, pendingData.DACommitment(), finalHeader.DataHash)

// Verify broadcasters were called with the pending block data
assert.True(t, hb2.called, "header broadcaster should be called")
assert.True(t, db2.called, "data broadcaster should be called")
// The testify mock framework tracks calls automatically

// Verify the executor state was updated correctly
finalState := exec2.getLastState()
Expand Down Expand Up @@ -262,8 +265,10 @@ func TestExecutor_RestartNoPendingHeader(t *testing.T) {
// Create first executor and produce one block
mockExec1 := testmocks.NewMockExecutor(t)
mockSeq1 := testmocks.NewMockSequencer(t)
hb1 := &mockBroadcaster[*types.SignedHeader]{}
db1 := &mockBroadcaster[*types.Data]{}
hb1 := common.NewMockBroadcaster[*types.SignedHeader](t)
hb1.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db1 := common.NewMockBroadcaster[*types.Data](t)
db1.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec1, err := NewExecutor(
memStore,
Expand Down Expand Up @@ -312,8 +317,10 @@ func TestExecutor_RestartNoPendingHeader(t *testing.T) {
// Create second executor (restart)
mockExec2 := testmocks.NewMockExecutor(t)
mockSeq2 := testmocks.NewMockSequencer(t)
hb2 := &mockBroadcaster[*types.SignedHeader]{}
db2 := &mockBroadcaster[*types.Data]{}
hb2 := common.NewMockBroadcaster[*types.SignedHeader](t)
hb2.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()
db2 := common.NewMockBroadcaster[*types.Data](t)
db2.EXPECT().WriteToStoreAndBroadcast(mock.Anything, mock.Anything).Return(nil).Maybe()

exec2, err := NewExecutor(
memStore,
Expand Down
Loading
Loading