Arena: map reward preimages to telemetry node names via first block import #11

Open
opened 2026-09-03 15:55:18 +00:00 by grenade · 0 comments
Owner

Feasibility checked 2026-09-03 against the live feed. It works, with a confidence signal that tells the honest cases from the ambiguous ones. Related: #2 (arena), #9 (range-aware leaderboard).

What the feed gives us

wss://feed-telemetry.quantus.cat/feed is stock substrate-telemetry, feed version 33. After subscribe:<planck genesis>:

  • AddedNode (code 3): node id, name, implementation, version, network peer id. 43 nodes on Planck at the time of checking, all named (karl node, quanpool-planck, DiffPool-QUAN-Planck, OGAWORLD/JAPAN, several QuantusMinerGUI, ...).
  • ImportedBlock (code 6): node id, [height, hash, block_time, timestamp, propagation_time]. The telemetry backend stamps the first node to report a hash with propagation_time = 0 and gives every later reporter its delay in ms after that first report.

Sampled 75 s at the tip (height 1,035,380 onward), 37 to 38 nodes importing each block:

height first reporter lead over the second reporter
1035380 QuantusMinerGUI 525 ms
1035381 QuantusMinerGUI 694 ms
1035382 QuantusMinerGUI 209 ms
1035383 married-jewel-9998 0 ms (tie with QuantusMinerGUI)
1035384 QuantusMinerGUI 217 ms
1035385 quanpool-planck 54 ms
1035386 married-jewel-9998 2 ms
1035387 OGAWORLD/JAPAN 188 ms

A node that authored a block imports it before announcing it, so it leads its peers by the announce-plus-gossip time, 200 to 700 ms here. When the author's node is not on telemetry, the first reporter is just the first peer to receive it by gossip, and the second reporter arrives within tens of ms. The lead over the second reporter is therefore the confidence signal: above about 150 ms the first reporter is the author; below about 50 ms the author is off-telemetry and the block is unattributable.

Design (arena exporter, which already holds both halves)

The exporter already parses the author preimage from every header it records, and already runs a feed client for the node census. Add:

  1. Ingest code 6 near the tip only (height within a few blocks of BestBlock, code 1), keeping per hash: first reporter, its timestamp, and the second reporter's delay. Old-history imports from syncing nodes are dropped by the height filter.
  2. In record(), where the header's preimage is known, look the hash up: if the lead exceeds the threshold, count (preimage -> node id); otherwise count (preimage -> unattributed).
  3. Export quantus_author_node_info{preimage, node_name, peer_id} = fraction of that preimage's attributed blocks first seen at that node, plus quantus_author_attributed_fraction{preimage} so a preimage whose owner is off-telemetry shows as such rather than as a wrong name.
  4. Dashboard: join the leaderboard on preimage with group_left(node_name), show name and confidence. Disambiguate duplicate names (QuantusMinerGUI appears under several node ids) with the short peer id.

Validation: our own preimage must map to our node's telemetry name with high confidence; if it does not, the threshold or the method is wrong.

Limits

  • Only authors whose node reports to telemetry can be named. From the sample, the biggest miners (QuantusMinerGUI, quanpool-planck, OGAWORLD/JAPAN) do report. 0x2ccf3929..., today's 30% miner, is the first one to check.
  • A pool's name is the pool's node, not its miners. That is still the interesting fact.
  • Names are self-declared and can collide or change; the peer id is the stable key.
  • Feed volume is real: about 270 messages/s on Planck, dominated by FinalizedBlock (code 7), which the exporter must discard cheaply.

Effort: about a day in the exporter plus the panel; no protocol change, no node change.

Feasibility checked 2026-09-03 against the live feed. It works, with a confidence signal that tells the honest cases from the ambiguous ones. Related: #2 (arena), #9 (range-aware leaderboard). ## What the feed gives us `wss://feed-telemetry.quantus.cat/feed` is stock substrate-telemetry, feed version 33. After `subscribe:<planck genesis>`: - `AddedNode` (code 3): node id, name, implementation, version, network peer id. 43 nodes on Planck at the time of checking, all named (`karl node`, `quanpool-planck`, `DiffPool-QUAN-Planck`, `OGAWORLD/JAPAN`, several `QuantusMinerGUI`, ...). - `ImportedBlock` (code 6): node id, `[height, hash, block_time, timestamp, propagation_time]`. The telemetry backend stamps the first node to report a hash with `propagation_time = 0` and gives every later reporter its delay in ms after that first report. Sampled 75 s at the tip (height 1,035,380 onward), 37 to 38 nodes importing each block: | height | first reporter | lead over the second reporter | | --- | --- | --- | | 1035380 | QuantusMinerGUI | 525 ms | | 1035381 | QuantusMinerGUI | 694 ms | | 1035382 | QuantusMinerGUI | 209 ms | | 1035383 | married-jewel-9998 | 0 ms (tie with QuantusMinerGUI) | | 1035384 | QuantusMinerGUI | 217 ms | | 1035385 | quanpool-planck | 54 ms | | 1035386 | married-jewel-9998 | 2 ms | | 1035387 | OGAWORLD/JAPAN | 188 ms | A node that authored a block imports it before announcing it, so it leads its peers by the announce-plus-gossip time, 200 to 700 ms here. When the author's node is **not** on telemetry, the first reporter is just the first peer to receive it by gossip, and the second reporter arrives within tens of ms. The lead over the second reporter is therefore the confidence signal: above about 150 ms the first reporter is the author; below about 50 ms the author is off-telemetry and the block is unattributable. ## Design (arena exporter, which already holds both halves) The exporter already parses the author preimage from every header it records, and already runs a feed client for the node census. Add: 1. Ingest code 6 near the tip only (height within a few blocks of `BestBlock`, code 1), keeping per hash: first reporter, its timestamp, and the second reporter's delay. Old-history imports from syncing nodes are dropped by the height filter. 2. In `record()`, where the header's preimage is known, look the hash up: if the lead exceeds the threshold, count `(preimage -> node id)`; otherwise count `(preimage -> unattributed)`. 3. Export `quantus_author_node_info{preimage, node_name, peer_id} = fraction of that preimage's attributed blocks first seen at that node`, plus `quantus_author_attributed_fraction{preimage}` so a preimage whose owner is off-telemetry shows as such rather than as a wrong name. 4. Dashboard: join the leaderboard on `preimage` with `group_left(node_name)`, show name and confidence. Disambiguate duplicate names (`QuantusMinerGUI` appears under several node ids) with the short peer id. Validation: our own preimage must map to our node's telemetry name with high confidence; if it does not, the threshold or the method is wrong. ## Limits - Only authors whose node reports to telemetry can be named. From the sample, the biggest miners (`QuantusMinerGUI`, `quanpool-planck`, `OGAWORLD/JAPAN`) do report. `0x2ccf3929...`, today's 30% miner, is the first one to check. - A pool's name is the pool's node, not its miners. That is still the interesting fact. - Names are self-declared and can collide or change; the peer id is the stable key. - Feed volume is real: about 270 messages/s on Planck, dominated by `FinalizedBlock` (code 7), which the exporter must discard cheaply. Effort: about a day in the exporter plus the panel; no protocol change, no node change.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lair/quantus#11