mirror of
https://github.com/logos-blockchain/research.git
synced 2026-08-07 19:53:10 +00:00
engine gains a cover_rates axis: each rate plays a timeline through the same graph and pairs it with the epoch emission budget, which needs no graph and so is computed alongside rather than inside the window. Seeds are separate streams (traffic_seedseq for the timeline and clocks, stake_seedseq for the stake draw and budget), so the stake distribution is independent of the topology and of the message schedule. sweep writes traffic.parquet only when a cover-traffic study actually ran, so every existing config keeps producing exactly three tables. quota_summary reports the measured ceiling beside the predicted one in the same row, so a run can be checked against the closed form instead of asked to be believed. Two figures: blending against cover rate and release delay with the rate*(2M+1)/3 law overlaid, and the quota ceiling with the measured transition band against the prediction. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
37 lines
1.9 KiB
YAML
37 lines
1.9 KiB
YAML
# Cover traffic: the anonymity set it buys, and the stake concentration it tolerates.
|
|
#
|
|
# Every node emits on its own uniformly-chosen slots at rate cover_rate_mult/N, so the default of
|
|
# 1.0 puts one emission per second on the whole network. Winning the block lottery consumes the
|
|
# next scheduled cover, which is what keeps every node's emission COUNT identical whether or not it
|
|
# produces blocks -- the property cover traffic exists to buy.
|
|
#
|
|
# Two things are measured. On a timeline: blending, the broadcasts a relay saw between consecutive
|
|
# releases (the anonymity set, since an observer cannot tell which one it forwarded), against
|
|
# mixing, the messages it held at once. At the baseline rate mixing is essentially nil, so the rate
|
|
# is swept over three decades to find where per-relay mixing actually begins. Over an epoch: which
|
|
# nodes win more proposals than their emission quota and so cannot stay uniform.
|
|
#
|
|
# max_blend_delay is swept alongside the rate because delay is the cheaper lever -- blending is
|
|
# rate*(2M+1)/3, so a longer release interval multiplies the anonymity set without adding a single
|
|
# message to the wire. The cost of that delay is priced in section 3.1.
|
|
n_nodes: [20000]
|
|
degree: [8]
|
|
blend_hops: [3]
|
|
max_blend_delay: [3, 10, 30]
|
|
unresponsive_frac: [0.0]
|
|
cover_rate_mult: [1.0, 4.0, 16.0, 64.0, 256.0]
|
|
f_adv: [0.2]
|
|
adversary_mode: [random]
|
|
seeds: 4
|
|
base:
|
|
# heavy-tailed stake is what makes the quota ceiling bite: the head sits orders of magnitude
|
|
# above it while the tail sits far below, so the breakpoint is measurable rather than assumed.
|
|
stake_dist: zipf
|
|
stake_zipf_a: 1.0
|
|
stake_inference_ratio: 1.0 # D_hat/D from the consensus study; 1.0 = an accurate estimator
|
|
block_interval_slots: 30
|
|
slots_per_epoch: 648000
|
|
traffic_window_slots: 900
|
|
n_rounds: 20 # propagation is not the subject here; keep it cheap
|
|
n_placements: 1
|