mirror of
https://github.com/logos-blockchain/research.git
synced 2026-08-10 05:03:11 +00:00
E5 needs to watch whether per-recipient delay variance manufactures the depth->=2 forks the countable rule cannot reach, and no recorded metric measured that. p_ref conflates "unreachable by construction" with "eligible but never picked up" -- the distinction that turned out to be the whole answer to item 5 -- and deep_ref_share is 0 by construction under the countable model, since the proposer's candidate filter drops deep-fork blocks before any reference to one is proposed. deep_orphan_share is the fraction of in-window orphans sitting below the first block of their fork, computed from the depth array fork_stats already builds. Also fixes a splat-unpack in test_selfish_engine that silently re-bound to the wrong quantities when fork_stats grew this field (it read deep_orphan_share as p_ref_honest). fork_stats has now gained a field twice; both call sites unpack by position explicitly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
3.5 KiB
YAML
48 lines
3.5 KiB
YAML
# Handoff E5 — the diagnostic: does per-recipient delay variance reproduce the standalone result?
|
|
#
|
|
# This is the only experiment in the handoff that could invalidate the REPORT rather than the spec
|
|
# section. The primary hypothesis for the original discrepancy is modelling, not measurement: the
|
|
# standalone simulation drew an INDEPENDENT propagation delay per (block, recipient), while this
|
|
# simulator's blend topology runs a cascade of relays and then floods network-wide from the LAST
|
|
# relay, so nodes receive a block at nearly the same time and their views stay synchronised.
|
|
# Independent per-recipient draws maximise view divergence, which is exactly what manufactures the
|
|
# depth->=2 forks the first-fork rule cannot recover.
|
|
#
|
|
# jitter_mean adds per-(block, node) arrival noise on top of the cascade, so sweeping it
|
|
# interpolates between the two models: 0 is the report's cascade, large values approach the
|
|
# standalone's independent-delay regime. The observable that decides it is deep_orphan_share --
|
|
# the fraction of in-window orphans sitting deeper than the first block of their fork, which is
|
|
# precisely the structural quantity behind claim C2.
|
|
#
|
|
# This is also the report's open item 15 (correlated/heterogeneous latency untested).
|
|
#
|
|
# EXACT ORACLE REQUIRED: the windowed fork choice and the arrival prune are only bit-exact at
|
|
# jitter_mean == 0 (a jittered arrival can cross the deterministic horizon), so both are off. That
|
|
# forces the full (N x n_blocks) matrix and makes each run ~17 s at k = 2160.
|
|
#
|
|
# Run TWICE — default (countable) and with --old. `--old` is NOT a candidate design: under the
|
|
# current spec a block carrying a deep-fork reference is REJECTED, so it is an unreachable upper
|
|
# bound on what any counting rule could recover, and the countable-vs-ceiling gap is the
|
|
# first-fork cost. Latency is in SLOTS (1 slot = 1 s).
|
|
n_nodes: [1000] # network size
|
|
stake_dist: [pareto] # heavy-tailed (realistic) stake distribution
|
|
topology: [blend] # Blend mixnet — the deployment transport
|
|
degree: [6] # peering degree of the d-regular graph
|
|
link_latency_mean: [0.5] # natural geographic transport (sub-slot)
|
|
link_latency_dist: [geo] # real-world geographic band mixture
|
|
blend_hops: [3] # the spec's Blend cascade length
|
|
blend_delay_max: [4.0] # E1: the spec's operating point (rho ~ 0.27)
|
|
max_uncles: [0, 1, 2, 4] # 0 = negative control; 4 = the spec's MAX_UNCLES
|
|
uncle_strategy: [oldest] # spec Uncle Selection
|
|
init_dest: [common] # per-node initial D_est from agreement
|
|
replicates: 12 # exact-oracle runs are ~17 s each; 12 x 40 cells
|
|
base: # per-run settings shared by every cell
|
|
k: 2160 # true security parameter
|
|
epochs: 20 # equilibrium within ~2 epochs; burn 50%
|
|
f: 0.03333333333333333 # slot activation coefficient (1/30)
|
|
genesis_d_factor: 0.5 # start near true stake (cheap epoch 0)
|
|
early_stop: true
|
|
windowed_fork_choice: false # exact oracle: required once jitter > 0
|
|
prune_arrival: false # ...and the prune needs the same horizon
|
|
jitter_mean: 0.0 # OVERRIDDEN per run by scripts/spec_jitter.py
|