Home / Input Output / ouroboros-leios-sim
Mar 25, 9-10 AM (3)
Mar 25, 10-11 AM (0)
Mar 25, 11-12 PM (1)
Mar 25, 12-1 PM (26)
Mar 25, 1-2 PM (0)
Mar 25, 2-3 PM (2)
Mar 25, 3-4 PM (0)
Mar 25, 4-5 PM (0)
Mar 25, 5-6 PM (0)
Mar 25, 6-7 PM (1)
Mar 25, 7-8 PM (0)
Mar 25, 8-9 PM (0)
Mar 25, 9-10 PM (0)
Mar 25, 10-11 PM (0)
Mar 25, 11-12 AM (0)
Mar 26, 12-1 AM (0)
Mar 26, 1-2 AM (0)
Mar 26, 2-3 AM (0)
Mar 26, 3-4 AM (0)
Mar 26, 4-5 AM (0)
Mar 26, 5-6 AM (0)
Mar 26, 6-7 AM (0)
Mar 26, 7-8 AM (1)
Mar 26, 8-9 AM (1)
Mar 26, 9-10 AM (4)
Mar 26, 10-11 AM (1)
Mar 26, 11-12 PM (5)
Mar 26, 12-1 PM (3)
Mar 26, 1-2 PM (2)
Mar 26, 2-3 PM (1)
Mar 26, 3-4 PM (2)
Mar 26, 4-5 PM (2)
Mar 26, 5-6 PM (1)
Mar 26, 6-7 PM (0)
Mar 26, 7-8 PM (0)
Mar 26, 8-9 PM (0)
Mar 26, 9-10 PM (0)
Mar 26, 10-11 PM (0)
Mar 26, 11-12 AM (0)
Mar 27, 12-1 AM (0)
Mar 27, 1-2 AM (0)
Mar 27, 2-3 AM (0)
Mar 27, 3-4 AM (0)
Mar 27, 4-5 AM (0)
Mar 27, 5-6 AM (0)
Mar 27, 6-7 AM (0)
Mar 27, 7-8 AM (0)
Mar 27, 8-9 AM (0)
Mar 27, 9-10 AM (1)
Mar 27, 10-11 AM (0)
Mar 27, 11-12 PM (0)
Mar 27, 12-1 PM (0)
Mar 27, 1-2 PM (0)
Mar 27, 2-3 PM (0)
Mar 27, 3-4 PM (0)
Mar 27, 4-5 PM (0)
Mar 27, 5-6 PM (0)
Mar 27, 6-7 PM (0)
Mar 27, 7-8 PM (0)
Mar 27, 8-9 PM (0)
Mar 27, 9-10 PM (0)
Mar 27, 10-11 PM (0)
Mar 27, 11-12 AM (0)
Mar 28, 12-1 AM (0)
Mar 28, 1-2 AM (0)
Mar 28, 2-3 AM (0)
Mar 28, 3-4 AM (0)
Mar 28, 4-5 AM (0)
Mar 28, 5-6 AM (0)
Mar 28, 6-7 AM (0)
Mar 28, 7-8 AM (0)
Mar 28, 8-9 AM (0)
Mar 28, 9-10 AM (0)
Mar 28, 10-11 AM (0)
Mar 28, 11-12 PM (0)
Mar 28, 12-1 PM (0)
Mar 28, 1-2 PM (0)
Mar 28, 2-3 PM (0)
Mar 28, 3-4 PM (0)
Mar 28, 4-5 PM (0)
Mar 28, 5-6 PM (0)
Mar 28, 6-7 PM (0)
Mar 28, 7-8 PM (0)
Mar 28, 8-9 PM (0)
Mar 28, 9-10 PM (0)
Mar 28, 10-11 PM (0)
Mar 28, 11-12 AM (0)
Mar 29, 12-1 AM (0)
Mar 29, 1-2 AM (0)
Mar 29, 2-3 AM (0)
Mar 29, 3-4 AM (0)
Mar 29, 4-5 AM (0)
Mar 29, 5-6 AM (0)
Mar 29, 6-7 AM (0)
Mar 29, 7-8 AM (0)
Mar 29, 8-9 AM (0)
Mar 29, 9-10 AM (0)
Mar 29, 10-11 AM (0)
Mar 29, 11-12 PM (0)
Mar 29, 12-1 PM (0)
Mar 29, 1-2 PM (0)
Mar 29, 2-3 PM (0)
Mar 29, 3-4 PM (0)
Mar 29, 4-5 PM (0)
Mar 29, 5-6 PM (0)
Mar 29, 6-7 PM (0)
Mar 29, 7-8 PM (0)
Mar 29, 8-9 PM (0)
Mar 29, 9-10 PM (0)
Mar 29, 10-11 PM (0)
Mar 29, 11-12 AM (0)
Mar 30, 12-1 AM (0)
Mar 30, 1-2 AM (0)
Mar 30, 2-3 AM (0)
Mar 30, 3-4 AM (0)
Mar 30, 4-5 AM (0)
Mar 30, 5-6 AM (0)
Mar 30, 6-7 AM (0)
Mar 30, 7-8 AM (0)
Mar 30, 8-9 AM (0)
Mar 30, 9-10 AM (1)
Mar 30, 10-11 AM (2)
Mar 30, 11-12 PM (0)
Mar 30, 12-1 PM (0)
Mar 30, 1-2 PM (0)
Mar 30, 2-3 PM (0)
Mar 30, 3-4 PM (0)
Mar 30, 4-5 PM (0)
Mar 30, 5-6 PM (0)
Mar 30, 6-7 PM (0)
Mar 30, 7-8 PM (0)
Mar 30, 8-9 PM (0)
Mar 30, 9-10 PM (0)
Mar 30, 10-11 PM (0)
Mar 30, 11-12 AM (0)
Mar 31, 12-1 AM (0)
Mar 31, 1-2 AM (0)
Mar 31, 2-3 AM (0)
Mar 31, 3-4 AM (0)
Mar 31, 4-5 AM (0)
Mar 31, 5-6 AM (0)
Mar 31, 6-7 AM (0)
Mar 31, 7-8 AM (0)
Mar 31, 8-9 AM (0)
Mar 31, 9-10 AM (2)
Mar 31, 10-11 AM (0)
Mar 31, 11-12 PM (0)
Mar 31, 12-1 PM (1)
Mar 31, 1-2 PM (5)
Mar 31, 2-3 PM (5)
Mar 31, 3-4 PM (0)
Mar 31, 4-5 PM (0)
Mar 31, 5-6 PM (0)
Mar 31, 6-7 PM (0)
Mar 31, 7-8 PM (0)
Mar 31, 8-9 PM (0)
Mar 31, 9-10 PM (0)
Mar 31, 10-11 PM (0)
Mar 31, 11-12 AM (0)
Apr 01, 12-1 AM (0)
Apr 01, 1-2 AM (0)
Apr 01, 2-3 AM (0)
Apr 01, 3-4 AM (0)
Apr 01, 4-5 AM (0)
Apr 01, 5-6 AM (1)
Apr 01, 6-7 AM (0)
Apr 01, 7-8 AM (0)
Apr 01, 8-9 AM (0)
Apr 01, 9-10 AM (0)
71 commits this week Mar 25, 2026 - Apr 01, 2026
net-rs: detect fork switches and issue rollback to common ancestor
Track adopted_tip_hash separately from the chain tree's speculative
best tip. When on_validation_complete finds the new block is on a
different fork than the adopted tip, walk prev_hash links to find
the common ancestor and issue InjectRollback before InjectBlock.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: add chain tree for Praos consensus with fork tracking
Replace the single local_tip in Consensus with a ChainTree that tracks
block headers keyed by hash, linked via prev_hash. Longest chain
(highest block_number) is selected as best tip. Blocks deeper than
security_param_k (default 2160) are pruned.

Block production now receives prev_hash and block_number from consensus
so headers contain correct chain linkage and globally consistent height.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: real-time event streaming via SSE
Replace 1s HTTP polling with Server-Sent Events for event delivery.
Events now appear in the UI as they arrive from nodes, making block
propagation visible as a wave across the graph.

- Add GET /api/events/stream SSE endpoint with broadcast channel
- Add useEventStream hook with 50ms batching to avoid render storms
- Remove TipAdvanced from flash triggers (redundant with RBReceived)
- Protect "produced" flash from being overwritten by "received"

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: fake blocks use valid Shelley+ CBOR, revert BlockFetched workaround
Replace the trivial [slot, hash] CBOR in fake blocks with proper
Shelley+ structure: era-tagged Conway header (10-field header_body with
slot, block_number, issuer_vkey, etc.) wrapped in #6.24, and a
complete block body with header + empty tx/witness/metadata maps.

This makes body.point() and WrappedHeader::parse() work correctly on
fake blocks, so the coordinator can derive the block point from the
body without needing the fetch range passed through.

Reverts the PeerEvent::BlockFetched { from, to, body } workaround
back to the original { body } form. The coordinator uses body.point()
again, which now works for both real and fake blocks. This is the
correct design for future multi-block range fetching.

New test: fake_block_has_parseable_cbor verifies header parsing,
point derivation from both header and body, and slot/era correctness.

324 tests (293 net-core + 31 net-node), 0 clippy warnings.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: net-node Stage 5 — telemetry with peer bandwidth tracking
Add telemetry system with event/stats sinks and per-peer bandwidth
monitoring:

net-core changes:
- mux/mod.rs: MuxStats with AtomicU64 bytes_sent/bytes_received counters,
  exposed via RunningMux
- mux/egress.rs, ingress.rs: increment counters per segment (header+payload)
- peer/types.rs: PeerEvent::Connected now carries Arc<MuxStats>
- multi_peer/types.rs: PeerInfo struct, NetworkCommand::QueryPeers,
  NetworkEvent::PeerSnapshot for per-peer telemetry snapshots
- coordinator.rs: stores mux_stats per peer, handles QueryPeers by
  building PeerInfo with address, mode, rtt, delay, bytes_sent/received

net-node changes:
- telemetry.rs: NodeEvent enum (sim-rs compatible JSONL format with
  serde tagged enum), StatsSnapshot with full peer list including
  bandwidth, EventSink/StatsSink traits, FileEventSink (JSONL),
  HttpEventSink (reqwest batched POST), LogStatsSink, HttpStatsSink,
  TelemetryHandle with counters and periodic flush
- config.rs: TelemetryConfig, EventSinkConfig (file/http),
  StatsSinkConfig (log/http)
- main.rs: stats timer sends QueryPeers, PeerSnapshot triggers
  emit_stats, all events recorded via telemetry.record()

323 tests (293 net-core + 30 net-node), 0 clippy warnings.
Live-tested: JSONL file output with correct sim-rs format, periodic
peer stats with bytes_sent/received incrementing, delay_ms reported.

Marks Stage 5 and all stages complete in test-node-plan.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: net-node Stage 4 — Leios production and per-peer delay injection
Extend the test node with Leios block types and network delay simulation:

- production.rs: EB/vote lotteries at stage boundaries, stage boundary
  detection, refactored to share lottery logic across block types
- consensus.rs: handles LeiosBlockOffered -> FetchLeiosBlock,
  LeiosVotesOffered -> FetchLeiosVotes, LeiosBlockTxsOffered ->
  FetchLeiosBlockTxs, logs Leios block/vote reception
- config.rs: ib/eb/vote generation probabilities, stage_length_slots,
  eb/vote validation timing, per-peer inbound_delay_ms
- Coordinator per-peer delay: new peer_delays config in CoordinatorConfig,
  events from delayed peers buffered and delivered after configured
  duration. Zero overhead when unconfigured (has_any_delays guard).
  Implemented in coordinator event loop with conditional select branch.

27 net-node tests + 293 net-core tests pass, 0 clippy warnings.
Live-tested: Leios EB/vote production and fetch, per-peer 200ms delay
visible in timestamps.

Marks Stage 4 complete in test-node-plan.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: extract header from block body, remove magic 0xA0 fallback (risk register R#2)
BlockBody::header() extracts the WrappedHeader directly from block body
CBOR, reusing shared try_extract_header() logic with point(). Coordinator
now falls back to body.header() when pending_headers misses, and skips
chain store insertion if neither produces a header. Post-remediation
review: added Resolution subsections for all three residual observations,
stripped trailing whitespace.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: update docs — test counts, scheduler name, risk register statuses
- Test count 258/280 → 291 in README, CLAUDE.md, implementation-plan
- README scheduler label: strict priority → PriorityWfq (actual default)
- CLAUDE.md: document SubmitTransaction broadcast in coordinator
- Risk register: consistent "Fixed" status (#8 was "Resolved", #9 "Mitigated")

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: wire client-side TxSubmission into peer orchestration (risk register #11)
TxSubmission protocol was implemented but only wired on the server side.
Client connections never negotiated it, so outbound peers couldn't push
transactions. Register in client_protocol_configs, add spawn_txsubmission,
wire into peer_task/duplex_task/coordinator with broadcast semantics.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>