From 28da417263d3c155136abf128330995046526474 Mon Sep 17 00:00:00 2001 From: Jonathan Oppenheimer Date: Mon, 22 Sep 2025 13:58:17 -0400 Subject: [PATCH 1/4] uplift gossip package --- vms/evm/gossip/handler.go | 80 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 vms/evm/gossip/handler.go diff --git a/vms/evm/gossip/handler.go b/vms/evm/gossip/handler.go new file mode 100644 index 000000000000..c33a5eb2a860 --- /dev/null +++ b/vms/evm/gossip/handler.go @@ -0,0 +1,80 @@ +// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package gossip + +import ( + "context" + "fmt" + "time" + + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/network/p2p" + "github.com/ava-labs/avalanchego/network/p2p/gossip" + "github.com/ava-labs/avalanchego/snow/engine/common" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/prometheus/client_golang/prometheus" +) + +var _ p2p.Handler = (*txGossipHandler)(nil) + +func NewTxGossipHandler[T gossip.Gossipable]( + log logging.Logger, + marshaller gossip.Marshaller[T], + mempool gossip.Set[T], + metrics gossip.Metrics, + maxMessageSize int, + throttlingPeriod time.Duration, + requestsPerPeer float64, + validators p2p.ValidatorSet, + registerer prometheus.Registerer, + namespace string, +) (*txGossipHandler, error) { + // push gossip messages can be handled from any peer + handler := gossip.NewHandler( + log, + marshaller, + mempool, + metrics, + maxMessageSize, + ) + + throttledHandler, err := p2p.NewDynamicThrottlerHandler( + log, + handler, + validators, + throttlingPeriod, + requestsPerPeer, + registerer, + namespace, + ) + if err != nil { + return nil, fmt.Errorf("failed to initialize throttler handler: %w", err) + } + + // pull gossip requests are filtered by validators and are throttled + // to prevent spamming + validatorHandler := p2p.NewValidatorHandler( + throttledHandler, + validators, + log, + ) + + return &txGossipHandler{ + appGossipHandler: handler, + appRequestHandler: validatorHandler, + }, nil +} + +type txGossipHandler struct { + appGossipHandler p2p.Handler + appRequestHandler p2p.Handler +} + +func (t *txGossipHandler) AppGossip(ctx context.Context, nodeID ids.NodeID, gossipBytes []byte) { + t.appGossipHandler.AppGossip(ctx, nodeID, gossipBytes) +} + +func (t *txGossipHandler) AppRequest(ctx context.Context, nodeID ids.NodeID, deadline time.Time, requestBytes []byte) ([]byte, *common.AppError) { + return t.appRequestHandler.AppRequest(ctx, nodeID, deadline, requestBytes) +} From e7a7fafc4ba4f3ad596cae1c1c56b99df6e8e0c3 Mon Sep 17 00:00:00 2001 From: Jonathan Oppenheimer Date: Mon, 22 Sep 2025 14:03:42 -0400 Subject: [PATCH 2/4] lint --- vms/evm/gossip/handler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vms/evm/gossip/handler.go b/vms/evm/gossip/handler.go index c33a5eb2a860..69c376957e1a 100644 --- a/vms/evm/gossip/handler.go +++ b/vms/evm/gossip/handler.go @@ -8,12 +8,13 @@ import ( "fmt" "time" + "github.com/prometheus/client_golang/prometheus" + "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/network/p2p" "github.com/ava-labs/avalanchego/network/p2p/gossip" "github.com/ava-labs/avalanchego/snow/engine/common" "github.com/ava-labs/avalanchego/utils/logging" - "github.com/prometheus/client_golang/prometheus" ) var _ p2p.Handler = (*txGossipHandler)(nil) From a3d7ed98a4558196451218645884e2281140a6e3 Mon Sep 17 00:00:00 2001 From: Jonathan Oppenheimer Date: Tue, 23 Sep 2025 10:35:42 -0400 Subject: [PATCH 3/4] move tx type above generator --- vms/evm/gossip/handler.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vms/evm/gossip/handler.go b/vms/evm/gossip/handler.go index 69c376957e1a..aeccac14a90e 100644 --- a/vms/evm/gossip/handler.go +++ b/vms/evm/gossip/handler.go @@ -19,6 +19,11 @@ import ( var _ p2p.Handler = (*txGossipHandler)(nil) +type txGossipHandler struct { + appGossipHandler p2p.Handler + appRequestHandler p2p.Handler +} + func NewTxGossipHandler[T gossip.Gossipable]( log logging.Logger, marshaller gossip.Marshaller[T], @@ -67,11 +72,6 @@ func NewTxGossipHandler[T gossip.Gossipable]( }, nil } -type txGossipHandler struct { - appGossipHandler p2p.Handler - appRequestHandler p2p.Handler -} - func (t *txGossipHandler) AppGossip(ctx context.Context, nodeID ids.NodeID, gossipBytes []byte) { t.appGossipHandler.AppGossip(ctx, nodeID, gossipBytes) } From 8fded3c9dcdd07851dfc99363a8cc133accbc6bf Mon Sep 17 00:00:00 2001 From: Jonathan Oppenheimer Date: Tue, 23 Sep 2025 12:48:55 -0400 Subject: [PATCH 4/4] change return type --- vms/evm/gossip/handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vms/evm/gossip/handler.go b/vms/evm/gossip/handler.go index aeccac14a90e..74ff9aab0f91 100644 --- a/vms/evm/gossip/handler.go +++ b/vms/evm/gossip/handler.go @@ -35,7 +35,7 @@ func NewTxGossipHandler[T gossip.Gossipable]( validators p2p.ValidatorSet, registerer prometheus.Registerer, namespace string, -) (*txGossipHandler, error) { +) (p2p.Handler, error) { // push gossip messages can be handled from any peer handler := gossip.NewHandler( log,