docs/src/proposals/optimistic-transaction-propagation-signal.md
The retransmission tree currently considers:
concatenating (1), (2), and (3) deduplicating this list of entries by pubkey favoring entries with contact info filtering this list by entries with contact info
This list is then randomly shuffled by stake weight.
Shreds are then retransmitted to up to FANOUT neighbors and up to FANOUT children.
weighted_shuffle will use a deterministic seed when
enable_deterministic_seed has been enabled based on the triple (shred slot,
shred index, leader pubkey):
if enable_deterministic_seed(self.slot(), root_bank) {
hashv(&[
&self.slot().to_le_bytes(),
&self.index().to_le_bytes(),
&leader_pubkey.to_bytes(),
])
First, only epoch staked nodes will be considered regardless of presence of contact info (and possibly including the validator node itself).
A deterministic ordering of the epoch staked nodes will be created based on the deterministic shred seed using weighted_shuffle.
Let neighbor_set be selected from up to FANOUT neighbors of the current node.
Let child_set be selected from up to FANOUT children of the current node.
Filter neighbor_set by contact info.
Filter child_set by contact info.
Let epoch_set be the union of neighbor_set and child_set.
Let remaining_set be all other nodes with contact info not contained in
epoch_set.
If epoch_set.len < 2*FANOUT then we may randomly select up to
2*FANOUT - epoch_set.len nodes to to retransmit to from remaining_set.
If the current validator node is not in the set of epoch staked nodes for the shred epoch then no early retransmission information can be obtained.
Compute the deterministic shred seed.
Run the deterministic epoch_stakes shuffle.
Find position of self in the neighbor or child sets.
Calculate the sum of the stakes of all nodes in the current and prior distribution levels.
attack by leader (level 0):
attack by node at level n:
Practically, signals should fall into the following buckets: