diff --git a/gossipsub-interop/experiment.py b/gossipsub-interop/experiment.py index 64135b3ca..420ef88c1 100644 --- a/gossipsub-interop/experiment.py +++ b/gossipsub-interop/experiment.py @@ -20,7 +20,7 @@ class ExperimentParams: def spread_heartbeat_delay( - node_count: int, template_gs_params: GossipSubParams + node_count: int, topics: List[str], template_gs_params: GossipSubParams ) -> List[ScriptInstruction]: instructions = [] initial_delay = timedelta(seconds=0.1) @@ -32,7 +32,8 @@ def spread_heartbeat_delay( instructions.append( script_instruction.IfNodeIDEquals( nodeID=i, - instruction=script_instruction.InitGossipSub(gossipSubParams=gs_params), + # group all the topics in a single bundle + instruction=script_instruction.InitGossipSub(topicBundles=[topics], gossipSubParams=gs_params), ) ) return instructions @@ -48,9 +49,10 @@ def scenario( if disable_gossip: gs_params.Dlazy = 0 gs_params.GossipFactor = 0 - instructions.extend(spread_heartbeat_delay(node_count, gs_params)) topic = "a-subnet" + instructions.extend(spread_heartbeat_delay(node_count, [topic], gs_params)) + blob_count = 48 # According to data gathered by lighthouse, a column takes around # 5ms. @@ -78,9 +80,9 @@ def scenario( if disable_gossip: gs_params.Dlazy = 0 gs_params.GossipFactor = 0 - instructions.extend(spread_heartbeat_delay(node_count, gs_params)) topic_a = "topic-a" topic_b = "topic-b" + instructions.extend(spread_heartbeat_delay(node_count, [topic_a, topic_b], gs_params)) number_of_conns_per_node = 20 if number_of_conns_per_node >= node_count: number_of_conns_per_node = node_count - 1 diff --git a/gossipsub-interop/go-libp2p/experiment.go b/gossipsub-interop/go-libp2p/experiment.go index 8bb61f19b..5e3943393 100644 --- a/gossipsub-interop/go-libp2p/experiment.go +++ b/gossipsub-interop/go-libp2p/experiment.go @@ -61,7 +61,7 @@ func (n *scriptedNode) runInstruction(ctx context.Context, instruction ScriptIns // Process each script instruction switch a := instruction.(type) { case InitGossipSubInstruction: - psOpts := pubsubOptions(n.slogger, a.GossipSubParams) + psOpts := pubsubOptions(n.slogger, a.TopicBundles, a.GossipSubParams) ps, err := pubsub.NewGossipSub(ctx, n.h, psOpts...) if err != nil { return err diff --git a/gossipsub-interop/go-libp2p/go.mod b/gossipsub-interop/go-libp2p/go.mod index 477b01ceb..d0a634797 100644 --- a/gossipsub-interop/go-libp2p/go.mod +++ b/gossipsub-interop/go-libp2p/go.mod @@ -109,3 +109,5 @@ require ( google.golang.org/protobuf v1.36.5 // indirect lukechampine.com/blake3 v1.4.0 // indirect ) + +replace github.com/libp2p/go-libp2p-pubsub => github.com/ppopth/go-libp2p-pubsub v0.15.1-0.20251104105446-b797c629a411 diff --git a/gossipsub-interop/go-libp2p/go.sum b/gossipsub-interop/go-libp2p/go.sum index 9453d0bc0..66e087d9d 100644 --- a/gossipsub-interop/go-libp2p/go.sum +++ b/gossipsub-interop/go-libp2p/go.sum @@ -137,8 +137,6 @@ github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQ github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-pubsub v0.13.1 h1:tV3ttzzZSCk0EtEXnxVmWIXgjVxXx+20Jwjbs/Ctzjo= -github.com/libp2p/go-libp2p-pubsub v0.13.1/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= @@ -258,6 +256,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/ppopth/go-libp2p-pubsub v0.15.1-0.20251104105446-b797c629a411 h1:DqtAOcQRMnIhZ0a95DCuJWsoTT+ptnpVfHcfyHeUaUw= +github.com/ppopth/go-libp2p-pubsub v0.15.1-0.20251104105446-b797c629a411/go.mod h1:lr4oE8bFgQaifRcoc2uWhWWiK6tPdOEKpUuR408GFN4= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= diff --git a/gossipsub-interop/go-libp2p/instruction.go b/gossipsub-interop/go-libp2p/instruction.go index 9c1149499..c4f02e250 100644 --- a/gossipsub-interop/go-libp2p/instruction.go +++ b/gossipsub-interop/go-libp2p/instruction.go @@ -73,6 +73,7 @@ func (SetTopicValidationDelayInstruction) isInstruction() {} // InitGossipSubInstruction represents an instruction to initialize GossipSub with specific parameters type InitGossipSubInstruction struct { Type string `json:"type"` + TopicBundles [][]string `json:"topicBundles"` GossipSubParams pubsub.GossipSubParams `json:"gossipSubParams"` } diff --git a/gossipsub-interop/go-libp2p/main.go b/gossipsub-interop/go-libp2p/main.go index ebf589072..9314ecfbb 100644 --- a/gossipsub-interop/go-libp2p/main.go +++ b/gossipsub-interop/go-libp2p/main.go @@ -27,7 +27,7 @@ var ( ) // pubsubOptions creates a list of options to configure our router with. -func pubsubOptions(slogger *slog.Logger, params pubsub.GossipSubParams) []pubsub.Option { +func pubsubOptions(slogger *slog.Logger, topicBundles [][]string, params pubsub.GossipSubParams) []pubsub.Option { tr := gossipTracer{logger: slogger.With("service", "gossipsub")} psOpts := []pubsub.Option{ pubsub.WithMessageSignaturePolicy(pubsub.StrictNoSign), @@ -42,7 +42,9 @@ func pubsubOptions(slogger *slog.Logger, params pubsub.GossipSubParams) []pubsub pubsub.WithGossipSubParams(params), pubsub.WithEventTracer(&tr), } - + if len(topicBundles) > 0 { + psOpts = append(psOpts, pubsub.WithTopicTableExtension(pubsub.TopicTableExtensionConfig{TopicBundles: topicBundles})) + } return psOpts } diff --git a/gossipsub-interop/script_instruction.py b/gossipsub-interop/script_instruction.py index cfc5143a4..97267d1fe 100644 --- a/gossipsub-interop/script_instruction.py +++ b/gossipsub-interop/script_instruction.py @@ -64,6 +64,7 @@ class InitGossipSub(BaseModel): """ type: Literal["initGossipSub"] = "initGossipSub" + topicBundles: List[List[str]] gossipSubParams: GossipSubParams