Multicast Subtree Group Announcement Frame Format
A receiver has to know which network group carries the slice of traffic it wants before it can subscribe. This has senders announce that mapping periodically, so a listener can join without being told out of band.
Reference for an AI
Everything an assistant needs to answer questions about BRC-127 accurately, including what it depends on.
Summary
- Why
- Subtree identifiers change with every new block candidate, so listeners have no static way to know which ones belong to a logical group they care about.
- What
- BRC-127 defines a 64-byte multicast control datagram that block assemblers periodically broadcast to announce which BRC-124 SubtreeID currently belongs to which stable 128-bit group.
- How
- A sender fills in the fixed-offset fields (SubtreeID, GroupID, epoch, TTL) and broadcasts the datagram every 10 to 30 seconds on the reserved control-plane multicast group, while listeners join that group, record each SubtreeID against its group with an expiry, evict stale entries, and use the resulting registry to…
What this lets you do
- Map a volatile SubtreeID to a stable 128-bit group identifier
- Subscribe to a logical class of transactions instead of a fixed subtree list
- Filter incoming BRC-124 frames by group membership without static config
- Derive GroupIDs deterministically with XXH3-128 or assign them as opaque values
- Restrict which senders' announcements a listener trusts via include/exclude filters
Written by claude-sonnet-5 from the specification text. Where the two differ, the original is correct.
The specification
Abstract
This BRC specifies a periodic multicast announcement protocol that maps BRC-124
SubtreeID values to stable 128-bit group identifiers. Senders broadcast
compact 64-byte datagrams on a reserved control-plane multicast group, allowing
listeners to dynamically learn which subtree IDs belong to which groups and
filter incoming transaction traffic accordingly — without static configuration.
Copyright
This BRC is licensed under the Open BSV License.
Motivation
BRC-124 frames carry a 32-byte SubtreeID that identifies the transaction
subtree to which each frame belongs. Subtree IDs are derived deterministically
by each block assembler and change with every new work candidate. Static subtree
ID lists are impractical for listeners that want to subscribe to a logical class
of transactions (a subtree group) across block boundaries.
This BRC introduces:
- Subtree groups — stable 128-bit identifiers that logically group related subtree IDs. A group ID is an XXH3-128 hash of a canonical group name, or any operator-assigned 128-bit value.
- SubtreeGroupAnnounce — a periodic 64-byte control datagram sent by block
assemblers announcing that a given
SubtreeIDis a member of a given group. - Dynamic listener filtering — listeners join a dedicated control-plane multicast group, process SubtreeGroupAnnounce datagrams, maintain a time-bounded registry, and pass transactions based on group membership.
Subtrees are temporal: they are valid only for the duration of a work candidate. Announcements are sent periodically; entries not refreshed within their TTL are evicted automatically.
Specification
Control-Plane Group
SubtreeGroupAnnounce datagrams are sent to the reserved control-plane multicast group
index 0xFFFC (GroupSubtreeGroupAnnounce), one slot below the BRC-126 beacon
group (0xFFFD).
Control-plane addresses use the IANA-aligned layout: bytes 0–1 carry the scope
prefix, bytes 2–11 are zero (IANA 96-bit boundary), bytes 12–13 carry the IANA
Bitcoin group-id (0x000B), and bytes 14–15 carry the group index.
| Scope | Announce Group |
|---|---|
Site (0x05) | FF05::B:FFFC |
Org (0x08) | FF08::B:FFFC |
Global (0x0E) | FF0E::B:FFFC |
Operators MAY override the IANA group-id (0x000B) via the -mc-group-id
configuration flag for private deployments; the resulting addresses change
accordingly.
Announce-group addresses are shown in ASM (FF0x) form; under SSM, substitute
the FF3x prefix per BRC-129 (FF3E::B:FFFC for inter-domain
scope, which is SSM-only per RFC 8815). The datagram format is unchanged. This
is a control-plane group whose source — the announcing block assembler — is not
discoverable from within the group, so SSM listeners (S,G)-join using the
bootstrap source lists defined in BRC-129; these are the same source addresses a
listener may configure in the include filter (see Sender Filtering).
SubtreeGroupAnnounce Wire Format (MsgType 0x30) — 64 bytes
| Offset | Size | Field | Description |
|---|---|---|---|
| 0 | 4 | Network Magic | 0xE3E1F3E8 (BSV mainnet P2P magic) |
| 4 | 2 | Protocol Ver | 0x02BF (703, BSV large-block baseline) |
| 6 | 1 | MsgType | 0x30 (SubtreeGroupAnnounce) |
| 7 | 1 | Flags | Reserved; must be 0x00 |
| 8 | 32 | SubtreeID | SHA-256 subtree root hash (from BRC-124 frame header) |
| 40 | 16 | GroupID | 128-bit group identifier, big-endian |
| 56 | 4 | Epoch | Unix timestamp (uint32 BE) when this announcement was created |
| 60 | 2 | TTL | Validity in seconds (uint16 BE); 0 = use listener default |
| 62 | 2 | Reserved | Must be 0x0000 |
Total: 64 bytes. Power-of-two message size; GroupID at offset 40 is 8-byte
aligned.
Flags (byte 7)
All bits are reserved and must be zero. Future versions of this protocol may define flag bits.
GroupID
A GroupID is a 128-bit value uniquely identifying a logical subtree group. It is recommended to derive GroupIDs using XXH3-128 applied to a canonical group name string, as this provides hardware-accelerated, collision-resistant derivation. GroupIDs may also be assigned directly as opaque 128-bit values.
TTL and Expiry
A TTL value of 0 instructs the listener to apply its locally configured
default TTL. Listeners SHOULD set the default TTL to at least 900 seconds (15
minutes) to accommodate block creation intervals. Senders SHOULD re-announce
each (SubtreeID, GroupID) pair at an interval well below the effective TTL
(recommended: every 10–30 seconds).
Multi-Group Membership
A single SubtreeID may belong to multiple groups. The sender emits one SubtreeGroupAnnounce datagram per (SubtreeID, GroupID) pair per announcement interval.
Sender Behaviour
- For each (SubtreeID, GroupID) pair, construct a 64-byte SubtreeGroupAnnounce datagram.
- Deliver the datagram to the SubtreeGroupAnnounce control group on the configured multicast scope(s). A sender on the multicast fabric sends it as a UDP packet directly. A sender that is not on the fabric, or that has no multicast egress of its own, MAY instead submit the same 64 bytes to an ingress proxy over its submission transport and have the proxy forward them to the control group unchanged. The datagram on the control group is identical either way, so a listener cannot tell the two apart and needs no knowledge of which was used.
- Repeat at the configured announcement interval (recommended: 10–30 seconds).
- On work reset (new block), stop announcing old SubtreeIDs. Listeners will evict them when the TTL expires.
No retransmission or sequencing is required. Periodic re-announcement provides eventual consistency.
Listener Behaviour
- Join the SubtreeGroupAnnounce control-plane multicast group on the configured scope(s).
- For each received datagram, validate the magic, ProtoVer, MsgType, and length.
- If a sender include/exclude filter is configured, check the UDP source address before processing.
- If the GroupID matches a subscribed group, record
(SubtreeID → expiry)in the group registry. - Periodically evict entries whose expiry has passed.
- On data-plane frame receipt, allow the frame if its SubtreeID is present in any subscribed group's registry.
Sender Filtering
Listeners MAY configure include and exclude filters on announcement source addresses (IPv6 addresses or CIDR prefixes). The evaluation order is: exclude first, then include. An empty include list accepts all non-excluded sources.
Example
SubtreeGroupAnnounce for SubtreeID A3F1...9247, GroupID
A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6, Epoch 1746800000, TTL 0 (use listener
default):
E3E1F3E8 // Network Magic
02BF // Protocol Version
30 // MsgType = SubtreeGroupAnnounce
00 // Flags = 0
A3F1E8B04C7D2A9156E3F08B4D7C2E9A // SubtreeID bytes 0–15
1B5F3D8E6C0A4279B1D5E8F3C6A09247 // SubtreeID bytes 16–31
A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6 // GroupID (128-bit)
67E27D80 // Epoch = 1746800000
0000 // TTL = 0 (use listener default)
0000 // Reserved
Constants Reference
| Name | Value | Hex | Description |
|---|---|---|---|
MagicBSV | 3823236072 | 0xE3E1F3E8 | BSV mainnet P2P magic |
ProtoVer | 703 | 0x02BF | Protocol version |
MsgTypeSubtreeGroupAnnounce | 48 | 0x30 | SubtreeGroupAnnounce datagram type |
GroupSubtreeGroupAnnounce | 65532 | 0xFFFC | Control-plane subtree group announce group |
GroupBeacon | 65533 | 0xFFFD | Control-plane beacon group (BRC-126) |
SubtreeGroupAnnounceSize | 64 | — | Fixed datagram size in bytes |
DefaultAnnounceTTL | 900 | — | Recommended listener default TTL (s) |
DefaultAnnounceInterval | 10 | — | Recommended sender re-announce interval (s) |
References
- BRC-124: Multicast Transaction Frame Format — Data-plane frame
format; defines
SubtreeID - BRC-129: Multicast Group Address Assignments — SSM/ASM addressing, scopes, and
(S,G)source discovery