Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
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
15 changes: 5 additions & 10 deletions block/components.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import (
"errors"
"fmt"

goheader "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,11 +122,6 @@ func (bc *Components) Stop() error {
return errs
}

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

// 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 @@ -136,8 +131,8 @@ func NewSyncComponents(
store store.Store,
exec coreexecutor.Executor,
da coreda.DA,
headerStore goheader.Store[*types.SignedHeader],
dataStore goheader.Store[*types.Data],
headerStore common.Broadcaster[*types.SignedHeader],
dataStore common.Broadcaster[*types.Data],
logger zerolog.Logger,
metrics *Metrics,
blockOpts BlockOptions,
Expand Down Expand Up @@ -199,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.

12 changes: 12 additions & 0 deletions block/internal/common/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,22 @@ package common

import "github.com/evstack/ev-node/types"

// EventSource represents the origin of a block event
type EventSource string

const (
// SourceDA indicates the event came from the DA layer
SourceDA EventSource = "DA"
// SourceP2P indicates the event came from P2P network
SourceP2P EventSource = "P2P"
)

// DAHeightEvent represents a DA event for caching
type DAHeightEvent struct {
Header *types.SignedHeader
Data *types.Data
// DaHeight corresponds to the highest DA included height between the Header and Data.
DaHeight uint64
// Source indicates where this event originated from (DA or P2P)
Source EventSource
}
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
Loading
Loading