Skip to content

SWIP-061: BPS multihop — FCFS multicast tree - #105

Open
zelig wants to merge 3 commits into
masterfrom
swip-61-bps-multihop
Open

SWIP-061: BPS multihop — FCFS multicast tree#105
zelig wants to merge 3 commits into
masterfrom
swip-61-bps-multihop

Conversation

@zelig

@zelig zelig commented Aug 5, 2026

Copy link
Copy Markdown
Member

Extends SWIP-60 (#104): removes the singlehop audience ceiling. A full node at capacity answers Subscribe by probing its own subtree over existing streams and returning the two shallowest attachment points — the joiner attaches to both, so every node keeps two parents (typically sisters): churn is masked, not suffered, self-healing is re-running the join, and withholding shows by comparing feeds. Join is ideally a two-step process regardless of tree size.

Key properties: forwarders are subscribers (accepting your first child = becoming a relay); no standing control state — idle cohorts are silent, probes carry depth in the frame itself; no depth bound (per-hop pricing steers joins rootward; closed cohorts are structurally singlehop); CohortSpec untouched; three control frames (Reparent, Probe, Candidates) fill the reserved Broadcast range; single new Ack field. Unmodified SWIP-60 clients attach as conformant (single-parented) leaves.

Deliberately out of scope (own SWIPs): bandwidth incentives, message history (pre-subscription delivery), broker discovery (SWIP-59, #103), NAT traversal (transport: circuit relay + DCUtR).

Wire: assets/swip-61/bps.proto — the SWIP-60 proto with the multihop control plane filled in. Implementation groundwork: bee ethersphere/bee#5435.

🤖 Generated with Claude Code

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@zelig zelig self-assigned this Aug 6, 2026
@zelig zelig changed the title add SWIP-61: BPS multihop — FCFS multicast tree SWIP-061: BPS multihop — FCFS multicast tree Aug 7, 2026
…PO_MIN

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per SWIP-65 (PR #106): a delivery gap on a self-indexed cohort is
detectable and recoverable from storage, so the contract is satisfied
by deliver-or-recover. The second parent becomes a per-subscriber
latency/cost choice - single-parented nodes were already well-formed,
and a single-parented relay endangers only itself. Conformance items
5-6 bind only nodes that maintain a second parent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@zelig

zelig commented Aug 9, 2026

Copy link
Copy Markdown
Member Author

Amendment pushed (1ca57ae), companion to SWIP-65 (#106):

  • Dual parenting is not required on self-indexed cohorts: a gap there is detectable at the next frame and recoverable from storage, so the contract is satisfied by deliver-or-recover. The second parent becomes a per-subscriber latency/cost choice — single-parented nodes were already well-formed (SWIP-60 leaves), and a single-parented relay endangers only itself. Conformance items 5–6 bind only nodes that maintain one. Dual parenting remains the costlier-but-faster product for the gap-intolerant live edge.

🤖 Generated with Claude Code

@zelig
zelig marked this pull request as ready for review August 11, 2026 07:55
Copilot AI lite review requested due to automatic review settings August 11, 2026 07:55

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces SWIP-61, extending the BPS (Broadcast Pub/Sub) family beyond the SWIP-60 single-hop audience ceiling by specifying a multihop, FCFS multicast tree join/control plane with subtree probing and dual-parent attachment for churn masking.

Changes:

  • Adds the SWIP-61 specification document describing probe-based joining, two-parent resilience, and make-before-break reparenting.
  • Adds the SWIP-61 wire specification (bps.proto) defining Reparent, Probe, Candidates, and Ack.candidates.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.

File Description
SWIPs/swip-61.md New SWIP-61 spec describing multihop join/probe behavior, dual-parent resilience, and reparenting semantics.
SWIPs/assets/swip-61/bps.proto Proto definitions for SWIP-61 control frames and the Ack extension carrying attachment candidates.
Suppressed comments (3)

SWIPs/swip-61.md:381

  • Inconsistent acronym casing: dCUTr here should match the DCUtR spelling used earlier in the document.
dCUTr: [bee#5355](https://github.com/ethersphere/bee/issues/5355)

SWIPs/assets/swip-61/bps.proto:84

  • The Subscribe comment is broker-specific, but in multihop a joiner can Subscribe to any known cohort node (broker or relay). Keeping the comment broker-only is misleading for implementers.
// Joiner -> broker: names the topic — nothing more. Subscribers carry no
// cohort metadata; auth is present iff the joiner publishes (publishers
// connect directly to the broker).

SWIPs/assets/swip-61/bps.proto:96

  • The Ack comment is broker-specific, but in multihop relays also answer Subscribe with Ack. Adjust wording to cover any cohort node responding on the stream.
// Broker -> peer, answering Open or Subscribe. The echoed CohortSpec lets a
// subscriber verify every message end-to-end against the topic binding.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread SWIPs/swip-61.md
Comment on lines +6 to +9
status: Draft
type: Standards Track (Networking)
created: 2026-08-04
requires: 60
Comment thread SWIPs/swip-61.md
Comment on lines +189 to +191
Reaching a NAT'd relay is the transport's business, not this protocol's: libp2p circuit
relay + DCUtR hole punching (the dcutr work item, bee
[#5355](https://github.com/ethersphere/bee/issues/5355)). BPS carries no signalling for
Comment on lines +71 to +74
// Stream establishment, stream name "pubsub/1.0.0" — one stream per (peer, topic).
// The first message on a fresh stream is Open (fixes a new cohort) or
// Subscribe (joins an existing one); the broker answers with Ack.
// ---------------------------------------------------------------------------
Comment on lines +2 to +3
// Spec: swip-bps-singlehop.md (SWIP-60, base protocol) and
// swip-bps-multihop.md (SWIP-61, multihop control plane).
Comment thread SWIPs/swip-61.md
Two cases:

- **graceful leave** — a departing relay `Reparent`s each child toward a replacement
(its own parents, or spread over its children **(?)**) before closing; the child's
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants