mirror of
https://github.com/logos-blockchain/research.git
synced 2026-08-08 20:23:28 +00:00
The results document was written as a reply to a briefing note that will not be
circulated, so it depended on a file no reader would have -- and linked to one
that was never committed, so the link was dead on GitHub regardless.
Rewritten to be self-contained: it now states what the added spec section
claims, what was measured, and the verdict, without reference to the brief.
The six claims and six experiments are stated in its own terms rather than by
the brief's C-numbers and E-numbers, and it carries its own reproduction table
mapping each section to the config or script and run directory behind it.
Renamed fork-loss-validation.md accordingly.
The configs and scripts written for these experiments carried the same
dependency in their header comments ("Handoff E5", "Claim C2"); those now
describe what they measure directly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
3.5 KiB
YAML
48 lines
3.5 KiB
YAML
# The diagnostic: does per-recipient delay variance reproduce the standalone result?
|
|
#
|
|
# The one experiment here that could invalidate the REPORT rather than the spec section it is
|
|
# checking. The hypothesis for the 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 the spec section's deep-fork claim.
|
|
#
|
|
# 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] # 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
|