From fab247e8bb86218e80edc69689fe7844b7fca92c Mon Sep 17 00:00:00 2001 From: mpoke Date: Fri, 20 Feb 2026 16:33:10 +0100 Subject: [PATCH 01/20] spec: Add Channel API contract, generator, and Emerald composition Co-Authored-By: Claude Opus 4.6 --- specs/channel_api_contract.qnt | 544 +++++++++++++++++++++++++ specs/channel_api_generator.qnt | 553 ++++++++++++++++++++++++++ specs/channel_api_generator_test.qnt | 8 + specs/emerald_with_generator.qnt | 321 +++++++++++++++ specs/emerald_with_generator_test.qnt | 8 + specs/faults.qnt | 38 ++ 6 files changed, 1472 insertions(+) create mode 100644 specs/channel_api_contract.qnt create mode 100644 specs/channel_api_generator.qnt create mode 100644 specs/channel_api_generator_test.qnt create mode 100644 specs/emerald_with_generator.qnt create mode 100644 specs/emerald_with_generator_test.qnt create mode 100644 specs/faults.qnt diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt new file mode 100644 index 00000000..4612d02d --- /dev/null +++ b/specs/channel_api_contract.qnt @@ -0,0 +1,544 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Channel API Contract (DRAFT) +// ============================================================================= +// +// Behavioral contract for Malachite's Channel API. +// Published by the Malachite team. Consumed by applications (e.g., Emerald). +// +// This contract defines: +// 1. The message types exchanged through the Channel API +// 2. Safety guarantees (agreement, validity) +// 3. Ordering guarantees (declarative properties over event histories) +// 4. Assumptions (what the application must do for guarantees to hold) +// +// Both safety and ordering properties are checked as invariants on any +// conforming generator (e.g., channel_api_generator.qnt). The generator +// enforces ordering through its state machine structure; these declarative +// properties make the ordering auditable and verifiable independently. +// +// Fault handling: Faults (crash/restart) are node-level, not API-specific. +// After a fault, the node's event history is cleared (it's ephemeral/mem +// state), while proposals and decisions survive on disk. This means contract +// properties only need to reason about the current session's events — no +// EvFault variant or session-reset logic needed. +// +// State follows the disk/mem convention from faults.qnt: +// - Disk: all_proposals, decisions (survive crash/restart) +// - Mem: event_history (cleared on fault, contains only current session) +// +// Source: Malachite's app-channel crate (crates/app-channel/src/msgs.rs) +// and the consensus Quint spec (specs/consensus/quint/). + +module channel_api_contract { + import basicSpells.* from "spells/basicSpells" + + // =========================================================================== + // TYPES (derived from AppMsg in msgs.rs) + // =========================================================================== + + type Node = str + type Height = int + type Round = int + type Payload = int + + type Proposal = { + height: Height, + round: Round, + proposer: Node, + payload: Payload, + } + + // Messages from Malachite consensus to the application, observable at the + // Channel API boundary. This is the subset relevant to Emerald. + // + // Not modeled here (future work): + // - ExtendVote / VerifyVoteExtension (vote extension lifecycle) + // - RestreamProposal (re-broadcast) + // - GetHistoryMinHeight (sync protocol detail) + // - ReceivedProposalPart (modeled as ReceivedProposal for simplicity) + // + // Faults (crash/restart) are NOT part of the Channel API event type. + // They are node-level events handled by clearing event histories. + // See faults.qnt for the FaultEvent type. + type ChannelEvent = + | EvConsensusReady + | EvStartedRound({ height: Height, round: Round, proposer: Node }) + | EvGetValue({ height: Height, round: Round }) + | EvReceivedProposal({ proposal: Proposal }) + | EvDecided({ proposal: Proposal }) + | EvProcessSyncedValue({ proposal: Proposal }) + | EvGetDecidedValue({ height: Height }) + + // =========================================================================== + // EVENT HELPERS + // =========================================================================== + + /// Extract the height from an event, if it has one. + pure def eventHeight(e: ChannelEvent): Option[Height] = match e { + | EvConsensusReady => None + | EvStartedRound(r) => Some(r.height) + | EvGetValue(r) => Some(r.height) + | EvReceivedProposal(r) => Some(r.proposal.height) + | EvDecided(r) => Some(r.proposal.height) + | EvProcessSyncedValue(r) => Some(r.proposal.height) + | EvGetDecidedValue(r) => Some(r.height) + } + + /// Whether an event is a consensus progress event (vs. a query/delivery event). + /// Progress events follow monotonic height ordering and are subject to + /// heightMonotonic and decidedIsFinal. + /// Excluded events: + /// - EvConsensusReady: one-time initialization, not height progress + /// - EvGetDecidedValue: intentionally queries past heights + /// - EvReceivedProposal: can arrive for future heights (buffered as pending) + pure def isProgressEvent(e: ChannelEvent): bool = match e { + | EvConsensusReady => false + | EvGetDecidedValue(_) => false + | EvReceivedProposal(_) => false + | _ => true + } + + // =========================================================================== + // OBSERVABLE STATE + // =========================================================================== + // + // State that any conforming generator must maintain for contract properties + // to be checkable. This is the "public interface" of the generator's state. + // + // Follows the disk/mem convention from faults.qnt: + // - Disk state survives restarts (proposals, decisions) + // - Mem state is cleared on fault (event histories — current session only) + // + // Design: event_history is the primary observable — most properties are + // checked over it. decisions and all_proposals are kept as separate fields + // for efficient lookup by validity and syncedValueIsDecided. + + type ChannelStateDisk = { + // All proposals that have been made (via GetValue responses) + all_proposals: Set[Proposal], + // Decided proposals per height (at most one per height) + decisions: Height -> Proposal, + } + + type ChannelStateMem = { + // Per-node: event history for the current session. + // Cleared on fault (crash/restart). Properties fold over only + // current-session events — no cross-session reasoning needed. + event_history: Node -> List[ChannelEvent], + } + + type ChannelState = { + disk: ChannelStateDisk, + mem: ChannelStateMem, + } + + // =========================================================================== + // SAFETY PROPERTIES + // =========================================================================== + + // Agreement: For any two Decided events across all nodes, if they are for + // the same height, the decided proposals must be identical. + // + // This corresponds to AgreementInv in statemachineAsync.qnt: + // "Any two correct processes agree in the consensus instances in which + // they both have already decided" + // + // Checked directly over event histories so it catches disagreement even + // if a buggy generator records inconsistent decisions. After a fault, + // histories are cleared — cross-session agreement is enforced by the + // generator's sendDecided guard checking against the decisions map (disk). + pure def agreement(s: ChannelState): bool = { + // Collect all decided proposals across all nodes, grouped by height. + // Cost: O(nodes × history_length). + val decidedByHeight: Height -> Set[Proposal] = + s.mem.event_history.keys().fold(Map(), (acc, node) => + s.mem.event_history.get(node).foldl(acc, (m, e) => + match e { + | EvDecided(d) => + val h = d.proposal.height + val existing = if (m.has(h)) m.get(h) else Set() + m.put(h, existing.union(Set(d.proposal))) + | _ => m + } + ) + ) + // At most one distinct proposal per height. + decidedByHeight.keys().forall(h => decidedByHeight.get(h).size() <= 1) + } + + // Validity: Every decided proposal was previously proposed by some node + // via GetValue. + // + // This corresponds to the requirement in consensus.qnt that + // ProposalAndCommitAndValidCInput requires a matching proposal. + pure def validity(s: ChannelState): bool = + s.disk.decisions.keys().forall(h => + s.disk.decisions.get(h).in(s.disk.all_proposals) + ) + + // Combined safety properties + pure def safety(s: ChannelState): bool = and { + agreement(s), + validity(s), + } + + // =========================================================================== + // ORDERING PROPERTIES + // =========================================================================== + // + // These properties constrain the order in which Channel API events are + // delivered to each node. They are expressed declaratively over per-node + // event histories, making them readable and auditable without understanding + // any generator's internal state machine. + // + // Event histories contain only current-session events (cleared on fault). + // This simplifies all fold-based properties — no session boundary logic + // needed. + // + // The reference generator enforces these through its phase transitions. + // These declarative properties let us verify that any generator (including + // alternative or simplified ones) respects the Channel API ordering. + // + // Source: derived from driver.qnt, consensus.qnt, and msgs.rs documentation. + + // consensusReadyFirst: ConsensusReady is the first event in the history, + // and it appears at most once per session. + // + // Before any other Channel API interaction, Malachite sends ConsensusReady + // to initialize the node. Histories are per-session (cleared on fault), + // so this is automatically scoped to the current session. + // + // Source: msgs.rs — ConsensusReady is sent when the consensus engine + // has been initialized and is ready to start. + pure def consensusReadyFirst(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + val hist = s.mem.event_history.get(node) + hist.foldl({ isFirst: true, ok: true }, (acc, e) => + if (not(acc.ok)) acc + else match e { + | EvConsensusReady => + if (not(acc.isFirst)) { isFirst: false, ok: false } + else { isFirst: false, ok: true } + | _ => if (acc.isFirst) { isFirst: false, ok: false } else acc + } + ).ok + ) + + // getValueAfterStartedRound: GetValue(h, r) is preceded by StartedRound(h, r, _) + // for the same node. + // + // The proposer can only be asked to build a value after consensus has + // entered that round. Histories are per-session (cleared on fault). + // + // Source: driver.qnt — GetValue is produced as part of the proposer logic + // in applyVotekeeper, after entering a new round. + pure def getValueAfterStartedRound(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + // Scan left to right: track which (h, r) had StartedRound. + // On GetValue(h, r), check (h, r) was already seen. Cost: O(n). + s.mem.event_history.get(node).foldl({ seen: Set(), ok: true }, (acc, e) => + if (not(acc.ok)) acc + else match e { + | EvStartedRound(sr) => + { ...acc, seen: acc.seen.union(Set((sr.height, sr.round))) } + | EvGetValue(gv) => + { ...acc, ok: acc.seen.contains((gv.height, gv.round)) } + | _ => acc + } + ).ok + ) + + // getValueUnique: GetValue(h, r) is sent at most once globally — to at + // most one node, at most once per node. + // + // Only the proposer for a given (height, round) receives GetValue, and + // consensus requests a value exactly once per round. Combined, this means + // each (h, r) produces at most one GetValue event across all nodes. + // + // Replaces the previous getValueAtMostOnce (per-node) and getValueToOneNode + // (cross-node) with a single global uniqueness check via counting. + // + // Source: driver.qnt — GetValue is produced exactly when entering a round + // where the node is the proposer, and a round is entered at most once. + pure def getValueUnique(s: ChannelState): bool = { + // Count GetValue events per (h, r) across all nodes. + // Cost: O(nodes × history_length). + val counts: (Height, Round) -> int = + s.mem.event_history.keys().fold(Map(), (acc, node) => + s.mem.event_history.get(node).foldl(acc, (m, e) => + match e { + | EvGetValue(gv) => + val key = (gv.height, gv.round) + val cur = if (m.has(key)) m.get(key) else 0 + m.put(key, cur + 1) + | _ => m + } + ) + ) + counts.keys().forall(k => counts.get(k) <= 1) + } + + // heightMonotonic: Heights are non-decreasing in a node's consensus progress + // events. + // + // Consensus processes heights sequentially. A node never receives progress + // events for an earlier height after it has received events for a later + // height. Query events (GetDecidedValue) are excluded — they intentionally + // reference past heights. Histories are per-session (cleared on fault). + // + // Source: consensus.qnt — the state machine processes one height at a time, + // advancing to h+1 only after deciding at h. + pure def heightMonotonic(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + // Scan left to right: track the max height seen in progress events. + // Each new progress event must have height >= max. Cost: O(n). + s.mem.event_history.get(node).foldl({ maxHeight: 0, ok: true }, (acc, e) => + if (not(acc.ok)) acc + else if (isProgressEvent(e)) { + match eventHeight(e) { + | Some(h) => + if (h < acc.maxHeight) { ...acc, ok: false } + else { ...acc, maxHeight: h } + | None => acc + } + } else acc + ).ok + ) + + // decidedIsFinal: After Decided(h), all subsequent consensus progress events + // for the same node have height exactly h+1. + // + // Once consensus decides at height h, it moves on to height h+1. No further + // progress events are delivered for the decided height, and no heights are + // skipped. Query events (GetDecidedValue) are excluded — they intentionally + // reference past heights. Histories are per-session (cleared on fault). + // + // Strictly stronger than just "height > maxDecided": prevents height gaps + // (e.g., Decided(3) then StartedRound(5,0) is rejected). + // + // Source: driver.qnt — after producing a Decided output, the driver resets + // to a new height. msgs.rs — Decided triggers the application to call + // StartHeight(h+1). + pure def decidedIsFinal(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + // Scan left to right: track the max decided height. + // Every progress event after a Decided must have height exactly + // maxDecided + 1. Cost: O(n). + s.mem.event_history.get(node).foldl({ maxDecided: 0, ok: true }, (acc, e) => + if (not(acc.ok)) acc + else + val check = + if (acc.maxDecided > 0 and isProgressEvent(e)) { + match eventHeight(e) { + | Some(h) => h == acc.maxDecided + 1 + | None => true + } + } else true + val newMax = match e { + | EvDecided(d) => d.proposal.height + | _ => acc.maxDecided + } + { maxDecided: newMax, ok: check } + ).ok + ) + + // receivedProposalNotToProposer: A node does not receive its own proposal + // via ReceivedProposal. + // + // The proposer learns its proposal through GetValue. Other nodes learn it + // through ReceivedProposal. Malachite never sends a proposal back to the + // node that created it. + // + // Source: msgs.rs — ReceivedProposalPart is delivered to non-proposer nodes. + pure def receivedProposalNotToProposer(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + val hist = s.mem.event_history.get(node) + hist.indices().forall(i => + match hist[i] { + | EvReceivedProposal(rp) => rp.proposal.proposer != node + | _ => true + } + ) + ) + + // syncedValueIsDecided: ProcessSyncedValue carries a proposal that was + // decided at that height. + // + // The sync protocol delivers decided values. A synced proposal must match + // the authoritative decision for its height. + // + // Source: msgs.rs — ProcessSyncedValue delivers a decided block for + // catch-up. The value comes from the sync protocol which retrieves + // decided blocks from other nodes. + pure def syncedValueIsDecided(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + val hist = s.mem.event_history.get(node) + hist.indices().forall(i => + match hist[i] { + | EvProcessSyncedValue(sv) => + val p = sv.proposal + s.disk.decisions.has(p.height) and s.disk.decisions.get(p.height) == p + | _ => true + } + ) + ) + + // roundsIncreasingWithinHeight: Within the same height, StartedRound events + // have strictly increasing rounds. + // + // Consensus processes rounds sequentially within a height. A node advances + // to round r+1 via timeout, or skips to a higher round for a late decision. + // It never goes back to an earlier round. Histories are per-session + // (cleared on fault). + // + // Source: consensus.qnt — round transitions are forward-only (timeout + // increments, skip-round jumps forward). driver.qnt — a round is entered + // at most once per height. + pure def roundsIncreasingWithinHeight(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + // Scan left to right: track the last round seen per height. + // Each new StartedRound at the same height must have a strictly + // higher round. Cost: O(n). + s.mem.event_history.get(node).foldl({ lastRound: Map(), ok: true }, (acc, e) => + if (not(acc.ok)) acc + else match e { + | EvStartedRound(sr) => + if (acc.lastRound.has(sr.height) and sr.round <= acc.lastRound.get(sr.height)) + { ...acc, ok: false } + else + { ...acc, lastRound: acc.lastRound.put(sr.height, sr.round) } + | _ => acc + } + ).ok + ) + + // decidedRequiresDeliveredProposal: Before Decided(p), Malachite must + // have delivered p to the node. The delivery path determines whether + // StartedRound is also required: + // + // - Sync path: ProcessSyncedValue(p) preceded Decided(p). + // No StartedRound required — the node is catching up. + // + // - Normal path: the proposal was delivered via ReceivedProposal(p) or + // GetValue(p.h, p.r) as proposer, AND StartedRound(p.height, p.round) + // preceded Decided(p). Without round skips, consecutive round + // progression guarantees the node went through StartedRound(h, r) + // for the proposal's round. + // + // In the implementation, Decided contains only a certificate (2f+1 vote + // proof), not the proposal itself. Malachite guarantees the proposal + // has been delivered before sending the decision certificate. + // Histories are per-session (cleared on fault). + // + // Source: Malachite driver — proposals are gossiped to all nodes, and the + // proposer builds its value via GetValue. + pure def decidedRequiresDeliveredProposal(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + s.mem.event_history.get(node).foldl({ + // Proposals delivered via ProcessSyncedValue (sync path) + syncDelivered: Set(), + // Proposals delivered via ReceivedProposal (normal path) + receivedProposals: Set(), + // (h, r) where this node was asked to build a value (proposer path) + proposedRounds: Set(), + // (h, r) where StartedRound was seen + startedRounds: Set(), + ok: true, + }, (acc, e) => + if (not(acc.ok)) acc + else match e { + | EvStartedRound(sr) => + { ...acc, startedRounds: acc.startedRounds.union(Set((sr.height, sr.round))) } + | EvGetValue(gv) => + { ...acc, proposedRounds: acc.proposedRounds.union(Set((gv.height, gv.round))) } + | EvReceivedProposal(rp) => + { ...acc, receivedProposals: acc.receivedProposals.union(Set(rp.proposal)) } + | EvProcessSyncedValue(sv) => + { ...acc, syncDelivered: acc.syncDelivered.union(Set(sv.proposal)) } + | EvDecided(d) => + val p = d.proposal + // Sync path: no StartedRound required + val viaSynced = acc.syncDelivered.contains(p) + // Normal path: proposal delivered AND StartedRound(h, r) preceded + val viaProposer = acc.proposedRounds.contains((p.height, p.round)) + and p.proposer == node + val viaReceived = acc.receivedProposals.contains(p) + val normalDelivered = viaProposer or viaReceived + val roundStarted = acc.startedRounds.contains((p.height, p.round)) + { ...acc, ok: viaSynced or (normalDelivered and roundStarted) } + | _ => acc + } + ).ok + ) + + // Combined ordering properties + pure def ordering(s: ChannelState): bool = and { + consensusReadyFirst(s), + getValueAfterStartedRound(s), + getValueUnique(s), + heightMonotonic(s), + decidedIsFinal(s), + receivedProposalNotToProposer(s), + syncedValueIsDecided(s), + roundsIncreasingWithinHeight(s), + decidedRequiresDeliveredProposal(s), + } + + // =========================================================================== + // FULL CONTRACT + // =========================================================================== + + // All properties a conforming generator must satisfy. + pure def contract(s: ChannelState): bool = and { + safety(s), + ordering(s), + } + + // =========================================================================== + // ASSUMPTIONS (what the application must do) + // =========================================================================== + // + // Stated informally. These constrain the application's behavior. + // + // 1. On ConsensusReady: the application MUST reply with a starting height + // and validator set. + // + // 2. On StartedRound: the application MUST reply immediately with any + // known values for this round (or empty). Needed for crash recovery. + // + // 3. On GetValue: the application MUST reply with a proposed value within + // the timeout duration. + // + // 4. On Decided: the application MUST reply with Next (start next height + // or restart current height). If no reply, consensus stalls. + // + // 5. On GetDecidedValue: the application MUST reply with the decided + // value if available, or None. + // + // 6. On ProcessSyncedValue: the application MUST reply with the decoded + // value, or None. + // + // 7. Environment: at most f validators are faulty, where n >= 3f+1. + // + // 8. Environment: the network eventually delivers messages between + // correct validators. + + // =========================================================================== + // LIVENESS GUARANTEES (semi-formal) + // =========================================================================== + // + // Under the assumptions above: + // + // - For every height h, eventually Decided(h) is sent to all correct nodes. + // + // - The timeout mechanism (Propose -> Prevote -> Precommit -> skip round) + // ensures progress across rounds even when the proposer is faulty. + // + // - A correct proposer in a synchronous round leads to a decision. + // + // These are not checked as invariants (they require fairness constraints). + // The reference generator produces finite traces that demonstrate progress + // but does not prove liveness in general. +} diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt new file mode 100644 index 00000000..552cd030 --- /dev/null +++ b/specs/channel_api_generator.qnt @@ -0,0 +1,553 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Channel API Reference Generator (DRAFT) +// ============================================================================= +// +// A minimal state machine that produces valid Channel API message sequences. +// Written by the Malachite team. Verified against channel_api_contract.qnt. +// +// This is NOT the full Malachite consensus spec. It models only the observable +// behavior at the Channel API boundary — just enough state to produce messages +// in the correct order with correct safety properties (agreement, validity). +// +// Consumers (e.g., Emerald) compose with this generator instead of writing +// ad-hoc listen_* functions that guess at Malachite's behavior. +// +// Design: +// - Per-node state tracks the phase in the Channel API lifecycle +// - Global state tracks decisions (for agreement) and proposals (for validity) +// - Actions correspond to Channel API messages from Malachite to the app +// - Ordering is enforced by the state machine structure (phase transitions) +// - Safety is enforced by global state constraints +// - All 11 contract properties (2 safety + 9 ordering) are checked via +// contractInv at every step +// - Fault injection: nodeCrash (lose all state) and nodeRestart (preserve +// disk state) clear the node's event history and reset to Unstarted +// +// State follows the disk/mem convention from faults.qnt: +// - Disk: maxDecided (survives restart) +// - Mem: phase, height, round, deliveredProposals, getValueSent (reset on fault) +// - Event histories are mem state (cleared on fault, current session only) + +module channel_api_generator { + import basicSpells.* from "spells/basicSpells" + import rareSpells.* from "spells/rareSpells" + import faults.* from "faults" + import channel_api_contract.* from "channel_api_contract" + + // =========================================================================== + // CONFIGURATION + // =========================================================================== + + const NODES: List[Node] + + // Proposer selection (matches Emerald's rotating proposer) + pure def proposer_for(height: Height, round: Round): Node = + NODES[(height - 1 + round) % NODES.length()] + + // Max height the generator will explore (bounds the trace length) + pure val MAX_HEIGHT = 4 + + // Max round per height (bounds timeout exploration) + pure val MAX_ROUND = 3 + + // =========================================================================== + // PER-NODE STATE (disk/mem split) + // =========================================================================== + + // Lifecycle phases for a node's view of the Channel API. + // These model the sequence of messages a node receives from Malachite. + // + // Unstarted + // → [ConsensusReady] → + // Started + // → [StartedRound(h, r)] → + // InRound + // → [GetValue(h, r)] if proposer → + // InRound (value proposed) + // → [Decided(h, v)] → + // Started (height h+1) + // → ... + // + // InRound + // → [Timeout(h, r)] → + // Started (same height, round r+1) + // + type Phase = + | Unstarted // Before ConsensusReady + | Started // ConsensusReady received, ready for StartedRound + | InRound // StartedRound received, consensus in progress + | Syncing // Receiving synced values (catch-up) + + // Disk state: survives restart, lost on crash + type GenDiskState = { + // Latest height decided by this node. Since decisions are strictly + // sequential, the max decided height fully characterizes all decided + // heights. Prevents sendDecided and sendProcessSyncedValue from firing + // twice for the same (node, height). + maxDecided: Height, + } + + // Mem state: cleared on any fault (crash or restart) + type GenMemState = { + phase: Phase, + height: Height, + round: Round, + // Proposals Malachite has delivered to this node via GetValue (proposer), + // ReceivedProposal (gossip), or ProcessSyncedValue (sync). Guards + // sendDecided — a node can only decide on a proposal it has received. + deliveredProposals: Set[Proposal], + // Which (height, round) have had GetValue sent to this node. + // Prevents duplicate GetValue for the same (h, r). + getValueSent: Set[(Height, Round)], + } + + type GenNodeState = { + disk: GenDiskState, + mem: GenMemState, + } + + pure val initGenDisk: GenDiskState = { + maxDecided: 0, + } + + pure val initGenMem: GenMemState = { + phase: Unstarted, + height: 0, + round: 0, + deliveredProposals: Set(), + getValueSent: Set(), + } + + pure val initGenNode: GenNodeState = { + disk: initGenDisk, + mem: initGenMem, + } + + // =========================================================================== + // TRACE EVENT (for lastEvent observation / MBT integration) + // =========================================================================== + // + // Since faults are no longer part of ChannelEvent, we need a separate + // type to represent what happened in the last step (channel message or fault). + + type TraceEvent = + | ChannelMsg(ChannelEvent) + | FaultMsg(FaultEvent) + + // =========================================================================== + // GLOBAL STATE + // =========================================================================== + + // Per-node Channel API state (disk/mem split per node) + var nodeStates: Node -> GenNodeState + + // All proposals made via GetValue (for validity checking) + var proposals: Set[Proposal] + + // Authoritative decisions: at most one per height. + // Used as a guard in sendDecided (ensuring the same proposal is decided + // across nodes) and by the contract's validity and syncedValueIsDecided + // properties. The contract's agreement property checks event histories + // directly, so it catches disagreement even if this map were buggy. + var decisions: Height -> Proposal + + // Per-node event history for the current session (mem state). + // Cleared on fault — contains only current-session events. + var eventHistory: Node -> List[ChannelEvent] + + // Last event emitted (for trace observation / MBT integration). + // None in the initial state (no event sent yet). + var lastEvent: Option[{ node: Node, event: TraceEvent }] + + // =========================================================================== + // ACTIONS: Channel API messages from Malachite to the application + // =========================================================================== + + // --- ConsensusReady --- + // Malachite has initialized and is ready. Sent once per node. + // The application replies with a starting height (replyStartHeight). + // + // Source: AppMsg::ConsensusReady in msgs.rs + action sendConsensusReady(node: Node, replyStartHeight: Height): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase == Unstarted, + replyStartHeight >= 1, + val evt = EvConsensusReady + all { + nodeStates' = nodeStates.set(node, { + ...ns, + mem: { ...ns.mem, phase: Started, height: replyStartHeight, round: 0 }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + proposals' = proposals, + decisions' = decisions, + } + } + } + + // --- StartedRound --- + // A new consensus round has begun. Sent after ConsensusReady (for the first + // round), after Decided (for the first round of a new height), or after a + // timeout (for subsequent rounds at the same height). + // + // Source: AppMsg::StartedRound in msgs.rs + action sendStartedRound(node: Node): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase == Started, + ns.mem.height <= MAX_HEIGHT, + val proposer = proposer_for(ns.mem.height, ns.mem.round) + val evt = EvStartedRound({ + height: ns.mem.height, + round: ns.mem.round, + proposer: proposer, + }) + all { + nodeStates' = nodeStates.set(node, { + ...ns, + mem: { ...ns.mem, phase: InRound }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + proposals' = proposals, + decisions' = decisions, + } + } + } + + // --- GetValue --- + // Request the application to build a value for consensus to propose. + // Only sent to the proposer for (height, round). At most once per + // (node, height, round). The application replies with a proposal + // (replyProposal). The generator validates (height, round, proposer) + // but the payload is the application's choice. + // + // Source: AppMsg::GetValue in msgs.rs + action sendGetValue(node: Node, replyProposal: Proposal): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase == InRound, + node == proposer_for(ns.mem.height, ns.mem.round), + not(ns.mem.getValueSent.contains((ns.mem.height, ns.mem.round))), + // Validate the reply proposal matches the current (height, round, proposer). + // The payload is the application's choice — not constrained here. + replyProposal.height == ns.mem.height, + replyProposal.round == ns.mem.round, + replyProposal.proposer == node, + val evt = EvGetValue({ + height: ns.mem.height, + round: ns.mem.round, + }) + all { + proposals' = proposals.union(Set(replyProposal)), + nodeStates' = nodeStates.set(node, { + ...ns, + mem: { + ...ns.mem, + getValueSent: ns.mem.getValueSent.union(Set((ns.mem.height, ns.mem.round))), + deliveredProposals: ns.mem.deliveredProposals.union(Set(replyProposal)), + }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + decisions' = decisions, + } + } + } + + // --- ReceivedProposal --- + // Inform a non-proposer node about a proposal. + // The proposal must exist (was created via GetValue). + // Can arrive in any phase after ConsensusReady — including before + // StartedRound (Emerald buffers as pending) or during sync. + // + // Source: AppMsg::ReceivedProposalPart in msgs.rs (simplified) + action sendReceivedProposal(node: Node, proposal: Proposal): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase != Unstarted, + proposal.in(proposals), + proposal.proposer != node, // Nodes don't receive their own proposals + proposal.height >= ns.mem.height, // Can arrive for future heights (buffered as pending) + val evt = EvReceivedProposal({ proposal: proposal }) + all { + nodeStates' = nodeStates.set(node, { + ...ns, + mem: { + ...ns.mem, + deliveredProposals: ns.mem.deliveredProposals.union(Set(proposal)), + }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + proposals' = proposals, + decisions' = decisions, + } + } + } + + // --- Decided --- + // Consensus has decided on a value. The decided proposal must exist. + // + // AGREEMENT ENFORCEMENT: If a decision already exists for this height, + // we must decide on the same proposal. If no decision exists yet, we + // record this as the authoritative decision for this height. + // + // Source: AppMsg::Decided in msgs.rs + // Safety: corresponds to AgreementInv in statemachineAsync.qnt + action sendDecided(node: Node, proposal: Proposal): bool = { + val ns = nodeStates.get(node) + all { + or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, + proposal.height == ns.mem.height, + proposal.in(proposals), + // Malachite must have delivered the proposal to this node + ns.mem.deliveredProposals.contains(proposal), + // Node must have reached the proposal's round (no round skips: + // if ns.round >= p.round, all rounds up to ns.round were entered) + proposal.round <= ns.mem.round, + // Agreement: if already decided for this height, must be the same + not(decisions.has(ns.mem.height)) or decisions.get(ns.mem.height) == proposal, + // Not already decided at this node for this height + ns.disk.maxDecided < ns.mem.height, + // Record the decision + decisions' = decisions.put(ns.mem.height, proposal), + // Move to next height + val evt = EvDecided({ proposal: proposal }) + all { + nodeStates' = nodeStates.set(node, { + disk: { ...ns.disk, maxDecided: ns.mem.height }, + mem: { ...ns.mem, phase: Started, height: ns.mem.height + 1, round: 0 }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + proposals' = proposals, + } + } + } + + // --- StartedRound after timeout --- + // Consensus timed out waiting for progress in the current round. + // Timeout is internal to Malachite — the application only sees the + // resulting StartedRound at the next round. + action sendStartedRoundAfterTimeout(node: Node): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase == InRound, + ns.mem.round < MAX_ROUND, + ns.mem.height <= MAX_HEIGHT, + val newRound = ns.mem.round + 1 + val proposer = proposer_for(ns.mem.height, newRound) + val evt = EvStartedRound({ + height: ns.mem.height, + round: newRound, + proposer: proposer, + }) + all { + nodeStates' = nodeStates.set(node, { + ...ns, + mem: { ...ns.mem, phase: InRound, round: newRound }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + proposals' = proposals, + decisions' = decisions, + } + } + } + + // --- ProcessSyncedValue --- + // A synced value arrives from the network (catch-up scenario). + // The proposal must have been decided at some other node. + // + // Source: AppMsg::ProcessSyncedValue in msgs.rs + action sendProcessSyncedValue(node: Node): bool = { + val ns = nodeStates.get(node) + all { + or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, + decisions.has(ns.mem.height), + ns.disk.maxDecided < ns.mem.height, + val proposal = decisions.get(ns.mem.height) + val evt = EvProcessSyncedValue({ proposal: proposal }) + all { + nodeStates' = nodeStates.set(node, { + ...ns, + mem: { + ...ns.mem, + phase: Syncing, + deliveredProposals: ns.mem.deliveredProposals.union(Set(proposal)), + }, + }), + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + proposals' = proposals, + decisions' = decisions, + } + } + } + + // --- GetDecidedValue --- + // Malachite asks the application for a previously decided value (sync). + // + // Source: AppMsg::GetDecidedValue in msgs.rs + action sendGetDecidedValue(node: Node, height: Height): bool = { + val ns = nodeStates.get(node) + all { + height >= 1, + height < ns.mem.height, + val evt = EvGetDecidedValue({ height: height }) + all { + lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), + eventHistory' = eventHistory.set(node, + eventHistory.get(node).append(evt) + ), + nodeStates' = nodeStates, + proposals' = proposals, + decisions' = decisions, + } + } + } + + // =========================================================================== + // FAULT ACTIONS: crash and restart + // =========================================================================== + // + // Faults clear the node's event history (mem state) instead of appending + // EvFault. This keeps histories short (bounded by session length) and + // eliminates session-boundary logic from all contract properties. + + // --- Node Crash --- + // Node lost all state: reset disk + mem, clear event history. + action nodeCrash(node: Node): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase != Unstarted, + nodeStates' = nodeStates.set(node, initGenNode), + eventHistory' = eventHistory.set(node, []), + lastEvent' = Some({ node: node, event: FaultMsg(Crash) }), + proposals' = proposals, + decisions' = decisions, + } + } + + // --- Node Restart --- + // Node restarted: preserve disk state, reset mem, clear event history. + // Decisions survive on disk (maxDecided preserved). Malachite re-initializes + // and will re-deliver proposals and ConsensusReady. + action nodeRestart(node: Node): bool = { + val ns = nodeStates.get(node) + all { + ns.mem.phase != Unstarted, + nodeStates' = nodeStates.set(node, { disk: ns.disk, mem: initGenMem }), + eventHistory' = eventHistory.set(node, []), + lastEvent' = Some({ node: node, event: FaultMsg(Restart) }), + proposals' = proposals, + decisions' = decisions, + } + } + + // =========================================================================== + // INITIALIZATION + // =========================================================================== + + action init = { + val nodes = NODES.toSet() + all { + nodeStates' = nodes.mapBy(n => initGenNode), + proposals' = Set(), + decisions' = Map(), + eventHistory' = nodes.mapBy(n => []), + lastEvent' = None, + } + } + + // =========================================================================== + // STEP: nondeterministically pick a node and a valid action + // =========================================================================== + + action step = { + val nodes = NODES.toSet() + nondet node = nodes.oneOf() + any { + sendConsensusReady(node, 1), + sendStartedRound(node), + val ns = nodeStates.get(node) + sendGetValue(node, { + height: ns.mem.height, + round: ns.mem.round, + proposer: node, + payload: proposals.size(), + }), + nondet proposal = proposals.oneOf() + sendReceivedProposal(node, proposal), + nondet proposal = proposals.oneOf() + sendDecided(node, proposal), + sendProcessSyncedValue(node), + nondet height = 1.to(MAX_HEIGHT).oneOf() + sendGetDecidedValue(node, height), + nodeCrash(node), + nodeRestart(node), + } + } + + // =========================================================================== + // CONTRACT PROPERTIES (checked as invariants) + // =========================================================================== + + // Build the observable ChannelState for contract checking. + // Only the fields used by contract properties are included. + // Internal generator state (nodeStates) is not exposed — it exists + // only for the generator's own guards. + val channelState: ChannelState = { + disk: { + all_proposals: proposals, + decisions: decisions, + }, + mem: { + event_history: eventHistory, + }, + } + + // Safety invariants from the contract + val agreementInv = agreement(channelState) + val validityInv = validity(channelState) + val safetyInv = safety(channelState) + + // Ordering invariants from the contract + val orderingInv = ordering(channelState) + + // Full contract (safety + ordering) + val contractInv = contract(channelState) + + // =========================================================================== + // GENERATOR-SPECIFIC INVARIANTS (ordering, enforced by state machine) + // =========================================================================== + + // Height is always positive for started nodes + val heightPositive = NODES.toSet().forall(n => + nodeStates.get(n).mem.phase != Unstarted implies nodeStates.get(n).mem.height > 0 + ) + + // Decided heights are contiguous (no gaps) + val decisionsContiguous = decisions.keys().forall(h => + h == 1 or decisions.has(h - 1) + ) +} diff --git a/specs/channel_api_generator_test.qnt b/specs/channel_api_generator_test.qnt new file mode 100644 index 00000000..d44cb8ee --- /dev/null +++ b/specs/channel_api_generator_test.qnt @@ -0,0 +1,8 @@ +// -*- mode: Bluespec; -*- + +// Test module for channel_api_generator: instantiates with concrete nodes +// and checks the contract invariant via simulation. + +module channel_api_generator_test { + import channel_api_generator(NODES = List("node1", "node2", "node3")).* from "channel_api_generator" +} diff --git a/specs/emerald_with_generator.qnt b/specs/emerald_with_generator.qnt new file mode 100644 index 00000000..e48cc269 --- /dev/null +++ b/specs/emerald_with_generator.qnt @@ -0,0 +1,321 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Emerald + Channel API Generator Composition +// ============================================================================= +// +// Composes the Channel API reference generator with Emerald's handler logic. +// Replaces the Choreo-based listen_* functions and Extensions oracle from +// emerald.qnt with the generator's state machine. +// +// Architecture: +// Generator picks node + action -> Generator updates its own state +// -> Emerald handler updates emeraldState +// +// Each step is: all { gen::sendX(node), handleX(node) } +// Generator and Emerald actions fire atomically, each assigning their own +// state variables. +// +// State follows the disk/mem convention from faults.qnt: +// - Disk: proposals, last_decided_height, last_decided_payload (survive restart) +// - Mem: phase, consensus_height, consensus_round (reset on fault) +// +// Scope: Normal lifecycle + timeouts + sync + crash/restart. + +module emerald_with_generator { + import basicSpells.* from "spells/basicSpells" + import rareSpells.* from "spells/rareSpells" + import channel_api_contract.* from "channel_api_contract" + import channel_api_generator(NODES = NODES) as gen from "channel_api_generator" + + const NODES: List[Node] + + // =========================================================================== + // EMERALD-SPECIFIC TYPES (disk/mem split) + // =========================================================================== + + type AppPhase = + | Uninitialized // Before ConsensusReady + | Ready // After ConsensusReady or Decided, before StartedRound + | Working // After StartedRound + | Syncing // After ProcessSyncedValue + + // Disk state: survives restart, lost on crash + type EmeraldDiskState = { + proposals: Set[Proposal], + last_decided_height: Height, + last_decided_payload: Option[Payload], + } + + // Mem state: cleared on any fault (crash or restart) + type EmeraldMemState = { + phase: AppPhase, + consensus_height: Height, + consensus_round: Round, + } + + type EmeraldNodeState = { + disk: EmeraldDiskState, + mem: EmeraldMemState, + } + + // =========================================================================== + // STATE + // =========================================================================== + + var emeraldState: Node -> EmeraldNodeState + + // =========================================================================== + // INITIALIZATION + // =========================================================================== + + pure val initEmeraldDisk: EmeraldDiskState = { + proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + } + + pure val initEmeraldMem: EmeraldMemState = { + phase: Uninitialized, + consensus_height: 0, + consensus_round: 0, + } + + pure val initEmeraldNode: EmeraldNodeState = { + disk: initEmeraldDisk, + mem: initEmeraldMem, + } + + action init = all { + gen::init, + emeraldState' = NODES.toSet().mapBy(n => initEmeraldNode), + } + + // =========================================================================== + // HANDLERS: Emerald's response to each Channel API message + // =========================================================================== + + // ConsensusReady: Initialize node. The starting height is passed in + // (computed from the node's last decided height in the composed step). + action handleConsensusReady(node: Node, startHeight: Height): bool = { + val s = emeraldState.get(node) + all { + s.mem.phase == Uninitialized, + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, phase: Ready, consensus_height: startHeight, consensus_round: 0 }, + }), + } + } + + // StartedRound: Enter new consensus round. + // Height and round come from the StartedRound message payload. + action handleStartedRound(node: Node, height: Height, round: Round): bool = + emeraldState' = emeraldState.set(node, { + ...emeraldState.get(node), + mem: { phase: Working, consensus_height: height, consensus_round: round }, + }) + + // GetValue: Proposer builds or returns a value. + // The proposal is computed in the composed step and passed to both the + // generator (which records it) and this handler (which stores it locally). + action handleGetValue(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { + ...s, + disk: { ...s.disk, proposals: s.disk.proposals.union(Set(proposal)) }, + }) + } + + // ReceivedProposal: Non-proposer learns about a proposal + action handleReceivedProposal(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { + ...s, + disk: { ...s.disk, proposals: s.disk.proposals.union(Set(proposal)) }, + }) + } + + // Decided: Consensus decided on a value, advance to next height. + // TODO: Model the proposal lifecycle (pending -> undecided -> decided). + // In the implementation, Decided carries only a certificate — the node + // must already have the proposal stored as undecided. The generator's + // decidedRequiresDeliveredProposal contract property enforces this + // ordering from Malachite's perspective, but Emerald should track + // pending/undecided proposals in its own state to match the + // implementation more closely. + action handleDecided(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { + disk: { + ...s.disk, + last_decided_height: proposal.height, + last_decided_payload: Some(proposal.payload), + proposals: s.disk.proposals.union(Set(proposal)), + }, + mem: { + phase: Ready, + consensus_height: proposal.height + 1, + consensus_round: 0, + }, + }) + } + + // ProcessSyncedValue: Catch-up with a synced decided value. + // The proposal comes from the ProcessSyncedValue message payload. + action handleProcessSyncedValue(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, phase: Syncing }, + disk: { ...s.disk, proposals: s.disk.proposals.union(Set(proposal)) }, + }) + } + + // GetDecidedValue: Query for past decided value (no Emerald state change) + action handleGetDecidedValue(node: Node, height: Height): bool = + emeraldState' = emeraldState + + // NodeCrash: Full reset — all state lost (disk + mem). + action handleNodeCrash(node: Node): bool = + emeraldState' = emeraldState.set(node, initEmeraldNode) + + // NodeRestart: Preserve disk state, reset mem. + // Proposals + last_decided_* survive on disk. Phase and consensus + // height/round reset — Malachite will re-send ConsensusReady. + action handleNodeRestart(node: Node): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { disk: s.disk, mem: initEmeraldMem }) + } + + // =========================================================================== + // PROPOSAL CONSTRUCTION + // =========================================================================== + + // Build a proposal for GetValue: return existing proposal for (h, r) or create new. + pure def buildProposal(s: EmeraldNodeState, node: Node, numProposals: int): Proposal = { + val existing = s.disk.proposals.find(p => + p.height == s.mem.consensus_height and p.round == s.mem.consensus_round + ) + match existing { + | Some(p) => p + | None => { + height: s.mem.consensus_height, + round: s.mem.consensus_round, + proposer: node, + payload: numProposals, + } + } + } + + // =========================================================================== + // COMPOSED STEPS + // =========================================================================== + + action stepConsensusReady(node: Node): bool = { + val startHeight = emeraldState.get(node).disk.last_decided_height + 1 + all { gen::sendConsensusReady(node, startHeight), handleConsensusReady(node, startHeight) } + } + + action stepStartedRound(node: Node): bool = { + val ns = gen::nodeStates.get(node).mem + any { + // Normal: after ConsensusReady or Decided + all { + gen::sendStartedRound(node), + handleStartedRound(node, ns.height, ns.round), + }, + // After timeout: Malachite internally timed out, app sees StartedRound at next round + all { + gen::sendStartedRoundAfterTimeout(node), + handleStartedRound(node, ns.height, ns.round + 1), + }, + } + } + + action stepGetValue(node: Node): bool = { + val proposal = buildProposal(emeraldState.get(node), node, gen::proposals.size()) + all { gen::sendGetValue(node, proposal), handleGetValue(node, proposal) } + } + + action stepReceivedProposal(node: Node, proposal: Proposal): bool = + all { gen::sendReceivedProposal(node, proposal), handleReceivedProposal(node, proposal) } + + action stepDecided(node: Node, proposal: Proposal): bool = + all { gen::sendDecided(node, proposal), handleDecided(node, proposal) } + + action stepProcessSyncedValue(node: Node): bool = { + val ns = gen::nodeStates.get(node).mem + val proposal = gen::decisions.get(ns.height) + all { gen::sendProcessSyncedValue(node), handleProcessSyncedValue(node, proposal) } + } + + action stepGetDecidedValue(node: Node, height: Height): bool = + all { gen::sendGetDecidedValue(node, height), handleGetDecidedValue(node, height) } + + action stepNodeCrash(node: Node): bool = + all { gen::nodeCrash(node), handleNodeCrash(node) } + + action stepNodeRestart(node: Node): bool = + all { gen::nodeRestart(node), handleNodeRestart(node) } + + action step = { + nondet node = NODES.toSet().oneOf() + any { + stepConsensusReady(node), + stepStartedRound(node), + stepGetValue(node), + nondet proposal = gen::proposals.oneOf() + stepReceivedProposal(node, proposal), + nondet proposal = gen::proposals.oneOf() + stepDecided(node, proposal), + stepProcessSyncedValue(node), + nondet height = 1.to(gen::MAX_HEIGHT).oneOf() + stepGetDecidedValue(node, height), + stepNodeCrash(node), + stepNodeRestart(node), + } + } + + // =========================================================================== + // INVARIANTS + // =========================================================================== + + // Safety: All nodes agree on decided blocks. + // This is backed by the generator's contract guarantee (agreement), not + // by a hand-crafted oracle. + val emerald_agreement = + NODES.toSet().forall(n1 => + NODES.toSet().forall(n2 => + val st1 = emeraldState.get(n1) + val st2 = emeraldState.get(n2) + st1.disk.last_decided_height == st2.disk.last_decided_height implies + st1.disk.last_decided_payload == st2.disk.last_decided_payload + ) + ) + + // Consistency: After initialization, consensus height is always greater + // than the last decided height. + val consensus_height_gt_last_decided_height = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + st.mem.consensus_height > 0 implies + st.mem.consensus_height > st.disk.last_decided_height + ) + + // Completeness: All nodes know all decided proposals up to their last + // decided height. + val completion = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + 1.to(st.disk.last_decided_height).forall(height => + gen::decisions.has(height) and gen::decisions.get(height).in(st.disk.proposals) + ) + ) + + // Contract: The generator's Channel API contract is verified separately + // in channel_api_generator_test.qnt. Checking it here adds ~11 history + // scans per step for properties already enforced by the generator's + // guards. Uncomment for full verification runs. + // val contractInv = gen::contractInv +} diff --git a/specs/emerald_with_generator_test.qnt b/specs/emerald_with_generator_test.qnt new file mode 100644 index 00000000..30f1c43b --- /dev/null +++ b/specs/emerald_with_generator_test.qnt @@ -0,0 +1,8 @@ +// -*- mode: Bluespec; -*- + +// Test module for emerald_with_generator: instantiates with concrete nodes +// and checks invariants via simulation. + +module emerald_with_generator_test { + import emerald_with_generator(NODES = List("node1", "node2", "node3")).* from "emerald_with_generator" +} diff --git a/specs/faults.qnt b/specs/faults.qnt new file mode 100644 index 00000000..5e8519ed --- /dev/null +++ b/specs/faults.qnt @@ -0,0 +1,38 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Fault Events (reusable) +// ============================================================================= +// +// General infrastructure fault types. Not Channel API-specific. +// A node crash/restart affects all APIs simultaneously — faults are +// node-level events, not embedded in individual API event types. +// +// Disk/mem convention: +// Modules using faults should split state into { disk: D, mem: M }. +// - Crash: reset both disk and mem to initial values +// - Restart: reset mem to initial, preserve disk (survives on disk) +// +// This encodes persistence semantics in the type structure: +// - New persistent fields → add to DiskState → auto-survive restarts +// - New ephemeral fields → add to MemState → auto-reset on restart +// +// Example: +// pure def crashReset(initDisk, initMem) = { disk: initDisk, mem: initMem } +// pure def restartReset(current, initMem) = { ...current, mem: initMem } +// +// Event histories are mem state — cleared on fault, containing only the +// current session's events. This means contract properties over event +// histories automatically scope to the current session with no +// session-boundary logic needed. + +module faults { + type FaultEvent = + | Crash // Node lost all state (disk + mem) + | Restart // Node restarted, disk state preserved + + pure def isCrash(e: FaultEvent): bool = match e { + | Crash => true + | _ => false + } +} From 6961cb6984a76bf63ff5cb7f10b9e35c9c1e9ef5 Mon Sep 17 00:00:00 2001 From: mpoke Date: Sat, 21 Feb 2026 12:28:06 +0100 Subject: [PATCH 02/20] clean separation between contract and generator --- specs/channel_api_contract.qnt | 232 +++++++++++++++++++++++---- specs/channel_api_generator.qnt | 44 +++-- specs/channel_api_generator_test.qnt | 17 +- specs/emerald_with_generator.qnt | 8 +- 4 files changed, 249 insertions(+), 52 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 4612d02d..05c9d94f 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -178,10 +178,26 @@ module channel_api_contract { s.disk.decisions.get(h).in(s.disk.all_proposals) ) + // Decisions contiguous: Decided heights have no gaps. If height h is + // decided, then all heights 1..h-1 are also decided. + // + // Consensus processes heights sequentially. A decision at height h requires + // that height h-1 was already decided (the decided value determines the + // app state for h). Combined with agreement, this means the global decision + // sequence is a contiguous prefix of heights. + // + // Source: consensus.qnt — the state machine advances to h+1 only after + // deciding at h. A node starts at height 1 (or its last decided + 1). + pure def decisionsContiguous(s: ChannelState): bool = + s.disk.decisions.keys().forall(h => + h == 1 or s.disk.decisions.has(h - 1) + ) + // Combined safety properties pure def safety(s: ChannelState): bool = and { agreement(s), validity(s), + decisionsContiguous(s), } // =========================================================================== @@ -203,6 +219,24 @@ module channel_api_contract { // // Source: derived from driver.qnt, consensus.qnt, and msgs.rs documentation. + // heightsPositive: All event heights are >= 1. + // + // Consensus starts at height 1 (or higher after restart). Height 0 is + // never a valid consensus height. This is a basic structural constraint + // that applies to all events carrying a height. + // + // Source: consensus.qnt — heights start at 1. The application replies to + // ConsensusReady with a starting height >= 1. + pure def heightsPositive(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + s.mem.event_history.get(node).foldl(true, (ok, e) => + ok and match eventHeight(e) { + | Some(h) => h >= 1 + | None => true + } + ) + ) + // consensusReadyFirst: ConsensusReady is the first event in the history, // and it appears at most once per session. // @@ -226,25 +260,29 @@ module channel_api_contract { ).ok ) - // getValueAfterStartedRound: GetValue(h, r) is preceded by StartedRound(h, r, _) - // for the same node. + // getValueAfterStartedRound: GetValue(h, r) on node N is preceded by + // StartedRound(h, r, proposer=N) for the same node. The node receiving + // GetValue must have been declared as the proposer for that round. // - // The proposer can only be asked to build a value after consensus has - // entered that round. Histories are per-session (cleared on fault). + // Strictly stronger than "preceded by StartedRound(h, r, _)": also + // verifies that the proposer field matches the receiving node. + // Histories are per-session (cleared on fault). // // Source: driver.qnt — GetValue is produced as part of the proposer logic // in applyVotekeeper, after entering a new round. pure def getValueAfterStartedRound(s: ChannelState): bool = s.mem.event_history.keys().forall(node => - // Scan left to right: track which (h, r) had StartedRound. - // On GetValue(h, r), check (h, r) was already seen. Cost: O(n). - s.mem.event_history.get(node).foldl({ seen: Set(), ok: true }, (acc, e) => + // Scan left to right: track which (h, r) declared this node as proposer. + // On GetValue(h, r), check (h, r) was started with proposer=self. Cost: O(n). + s.mem.event_history.get(node).foldl({ startedAsProposer: Set(), ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { | EvStartedRound(sr) => - { ...acc, seen: acc.seen.union(Set((sr.height, sr.round))) } + if (sr.proposer == node) + { ...acc, startedAsProposer: acc.startedAsProposer.union(Set((sr.height, sr.round))) } + else acc | EvGetValue(gv) => - { ...acc, ok: acc.seen.contains((gv.height, gv.round)) } + { ...acc, ok: acc.startedAsProposer.contains((gv.height, gv.round)) } | _ => acc } ).ok @@ -344,6 +382,57 @@ module channel_api_contract { ).ok ) + // heightAdvanceRequiresDecision: A node's consensus height only advances + // after a decision at the previous height. + // + // When the height increases between progress events, the earlier height + // must have been decided first. This prevents height jumps without + // decisions (e.g., StartedRound(1,0) → StartedRound(2,0) with no + // Decided(1) in between). + // + // Combined with decidedIsFinal (post-decision height is exactly h+1) + // and heightMonotonic (no regression), this fully constrains height + // progression: heights advance one at a time, only after deciding. + // + // Source: consensus.qnt — the state machine advances to h+1 only after + // deciding at h. driver.qnt — Decided triggers StartHeight(h+1). + pure def heightAdvanceRequiresDecision(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + s.mem.event_history.get(node).foldl( + { currentHeight: 0, maxDecided: 0, ok: true }, (acc, e) => + if (not(acc.ok)) acc + else + val newMaxDecided = match e { + | EvDecided(d) => + if (d.proposal.height > acc.maxDecided) d.proposal.height + else acc.maxDecided + | _ => acc.maxDecided + } + // Track current height from progress events. + // After Decided(h), the node advances to h+1. + if (isProgressEvent(e)) { + match e { + | EvDecided(d) => + val h = d.proposal.height + 1 + if (acc.currentHeight > 0 and h > acc.currentHeight) + { currentHeight: h, maxDecided: newMaxDecided, + ok: acc.currentHeight <= newMaxDecided } + else + { currentHeight: h, maxDecided: newMaxDecided, ok: true } + | _ => match eventHeight(e) { + | Some(h) => + if (acc.currentHeight > 0 and h > acc.currentHeight) + { currentHeight: h, maxDecided: newMaxDecided, + ok: acc.currentHeight <= newMaxDecided } + else + { currentHeight: h, maxDecided: newMaxDecided, ok: true } + | None => { ...acc, maxDecided: newMaxDecided } + } + } + } else { ...acc, maxDecided: newMaxDecided } + ).ok + ) + // receivedProposalNotToProposer: A node does not receive its own proposal // via ReceivedProposal. // @@ -385,30 +474,69 @@ module channel_api_contract { ) ) - // roundsIncreasingWithinHeight: Within the same height, StartedRound events - // have strictly increasing rounds. + // syncIsIrrevocable: After ProcessSyncedValue(h), no StartedRound or + // GetValue events can occur at the same height h. Once Malachite enters + // the sync path for a height, it stays in sync until deciding — it does + // not fall back to normal consensus rounds. + // + // In the implementation, once Malachite detects it is behind and receives + // a synced value, timeouts are effectively disabled for that height. + // The next step is always Decided, followed by height advancement (which + // cancels all timeouts via CancelAllTimeouts + ResetTimeouts). + // + // Source: Malachite core-consensus sync.rs — on_value_response processes + // the commit certificate immediately. start_height.rs — CancelAllTimeouts + // on height advancement. timeout.rs — stale timeouts are ignored + // (round mismatch check). + pure def syncIsIrrevocable(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + // Scan left to right: track heights where ProcessSyncedValue has been seen. + // If StartedRound or GetValue appears at a synced height, fail. Cost: O(n). + s.mem.event_history.get(node).foldl({ syncedHeights: Set(), ok: true }, (acc, e) => + if (not(acc.ok)) acc + else match e { + | EvProcessSyncedValue(sv) => + { ...acc, syncedHeights: acc.syncedHeights.union(Set(sv.proposal.height)) } + | EvStartedRound(sr) => + { ...acc, ok: not(acc.syncedHeights.contains(sr.height)) } + | EvGetValue(gv) => + { ...acc, ok: not(acc.syncedHeights.contains(gv.height)) } + | _ => acc + } + ).ok + ) + + // roundsConsecutiveWithinHeight: Within the same height, StartedRound + // events have consecutive rounds (exactly +1), and the first round at + // each height is 0. // - // Consensus processes rounds sequentially within a height. A node advances - // to round r+1 via timeout, or skips to a higher round for a late decision. - // It never goes back to an earlier round. Histories are per-session - // (cleared on fault). + // Consensus starts each height at round 0. Rounds advance by exactly 1 + // via timeout. A node never skips rounds within normal operation. + // Histories are per-session (cleared on fault). // - // Source: consensus.qnt — round transitions are forward-only (timeout - // increments, skip-round jumps forward). driver.qnt — a round is entered - // at most once per height. - pure def roundsIncreasingWithinHeight(s: ChannelState): bool = + // Strictly stronger than "strictly increasing": prevents round gaps + // (e.g., round 0 → round 3). Subsumes the previous + // roundsIncreasingWithinHeight. + // + // Source: consensus.qnt — timeout increments round by 1. driver.qnt — + // each height starts at round 0. + pure def roundsConsecutiveWithinHeight(s: ChannelState): bool = s.mem.event_history.keys().forall(node => // Scan left to right: track the last round seen per height. - // Each new StartedRound at the same height must have a strictly - // higher round. Cost: O(n). + // First StartedRound at a height must be round 0. Each subsequent + // one must be exactly previous + 1. Cost: O(n). s.mem.event_history.get(node).foldl({ lastRound: Map(), ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { | EvStartedRound(sr) => - if (acc.lastRound.has(sr.height) and sr.round <= acc.lastRound.get(sr.height)) - { ...acc, ok: false } - else - { ...acc, lastRound: acc.lastRound.put(sr.height, sr.round) } + if (acc.lastRound.has(sr.height)) { + val prev = acc.lastRound.get(sr.height) + { ok: sr.round == prev + 1, + lastRound: acc.lastRound.put(sr.height, sr.round) } + } else { + { ok: sr.round == 0, + lastRound: acc.lastRound.put(sr.height, sr.round) } + } | _ => acc } ).ok @@ -473,16 +601,64 @@ module channel_api_contract { ).ok ) + // receivedProposalExists: Every ReceivedProposal event references a + // proposal that was previously created via GetValue. + // + // Malachite gossips proposals between nodes, but only proposals that + // actually exist (were built by some proposer). A ReceivedProposal for + // a non-existent proposal would indicate a fabrication bug. + // + // Source: Malachite driver — proposals are gossiped after being built + // by the proposer via GetValue. Only existing proposals are forwarded. + pure def receivedProposalExists(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + s.mem.event_history.get(node).foldl(true, (ok, e) => + ok and match e { + | EvReceivedProposal(rp) => rp.proposal.in(s.disk.all_proposals) + | _ => true + } + ) + ) + + // proposerConsistency: For each (height, round), all StartedRound events + // across all nodes declare the same proposer. + // + // Proposer selection is deterministic — every node in the network is told + // the same proposer for a given round. This catches bugs where different + // nodes receive conflicting proposer assignments. + // + // Cost: O(nodes × history_length). + pure def proposerConsistency(s: ChannelState): bool = { + val proposersByRound: (Height, Round) -> Set[Node] = + s.mem.event_history.keys().fold(Map(), (acc, node) => + s.mem.event_history.get(node).foldl(acc, (m, e) => + match e { + | EvStartedRound(sr) => + val key = (sr.height, sr.round) + val existing = if (m.has(key)) m.get(key) else Set() + m.put(key, existing.union(Set(sr.proposer))) + | _ => m + } + ) + ) + proposersByRound.keys().forall(k => proposersByRound.get(k).size() <= 1) + } + // Combined ordering properties pure def ordering(s: ChannelState): bool = and { + heightsPositive(s), consensusReadyFirst(s), getValueAfterStartedRound(s), getValueUnique(s), + proposerConsistency(s), heightMonotonic(s), decidedIsFinal(s), + heightAdvanceRequiresDecision(s), receivedProposalNotToProposer(s), + receivedProposalExists(s), syncedValueIsDecided(s), - roundsIncreasingWithinHeight(s), + syncIsIrrevocable(s), + roundsConsecutiveWithinHeight(s), decidedRequiresDeliveredProposal(s), } @@ -509,7 +685,9 @@ module channel_api_contract { // known values for this round (or empty). Needed for crash recovery. // // 3. On GetValue: the application MUST reply with a proposed value within - // the timeout duration. + // the timeout duration. The proposal's height, round, and proposer + // fields MUST match the GetValue request (height, round, node). + // The payload is the application's choice. // // 4. On Decided: the application MUST reply with Next (start next height // or restart current height). If no reply, consensus stalls. diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 552cd030..7c40f858 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -20,8 +20,7 @@ // - Actions correspond to Channel API messages from Malachite to the app // - Ordering is enforced by the state machine structure (phase transitions) // - Safety is enforced by global state constraints -// - All 11 contract properties (2 safety + 9 ordering) are checked via -// contractInv at every step +// - All contract properties are checked via contractInv at every step // - Fault injection: nodeCrash (lose all state) and nodeRestart (preserve // disk state) clear the node's event history and reset to Unstarted // @@ -42,9 +41,11 @@ module channel_api_generator { const NODES: List[Node] - // Proposer selection (matches Emerald's rotating proposer) - pure def proposer_for(height: Height, round: Round): Node = - NODES[(height - 1 + round) % NODES.length()] + // Proposer selection — provided by the application (e.g., Emerald). + // In the real system, the application defines this via the Malachite + // Context trait. The generator (modeling Malachite) is parameterized + // over it rather than defining it. + const proposer_for: (Height, Round) => Node // Max height the generator will explore (bounds the trace length) pure val MAX_HEIGHT = 4 @@ -174,6 +175,8 @@ module channel_api_generator { val ns = nodeStates.get(node) all { ns.mem.phase == Unstarted, + // Contract: heightsPositive requires all event heights >= 1. + // This guard ensures the starting height satisfies that property. replyStartHeight >= 1, val evt = EvConsensusReady all { @@ -237,8 +240,9 @@ module channel_api_generator { ns.mem.phase == InRound, node == proposer_for(ns.mem.height, ns.mem.round), not(ns.mem.getValueSent.contains((ns.mem.height, ns.mem.round))), - // Validate the reply proposal matches the current (height, round, proposer). - // The payload is the application's choice — not constrained here. + // Assumption (not a Malachite guarantee): the application's reply matches + // the current (height, round, proposer). Documented as assumption #3 in the + // contract. The payload is the application's choice — not constrained here. replyProposal.height == ns.mem.height, replyProposal.round == ns.mem.round, replyProposal.proposer == node, @@ -278,7 +282,9 @@ module channel_api_generator { ns.mem.phase != Unstarted, proposal.in(proposals), proposal.proposer != node, // Nodes don't receive their own proposals - proposal.height >= ns.mem.height, // Can arrive for future heights (buffered as pending) + // Optimization: real network can deliver stale proposals (Emerald drops them). + // Not enforced by the contract — restricts traces to reduce state space. + proposal.height >= ns.mem.height, val evt = EvReceivedProposal({ proposal: proposal }) all { nodeStates' = nodeStates.set(node, { @@ -315,8 +321,10 @@ module channel_api_generator { proposal.in(proposals), // Malachite must have delivered the proposal to this node ns.mem.deliveredProposals.contains(proposal), - // Node must have reached the proposal's round (no round skips: - // if ns.round >= p.round, all rounds up to ns.round were entered) + // Optimization: in the normal (non-sync) path, the contract's + // decidedRequiresDeliveredProposal + roundsConsecutiveWithinHeight + // already constrain this. This guard further restricts the generator + // to avoid producing traces where a decision references a future round. proposal.round <= ns.mem.round, // Agreement: if already decided for this height, must be the same not(decisions.has(ns.mem.height)) or decisions.get(ns.mem.height) == proposal, @@ -411,6 +419,9 @@ module channel_api_generator { action sendGetDecidedValue(node: Node, height: Height): bool = { val ns = nodeStates.get(node) all { + // Optimization: real Malachite can query any height — the app returns + // None for unavailable heights. These guards restrict traces to reduce + // state space; not enforced by the contract. height >= 1, height < ns.mem.height, val evt = EvGetDecidedValue({ height: height }) @@ -537,17 +548,4 @@ module channel_api_generator { // Full contract (safety + ordering) val contractInv = contract(channelState) - // =========================================================================== - // GENERATOR-SPECIFIC INVARIANTS (ordering, enforced by state machine) - // =========================================================================== - - // Height is always positive for started nodes - val heightPositive = NODES.toSet().forall(n => - nodeStates.get(n).mem.phase != Unstarted implies nodeStates.get(n).mem.height > 0 - ) - - // Decided heights are contiguous (no gaps) - val decisionsContiguous = decisions.keys().forall(h => - h == 1 or decisions.has(h - 1) - ) } diff --git a/specs/channel_api_generator_test.qnt b/specs/channel_api_generator_test.qnt index d44cb8ee..08db8211 100644 --- a/specs/channel_api_generator_test.qnt +++ b/specs/channel_api_generator_test.qnt @@ -4,5 +4,20 @@ // and checks the contract invariant via simulation. module channel_api_generator_test { - import channel_api_generator(NODES = List("node1", "node2", "node3")).* from "channel_api_generator" + import channel_api_contract.* from "channel_api_contract" + + pure val NODES = List("node1", "node2", "node3") + + pure def test_proposer_for(height: Height, round: Round): Node = + NODES[(height - 1 + round) % NODES.length()] + + import channel_api_generator( + NODES = NODES, + proposer_for = test_proposer_for, + ) as gen from "channel_api_generator" + + // Re-export generator state for simulation + action init = gen::init + action step = gen::step + val contractInv = gen::contractInv } diff --git a/specs/emerald_with_generator.qnt b/specs/emerald_with_generator.qnt index e48cc269..004ce8e4 100644 --- a/specs/emerald_with_generator.qnt +++ b/specs/emerald_with_generator.qnt @@ -26,10 +26,16 @@ module emerald_with_generator { import basicSpells.* from "spells/basicSpells" import rareSpells.* from "spells/rareSpells" import channel_api_contract.* from "channel_api_contract" - import channel_api_generator(NODES = NODES) as gen from "channel_api_generator" const NODES: List[Node] + // Proposer selection — application-defined, passed to the generator. + // Rotating proposer based on (height, round). + pure def proposer_for(height: Height, round: Round): Node = + NODES[(height - 1 + round) % NODES.length()] + + import channel_api_generator(NODES = NODES, proposer_for = proposer_for) as gen from "channel_api_generator" + // =========================================================================== // EMERALD-SPECIFIC TYPES (disk/mem split) // =========================================================================== From 9c3490d1583144a179c76d056052c78a79d1891a Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 23 Feb 2026 09:32:50 +0100 Subject: [PATCH 03/20] add syncRequiresStartedRound property --- specs/channel_api_contract.qnt | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 05c9d94f..05a1710c 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -474,6 +474,30 @@ module channel_api_contract { ) ) + // syncRequiresStartedRound: ProcessSyncedValue(h) requires a prior + // StartedRound(h, _) at the same height. Malachite always enters a round + // (via start_height → StartedRound) before sync can deliver values for + // that height. A node cannot receive a synced value for a height it hasn't + // started consensus on. + // + // Source: Malachite start_height.rs — start_height always emits + // StartedRound(h, 0) before any other events at height h. + pure def syncRequiresStartedRound(s: ChannelState): bool = + s.mem.event_history.keys().forall(node => + // Scan left to right: track heights where StartedRound has been seen. + // On ProcessSyncedValue(h), check StartedRound(h, _) preceded it. Cost: O(n). + s.mem.event_history.get(node).foldl({ startedHeights: Set(), ok: true }, (acc, e) => + if (not(acc.ok)) acc + else match e { + | EvStartedRound(sr) => + { ...acc, startedHeights: acc.startedHeights.union(Set(sr.height)) } + | EvProcessSyncedValue(sv) => + { ...acc, ok: acc.startedHeights.contains(sv.proposal.height) } + | _ => acc + } + ).ok + ) + // syncIsIrrevocable: After ProcessSyncedValue(h), no StartedRound or // GetValue events can occur at the same height h. Once Malachite enters // the sync path for a height, it stays in sync until deciding — it does @@ -657,6 +681,7 @@ module channel_api_contract { receivedProposalNotToProposer(s), receivedProposalExists(s), syncedValueIsDecided(s), + syncRequiresStartedRound(s), syncIsIrrevocable(s), roundsConsecutiveWithinHeight(s), decidedRequiresDeliveredProposal(s), From efff8a390d530645273c74666c85913abdb24bae Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 23 Feb 2026 11:49:42 +0100 Subject: [PATCH 04/20] add proposal lifecycle tracking to emerald spec --- specs/emerald_with_generator.qnt | 95 +++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 27 deletions(-) diff --git a/specs/emerald_with_generator.qnt b/specs/emerald_with_generator.qnt index 004ce8e4..595cfdb5 100644 --- a/specs/emerald_with_generator.qnt +++ b/specs/emerald_with_generator.qnt @@ -17,8 +17,13 @@ // state variables. // // State follows the disk/mem convention from faults.qnt: -// - Disk: proposals, last_decided_height, last_decided_payload (survive restart) -// - Mem: phase, consensus_height, consensus_round (reset on fault) +// - Disk: decided_proposals, last_decided_height, last_decided_payload (survive restart) +// - Mem: phase, consensus_height, consensus_round, pending_proposals, undecided_proposals (reset on fault) +// +// Proposal lifecycle (pending → undecided → decided): +// - pending (mem): received at height > consensus_height, can't validate yet +// - undecided (mem): received at height == consensus_height, actionable +// - decided (disk): committed decisions, survive restart // // Scope: Normal lifecycle + timeouts + sync + crash/restart. @@ -48,7 +53,7 @@ module emerald_with_generator { // Disk state: survives restart, lost on crash type EmeraldDiskState = { - proposals: Set[Proposal], + decided_proposals: Set[Proposal], // committed decisions last_decided_height: Height, last_decided_payload: Option[Payload], } @@ -58,6 +63,8 @@ module emerald_with_generator { phase: AppPhase, consensus_height: Height, consensus_round: Round, + pending_proposals: Set[Proposal], // height > consensus_height, can't validate + undecided_proposals: Set[Proposal], // height == consensus_height, actionable } type EmeraldNodeState = { @@ -76,7 +83,7 @@ module emerald_with_generator { // =========================================================================== pure val initEmeraldDisk: EmeraldDiskState = { - proposals: Set(), + decided_proposals: Set(), last_decided_height: 0, last_decided_payload: None, } @@ -85,6 +92,8 @@ module emerald_with_generator { phase: Uninitialized, consensus_height: 0, consensus_round: 0, + pending_proposals: Set(), + undecided_proposals: Set(), } pure val initEmeraldNode: EmeraldNodeState = { @@ -116,65 +125,88 @@ module emerald_with_generator { // StartedRound: Enter new consensus round. // Height and round come from the StartedRound message payload. - action handleStartedRound(node: Node, height: Height, round: Round): bool = + // When entering a new height, promote matching pending proposals to undecided. + action handleStartedRound(node: Node, height: Height, round: Round): bool = { + val s = emeraldState.get(node) + val promoted = s.mem.pending_proposals.filter(p => p.height == height) + val remaining = s.mem.pending_proposals.exclude(promoted) emeraldState' = emeraldState.set(node, { - ...emeraldState.get(node), - mem: { phase: Working, consensus_height: height, consensus_round: round }, + ...s, + mem: { + phase: Working, + consensus_height: height, + consensus_round: round, + pending_proposals: remaining, + undecided_proposals: s.mem.undecided_proposals.union(promoted), + }, }) + } // GetValue: Proposer builds or returns a value. // The proposal is computed in the composed step and passed to both the // generator (which records it) and this handler (which stores it locally). + // Proposer is at consensus_height, so proposal goes to undecided (mem). action handleGetValue(node: Node, proposal: Proposal): bool = { val s = emeraldState.get(node) emeraldState' = emeraldState.set(node, { ...s, - disk: { ...s.disk, proposals: s.disk.proposals.union(Set(proposal)) }, + mem: { ...s.mem, undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)) }, }) } - // ReceivedProposal: Non-proposer learns about a proposal + // ReceivedProposal: Non-proposer learns about a proposal. + // Categorize by height: stale proposals dropped, current → undecided, future → pending. action handleReceivedProposal(node: Node, proposal: Proposal): bool = { val s = emeraldState.get(node) - emeraldState' = emeraldState.set(node, { - ...s, - disk: { ...s.disk, proposals: s.disk.proposals.union(Set(proposal)) }, - }) + if (proposal.height < s.mem.consensus_height) { + // Stale proposal — drop it + emeraldState' = emeraldState + } else if (proposal.height == s.mem.consensus_height) { + // Current height — actionable + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)) }, + }) + } else { + // Future height — can't validate yet + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, pending_proposals: s.mem.pending_proposals.union(Set(proposal)) }, + }) + } } // Decided: Consensus decided on a value, advance to next height. - // TODO: Model the proposal lifecycle (pending -> undecided -> decided). - // In the implementation, Decided carries only a certificate — the node - // must already have the proposal stored as undecided. The generator's - // decidedRequiresDeliveredProposal contract property enforces this - // ordering from Malachite's perspective, but Emerald should track - // pending/undecided proposals in its own state to match the - // implementation more closely. + // Move proposal to decided (disk), clear undecided at this height (stale for next). + // Pending proposals for future heights are kept. action handleDecided(node: Node, proposal: Proposal): bool = { val s = emeraldState.get(node) + val nextHeight = proposal.height + 1 emeraldState' = emeraldState.set(node, { disk: { ...s.disk, last_decided_height: proposal.height, last_decided_payload: Some(proposal.payload), - proposals: s.disk.proposals.union(Set(proposal)), + decided_proposals: s.disk.decided_proposals.union(Set(proposal)), }, mem: { phase: Ready, - consensus_height: proposal.height + 1, + consensus_height: nextHeight, consensus_round: 0, + pending_proposals: s.mem.pending_proposals, + undecided_proposals: Set(), }, }) } // ProcessSyncedValue: Catch-up with a synced decided value. // The proposal comes from the ProcessSyncedValue message payload. + // Goes to undecided (mem) — subsequent Decided will promote to decided (disk). action handleProcessSyncedValue(node: Node, proposal: Proposal): bool = { val s = emeraldState.get(node) emeraldState' = emeraldState.set(node, { ...s, - mem: { ...s.mem, phase: Syncing }, - disk: { ...s.disk, proposals: s.disk.proposals.union(Set(proposal)) }, + mem: { ...s.mem, phase: Syncing, undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)) }, }) } @@ -198,9 +230,9 @@ module emerald_with_generator { // PROPOSAL CONSTRUCTION // =========================================================================== - // Build a proposal for GetValue: return existing proposal for (h, r) or create new. + // Build a proposal for GetValue: return existing undecided proposal for (h, r) or create new. pure def buildProposal(s: EmeraldNodeState, node: Node, numProposals: int): Proposal = { - val existing = s.disk.proposals.find(p => + val existing = s.mem.undecided_proposals.find(p => p.height == s.mem.consensus_height and p.round == s.mem.consensus_round ) match existing { @@ -315,10 +347,19 @@ module emerald_with_generator { NODES.toSet().forall(n => val st = emeraldState.get(n) 1.to(st.disk.last_decided_height).forall(height => - gen::decisions.has(height) and gen::decisions.get(height).in(st.disk.proposals) + gen::decisions.has(height) and gen::decisions.get(height).in(st.disk.decided_proposals) ) ) + // Lifecycle: After StartedRound(h), no proposals at height h remain pending — + // they should all have been promoted to undecided. + val no_pending_at_current_height = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + st.mem.consensus_height > 0 implies + st.mem.pending_proposals.forall(p => p.height > st.mem.consensus_height) + ) + // Contract: The generator's Channel API contract is verified separately // in channel_api_generator_test.qnt. Checking it here adds ~11 history // scans per step for properties already enforced by the generator's From 215d44a709c1fc4255ebb5b1a0b979bad258abb3 Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 23 Feb 2026 12:37:26 +0100 Subject: [PATCH 05/20] decouple emerald composed steps from generator internal state --- specs/emerald_with_generator.qnt | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/specs/emerald_with_generator.qnt b/specs/emerald_with_generator.qnt index 595cfdb5..4d455142 100644 --- a/specs/emerald_with_generator.qnt +++ b/specs/emerald_with_generator.qnt @@ -16,6 +16,11 @@ // Generator and Emerald actions fire atomically, each assigning their own // state variables. // +// Remaining dependencies on generator state: +// - gen::proposals: nondeterministic proposal selection in step (trace exploration) +// - gen::decisions: synced value lookup + completion invariant (network truth) +// - gen::MAX_HEIGHT: bounds nondeterministic height selection in step +// // State follows the disk/mem convention from faults.qnt: // - Disk: decided_proposals, last_decided_height, last_decided_payload (survive restart) // - Mem: phase, consensus_height, consensus_round, pending_proposals, undecided_proposals (reset on fault) @@ -231,7 +236,8 @@ module emerald_with_generator { // =========================================================================== // Build a proposal for GetValue: return existing undecided proposal for (h, r) or create new. - pure def buildProposal(s: EmeraldNodeState, node: Node, numProposals: int): Proposal = { + // Payload derived from (height, round) — unique per proposal slot. Safe for MAX_ROUND=3, MAX_HEIGHT=4. + pure def buildProposal(s: EmeraldNodeState, node: Node): Proposal = { val existing = s.mem.undecided_proposals.find(p => p.height == s.mem.consensus_height and p.round == s.mem.consensus_round ) @@ -241,7 +247,7 @@ module emerald_with_generator { height: s.mem.consensus_height, round: s.mem.consensus_round, proposer: node, - payload: numProposals, + payload: s.mem.consensus_height * 100 + s.mem.consensus_round, } } } @@ -256,23 +262,23 @@ module emerald_with_generator { } action stepStartedRound(node: Node): bool = { - val ns = gen::nodeStates.get(node).mem + val s = emeraldState.get(node).mem any { // Normal: after ConsensusReady or Decided all { gen::sendStartedRound(node), - handleStartedRound(node, ns.height, ns.round), + handleStartedRound(node, s.consensus_height, s.consensus_round), }, // After timeout: Malachite internally timed out, app sees StartedRound at next round all { gen::sendStartedRoundAfterTimeout(node), - handleStartedRound(node, ns.height, ns.round + 1), + handleStartedRound(node, s.consensus_height, s.consensus_round + 1), }, } } action stepGetValue(node: Node): bool = { - val proposal = buildProposal(emeraldState.get(node), node, gen::proposals.size()) + val proposal = buildProposal(emeraldState.get(node), node) all { gen::sendGetValue(node, proposal), handleGetValue(node, proposal) } } @@ -283,8 +289,8 @@ module emerald_with_generator { all { gen::sendDecided(node, proposal), handleDecided(node, proposal) } action stepProcessSyncedValue(node: Node): bool = { - val ns = gen::nodeStates.get(node).mem - val proposal = gen::decisions.get(ns.height) + val h = emeraldState.get(node).mem.consensus_height + val proposal = gen::decisions.get(h) all { gen::sendProcessSyncedValue(node), handleProcessSyncedValue(node, proposal) } } From 5a43c0f6193cb3fd6a1d3ba13a68cfb4921de49e Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 23 Feb 2026 16:54:38 +0100 Subject: [PATCH 06/20] add quorumDecision property to Channel API contract --- specs/channel_api_contract.qnt | 59 +++++++++++++++++++++++-- specs/channel_api_generator.qnt | 62 +++++++++++++++++++++++++-- specs/channel_api_generator_test.qnt | 6 ++- specs/emerald_with_generator_test.qnt | 4 +- 4 files changed, 122 insertions(+), 9 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 05a1710c..0dd1bf25 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -5,7 +5,8 @@ // ============================================================================= // // Behavioral contract for Malachite's Channel API. -// Published by the Malachite team. Consumed by applications (e.g., Emerald). +// Written by the Emerald team as a proof of concept for the contract pattern. +// Models what the Malachite team would publish for applications to consume. // // This contract defines: // 1. The message types exchanged through the Channel API @@ -120,6 +121,18 @@ module channel_api_contract { all_proposals: Set[Proposal], // Decided proposals per height (at most one per height) decisions: Height -> Proposal, + // Per-proposal: which nodes have been delivered this specific proposal + // and are in a position to vote on it. Keyed by Proposal (not Height) + // because different rounds at the same height can have different + // proposals from different proposers. + // Updated by GetValue (proposer), ReceivedProposal at current height + // (non-proposer), and StartedRound (retroactive — if a node had the + // proposal from a prior height as pending, counted when it reaches + // this height). NOT updated by ProcessSyncedValue — synced values + // are already decided, so the quorum was already met. + // Disk state: a vote is cast when the proposal is received — this + // doesn't un-happen on restart or crash. The network saw it. + proposal_support: Proposal -> Set[Node], } type ChannelStateMem = { @@ -193,11 +206,44 @@ module channel_api_contract { h == 1 or s.disk.decisions.has(h - 1) ) + // quorumDecision: Every decided height has proposal support from strictly + // more than 2/3 of the network. + // + // In BFT consensus, a decision requires 2f+1 precommits (where n >= 3f+1), + // which is strictly more than 2/3 of voting power. A node can only + // precommit a proposal it has seen. At the Channel API boundary, proposal + // delivery is observable via GetValue (proposer), ReceivedProposal at + // current height (non-proposer), and retroactively at StartedRound + // (for proposals received at a prior height as pending). + // ProcessSyncedValue is NOT counted — synced proposals are already + // decided, so the quorum was already met. + // + // Keyed by Proposal (not Height) because different rounds at the same + // height can have different proposals from different proposers. The + // quorum must hold for the specific proposal that was decided. + // + // This property ensures a minority partition cannot unilaterally decide. + // The generator enforces this as a guard on sendDecided. + // + // Assumption: all validators have equal voting power. The quorum + // threshold is computed as strictly more than 2/3 of node count. + // With non-uniform voting power, this would use the validator set's + // total voting power instead of node count. + // + // Source: Tendermint BFT — decision requires 2f+1 precommits where n≥3f+1. + pure def quorumDecision(s: ChannelState, nNodes: int): bool = + s.disk.decisions.keys().forall(h => + val proposal = s.disk.decisions.get(h) + s.disk.proposal_support.has(proposal) and + s.disk.proposal_support.get(proposal).size() * 3 > nNodes * 2 + ) + // Combined safety properties - pure def safety(s: ChannelState): bool = and { + pure def safety(s: ChannelState, nNodes: int): bool = and { agreement(s), validity(s), decisionsContiguous(s), + quorumDecision(s, nNodes), } // =========================================================================== @@ -692,8 +738,8 @@ module channel_api_contract { // =========================================================================== // All properties a conforming generator must satisfy. - pure def contract(s: ChannelState): bool = and { - safety(s), + pure def contract(s: ChannelState, nNodes: int): bool = and { + safety(s, nNodes), ordering(s), } @@ -727,6 +773,11 @@ module channel_api_contract { // // 8. Environment: the network eventually delivers messages between // correct validators. + // + // 9. Voting power: all validators have equal voting power. The quorum + // threshold (strictly more than 2/3 of node count) assumes this. + // With non-uniform voting power, quorumDecision would need the + // validator set's total voting power instead of nNodes. // =========================================================================== // LIVENESS GUARANTEES (semi-formal) diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 7c40f858..1761dea7 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -5,7 +5,7 @@ // ============================================================================= // // A minimal state machine that produces valid Channel API message sequences. -// Written by the Malachite team. Verified against channel_api_contract.qnt. +// Verified against channel_api_contract.qnt. // // This is NOT the full Malachite consensus spec. It models only the observable // behavior at the Channel API boundary — just enough state to produce messages @@ -158,6 +158,23 @@ module channel_api_generator { // Cleared on fault — contains only current-session events. var eventHistory: Node -> List[ChannelEvent] + // Per-proposal: which nodes have been delivered this specific proposal + // and are in a position to vote on it. Keyed by Proposal (not Height) + // because different rounds at the same height can have different + // proposals from different proposers. + // Disk state — a vote is cast when a proposal is received; this doesn't + // un-happen on restart or crash (the network saw it). + // Updated by: + // - sendGetValue: proposer participates at their height + // - sendReceivedProposal: at current height only (future-height + // proposals are pending — not voted on yet) + // - sendStartedRound: retroactive — if a node already has proposals + // for this height (received at a prior height as pending), count + // the node as support now that it has reached this height + // NOT updated by sendProcessSyncedValue — already decided, quorum was met. + // Guards sendDecided: requires > 2/3 support before any node can decide. + var proposalSupport: Proposal -> Set[Node] + // Last event emitted (for trace observation / MBT integration). // None in the initial state (no event sent yet). var lastEvent: Option[{ node: Node, event: TraceEvent }] @@ -190,6 +207,7 @@ module channel_api_generator { ), proposals' = proposals, decisions' = decisions, + proposalSupport' = proposalSupport, } } } @@ -202,6 +220,15 @@ module channel_api_generator { // Source: AppMsg::StartedRound in msgs.rs action sendStartedRound(node: Node): bool = { val ns = nodeStates.get(node) + val h = ns.mem.height + // If the node already has proposals for this height (received at a + // prior height and buffered as pending), count it as support for + // each such proposal now that the node is at this height. + val pendingAtHeight = ns.mem.deliveredProposals.filter(p => p.height == h) + val updatedSupport = pendingAtHeight.fold(proposalSupport, (acc, p) => + val existing = if (acc.has(p)) acc.get(p) else Set() + acc.put(p, existing.union(Set(node))) + ) all { ns.mem.phase == Started, ns.mem.height <= MAX_HEIGHT, @@ -222,6 +249,7 @@ module channel_api_generator { ), proposals' = proposals, decisions' = decisions, + proposalSupport' = updatedSupport, } } } @@ -250,6 +278,7 @@ module channel_api_generator { height: ns.mem.height, round: ns.mem.round, }) + val existing = if (proposalSupport.has(replyProposal)) proposalSupport.get(replyProposal) else Set() all { proposals' = proposals.union(Set(replyProposal)), nodeStates' = nodeStates.set(node, { @@ -265,6 +294,8 @@ module channel_api_generator { eventHistory.get(node).append(evt) ), decisions' = decisions, + // Proposer supports their specific proposal + proposalSupport' = proposalSupport.put(replyProposal, existing.union(Set(node))), } } } @@ -286,6 +317,11 @@ module channel_api_generator { // Not enforced by the contract — restricts traces to reduce state space. proposal.height >= ns.mem.height, val evt = EvReceivedProposal({ proposal: proposal }) + // Only count support when the node is at the proposal's height. + // Future-height proposals are buffered as pending — the node hasn't + // participated in consensus at that height yet. + val atCurrentHeight = proposal.height == ns.mem.height + val existing = if (proposalSupport.has(proposal)) proposalSupport.get(proposal) else Set() all { nodeStates' = nodeStates.set(node, { ...ns, @@ -300,6 +336,10 @@ module channel_api_generator { ), proposals' = proposals, decisions' = decisions, + proposalSupport' = if (atCurrentHeight) + proposalSupport.put(proposal, existing.union(Set(node))) + else + proposalSupport, } } } @@ -330,6 +370,11 @@ module channel_api_generator { not(decisions.has(ns.mem.height)) or decisions.get(ns.mem.height) == proposal, // Not already decided at this node for this height ns.disk.maxDecided < ns.mem.height, + // Quorum: strictly more than 2/3 of nodes must have received + // this specific proposal before any node can decide on it. + // Assumes equal voting power — uses node count as threshold. + proposalSupport.has(proposal), + proposalSupport.get(proposal).size() * 3 > NODES.length() * 2, // Record the decision decisions' = decisions.put(ns.mem.height, proposal), // Move to next height @@ -344,6 +389,7 @@ module channel_api_generator { eventHistory.get(node).append(evt) ), proposals' = proposals, + proposalSupport' = proposalSupport, } } } @@ -376,6 +422,7 @@ module channel_api_generator { ), proposals' = proposals, decisions' = decisions, + proposalSupport' = proposalSupport, } } } @@ -408,6 +455,8 @@ module channel_api_generator { ), proposals' = proposals, decisions' = decisions, + // No support update — proposal is already decided, quorum was already met. + proposalSupport' = proposalSupport, } } } @@ -433,6 +482,7 @@ module channel_api_generator { nodeStates' = nodeStates, proposals' = proposals, decisions' = decisions, + proposalSupport' = proposalSupport, } } } @@ -456,6 +506,8 @@ module channel_api_generator { lastEvent' = Some({ node: node, event: FaultMsg(Crash) }), proposals' = proposals, decisions' = decisions, + // Disk state — votes already cast don't un-happen + proposalSupport' = proposalSupport, } } @@ -472,6 +524,8 @@ module channel_api_generator { lastEvent' = Some({ node: node, event: FaultMsg(Restart) }), proposals' = proposals, decisions' = decisions, + // Disk state — votes already cast don't un-happen + proposalSupport' = proposalSupport, } } @@ -486,6 +540,7 @@ module channel_api_generator { proposals' = Set(), decisions' = Map(), eventHistory' = nodes.mapBy(n => []), + proposalSupport' = Map(), lastEvent' = None, } } @@ -531,6 +586,7 @@ module channel_api_generator { disk: { all_proposals: proposals, decisions: decisions, + proposal_support: proposalSupport, }, mem: { event_history: eventHistory, @@ -540,12 +596,12 @@ module channel_api_generator { // Safety invariants from the contract val agreementInv = agreement(channelState) val validityInv = validity(channelState) - val safetyInv = safety(channelState) + val safetyInv = safety(channelState, NODES.length()) // Ordering invariants from the contract val orderingInv = ordering(channelState) // Full contract (safety + ordering) - val contractInv = contract(channelState) + val contractInv = contract(channelState, NODES.length()) } diff --git a/specs/channel_api_generator_test.qnt b/specs/channel_api_generator_test.qnt index 08db8211..e188b441 100644 --- a/specs/channel_api_generator_test.qnt +++ b/specs/channel_api_generator_test.qnt @@ -2,11 +2,15 @@ // Test module for channel_api_generator: instantiates with concrete nodes // and checks the contract invariant via simulation. +// +// 4 nodes: with equal voting power and the >2/3 quorum threshold, 3 out of 4 +// nodes must support a proposal before any node can decide. This allows +// traces where one node crashes and the remaining 3 still make progress. module channel_api_generator_test { import channel_api_contract.* from "channel_api_contract" - pure val NODES = List("node1", "node2", "node3") + pure val NODES = List("node1", "node2", "node3", "node4") pure def test_proposer_for(height: Height, round: Round): Node = NODES[(height - 1 + round) % NODES.length()] diff --git a/specs/emerald_with_generator_test.qnt b/specs/emerald_with_generator_test.qnt index 30f1c43b..3f519e3e 100644 --- a/specs/emerald_with_generator_test.qnt +++ b/specs/emerald_with_generator_test.qnt @@ -2,7 +2,9 @@ // Test module for emerald_with_generator: instantiates with concrete nodes // and checks invariants via simulation. +// +// 4 nodes: allows progress with one crashed node (3/4 > 2/3 quorum). module emerald_with_generator_test { - import emerald_with_generator(NODES = List("node1", "node2", "node3")).* from "emerald_with_generator" + import emerald_with_generator(NODES = List("node1", "node2", "node3", "node4")).* from "emerald_with_generator" } From f6059d340ad9b2c89aaf90b2e97399a413299459 Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 23 Feb 2026 19:16:41 +0100 Subject: [PATCH 07/20] refactor: rename channel events to channel requests --- specs/channel_api_contract.qnt | 256 ++++++++++++++++---------------- specs/channel_api_generator.qnt | 114 +++++++------- 2 files changed, 185 insertions(+), 185 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 0dd1bf25..78edfd61 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -11,7 +11,7 @@ // This contract defines: // 1. The message types exchanged through the Channel API // 2. Safety guarantees (agreement, validity) -// 3. Ordering guarantees (declarative properties over event histories) +// 3. Ordering guarantees (declarative properties over request histories) // 4. Assumptions (what the application must do for guarantees to hold) // // Both safety and ordering properties are checked as invariants on any @@ -20,14 +20,14 @@ // properties make the ordering auditable and verifiable independently. // // Fault handling: Faults (crash/restart) are node-level, not API-specific. -// After a fault, the node's event history is cleared (it's ephemeral/mem +// After a fault, the node's request history is cleared (it's ephemeral/mem // state), while proposals and decisions survive on disk. This means contract -// properties only need to reason about the current session's events — no -// EvFault variant or session-reset logic needed. +// properties only need to reason about the current session's requests — no +// ReqFault variant or session-reset logic needed. // // State follows the disk/mem convention from faults.qnt: // - Disk: all_proposals, decisions (survive crash/restart) -// - Mem: event_history (cleared on fault, contains only current session) +// - Mem: request_history (cleared on fault, contains only current session) // // Source: Malachite's app-channel crate (crates/app-channel/src/msgs.rs) // and the consensus Quint spec (specs/consensus/quint/). @@ -60,44 +60,44 @@ module channel_api_contract { // - GetHistoryMinHeight (sync protocol detail) // - ReceivedProposalPart (modeled as ReceivedProposal for simplicity) // - // Faults (crash/restart) are NOT part of the Channel API event type. - // They are node-level events handled by clearing event histories. + // Faults (crash/restart) are NOT part of the Channel API request type. + // They are node-level events handled by clearing request histories. // See faults.qnt for the FaultEvent type. - type ChannelEvent = - | EvConsensusReady - | EvStartedRound({ height: Height, round: Round, proposer: Node }) - | EvGetValue({ height: Height, round: Round }) - | EvReceivedProposal({ proposal: Proposal }) - | EvDecided({ proposal: Proposal }) - | EvProcessSyncedValue({ proposal: Proposal }) - | EvGetDecidedValue({ height: Height }) + type ChannelRequest = + | ReqConsensusReady + | ReqStartedRound({ height: Height, round: Round, proposer: Node }) + | ReqGetValue({ height: Height, round: Round }) + | ReqReceivedProposal({ proposal: Proposal }) + | ReqDecided({ proposal: Proposal }) + | ReqProcessSyncedValue({ proposal: Proposal }) + | ReqGetDecidedValue({ height: Height }) // =========================================================================== - // EVENT HELPERS + // REQUEST HELPERS // =========================================================================== - /// Extract the height from an event, if it has one. - pure def eventHeight(e: ChannelEvent): Option[Height] = match e { - | EvConsensusReady => None - | EvStartedRound(r) => Some(r.height) - | EvGetValue(r) => Some(r.height) - | EvReceivedProposal(r) => Some(r.proposal.height) - | EvDecided(r) => Some(r.proposal.height) - | EvProcessSyncedValue(r) => Some(r.proposal.height) - | EvGetDecidedValue(r) => Some(r.height) + /// Extract the height from a request, if it has one. + pure def requestHeight(e: ChannelRequest): Option[Height] = match e { + | ReqConsensusReady => None + | ReqStartedRound(r) => Some(r.height) + | ReqGetValue(r) => Some(r.height) + | ReqReceivedProposal(r) => Some(r.proposal.height) + | ReqDecided(r) => Some(r.proposal.height) + | ReqProcessSyncedValue(r) => Some(r.proposal.height) + | ReqGetDecidedValue(r) => Some(r.height) } - /// Whether an event is a consensus progress event (vs. a query/delivery event). - /// Progress events follow monotonic height ordering and are subject to + /// Whether a request is a consensus progress request (vs. a query/delivery request). + /// Progress requests follow monotonic height ordering and are subject to /// heightMonotonic and decidedIsFinal. - /// Excluded events: - /// - EvConsensusReady: one-time initialization, not height progress - /// - EvGetDecidedValue: intentionally queries past heights - /// - EvReceivedProposal: can arrive for future heights (buffered as pending) - pure def isProgressEvent(e: ChannelEvent): bool = match e { - | EvConsensusReady => false - | EvGetDecidedValue(_) => false - | EvReceivedProposal(_) => false + /// Excluded requests: + /// - ReqConsensusReady: one-time initialization, not height progress + /// - ReqGetDecidedValue: intentionally queries past heights + /// - ReqReceivedProposal: can arrive for future heights (buffered as pending) + pure def isProgressRequest(e: ChannelRequest): bool = match e { + | ReqConsensusReady => false + | ReqGetDecidedValue(_) => false + | ReqReceivedProposal(_) => false | _ => true } @@ -110,9 +110,9 @@ module channel_api_contract { // // Follows the disk/mem convention from faults.qnt: // - Disk state survives restarts (proposals, decisions) - // - Mem state is cleared on fault (event histories — current session only) + // - Mem state is cleared on fault (request histories — current session only) // - // Design: event_history is the primary observable — most properties are + // Design: request_history is the primary observable — most properties are // checked over it. decisions and all_proposals are kept as separate fields // for efficient lookup by validity and syncedValueIsDecided. @@ -136,10 +136,10 @@ module channel_api_contract { } type ChannelStateMem = { - // Per-node: event history for the current session. + // Per-node: request history for the current session. // Cleared on fault (crash/restart). Properties fold over only - // current-session events — no cross-session reasoning needed. - event_history: Node -> List[ChannelEvent], + // current-session requests — no cross-session reasoning needed. + request_history: Node -> List[ChannelRequest], } type ChannelState = { @@ -151,14 +151,14 @@ module channel_api_contract { // SAFETY PROPERTIES // =========================================================================== - // Agreement: For any two Decided events across all nodes, if they are for + // Agreement: For any two Decided requests across all nodes, if they are for // the same height, the decided proposals must be identical. // // This corresponds to AgreementInv in statemachineAsync.qnt: // "Any two correct processes agree in the consensus instances in which // they both have already decided" // - // Checked directly over event histories so it catches disagreement even + // Checked directly over request histories so it catches disagreement even // if a buggy generator records inconsistent decisions. After a fault, // histories are cleared — cross-session agreement is enforced by the // generator's sendDecided guard checking against the decisions map (disk). @@ -166,10 +166,10 @@ module channel_api_contract { // Collect all decided proposals across all nodes, grouped by height. // Cost: O(nodes × history_length). val decidedByHeight: Height -> Set[Proposal] = - s.mem.event_history.keys().fold(Map(), (acc, node) => - s.mem.event_history.get(node).foldl(acc, (m, e) => + s.mem.request_history.keys().fold(Map(), (acc, node) => + s.mem.request_history.get(node).foldl(acc, (m, e) => match e { - | EvDecided(d) => + | ReqDecided(d) => val h = d.proposal.height val existing = if (m.has(h)) m.get(h) else Set() m.put(h, existing.union(Set(d.proposal))) @@ -250,12 +250,12 @@ module channel_api_contract { // ORDERING PROPERTIES // =========================================================================== // - // These properties constrain the order in which Channel API events are + // These properties constrain the order in which Channel API requests are // delivered to each node. They are expressed declaratively over per-node - // event histories, making them readable and auditable without understanding + // request histories, making them readable and auditable without understanding // any generator's internal state machine. // - // Event histories contain only current-session events (cleared on fault). + // Request histories contain only current-session requests (cleared on fault). // This simplifies all fold-based properties — no session boundary logic // needed. // @@ -265,25 +265,25 @@ module channel_api_contract { // // Source: derived from driver.qnt, consensus.qnt, and msgs.rs documentation. - // heightsPositive: All event heights are >= 1. + // heightsPositive: All request heights are >= 1. // // Consensus starts at height 1 (or higher after restart). Height 0 is // never a valid consensus height. This is a basic structural constraint - // that applies to all events carrying a height. + // that applies to all requests carrying a height. // // Source: consensus.qnt — heights start at 1. The application replies to // ConsensusReady with a starting height >= 1. pure def heightsPositive(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - s.mem.event_history.get(node).foldl(true, (ok, e) => - ok and match eventHeight(e) { + s.mem.request_history.keys().forall(node => + s.mem.request_history.get(node).foldl(true, (ok, e) => + ok and match requestHeight(e) { | Some(h) => h >= 1 | None => true } ) ) - // consensusReadyFirst: ConsensusReady is the first event in the history, + // consensusReadyFirst: ConsensusReady is the first request in the history, // and it appears at most once per session. // // Before any other Channel API interaction, Malachite sends ConsensusReady @@ -293,12 +293,12 @@ module channel_api_contract { // Source: msgs.rs — ConsensusReady is sent when the consensus engine // has been initialized and is ready to start. pure def consensusReadyFirst(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - val hist = s.mem.event_history.get(node) + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) hist.foldl({ isFirst: true, ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { - | EvConsensusReady => + | ReqConsensusReady => if (not(acc.isFirst)) { isFirst: false, ok: false } else { isFirst: false, ok: true } | _ => if (acc.isFirst) { isFirst: false, ok: false } else acc @@ -317,17 +317,17 @@ module channel_api_contract { // Source: driver.qnt — GetValue is produced as part of the proposer logic // in applyVotekeeper, after entering a new round. pure def getValueAfterStartedRound(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => + s.mem.request_history.keys().forall(node => // Scan left to right: track which (h, r) declared this node as proposer. // On GetValue(h, r), check (h, r) was started with proposer=self. Cost: O(n). - s.mem.event_history.get(node).foldl({ startedAsProposer: Set(), ok: true }, (acc, e) => + s.mem.request_history.get(node).foldl({ startedAsProposer: Set(), ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { - | EvStartedRound(sr) => + | ReqStartedRound(sr) => if (sr.proposer == node) { ...acc, startedAsProposer: acc.startedAsProposer.union(Set((sr.height, sr.round))) } else acc - | EvGetValue(gv) => + | ReqGetValue(gv) => { ...acc, ok: acc.startedAsProposer.contains((gv.height, gv.round)) } | _ => acc } @@ -339,7 +339,7 @@ module channel_api_contract { // // Only the proposer for a given (height, round) receives GetValue, and // consensus requests a value exactly once per round. Combined, this means - // each (h, r) produces at most one GetValue event across all nodes. + // each (h, r) produces at most one GetValue request across all nodes. // // Replaces the previous getValueAtMostOnce (per-node) and getValueToOneNode // (cross-node) with a single global uniqueness check via counting. @@ -347,13 +347,13 @@ module channel_api_contract { // Source: driver.qnt — GetValue is produced exactly when entering a round // where the node is the proposer, and a round is entered at most once. pure def getValueUnique(s: ChannelState): bool = { - // Count GetValue events per (h, r) across all nodes. + // Count GetValue requests per (h, r) across all nodes. // Cost: O(nodes × history_length). val counts: (Height, Round) -> int = - s.mem.event_history.keys().fold(Map(), (acc, node) => - s.mem.event_history.get(node).foldl(acc, (m, e) => + s.mem.request_history.keys().fold(Map(), (acc, node) => + s.mem.request_history.get(node).foldl(acc, (m, e) => match e { - | EvGetValue(gv) => + | ReqGetValue(gv) => val key = (gv.height, gv.round) val cur = if (m.has(key)) m.get(key) else 0 m.put(key, cur + 1) @@ -365,23 +365,23 @@ module channel_api_contract { } // heightMonotonic: Heights are non-decreasing in a node's consensus progress - // events. + // requests. // // Consensus processes heights sequentially. A node never receives progress - // events for an earlier height after it has received events for a later - // height. Query events (GetDecidedValue) are excluded — they intentionally + // requests for an earlier height after it has received requests for a later + // height. Query requests (GetDecidedValue) are excluded — they intentionally // reference past heights. Histories are per-session (cleared on fault). // // Source: consensus.qnt — the state machine processes one height at a time, // advancing to h+1 only after deciding at h. pure def heightMonotonic(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - // Scan left to right: track the max height seen in progress events. - // Each new progress event must have height >= max. Cost: O(n). - s.mem.event_history.get(node).foldl({ maxHeight: 0, ok: true }, (acc, e) => + s.mem.request_history.keys().forall(node => + // Scan left to right: track the max height seen in progress requests. + // Each new progress request must have height >= max. Cost: O(n). + s.mem.request_history.get(node).foldl({ maxHeight: 0, ok: true }, (acc, e) => if (not(acc.ok)) acc - else if (isProgressEvent(e)) { - match eventHeight(e) { + else if (isProgressRequest(e)) { + match requestHeight(e) { | Some(h) => if (h < acc.maxHeight) { ...acc, ok: false } else { ...acc, maxHeight: h } @@ -391,12 +391,12 @@ module channel_api_contract { ).ok ) - // decidedIsFinal: After Decided(h), all subsequent consensus progress events + // decidedIsFinal: After Decided(h), all subsequent consensus progress requests // for the same node have height exactly h+1. // // Once consensus decides at height h, it moves on to height h+1. No further - // progress events are delivered for the decided height, and no heights are - // skipped. Query events (GetDecidedValue) are excluded — they intentionally + // progress requests are delivered for the decided height, and no heights are + // skipped. Query requests (GetDecidedValue) are excluded — they intentionally // reference past heights. Histories are per-session (cleared on fault). // // Strictly stronger than just "height > maxDecided": prevents height gaps @@ -406,22 +406,22 @@ module channel_api_contract { // to a new height. msgs.rs — Decided triggers the application to call // StartHeight(h+1). pure def decidedIsFinal(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => + s.mem.request_history.keys().forall(node => // Scan left to right: track the max decided height. - // Every progress event after a Decided must have height exactly + // Every progress request after a Decided must have height exactly // maxDecided + 1. Cost: O(n). - s.mem.event_history.get(node).foldl({ maxDecided: 0, ok: true }, (acc, e) => + s.mem.request_history.get(node).foldl({ maxDecided: 0, ok: true }, (acc, e) => if (not(acc.ok)) acc else val check = - if (acc.maxDecided > 0 and isProgressEvent(e)) { - match eventHeight(e) { + if (acc.maxDecided > 0 and isProgressRequest(e)) { + match requestHeight(e) { | Some(h) => h == acc.maxDecided + 1 | None => true } } else true val newMax = match e { - | EvDecided(d) => d.proposal.height + | ReqDecided(d) => d.proposal.height | _ => acc.maxDecided } { maxDecided: newMax, ok: check } @@ -431,7 +431,7 @@ module channel_api_contract { // heightAdvanceRequiresDecision: A node's consensus height only advances // after a decision at the previous height. // - // When the height increases between progress events, the earlier height + // When the height increases between progress requests, the earlier height // must have been decided first. This prevents height jumps without // decisions (e.g., StartedRound(1,0) → StartedRound(2,0) with no // Decided(1) in between). @@ -443,29 +443,29 @@ module channel_api_contract { // Source: consensus.qnt — the state machine advances to h+1 only after // deciding at h. driver.qnt — Decided triggers StartHeight(h+1). pure def heightAdvanceRequiresDecision(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - s.mem.event_history.get(node).foldl( + s.mem.request_history.keys().forall(node => + s.mem.request_history.get(node).foldl( { currentHeight: 0, maxDecided: 0, ok: true }, (acc, e) => if (not(acc.ok)) acc else val newMaxDecided = match e { - | EvDecided(d) => + | ReqDecided(d) => if (d.proposal.height > acc.maxDecided) d.proposal.height else acc.maxDecided | _ => acc.maxDecided } - // Track current height from progress events. + // Track current height from progress requests. // After Decided(h), the node advances to h+1. - if (isProgressEvent(e)) { + if (isProgressRequest(e)) { match e { - | EvDecided(d) => + | ReqDecided(d) => val h = d.proposal.height + 1 if (acc.currentHeight > 0 and h > acc.currentHeight) { currentHeight: h, maxDecided: newMaxDecided, ok: acc.currentHeight <= newMaxDecided } else { currentHeight: h, maxDecided: newMaxDecided, ok: true } - | _ => match eventHeight(e) { + | _ => match requestHeight(e) { | Some(h) => if (acc.currentHeight > 0 and h > acc.currentHeight) { currentHeight: h, maxDecided: newMaxDecided, @@ -488,11 +488,11 @@ module channel_api_contract { // // Source: msgs.rs — ReceivedProposalPart is delivered to non-proposer nodes. pure def receivedProposalNotToProposer(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - val hist = s.mem.event_history.get(node) + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) hist.indices().forall(i => match hist[i] { - | EvReceivedProposal(rp) => rp.proposal.proposer != node + | ReqReceivedProposal(rp) => rp.proposal.proposer != node | _ => true } ) @@ -508,11 +508,11 @@ module channel_api_contract { // catch-up. The value comes from the sync protocol which retrieves // decided blocks from other nodes. pure def syncedValueIsDecided(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - val hist = s.mem.event_history.get(node) + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) hist.indices().forall(i => match hist[i] { - | EvProcessSyncedValue(sv) => + | ReqProcessSyncedValue(sv) => val p = sv.proposal s.disk.decisions.has(p.height) and s.disk.decisions.get(p.height) == p | _ => true @@ -527,17 +527,17 @@ module channel_api_contract { // started consensus on. // // Source: Malachite start_height.rs — start_height always emits - // StartedRound(h, 0) before any other events at height h. + // StartedRound(h, 0) before any other requests at height h. pure def syncRequiresStartedRound(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => + s.mem.request_history.keys().forall(node => // Scan left to right: track heights where StartedRound has been seen. // On ProcessSyncedValue(h), check StartedRound(h, _) preceded it. Cost: O(n). - s.mem.event_history.get(node).foldl({ startedHeights: Set(), ok: true }, (acc, e) => + s.mem.request_history.get(node).foldl({ startedHeights: Set(), ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { - | EvStartedRound(sr) => + | ReqStartedRound(sr) => { ...acc, startedHeights: acc.startedHeights.union(Set(sr.height)) } - | EvProcessSyncedValue(sv) => + | ReqProcessSyncedValue(sv) => { ...acc, ok: acc.startedHeights.contains(sv.proposal.height) } | _ => acc } @@ -545,7 +545,7 @@ module channel_api_contract { ) // syncIsIrrevocable: After ProcessSyncedValue(h), no StartedRound or - // GetValue events can occur at the same height h. Once Malachite enters + // GetValue requests can occur at the same height h. Once Malachite enters // the sync path for a height, it stays in sync until deciding — it does // not fall back to normal consensus rounds. // @@ -559,17 +559,17 @@ module channel_api_contract { // on height advancement. timeout.rs — stale timeouts are ignored // (round mismatch check). pure def syncIsIrrevocable(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => + s.mem.request_history.keys().forall(node => // Scan left to right: track heights where ProcessSyncedValue has been seen. // If StartedRound or GetValue appears at a synced height, fail. Cost: O(n). - s.mem.event_history.get(node).foldl({ syncedHeights: Set(), ok: true }, (acc, e) => + s.mem.request_history.get(node).foldl({ syncedHeights: Set(), ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { - | EvProcessSyncedValue(sv) => + | ReqProcessSyncedValue(sv) => { ...acc, syncedHeights: acc.syncedHeights.union(Set(sv.proposal.height)) } - | EvStartedRound(sr) => + | ReqStartedRound(sr) => { ...acc, ok: not(acc.syncedHeights.contains(sr.height)) } - | EvGetValue(gv) => + | ReqGetValue(gv) => { ...acc, ok: not(acc.syncedHeights.contains(gv.height)) } | _ => acc } @@ -577,7 +577,7 @@ module channel_api_contract { ) // roundsConsecutiveWithinHeight: Within the same height, StartedRound - // events have consecutive rounds (exactly +1), and the first round at + // requests have consecutive rounds (exactly +1), and the first round at // each height is 0. // // Consensus starts each height at round 0. Rounds advance by exactly 1 @@ -591,14 +591,14 @@ module channel_api_contract { // Source: consensus.qnt — timeout increments round by 1. driver.qnt — // each height starts at round 0. pure def roundsConsecutiveWithinHeight(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => + s.mem.request_history.keys().forall(node => // Scan left to right: track the last round seen per height. // First StartedRound at a height must be round 0. Each subsequent // one must be exactly previous + 1. Cost: O(n). - s.mem.event_history.get(node).foldl({ lastRound: Map(), ok: true }, (acc, e) => + s.mem.request_history.get(node).foldl({ lastRound: Map(), ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { - | EvStartedRound(sr) => + | ReqStartedRound(sr) => if (acc.lastRound.has(sr.height)) { val prev = acc.lastRound.get(sr.height) { ok: sr.round == prev + 1, @@ -633,8 +633,8 @@ module channel_api_contract { // Source: Malachite driver — proposals are gossiped to all nodes, and the // proposer builds its value via GetValue. pure def decidedRequiresDeliveredProposal(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - s.mem.event_history.get(node).foldl({ + s.mem.request_history.keys().forall(node => + s.mem.request_history.get(node).foldl({ // Proposals delivered via ProcessSyncedValue (sync path) syncDelivered: Set(), // Proposals delivered via ReceivedProposal (normal path) @@ -647,15 +647,15 @@ module channel_api_contract { }, (acc, e) => if (not(acc.ok)) acc else match e { - | EvStartedRound(sr) => + | ReqStartedRound(sr) => { ...acc, startedRounds: acc.startedRounds.union(Set((sr.height, sr.round))) } - | EvGetValue(gv) => + | ReqGetValue(gv) => { ...acc, proposedRounds: acc.proposedRounds.union(Set((gv.height, gv.round))) } - | EvReceivedProposal(rp) => + | ReqReceivedProposal(rp) => { ...acc, receivedProposals: acc.receivedProposals.union(Set(rp.proposal)) } - | EvProcessSyncedValue(sv) => + | ReqProcessSyncedValue(sv) => { ...acc, syncDelivered: acc.syncDelivered.union(Set(sv.proposal)) } - | EvDecided(d) => + | ReqDecided(d) => val p = d.proposal // Sync path: no StartedRound required val viaSynced = acc.syncDelivered.contains(p) @@ -671,7 +671,7 @@ module channel_api_contract { ).ok ) - // receivedProposalExists: Every ReceivedProposal event references a + // receivedProposalExists: Every ReceivedProposal request references a // proposal that was previously created via GetValue. // // Malachite gossips proposals between nodes, but only proposals that @@ -681,16 +681,16 @@ module channel_api_contract { // Source: Malachite driver — proposals are gossiped after being built // by the proposer via GetValue. Only existing proposals are forwarded. pure def receivedProposalExists(s: ChannelState): bool = - s.mem.event_history.keys().forall(node => - s.mem.event_history.get(node).foldl(true, (ok, e) => + s.mem.request_history.keys().forall(node => + s.mem.request_history.get(node).foldl(true, (ok, e) => ok and match e { - | EvReceivedProposal(rp) => rp.proposal.in(s.disk.all_proposals) + | ReqReceivedProposal(rp) => rp.proposal.in(s.disk.all_proposals) | _ => true } ) ) - // proposerConsistency: For each (height, round), all StartedRound events + // proposerConsistency: For each (height, round), all StartedRound requests // across all nodes declare the same proposer. // // Proposer selection is deterministic — every node in the network is told @@ -700,10 +700,10 @@ module channel_api_contract { // Cost: O(nodes × history_length). pure def proposerConsistency(s: ChannelState): bool = { val proposersByRound: (Height, Round) -> Set[Node] = - s.mem.event_history.keys().fold(Map(), (acc, node) => - s.mem.event_history.get(node).foldl(acc, (m, e) => + s.mem.request_history.keys().fold(Map(), (acc, node) => + s.mem.request_history.get(node).foldl(acc, (m, e) => match e { - | EvStartedRound(sr) => + | ReqStartedRound(sr) => val key = (sr.height, sr.round) val existing = if (m.has(key)) m.get(key) else Set() m.put(key, existing.union(Set(sr.proposer))) diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 1761dea7..2f6a2ae8 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -22,12 +22,12 @@ // - Safety is enforced by global state constraints // - All contract properties are checked via contractInv at every step // - Fault injection: nodeCrash (lose all state) and nodeRestart (preserve -// disk state) clear the node's event history and reset to Unstarted +// disk state) clear the node's request history and reset to Unstarted // // State follows the disk/mem convention from faults.qnt: // - Disk: maxDecided (survives restart) // - Mem: phase, height, round, deliveredProposals, getValueSent (reset on fault) -// - Event histories are mem state (cleared on fault, current session only) +// - Request histories are mem state (cleared on fault, current session only) module channel_api_generator { import basicSpells.* from "spells/basicSpells" @@ -127,14 +127,14 @@ module channel_api_generator { } // =========================================================================== - // TRACE EVENT (for lastEvent observation / MBT integration) + // TRACE ENTRY (for lastEntry observation / MBT integration) // =========================================================================== // - // Since faults are no longer part of ChannelEvent, we need a separate + // Since faults are no longer part of ChannelRequest, we need a separate // type to represent what happened in the last step (channel message or fault). - type TraceEvent = - | ChannelMsg(ChannelEvent) + type TraceEntry = + | ChannelMsg(ChannelRequest) | FaultMsg(FaultEvent) // =========================================================================== @@ -150,13 +150,13 @@ module channel_api_generator { // Authoritative decisions: at most one per height. // Used as a guard in sendDecided (ensuring the same proposal is decided // across nodes) and by the contract's validity and syncedValueIsDecided - // properties. The contract's agreement property checks event histories + // properties. The contract's agreement property checks request histories // directly, so it catches disagreement even if this map were buggy. var decisions: Height -> Proposal - // Per-node event history for the current session (mem state). - // Cleared on fault — contains only current-session events. - var eventHistory: Node -> List[ChannelEvent] + // Per-node request history for the current session (mem state). + // Cleared on fault — contains only current-session requests. + var requestHistory: Node -> List[ChannelRequest] // Per-proposal: which nodes have been delivered this specific proposal // and are in a position to vote on it. Keyed by Proposal (not Height) @@ -175,9 +175,9 @@ module channel_api_generator { // Guards sendDecided: requires > 2/3 support before any node can decide. var proposalSupport: Proposal -> Set[Node] - // Last event emitted (for trace observation / MBT integration). - // None in the initial state (no event sent yet). - var lastEvent: Option[{ node: Node, event: TraceEvent }] + // Last trace entry emitted (for trace observation / MBT integration). + // None in the initial state (no entry yet). + var lastEntry: Option[{ node: Node, entry: TraceEntry }] // =========================================================================== // ACTIONS: Channel API messages from Malachite to the application @@ -192,18 +192,18 @@ module channel_api_generator { val ns = nodeStates.get(node) all { ns.mem.phase == Unstarted, - // Contract: heightsPositive requires all event heights >= 1. + // Contract: heightsPositive requires all request heights >= 1. // This guard ensures the starting height satisfies that property. replyStartHeight >= 1, - val evt = EvConsensusReady + val req = ReqConsensusReady all { nodeStates' = nodeStates.set(node, { ...ns, mem: { ...ns.mem, phase: Started, height: replyStartHeight, round: 0 }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), proposals' = proposals, decisions' = decisions, @@ -233,7 +233,7 @@ module channel_api_generator { ns.mem.phase == Started, ns.mem.height <= MAX_HEIGHT, val proposer = proposer_for(ns.mem.height, ns.mem.round) - val evt = EvStartedRound({ + val req = ReqStartedRound({ height: ns.mem.height, round: ns.mem.round, proposer: proposer, @@ -243,9 +243,9 @@ module channel_api_generator { ...ns, mem: { ...ns.mem, phase: InRound }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), proposals' = proposals, decisions' = decisions, @@ -274,7 +274,7 @@ module channel_api_generator { replyProposal.height == ns.mem.height, replyProposal.round == ns.mem.round, replyProposal.proposer == node, - val evt = EvGetValue({ + val req = ReqGetValue({ height: ns.mem.height, round: ns.mem.round, }) @@ -289,9 +289,9 @@ module channel_api_generator { deliveredProposals: ns.mem.deliveredProposals.union(Set(replyProposal)), }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), decisions' = decisions, // Proposer supports their specific proposal @@ -316,7 +316,7 @@ module channel_api_generator { // Optimization: real network can deliver stale proposals (Emerald drops them). // Not enforced by the contract — restricts traces to reduce state space. proposal.height >= ns.mem.height, - val evt = EvReceivedProposal({ proposal: proposal }) + val req = ReqReceivedProposal({ proposal: proposal }) // Only count support when the node is at the proposal's height. // Future-height proposals are buffered as pending — the node hasn't // participated in consensus at that height yet. @@ -330,9 +330,9 @@ module channel_api_generator { deliveredProposals: ns.mem.deliveredProposals.union(Set(proposal)), }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), proposals' = proposals, decisions' = decisions, @@ -378,15 +378,15 @@ module channel_api_generator { // Record the decision decisions' = decisions.put(ns.mem.height, proposal), // Move to next height - val evt = EvDecided({ proposal: proposal }) + val req = ReqDecided({ proposal: proposal }) all { nodeStates' = nodeStates.set(node, { disk: { ...ns.disk, maxDecided: ns.mem.height }, mem: { ...ns.mem, phase: Started, height: ns.mem.height + 1, round: 0 }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), proposals' = proposals, proposalSupport' = proposalSupport, @@ -406,7 +406,7 @@ module channel_api_generator { ns.mem.height <= MAX_HEIGHT, val newRound = ns.mem.round + 1 val proposer = proposer_for(ns.mem.height, newRound) - val evt = EvStartedRound({ + val req = ReqStartedRound({ height: ns.mem.height, round: newRound, proposer: proposer, @@ -416,9 +416,9 @@ module channel_api_generator { ...ns, mem: { ...ns.mem, phase: InRound, round: newRound }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), proposals' = proposals, decisions' = decisions, @@ -439,7 +439,7 @@ module channel_api_generator { decisions.has(ns.mem.height), ns.disk.maxDecided < ns.mem.height, val proposal = decisions.get(ns.mem.height) - val evt = EvProcessSyncedValue({ proposal: proposal }) + val req = ReqProcessSyncedValue({ proposal: proposal }) all { nodeStates' = nodeStates.set(node, { ...ns, @@ -449,9 +449,9 @@ module channel_api_generator { deliveredProposals: ns.mem.deliveredProposals.union(Set(proposal)), }, }), - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), proposals' = proposals, decisions' = decisions, @@ -473,11 +473,11 @@ module channel_api_generator { // state space; not enforced by the contract. height >= 1, height < ns.mem.height, - val evt = EvGetDecidedValue({ height: height }) + val req = ReqGetDecidedValue({ height: height }) all { - lastEvent' = Some({ node: node, event: ChannelMsg(evt) }), - eventHistory' = eventHistory.set(node, - eventHistory.get(node).append(evt) + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) ), nodeStates' = nodeStates, proposals' = proposals, @@ -491,19 +491,19 @@ module channel_api_generator { // FAULT ACTIONS: crash and restart // =========================================================================== // - // Faults clear the node's event history (mem state) instead of appending - // EvFault. This keeps histories short (bounded by session length) and + // Faults clear the node's request history (mem state) instead of appending + // ReqFault. This keeps histories short (bounded by session length) and // eliminates session-boundary logic from all contract properties. // --- Node Crash --- - // Node lost all state: reset disk + mem, clear event history. + // Node lost all state: reset disk + mem, clear request history. action nodeCrash(node: Node): bool = { val ns = nodeStates.get(node) all { ns.mem.phase != Unstarted, nodeStates' = nodeStates.set(node, initGenNode), - eventHistory' = eventHistory.set(node, []), - lastEvent' = Some({ node: node, event: FaultMsg(Crash) }), + requestHistory' = requestHistory.set(node, []), + lastEntry' = Some({ node: node, entry: FaultMsg(Crash) }), proposals' = proposals, decisions' = decisions, // Disk state — votes already cast don't un-happen @@ -512,7 +512,7 @@ module channel_api_generator { } // --- Node Restart --- - // Node restarted: preserve disk state, reset mem, clear event history. + // Node restarted: preserve disk state, reset mem, clear request history. // Decisions survive on disk (maxDecided preserved). Malachite re-initializes // and will re-deliver proposals and ConsensusReady. action nodeRestart(node: Node): bool = { @@ -520,8 +520,8 @@ module channel_api_generator { all { ns.mem.phase != Unstarted, nodeStates' = nodeStates.set(node, { disk: ns.disk, mem: initGenMem }), - eventHistory' = eventHistory.set(node, []), - lastEvent' = Some({ node: node, event: FaultMsg(Restart) }), + requestHistory' = requestHistory.set(node, []), + lastEntry' = Some({ node: node, entry: FaultMsg(Restart) }), proposals' = proposals, decisions' = decisions, // Disk state — votes already cast don't un-happen @@ -539,9 +539,9 @@ module channel_api_generator { nodeStates' = nodes.mapBy(n => initGenNode), proposals' = Set(), decisions' = Map(), - eventHistory' = nodes.mapBy(n => []), + requestHistory' = nodes.mapBy(n => []), proposalSupport' = Map(), - lastEvent' = None, + lastEntry' = None, } } @@ -589,7 +589,7 @@ module channel_api_generator { proposal_support: proposalSupport, }, mem: { - event_history: eventHistory, + request_history: requestHistory, }, } From c98737ef2951e54ded1eb1d696e0197c622c1460 Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 23 Feb 2026 19:20:12 +0100 Subject: [PATCH 08/20] refactor: generalize faults module --- specs/faults.qnt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/specs/faults.qnt b/specs/faults.qnt index 5e8519ed..306b0273 100644 --- a/specs/faults.qnt +++ b/specs/faults.qnt @@ -4,9 +4,9 @@ // Fault Events (reusable) // ============================================================================= // -// General infrastructure fault types. Not Channel API-specific. +// General infrastructure fault types. // A node crash/restart affects all APIs simultaneously — faults are -// node-level events, not embedded in individual API event types. +// node-level events, not embedded in individual API request types. // // Disk/mem convention: // Modules using faults should split state into { disk: D, mem: M }. @@ -21,8 +21,8 @@ // pure def crashReset(initDisk, initMem) = { disk: initDisk, mem: initMem } // pure def restartReset(current, initMem) = { ...current, mem: initMem } // -// Event histories are mem state — cleared on fault, containing only the -// current session's events. This means contract properties over event +// Request histories are mem state — cleared on fault, containing only the +// current session's requests. This means contract properties over request // histories automatically scope to the current session with no // session-boundary logic needed. From 276da415ff2b84ded027e47ee9be81c2a149263e Mon Sep 17 00:00:00 2001 From: mpoke Date: Wed, 25 Feb 2026 19:01:10 +0100 Subject: [PATCH 09/20] adding engine api contract, generator, and emerald spec composed with both channel and engine API --- specs/channel_api_contract.qnt | 2 +- specs/channel_api_generator.qnt | 21 +- specs/emerald_with_both_generators.qnt | 689 ++++++++++++++++++++ specs/emerald_with_both_generators_test.qnt | 10 + specs/engine_api_contract.qnt | 396 +++++++++++ specs/engine_api_generator.qnt | 683 +++++++++++++++++++ specs/engine_api_generator_test.qnt | 22 + 7 files changed, 1819 insertions(+), 4 deletions(-) create mode 100644 specs/emerald_with_both_generators.qnt create mode 100644 specs/emerald_with_both_generators_test.qnt create mode 100644 specs/engine_api_contract.qnt create mode 100644 specs/engine_api_generator.qnt create mode 100644 specs/engine_api_generator_test.qnt diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 78edfd61..850f4aa3 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -9,7 +9,7 @@ // Models what the Malachite team would publish for applications to consume. // // This contract defines: -// 1. The message types exchanged through the Channel API +// 1. The request types for the Channel API // 2. Safety guarantees (agreement, validity) // 3. Ordering guarantees (declarative properties over request histories) // 4. Assumptions (what the application must do for guarantees to hold) diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 2f6a2ae8..688eafc0 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -213,9 +213,9 @@ module channel_api_generator { } // --- StartedRound --- - // A new consensus round has begun. Sent after ConsensusReady (for the first - // round), after Decided (for the first round of a new height), or after a - // timeout (for subsequent rounds at the same height). + // The first round at a new height. Sent after ConsensusReady (height 1) or + // after Decided (next height). Guard: phase == Started. + // For timeout-driven round bumps at the same height, see sendStartedRoundAfterTimeout. // // Source: AppMsg::StartedRound in msgs.rs action sendStartedRound(node: Node): bool = { @@ -529,6 +529,21 @@ module channel_api_generator { } } + // =========================================================================== + // PASSTHROUGH ACTION (for composition) + // =========================================================================== + + // Stutter action: no Channel API activity this step. + // Exported for composition steps that only interact with Engine API. + action genUnchanged: bool = all { + nodeStates' = nodeStates, + proposals' = proposals, + decisions' = decisions, + requestHistory' = requestHistory, + proposalSupport' = proposalSupport, + lastEntry' = lastEntry, + } + // =========================================================================== // INITIALIZATION // =========================================================================== diff --git a/specs/emerald_with_both_generators.qnt b/specs/emerald_with_both_generators.qnt new file mode 100644 index 00000000..b1937009 --- /dev/null +++ b/specs/emerald_with_both_generators.qnt @@ -0,0 +1,689 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Emerald + Channel API Generator + Engine API Generator Composition +// ============================================================================= +// +// Three-way composition connecting both boundaries: +// Channel API Generator → Emerald handlers → Engine API Generator +// +// Architecture: +// - Channel API generator models Malachite sending requests to Emerald +// - Emerald handlers process requests and make Engine API calls +// - Engine API generator models Reth responding to Emerald's calls +// +// Mapping from Channel API requests to Engine API requests (from Emerald's app.rs): +// | Channel API Request | Engine API Requests | +// |-----------------------|-----------------------------------------------| +// | ConsensusReady | (none — Phase 2 adds exchangeCapabilities) | +// | StartedRound | none | +// | GetValue | forkchoiceUpdated(head, attrs) → getPayload | +// | ReceivedProposal | newPayload(block) | +// | Decided | newPayload(block) → forkchoiceUpdated(hash) | +// | ProcessSyncedValue | none (validation deferred to Decided) | +// +// Non-atomic Engine API composition: +// Channel API events are received in one transition, then Engine API calls +// are executed one-per-transition via a queue + continuation pattern. +// This exposes intermediate states (e.g., mid-processing crashes) that +// the atomic model would hide. Interleaving model: fault-only for the +// same node (no new Channel events while processing), full interleaving +// for other nodes. +// +// State follows the disk/mem convention from faults.qnt. +// Extends emerald_with_generator.qnt with Engine API tracking state. + +module emerald_with_both_generators { + import basicSpells.* from "spells/basicSpells" + import rareSpells.* from "spells/rareSpells" + import channel_api_contract.* from "channel_api_contract" + import engine_api_contract as eac from "engine_api_contract" + + const NODES: List[Node] + + // Proposer selection — application-defined, passed to the channel generator. + pure def proposer_for(height: Height, round: Round): Node = + NODES[(height - 1 + round) % NODES.length()] + + import channel_api_generator(NODES = NODES, proposer_for = proposer_for) as gen from "channel_api_generator" + import engine_api_generator(NODES = NODES) as reth from "engine_api_generator" + + // =========================================================================== + // EMERALD-SPECIFIC TYPES (disk/mem split, extended with Engine API tracking) + // =========================================================================== + + type AppPhase = + | Uninitialized // Before ConsensusReady + | Ready // After ConsensusReady or Decided, before StartedRound + | Working // After StartedRound + | Syncing // After ProcessSyncedValue + + // --------------------------------------------------------------------------- + // Non-atomic Engine API types + // --------------------------------------------------------------------------- + + // Specifies which Engine API primitive action to call. + // One variant per primitive action, carrying required parameters. + // TODO: why is this not part of the engine generator? + type EngineCallSpec = + | CallBuildRequest // respondBuildRequest(node) + | CallGetPayload // respondGetPayload(node) + | CallNewPayload({ block: eac::Block }) // respondNewPayload(node, block) + | CallHeadUpdate({ headHash: eac::BlockHash, + headHeight: eac::Height }) // respondHeadUpdate(node, headHash, headHeight) + + // Handler-specific context carried through the queue for finalization. + // Each variant holds exactly the data the corresponding handler needs. + type ProcessingContext = + | ProcGetValue({ proposal: Proposal }) + | ProcReceivedProposal({ proposal: Proposal, block: eac::Block }) + | ProcDecided({ proposal: Proposal, block: eac::Block }) + + // Pending Engine API work: a list of remaining calls + context for finalization. + // When remainingCalls is empty, finalize using context. + type PendingWork = { + remainingCalls: List[EngineCallSpec], + context: ProcessingContext, + } + + // --------------------------------------------------------------------------- + // Emerald node state + // --------------------------------------------------------------------------- + + // Disk state: survives restart, lost on crash + type EmeraldDiskState = { + decided_proposals: Set[Proposal], // committed decisions + last_decided_height: Height, + last_decided_payload: Option[Payload], + // Engine API tracking (persisted) + latest_block: Option[eac::Block], // Latest committed block + } + + // Mem state: cleared on any fault (crash or restart) + type EmeraldMemState = { + phase: AppPhase, + consensus_height: Height, + consensus_round: Round, + pending_proposals: Set[Proposal], // height > consensus_height + undecided_proposals: Set[Proposal], // height == consensus_height + // Engine API tracking (ephemeral) + head_block_hash: eac::BlockHash, // Current execution head + validated_cache: Set[eac::BlockHash], // Cached validation results + // Non-atomic Engine API processing queue + pendingWork: Option[PendingWork], + } + + type EmeraldNodeState = { + disk: EmeraldDiskState, + mem: EmeraldMemState, + } + + // =========================================================================== + // STATE + // =========================================================================== + + var emeraldState: Node -> EmeraldNodeState + + // =========================================================================== + // INITIALIZATION + // =========================================================================== + + pure val initEmeraldDisk: EmeraldDiskState = { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None, + } + + pure val initEmeraldMem: EmeraldMemState = { + phase: Uninitialized, + consensus_height: 0, + consensus_round: 0, + pending_proposals: Set(), + undecided_proposals: Set(), + head_block_hash: 0, + validated_cache: Set(), + pendingWork: None, + } + + pure val initEmeraldNode: EmeraldNodeState = { + disk: initEmeraldDisk, + mem: initEmeraldMem, + } + + action init = all { + gen::init, + reth::init, + emeraldState' = NODES.toSet().mapBy(n => initEmeraldNode), + } + + // =========================================================================== + // HANDLERS: Emerald's response to Channel API messages + // =========================================================================== + + // ConsensusReady: Initialize node. + action handleConsensusReady(node: Node, startHeight: Height): bool = { + val s = emeraldState.get(node) + all { + s.mem.phase == Uninitialized, + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, phase: Ready, consensus_height: startHeight, consensus_round: 0 }, + }), + } + } + + // StartedRound: Enter new consensus round. + action handleStartedRound(node: Node, height: Height, round: Round): bool = { + val s = emeraldState.get(node) + val promoted = s.mem.pending_proposals.filter(p => p.height == height) + val remaining = s.mem.pending_proposals.exclude(promoted) + emeraldState' = emeraldState.set(node, { + ...s, + mem: { + ...s.mem, + phase: Working, + consensus_height: height, + consensus_round: round, + pending_proposals: remaining, + undecided_proposals: s.mem.undecided_proposals.union(promoted), + }, + }) + } + + // GetValue: Proposer builds a value using Engine API. + // Called during finalization (after respondBuildRequest + respondGetPayload). + action handleGetValue(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { + ...s, + mem: { + ...s.mem, + undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)), + pendingWork: None, + }, + }) + } + + // ReceivedProposal: Non-proposer learns about a proposal. + // Validates via Engine API (newPayload). Block tracking updated. + action handleReceivedProposal(node: Node, proposal: Proposal, blockHash: eac::BlockHash, valid: bool): bool = { + val s = emeraldState.get(node) + if (proposal.height < s.mem.consensus_height) { + // Stale proposal — drop it + emeraldState' = emeraldState + } else if (proposal.height == s.mem.consensus_height) { + // Current height — actionable (called from finalization) + emeraldState' = emeraldState.set(node, { + ...s, + mem: { + ...s.mem, + undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)), + validated_cache: if (valid) s.mem.validated_cache.union(Set(blockHash)) else s.mem.validated_cache, + pendingWork: None, + }, + }) + } else { + // Future height — can't validate yet + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, pending_proposals: s.mem.pending_proposals.union(Set(proposal)) }, + }) + } + } + + // Decided: Consensus decided on a value. + // Called during finalization (after respondNewPayload + respondHeadUpdate). + action handleDecided(node: Node, proposal: Proposal, decidedBlock: eac::Block): bool = { + val s = emeraldState.get(node) + val nextHeight = proposal.height + 1 + emeraldState' = emeraldState.set(node, { + disk: { + ...s.disk, + last_decided_height: proposal.height, + last_decided_payload: Some(proposal.payload), + decided_proposals: s.disk.decided_proposals.union(Set(proposal)), + latest_block: Some(decidedBlock), + }, + mem: { + phase: Ready, + consensus_height: nextHeight, + consensus_round: 0, + pending_proposals: s.mem.pending_proposals, + undecided_proposals: Set(), + head_block_hash: decidedBlock.hash, + validated_cache: s.mem.validated_cache.union(Set(decidedBlock.hash)), + pendingWork: None, + }, + }) + } + + // ProcessSyncedValue: Catch-up with a synced decided value. + // No Engine API calls — validation deferred to Decided. + action handleProcessSyncedValue(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, phase: Syncing, undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)) }, + }) + } + + // GetDecidedValue: Query for past decided value (no Emerald state change) + action handleGetDecidedValue(node: Node, height: Height): bool = + emeraldState' = emeraldState + + // NodeCrash: Full reset — all state lost (disk + mem). + action handleNodeCrash(node: Node): bool = + emeraldState' = emeraldState.set(node, initEmeraldNode) + + // NodeRestart: Preserve disk state, reset mem. + action handleNodeRestart(node: Node): bool = { + val s = emeraldState.get(node) + emeraldState' = emeraldState.set(node, { disk: s.disk, mem: initEmeraldMem }) + } + + // =========================================================================== + // PROPOSAL CONSTRUCTION (same as emerald_with_generator) + // =========================================================================== + + pure def buildProposal(s: EmeraldNodeState, node: Node): Proposal = { + val existing = s.mem.undecided_proposals.find(p => + p.height == s.mem.consensus_height and p.round == s.mem.consensus_round + ) + match existing { + | Some(p) => p + | None => { + height: s.mem.consensus_height, + round: s.mem.consensus_round, + proposer: node, + payload: s.mem.consensus_height * 100 + s.mem.consensus_round, + } + } + } + + // =========================================================================== + // BLOCK CONSTRUCTION (for Engine API calls) + // =========================================================================== + + // Block for validating a received/decided proposal + pure def validationBlock(proposal: Proposal, parentHash: eac::BlockHash): eac::Block = { + height: proposal.height, + hash: proposal.payload * 10 + proposal.height, + parentHash: parentHash, + } + + // =========================================================================== + // RETH STATE PASSTHROUGH (for steps with no Engine API calls) + // =========================================================================== + + // Delegate to generator's published action (no need to know internal state vars) + // TODO: why is this needed and we cannot use directly reth::rethUnchanged? + action rethUnchanged: bool = reth::rethUnchanged + + // =========================================================================== + // NON-ATOMIC ENGINE API PROCESSING + // =========================================================================== + + // Dispatch a single Engine API call to the appropriate Reth primitive action. + // TODO: should this be part of the engine generator? + action dispatchEngineCall(node: Node, call: EngineCallSpec): bool = + match call { + | CallBuildRequest => reth::respondBuildRequest(node) + | CallGetPayload => reth::respondGetPayload(node) + | CallNewPayload(np) => reth::respondNewPayload(node, np.block) + | CallHeadUpdate(hu) => reth::respondHeadUpdate(node, hu.headHash, hu.headHeight) + } + + // Finalize processing by calling the appropriate Emerald handler. + // Called when all Engine API calls in the queue have been executed. + action finalizeProcessing(node: Node, pw: PendingWork): bool = + match pw.context { + | ProcGetValue(gv) => handleGetValue(node, gv.proposal) + | ProcReceivedProposal(rp) => + val rns = reth::rethStates.get(node) + val valid = reth::computePayloadStatus(rns, rp.block) == eac::Valid + handleReceivedProposal(node, rp.proposal, rp.block.hash, valid) + | ProcDecided(d) => handleDecided(node, d.proposal, d.block) + } + + // Process one Engine API call from the queue, or finalize if queue is empty. + // TODO: why is not finalizeProcessing one of the pending work items? + action stepAdvanceEngine(node: Node): bool = { + val s = emeraldState.get(node) + // Extract with defaults — guard below ensures pendingWork is Some + val pw: PendingWork = match s.mem.pendingWork { + | Some(pw) => pw + | None => { + remainingCalls: [], + context: ProcGetValue({ proposal: { height: 0, round: 0, proposer: "", payload: 0 } }), + } + } + all { + s.mem.pendingWork != None, + if (pw.remainingCalls.length() > 0) + all { + dispatchEngineCall(node, pw.remainingCalls.head()), + gen::genUnchanged, + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, pendingWork: Some({ ...pw, remainingCalls: pw.remainingCalls.tail() }) }, + }), + } + else + all { + finalizeProcessing(node, pw), + gen::genUnchanged, + rethUnchanged, + } + } + } + + // =========================================================================== + // COMPOSED STEPS + // =========================================================================== + + // ConsensusReady: Channel API only. Also start Reth if offline. + // TODO: Model bootstrap logic on ConsensusReady. + // The real implementation (bootstrap.rs) has two initialization paths: + // 1. Genesis (no stored blocks): initialize_state_from_genesis fetches the + // genesis block from Reth, sets latest_block, and starts consensus at + // genesis height + 1. + // 2. Existing block (restart with stored decisions): initialize_state_from_existing_block + // compares Reth's latest height against Emerald's stored height. If Reth + // is behind, replays decided blocks via newPayload + forkchoiceUpdated per + // height until aligned. Then sends a final forkchoiceUpdated to set the head, + // and starts consensus at stored height + 1. + // Currently the spec skips all of this — handleConsensusReady just sets phase + // to Ready without initializing latest_block or aligning Reth's chain state. + // This means: + // - latest_block is None after ConsensusReady (genesis block not fetched) + // - Reth's head may be inconsistent with Emerald's disk after restart + // - No Engine API replay calls are modeled (newPayload + FCU per replayed height) + // - head_tracks_consensus invariant is only incidentally satisfied + action stepConsensusReady(node: Node): bool = { + val startHeight = emeraldState.get(node).disk.last_decided_height + 1 + val rns = reth::rethStates.get(node) + all { + emeraldState.get(node).mem.pendingWork == None, + gen::sendConsensusReady(node, startHeight), + handleConsensusReady(node, startHeight), + // Start Reth if not already running + // TODO (low priority) avoid accessing rns state + if (rns.mem.phase == reth::Offline) reth::rethStart(node) + else rethUnchanged, + } + } + + // StartedRound: Channel API only, no Engine API calls. + // TODO: Add Engine API validation for promoted proposals + // Currently, pending proposals are promoted to undecided WITHOUT validation via + // newPayload. In the real implementation, StartedRound validates pending proposals + // at the new height before promoting them. This causes: + // 1. Missing Engine API calls (not matching implementation) + // 2. validated_before_decided invariant is trivial (validation happens in stepDecided) + // 3. Later validation failures that could be caught earlier + // + // Fix: Add validatePromotedProposals(node, promoted) before handleStartedRound + // to validate pending proposals via newPayload (mem only, no disk chain updates). + // See plan file: /home/dev/.claude/plans/shimmering-bubbling-breeze.md + action stepStartedRound(node: Node): bool = { + val s = emeraldState.get(node).mem + all { + emeraldState.get(node).mem.pendingWork == None, + any { + all { + gen::sendStartedRound(node), + handleStartedRound(node, s.consensus_height, s.consensus_round), + }, + all { + gen::sendStartedRoundAfterTimeout(node), + handleStartedRound(node, s.consensus_height, s.consensus_round + 1), + }, + }, + rethUnchanged, + } + } + + // GetValue: Receive Channel API event, enqueue [BuildRequest, GetPayload] + // for Engine API processing. Handler fires during finalization. + action stepGetValue(node: Node): bool = { + val s = emeraldState.get(node) + val proposal = buildProposal(s, node) + all { + s.mem.pendingWork == None, + gen::sendGetValue(node, proposal), + rethUnchanged, + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, + // TODO does this pattern work also if CallGetPayload depends on the response of CallBuildRequest? Or is this response stored in the engine generator? + pendingWork: Some({ + remainingCalls: [CallBuildRequest, CallGetPayload], + context: ProcGetValue({ proposal: proposal }), + }), + }, + }), + } + } + + // ReceivedProposal: Receive Channel API event. For current-height proposals, + // enqueue [NewPayload] for Engine API validation. For future-height proposals, + // handle immediately (buffer as pending, no Engine API needed). + action stepReceivedProposal(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + // TODO (low priority) avoid accessing rns state + val rns = reth::rethStates.get(node) + val parentHash = if (rns.disk.chain.has(proposal.height - 1)) + rns.disk.chain.get(proposal.height - 1).hash + else + -1 + val block: eac::Block = validationBlock(proposal, parentHash) + all { + s.mem.pendingWork == None, + gen::sendReceivedProposal(node, proposal), + rethUnchanged, + // TODO what if the proposal is for an old height; the channel API generator drops them, but we should still cover that edge case here + emeraldState' = if (proposal.height == s.mem.consensus_height) + // Current height — enqueue Engine API validation + emeraldState.set(node, { ...s, mem: { ...s.mem, + pendingWork: Some({ + remainingCalls: [CallNewPayload({ block: block })], + context: ProcReceivedProposal({ proposal: proposal, block: block }), + }), + }}) + else + // Future height — handle immediately, no Engine API needed + emeraldState.set(node, { ...s, mem: { ...s.mem, + pending_proposals: s.mem.pending_proposals.union(Set(proposal)), + }}), + } + } + + // Decided: Receive Channel API event, enqueue [NewPayload, HeadUpdate] + // for Engine API processing. Handler fires during finalization. + // Guard: block must be valid (prevents enqueueing uncompleable work). + action stepDecided(node: Node, proposal: Proposal): bool = { + val s = emeraldState.get(node) + // TODO (low priority) avoid accessing rns state + val rns = reth::rethStates.get(node) + val parentHash = if (rns.disk.chain.has(proposal.height - 1)) + rns.disk.chain.get(proposal.height - 1).hash + else + -1 + val block: eac::Block = validationBlock(proposal, parentHash) + all { + s.mem.pendingWork == None, + // Guard: block must be valid (same as atomic respondValidateAndFinalize's guard) + reth::computePayloadStatus(rns, block) == eac::Valid, + gen::sendDecided(node, proposal), + rethUnchanged, + emeraldState' = emeraldState.set(node, { ...s, mem: { ...s.mem, + pendingWork: Some({ + remainingCalls: [ + CallNewPayload({ block: block }), + CallHeadUpdate({ headHash: block.hash, headHeight: block.height }), + ], + context: ProcDecided({ proposal: proposal, block: block }), + }), + }}), + } + } + + // ProcessSyncedValue: Channel API only, no Engine API calls. + action stepProcessSyncedValue(node: Node): bool = { + val h = emeraldState.get(node).mem.consensus_height + val proposal = gen::decisions.get(h) + all { + emeraldState.get(node).mem.pendingWork == None, + gen::sendProcessSyncedValue(node), + handleProcessSyncedValue(node, proposal), + rethUnchanged, + } + } + + // GetDecidedValue: Channel API only, no Engine API calls. + action stepGetDecidedValue(node: Node, height: Height): bool = all { + emeraldState.get(node).mem.pendingWork == None, + gen::sendGetDecidedValue(node, height), + handleGetDecidedValue(node, height), + rethUnchanged, + } + + // NodeCrash: Both generators + Emerald state reset. + // No idle guard — faults can occur mid-processing (clears pendingWork). + // TODO: Model independent process crashes + // Currently crashes BOTH Emerald and Reth together, but they run in separate + // processes and can crash independently. Should add: + // - stepEmeraldCrash: crash Emerald only (Reth keeps running) + // - stepRethCrash: crash Reth only (Emerald keeps running) + // - stepBothCrash: crash both (current behavior) + // + // Independent crashes test more realistic failure scenarios: + // - Emerald crashes: loses mem state (pending, undecided, validated_cache), + // but Reth continues validating; when Emerald restarts, must resync + // - Reth crashes: loses mem state (validatedBlocks, pendingBuild), but + // Emerald continues; subsequent Engine API calls may fail or require retry + // - Both crash: current model (coordinated failure) + // + // Impact on invariants: + // - validated_before_decided: must check Reth DISK chain (mem cleared on Reth crash) + // - head_tracks_consensus: Emerald may be ahead if Reth crashed and restarted + action stepNodeCrash(node: Node): bool = all { + gen::nodeCrash(node), + reth::rethCrash(node), + handleNodeCrash(node), + } + + // NodeRestart: Both generators + Emerald state reset (disk preserved). + // No idle guard — faults can occur mid-processing (clears pendingWork). + // TODO: Same as stepNodeCrash - should model independent restarts + action stepNodeRestart(node: Node): bool = all { + gen::nodeRestart(node), + reth::rethRestart(node), + handleNodeRestart(node), + } + + action step = { + nondet node = NODES.toSet().oneOf() + any { + stepConsensusReady(node), + stepStartedRound(node), + stepGetValue(node), + nondet proposal = gen::proposals.oneOf() + stepReceivedProposal(node, proposal), + nondet proposal = gen::proposals.oneOf() + stepDecided(node, proposal), + stepProcessSyncedValue(node), + nondet height = 1.to(gen::MAX_HEIGHT).oneOf() + stepGetDecidedValue(node, height), + stepAdvanceEngine(node), + stepNodeCrash(node), + stepNodeRestart(node), + } + } + + // =========================================================================== + // INVARIANTS + // =========================================================================== + + // TODO This should be Emerald specific invariants, with an option to run this spec against both contracts + + // --- Channel API invariants --- + + // Safety: All nodes agree on decided blocks. + val emerald_agreement = + NODES.toSet().forall(n1 => + NODES.toSet().forall(n2 => + val st1 = emeraldState.get(n1) + val st2 = emeraldState.get(n2) + st1.disk.last_decided_height == st2.disk.last_decided_height implies + st1.disk.last_decided_payload == st2.disk.last_decided_payload + ) + ) + + // Consistency: consensus height > last decided height after initialization. + val consensus_height_gt_last_decided_height = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + st.mem.consensus_height > 0 implies + st.mem.consensus_height > st.disk.last_decided_height + ) + + // Completeness: All nodes know all decided proposals. + val completion = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + 1.to(st.disk.last_decided_height).forall(height => + gen::decisions.has(height) and gen::decisions.get(height).in(st.disk.decided_proposals) + ) + ) + + // Lifecycle: No pending proposals at current height. + val no_pending_at_current_height = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + st.mem.consensus_height > 0 implies + st.mem.pending_proposals.forall(p => p.height > st.mem.consensus_height) + ) + + // --- Engine API invariants --- + + // head_tracks_consensus: After Decided(h), Reth's head height >= h. + val head_tracks_consensus = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + val rns = reth::rethStates.get(n) + st.disk.last_decided_height > 0 and st.mem.phase != Uninitialized implies + rns.disk.headHeight >= st.disk.last_decided_height + ) + + // validated_before_decided: Every decided block was validated. + // Checks mem (validated_cache, reth validatedBlocks) and disk (reth chain). + // After restart, mem evidence is cleared but the block persists in Reth's chain. + val validated_before_decided = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + val rns = reth::rethStates.get(n) + match st.disk.latest_block { + | Some(b) => + // Mem evidence (current session) + st.mem.validated_cache.contains(b.hash) or + rns.mem.validatedBlocks.contains(b.hash) or + // Disk evidence (survives restart) + rns.disk.chain.keys().exists(h => rns.disk.chain.get(h).hash == b.hash) + | None => true + } + ) + + // chain_continuity: Reth's canonical chain forms a linked list. + val chain_continuity_inv = + NODES.toSet().forall(n => + val rns = reth::rethStates.get(n) + rns.disk.chain.keys().forall(h => + h == 0 or { + rns.disk.chain.has(h - 1) and + rns.disk.chain.get(h).parentHash == rns.disk.chain.get(h - 1).hash + } + ) + ) +} diff --git a/specs/emerald_with_both_generators_test.qnt b/specs/emerald_with_both_generators_test.qnt new file mode 100644 index 00000000..956cb185 --- /dev/null +++ b/specs/emerald_with_both_generators_test.qnt @@ -0,0 +1,10 @@ +// -*- mode: Bluespec; -*- + +// Test module for emerald_with_both_generators: instantiates with concrete +// nodes and checks invariants via simulation. +// +// 4 nodes: allows progress with one crashed node (3/4 > 2/3 quorum). + +module emerald_with_both_generators_test { + import emerald_with_both_generators(NODES = List("node1", "node2", "node3", "node4")).* from "emerald_with_both_generators" +} diff --git a/specs/engine_api_contract.qnt b/specs/engine_api_contract.qnt new file mode 100644 index 00000000..b1eb6e51 --- /dev/null +++ b/specs/engine_api_contract.qnt @@ -0,0 +1,396 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Engine API Contract (DRAFT) +// ============================================================================= +// +// Behavioral contract for Reth's Engine API boundary (Emerald↔Reth). +// Written by the Emerald team as a proof of concept for the contract pattern. +// Models what the Reth team would publish for Emerald to consume. +// +// This contract defines: +// 1. The request types for the Engine API +// 2. Response correctness guarantees (what Reth guarantees) +// 3. Request ordering constraints (what Emerald must do) +// +// Key structural difference from Channel API: +// - Channel API: Malachite sends requests to Emerald (Emerald responds) +// - Engine API: Emerald sends requests to Reth (Reth responds) +// - Generator models Reth producing responses to Emerald's requests +// +// Phase 1 scope: 3 core methods +// - engine_forkchoiceUpdatedV3(head, attrs?) +// - engine_newPayloadV4(payload, ...) +// - engine_getPayloadV4(payloadId) +// +// State follows the disk/mem convention from faults.qnt: +// - Disk: chain, head (persist through restart) +// - Mem: request_history (cleared on fault, current session only) +// +// Source: Reth's Engine API implementation + Ethereum Engine API spec. +// +// ============================================================================= +// WHY PER-NODE CONTRACT CHECKING? +// ============================================================================= +// +// Unlike the Channel API (which checks properties globally across all nodes), +// the Engine API contract is checked INDEPENDENTLY for each node's Reth instance. +// This reflects the fundamental architectural difference between the two APIs: +// +// Channel API (Malachite ↔ Emerald): +// - Models a DISTRIBUTED CONSENSUS PROTOCOL +// - Nodes coordinate via Malachite to reach agreement +// - Properties check CROSS-NODE consistency (e.g., agreement: all nodes +// deciding the same proposal at a given height) +// - Shared global state: decisions map, proposal support (quorum tracking) +// - Contract must see ALL nodes' histories to verify consensus safety +// +// Engine API (Emerald ↔ Reth): +// - Models a LOCAL RPC INTERFACE between one Emerald and one Reth +// - Each node runs its own INDEPENDENT Reth execution engine +// - No coordination at the Engine API boundary (Reth instances don't +// communicate through this API) +// - Properties check SINGLE-INSTANCE correctness (e.g., validationStability: +// this Reth instance never changes Valid → Invalid) +// - Per-node state: each Reth has its own chain, head, validation cache +// - Each Emerald only observes its own Reth instance +// +// What about Reth's P2P layer (syncing)? +// - When Phase 2 adds SYNCING state, Reth nodes will sync blocks from each +// other via p2p (Reth1 ↔ Reth2). +// - This is an IMPLEMENTATION DETAIL of how Reth gets block data, not part +// of the Engine API boundary. +// - The contract specifies WHAT Emerald observes (SYNCING → VALID transitions), +// not HOW Reth gets blocks (p2p, snapshots, database). +// - Contract properties remain per-node: "If my Reth transitions SYNCING → VALID +// for block B, it never later says INVALID" (single-instance consistency). +// - The generator may model cross-node sync actions to produce realistic traces, +// but contract properties still check each Reth instance independently. +// +// Why this matters: +// - Correct abstraction: Contract models the observable API boundary, not +// internal implementation (p2p layer is internal to Reth). +// - Composability: Emerald can reason about its local Reth without needing +// to know about other nodes' Reth instances. +// - Testability: Properties can be verified against a single Reth instance +// in isolation (useful for Reth developers). +// +// Generator checking strategy: +// The generator checks: NODES.toSet().forall(n => engineContract(stateForNode(n))) +// This means: "Every Reth instance independently satisfies the contract." +// Compare to Channel API: contract(globalState) checks cross-node properties +// like agreement over all nodes simultaneously. + +module engine_api_contract { + import basicSpells.* from "spells/basicSpells" + + // =========================================================================== + // TYPES (abstract — no real EVM types, protocol-level structure) + // =========================================================================== + + // Shared with channel_api_contract (same structural types) + type Node = str + type Height = int + + type BlockHash = int + type PayloadId = int + + type Block = { + height: Height, + hash: BlockHash, + parentHash: BlockHash, + } + + type PayloadStatusCode = + | Valid + | Invalid + + // Request-response pairs logged at the Engine API boundary. + // Each variant captures both the request parameters and the response. + // Response fields are prefixed with "resp" to distinguish them from + // request fields. + type EngineRequest = + | ReqNewPayload({ block: Block, respStatus: PayloadStatusCode }) + | ReqForkchoiceUpdated({ + headHash: BlockHash, + building: bool, + respStatus: PayloadStatusCode, + respPayloadId: Option[PayloadId], + }) + | ReqGetPayload({ payloadId: PayloadId, respBlock: Block }) + + // =========================================================================== + // OBSERVABLE STATE + // =========================================================================== + // + // State that any conforming generator must maintain for contract properties + // to be checkable. Follows the disk/mem convention from faults.qnt. + + type EngineStateDisk = { + // Canonical chain: height → block (persisted by Reth) + chain: Height -> Block, + // Current canonical head hash + head: BlockHash, + // Current head height + headHeight: Height, + } + + type EngineStateMem = { + // Per-node: request history for the current session. + // Cleared on fault — contains only current-session requests. + request_history: Node -> List[EngineRequest], + } + + type EngineState = { + disk: EngineStateDisk, + mem: EngineStateMem, + } + + // =========================================================================== + // RESPONSE CORRECTNESS PROPERTIES (Reth guarantees) + // =========================================================================== + + // validationStability: Once newPayload(block) returns Valid, subsequent + // calls for the same block hash never return Invalid. + // + // Reth persists validation results. Once a block is accepted as valid, + // it remains valid. This lets Emerald cache validation status safely. + // + // Source: Engine API spec — payload status is deterministic for a given + // payload. Valid payloads do not become Invalid. + pure def validationStability(s: EngineState): bool = + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) + // No subsequent newPayload for a validated hash returns Invalid + hist.foldl({ validated: Set(), ok: true }, (acc, ex) => + if (not(acc.ok)) acc + else match ex { + | ReqNewPayload(np) => + match np.respStatus { + | Valid => + { ...acc, validated: acc.validated.union(Set(np.block.hash)) } + | Invalid => + { ...acc, ok: not(acc.validated.contains(np.block.hash)) } + } + | _ => acc + } + ).ok + ) + + // buildIntegrity: getPayload(id) returns a block whose parentHash matches + // the head from the forkchoiceUpdated that produced that payloadId. + // + // When Emerald calls forkchoiceUpdated with building=true, Reth starts + // building on top of the current head. The resulting block must extend + // that head. + // + // Source: Engine API spec — getPayload returns the execution payload + // built on the state identified by the prior forkchoiceUpdated. + pure def buildIntegrity(s: EngineState): bool = + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) + // Single pass: collect payloadId → headHash from FCU, check getPayload against it. + // Works because forkchoiceUpdated always precedes its getPayload in the history. + hist.foldl({ buildHeads: Map(), ok: true }, (acc, ex) => + if (not(acc.ok)) acc + else match ex { + | ReqForkchoiceUpdated(fcu) => + if (fcu.building) match fcu.respPayloadId { + | Some(pid) => + { ...acc, buildHeads: acc.buildHeads.put(pid, fcu.headHash) } + | None => acc + } + else acc + | ReqGetPayload(gp) => + { ...acc, ok: acc.buildHeads.has(gp.payloadId) and + gp.respBlock.parentHash == acc.buildHeads.get(gp.payloadId) } + | _ => acc + } + ).ok + ) + + // headProgression: After forkchoiceUpdated(hash) returns Valid, the + // canonical head is updated to that hash. + // + // A successful forkchoiceUpdated sets the execution head. This is the + // primary mechanism for finalizing blocks. + // + // Checked globally (not per-node) since Reth has a single canonical chain. + // + // Source: Engine API spec — forkchoiceUpdated updates the fork choice state. + pure def headProgression(s: EngineState): bool = + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) + hist.length() == 0 or { + // The last successful forkchoiceUpdated determines the head. + // Check that the global head matches the last valid FCU. + // Note: foldl is used as "find last match" — Quint would benefit from findLast. + val lastValidFCU: Option[BlockHash] = hist.foldl(None, (acc, ex) => + match ex { + | ReqForkchoiceUpdated(fcu) => + match fcu.respStatus { + | Valid => Some(fcu.headHash) + | _ => acc + } + | _ => acc + } + ) + match lastValidFCU { + | Some(h) => s.disk.head == h + | None => true + } + } + ) + + // validBeforeHead: forkchoiceUpdated(hash) returning Valid requires that + // the block was previously known — either via newPayload returning Valid, + // getPayload returning it (built by Reth), or already in the chain. + // + // Source: Engine API spec — INVALID_FORKCHOICE_STATE if the head + // references an unknown or invalid payload. + pure def validBeforeHead(s: EngineState): bool = + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) + // Track hashes known via newPayload(Valid) + getPayload + chain + val chainHashes: Set[BlockHash] = s.disk.chain.keys().fold(Set(), (acc, h) => + acc.union(Set(s.disk.chain.get(h).hash)) + ) + hist.foldl({ validated: chainHashes, ok: true }, (acc, ex) => + if (not(acc.ok)) acc + else match ex { + | ReqNewPayload(np) => + match np.respStatus { + | Valid => { ...acc, validated: acc.validated.union(Set(np.block.hash)) } + | _ => acc + } + | ReqGetPayload(gp) => + // Built by Reth — implicitly valid + { ...acc, validated: acc.validated.union(Set(gp.respBlock.hash)) } + | ReqForkchoiceUpdated(fcu) => + match fcu.respStatus { + | Valid => { ...acc, ok: acc.validated.contains(fcu.headHash) } + | _ => acc + } + | _ => acc + } + ).ok + ) + + // chainContinuity: Blocks in the canonical chain form a linked list + // via parentHash. + // + // Each block at height h > 1 must have parentHash equal to the hash + // of the block at height h-1. + // + // Source: Ethereum block structure — blocks form a chain via parentHash. + pure def chainContinuity(s: EngineState): bool = + s.disk.chain.keys().forall(h => + h == 0 or { + s.disk.chain.has(h - 1) and + s.disk.chain.get(h).parentHash == s.disk.chain.get(h - 1).hash + } + ) + + // =========================================================================== + // PHASE 1 CONSTRAINTS (to be relaxed in Phase 2) + // =========================================================================== + + // headMonotonic: The canonical head height never decreases (no reorgs). + // + // Phase 1 constraint: Once the head advances to height h, it never moves + // back to a lower height. This simplifies initial modeling by excluding + // reorg scenarios. + // + // In Phase 1: + // - forkchoiceUpdated can only move head forward or stay at same height + // - Idempotent updates (same height/hash) are allowed for retry handling + // + // Phase 2 will relax this to allow reorgs: + // - Head can move to different blocks at same or lower heights + // - Models Ethereum's fork choice with chain reorganizations + // + // NOTE: This is NOT a fundamental Reth guarantee — real Reth supports reorgs. + // This property is enforced by the generator's state machine guards, not by + // Reth's implementation. + pure def headMonotonic(s: EngineState): bool = + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) + // Track head height progression through successful forkchoiceUpdated calls + hist.foldl({ maxHeight: 0, ok: true }, (acc, ex) => + if (not(acc.ok)) acc + else match ex { + | ReqForkchoiceUpdated(fcu) => + match fcu.respStatus { + | Valid => + // After this FCU, head is at the height of the referenced block + val newHeight = s.disk.chain.keys().fold(-1, (maxH, h) => + if (s.disk.chain.get(h).hash == fcu.headHash and h > maxH) h else maxH + ) + { maxHeight: if (newHeight > acc.maxHeight) newHeight else acc.maxHeight, + ok: newHeight >= acc.maxHeight } + | _ => acc + } + | _ => acc + } + ).ok + ) + + // Combined response correctness properties + pure def responseCorrectness(s: EngineState): bool = and { + validationStability(s), + buildIntegrity(s), + headProgression(s), + validBeforeHead(s), + chainContinuity(s), + } + + // Phase 1 specific constraints + pure def phase1Constraints(s: EngineState): bool = and { + headMonotonic(s), + } + + // =========================================================================== + // REQUEST ORDERING PROPERTIES (Emerald obligations) + // =========================================================================== + + // buildLifecycle: getPayload(id) must follow a forkchoiceUpdated that + // returned that id. Each payloadId is consumed at most once. + // + // Source: Engine API spec — payloadId is a one-time-use token. + pure def buildLifecycle(s: EngineState): bool = + s.mem.request_history.keys().forall(node => + val hist = s.mem.request_history.get(node) + hist.foldl({ available: Set(), ok: true }, (acc, ex) => + if (not(acc.ok)) acc + else match ex { + | ReqForkchoiceUpdated(fcu) => + if (fcu.building) match fcu.respPayloadId { + | Some(pid) => + { ...acc, available: acc.available.union(Set(pid)) } + | None => acc + } + else acc + | ReqGetPayload(gp) => + { ok: acc.available.contains(gp.payloadId), + available: acc.available.exclude(Set(gp.payloadId)) } + | _ => acc + } + ).ok + ) + + // Combined request ordering properties + pure def requestOrdering(s: EngineState): bool = and { + buildLifecycle(s), + } + + // =========================================================================== + // FULL CONTRACT + // =========================================================================== + + // All properties a conforming generator must satisfy. + pure def engineContract(s: EngineState): bool = and { + responseCorrectness(s), + requestOrdering(s), + phase1Constraints(s), + } +} diff --git a/specs/engine_api_generator.qnt b/specs/engine_api_generator.qnt new file mode 100644 index 00000000..0b4699da --- /dev/null +++ b/specs/engine_api_generator.qnt @@ -0,0 +1,683 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Engine API Reference Generator (DRAFT) +// ============================================================================= +// +// A state machine modeling Reth's Engine API responses. Verified against +// engine_api_contract.qnt. +// +// Unlike the Channel API generator (which nondeterministically picks what to +// send), this generator is REACTIVE — it responds to requests from Emerald. +// The caller (Emerald or a test driver) picks which Engine API call to make; +// the generator determines the response. +// +// Design: +// - Per-node state tracks Reth's execution state (chain, builds in progress) +// - Actions correspond to Engine API request-response pairs +// - Response correctness is enforced by the state machine structure +// - All contract properties are checked via contractInv at every step +// - Fault injection: rethCrash (lose all state) and rethRestart (preserve +// disk state) clear request histories and reset to Ready +// +// State follows the disk/mem convention from faults.qnt: +// - Disk: chain, head, headHeight (survive restart) +// - Mem: phase, validatedBlocks, pendingBuild (reset on fault) +// - Request histories are mem state (cleared on fault) +// +// Phase 1 scope: Ready + Building phases. No SYNCING state. +// +// Block hash abstraction: deterministic hash = height * 1000 + index. +// Genesis block: height 0, hash 0, parentHash 0. + +module engine_api_generator { + import basicSpells.* from "spells/basicSpells" + import rareSpells.* from "spells/rareSpells" + import faults.* from "faults" + import engine_api_contract.* from "engine_api_contract" + + // =========================================================================== + // CONFIGURATION + // =========================================================================== + + const NODES: List[Node] + + // Max height the generator will explore (bounds trace length) + pure val MAX_HEIGHT = 4 + + // =========================================================================== + // PER-NODE STATE (disk/mem split) + // =========================================================================== + + type RethPhase = + | Offline // Not running + | Ready // Processing requests normally + | Building // forkchoiceUpdated called with attrs, payload in progress + + // Disk state: survives restart, lost on crash + type RethDiskState = { + // Persisted canonical chain: height → block + chain: Height -> Block, + // Current head hash + head: BlockHash, + // Current head height + headHeight: Height, + } + + // Mem state: cleared on any fault (crash or restart) + type RethMemState = { + phase: RethPhase, + // Blocks validated via newPayload in this session + validatedBlocks: Set[BlockHash], + // Pending build: payloadId + parentHash of the build + pendingBuild: Option[{ payloadId: PayloadId, parentHash: BlockHash, parentHeight: Height }], + } + + type RethNodeState = { + disk: RethDiskState, + mem: RethMemState, + } + + // Genesis block: the foundation of the chain + pure val GENESIS_BLOCK: Block = { + height: 0, + hash: 0, + parentHash: 0, + } + + pure val initRethDisk: RethDiskState = { + chain: Map(0 -> GENESIS_BLOCK), + head: 0, + headHeight: 0, + } + + pure val initRethMem: RethMemState = { + phase: Offline, + validatedBlocks: Set(), + pendingBuild: None, + } + + pure val readyRethMem: RethMemState = { + phase: Ready, + validatedBlocks: Set(), + pendingBuild: None, + } + + pure val initRethNode: RethNodeState = { + disk: initRethDisk, + mem: initRethMem, + } + + // =========================================================================== + // TRACE ENTRY (for lastEvent observation / MBT integration) + // =========================================================================== + + type EngineTraceEntry = + | EngineMsg(EngineRequest) + | EngineFaultMsg(FaultEvent) + + // =========================================================================== + // GLOBAL STATE + // =========================================================================== + + // Per-node Reth state (disk/mem split) + var rethStates: Node -> RethNodeState + + // Per-node request history (mem state) + var requestHistory: Node -> List[EngineRequest] + + // Last trace entry emitted (for trace observation) + var engineLastTraceEntry: Option[{ node: Node, entry: EngineTraceEntry }] + + // Counter for generating unique IDs (payload IDs and block hashes) + var nextId: int + + // =========================================================================== + // HELPERS + // =========================================================================== + + // Deterministic hash: height * 1000 + a counter-like offset. + pure def blockHash(height: Height, payloadId: PayloadId): BlockHash = + height * 1000 + payloadId + + // Compute newPayload validation status for a block against a node's chain. + // Extracted from respondNewPayload for reuse by composition (e.g., to pass + // the validity result to Emerald's handleReceivedProposal). + pure def computePayloadStatus(ns: RethNodeState, block: Block): PayloadStatusCode = { + val parentValid = ns.disk.chain.has(block.height - 1) and + ns.disk.chain.get(block.height - 1).hash == block.parentHash + if (parentValid) Valid else Invalid + } + + // =========================================================================== + // ACTIONS: Engine API request-response pairs + // =========================================================================== + // + // Phase state machine: + // + // Offline ─────────► Ready ◄──────────────┐ + // (rethStart) │ │ + // │ │ + // ▼ │ + // Building ───────────────┘ + // (respondBuildRequest) (respondGetPayload, + // respondHeadUpdate) + // + // Composition usage note: + // - In emerald_with_both_generators.qnt, respondBuildRequest + respondGetPayload + // are combined atomically in stepGetValue (instantaneous build model). + // - Standalone test driver explores these actions independently to validate + // contract properties under broader conditions than realistic usage. + // + // Implementation details vs contract properties: + // Guards and behaviors in these actions fall into three categories: + // + // 1. CONTRACT ENFORCEMENT: Guards that directly enforce contract properties + // Example: respondHeadUpdate checks block exists in chain (validBeforeHead) + // + // 2. IMPLEMENTATION DETAILS: Generator-specific choices not required by contract + // Example: respondBuildRequest always builds on current head (enables buildIntegrity + // but not the only way); phase state machine (internal, not observable) + // + // 3. OPTIMIZATIONS: Bounds that reduce search space without affecting correctness + // Example: block.height <= MAX_HEIGHT (real Reth handles arbitrary heights) + // + // 4. PHASE 1 CONSTRAINTS: Temporary simplifications to be relaxed in Phase 2 + // Example: headMonotonic (no reorgs) — real Reth supports reorgs + // + // Inline comments below mark guards with [CONTRACT], [IMPL], [OPT], or [PHASE1] + // to clarify their purpose. + // + + // --- respondNewPayload --- + // Emerald sends a block for validation. Reth validates and returns status. + // + // Valid if: block's parentHash matches the chain at (height - 1). + // Invalid otherwise. + // + // Source: engine_newPayloadV4 in Engine API spec + action respondNewPayload(node: Node, block: Block): bool = { + val ns = rethStates.get(node) + // [CONTRACT] validationDeterminism: validation outcome is deterministic based on chain state + // This enables validationStability (once Valid, always Valid) + val status = computePayloadStatus(ns, block) + val parentValid = status == Valid + val request =ReqNewPayload({ block: block, respStatus: status }) + all { + // [IMPL] Phase check: internal state machine, not observable by contract + or { ns.mem.phase == Ready, ns.mem.phase == Building }, + // [OPT] Height bounds: search space optimization (real Reth handles arbitrary heights) + block.height >= 1, + block.height <= MAX_HEIGHT, + rethStates' = rethStates.set(node, { + disk: { + ...ns.disk, + // Add valid blocks to the chain if no entry exists at that height. + // Don't overwrite existing entries — prevents chainContinuity violations + // when the standalone test validates different blocks at the same height. + chain: if (parentValid and not(ns.disk.chain.has(block.height))) + ns.disk.chain.put(block.height, block) + else + ns.disk.chain, + }, + mem: { + ...ns.mem, + validatedBlocks: if (parentValid) + ns.mem.validatedBlocks.union(Set(block.hash)) + else + ns.mem.validatedBlocks, + }, + }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(request) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), + // Increment counter to ensure standalone test driver generates unique + // block hashes (blockHash uses nextId). Without this, consecutive + // respondNewPayload calls at the same height produce hash collisions. + nextId' = nextId + 1, + } + } + + // --- respondBuildRequest --- + // Emerald requests Reth to build a new block on top of the current head. + // Generates a unique payloadId and enters Building phase. + // + // Key behaviors: + // - Always builds on ns.disk.head + // - Can be called while Building (overwrites pendingBuild, orphans old payloadId) + // - No disk changes (build persisted only when respondGetPayload is called) + // + // Composition: Combined atomically with respondGetPayload in stepGetValue. + // + // Source: engine_forkchoiceUpdatedV3 with payload attributes + action respondBuildRequest(node: Node): bool = { + val ns = rethStates.get(node) + // [IMPL] buildOnCurrentHead: always builds on current head + // One way to achieve buildIntegrity, but not the only way + val headHash = ns.disk.head + val request = ReqForkchoiceUpdated({ + headHash: headHash, + building: true, + respStatus: Valid, + // [CONTRACT] payloadIdUniqueness: structural guarantee enabling buildLifecycle + // nextId counter ensures globally unique payloadIds + respPayloadId: Some(nextId), + }) + all { + // [IMPL] Phase check: internal state machine, not observable by contract + or { ns.mem.phase == Ready, ns.mem.phase == Building }, + rethStates' = rethStates.set(node, { + ...ns, + mem: { + phase: Building, + validatedBlocks: ns.mem.validatedBlocks, + pendingBuild: Some({ payloadId: nextId, parentHash: headHash, parentHeight: ns.disk.headHeight }), + }, + }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(request) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), + nextId' = nextId + 1, + } + } + + // --- respondHeadUpdate --- + // Emerald updates Reth's canonical head after a consensus decision. + // This finalizes a block as the active execution head without requesting a build. + // + // Key distinction from respondNewPayload/respondGetPayload: + // - Those actions ADD blocks to the chain (validation) + // - This action SELECTS which block is canonical (finalization) + // + // Source: engine_forkchoiceUpdatedV3 without payload attributes + action respondHeadUpdate(node: Node, headHash: BlockHash, headHeight: Height): bool = { + val ns = rethStates.get(node) + val request = ReqForkchoiceUpdated({ + headHash: headHash, + building: false, + respStatus: Valid, + respPayloadId: None, + }) + all { + // [IMPL] Phase check: internal state machine, not observable by contract + or { ns.mem.phase == Ready, ns.mem.phase == Building }, + + // [CONTRACT] validBeforeHead: block must already exist in chain before finalization + ns.disk.chain.has(headHeight) and ns.disk.chain.get(headHeight).hash == headHash, + + // [PHASE1] headMonotonic: no reorgs constraint + // EITHER: headHash == current head (idempotent update, allows retries) + // OR: headHeight > current headHeight (monotonic forward progress) + // + // Why idempotency is needed: + // - Consensus layer retries after network delays + // - Re-establishment after restarts + // - Duplicate Decided events in the model + // + // Phase 1 limitation: Prevents reorgs (can't move head from height 3 back to height 2) + // Phase 2 will relax this to allow forking/reorg scenarios + // NOTE: Real Reth supports reorgs — this is a modeling simplification + or { headHash == ns.disk.head, headHeight > ns.disk.headHeight }, + + // State updates: Only disk.head changes, chain itself is unchanged + rethStates' = rethStates.set(node, { + disk: { + chain: ns.disk.chain, // Chain unchanged (block already added earlier) + head: headHash, // Update canonical head + headHeight: headHeight, + }, + mem: { + phase: Ready, // Return to Ready (clear Building if active) + validatedBlocks: ns.mem.validatedBlocks, + pendingBuild: ns.mem.pendingBuild, + }, + }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(request) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), + nextId' = nextId, + } + } + + // --- respondGetPayload --- + // Emerald retrieves the block built by a prior respondBuildRequest. + // Returns the built block, adds it to chain, and clears pendingBuild. + // + // Lifecycle: PayloadId is single-use (respondBuildRequest generates, this consumes). + // + // Block construction: + // - Height: parentHeight + 1 + // - Hash: deterministic (height * 1000 + payloadId) + // - ParentHash: from pendingBuild + // + // Match-with-defaults: Guards ensure pendingBuild is Some, None case never executes. + // + // Composition: Combined atomically with respondBuildRequest in stepGetValue. + // + // Source: engine_getPayloadV4 in Engine API spec + action respondGetPayload(node: Node): bool = { + val ns = rethStates.get(node) + // Extract build info; guard ensures pendingBuild is Some + val build = match ns.mem.pendingBuild { + | Some(b) => b + | None => { payloadId: -1, parentHash: -1, parentHeight: -1 } + } + val newBlock: Block = { + height: build.parentHeight + 1, + hash: blockHash(build.parentHeight + 1, build.payloadId), + parentHash: build.parentHash, + } + val request =ReqGetPayload({ payloadId: build.payloadId, respBlock: newBlock }) + all { + // [IMPL] getPayloadRequiresBuilding: stricter than contract requires + // Contract only requires prior forkchoiceUpdated with this payloadId (buildLifecycle) + // This guard adds phase ordering: must still be in Building state + ns.mem.phase == Building, + // [CONTRACT] buildLifecycle: payloadId must exist (part of single-use token property) + ns.mem.pendingBuild != None, + rethStates' = rethStates.set(node, { + disk: { + ...ns.disk, + // Don't overwrite existing chain entries (same rationale as respondNewPayload) + chain: if (not(ns.disk.chain.has(newBlock.height))) + ns.disk.chain.put(newBlock.height, newBlock) + else + ns.disk.chain, + }, + mem: { + phase: Ready, + validatedBlocks: ns.mem.validatedBlocks.union(Set(newBlock.hash)), + pendingBuild: None, + }, + }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(request) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), + nextId' = nextId, + } + } + + // =========================================================================== + // COMBINED ACTIONS (for composition) + // =========================================================================== + // + // These actions combine primitive actions atomically for use in composition. + // The composition calls these instead of manipulating generator state directly. + // Primitive actions (respondBuildRequest, respondGetPayload, respondHeadUpdate) + // remain for standalone testing. + + // --- respondBuildAndGetPayload --- + // Atomically: forkchoiceUpdated(head, attrs=true) + getPayload(id). + // Used by stepGetValue in composition. Instant build model — no Building + // phase observable from outside. + // + // Constructs a new block on the current head, adds it to chain and + // validatedBlocks, appends both FCU and GetPayload to history. + action respondBuildAndGetPayload(node: Node): bool = { + val ns = rethStates.get(node) + val headHash = ns.disk.head + val pid = nextId + val newBlock: Block = { + height: ns.disk.headHeight + 1, + hash: blockHash(ns.disk.headHeight + 1, pid), + parentHash: headHash, + } + val fcuReq = ReqForkchoiceUpdated({ + headHash: headHash, + building: true, + respStatus: Valid, + respPayloadId: Some(pid), + }) + val gpReq = ReqGetPayload({ payloadId: pid, respBlock: newBlock }) + all { + // [IMPL] Phase check: internal state machine + or { ns.mem.phase == Ready, ns.mem.phase == Building }, + rethStates' = rethStates.set(node, { + disk: { + ...ns.disk, + // Don't overwrite existing chain entries (same rationale as respondNewPayload) + chain: if (not(ns.disk.chain.has(newBlock.height))) + ns.disk.chain.put(newBlock.height, newBlock) + else + ns.disk.chain, + }, + mem: { + phase: Ready, + validatedBlocks: ns.mem.validatedBlocks.union(Set(newBlock.hash)), + pendingBuild: None, + }, + }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(fcuReq).append(gpReq) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(gpReq) }), + nextId' = pid + 1, + } + } + + // --- respondValidateAndFinalize --- + // Atomically: newPayload(block) + forkchoiceUpdated(block.hash, attrs=false). + // Used by stepDecided in composition. Validates the decided block and updates + // Reth's canonical head in one step. + // + // Guards: block must be valid (parent exists and matches), head must not + // regress (Phase 1 no-reorg constraint). + action respondValidateAndFinalize(node: Node, block: Block): bool = { + val ns = rethStates.get(node) + val status = computePayloadStatus(ns, block) + val npReq = ReqNewPayload({ block: block, respStatus: status }) + val fcuReq = ReqForkchoiceUpdated({ + headHash: block.hash, + building: false, + respStatus: Valid, + respPayloadId: None, + }) + all { + // [IMPL] Phase check: internal state machine + or { ns.mem.phase == Ready, ns.mem.phase == Building }, + // [CONTRACT] Block must be valid (parent chain linkage) + status == Valid, + // [PHASE1] headMonotonic: no reorgs (same as respondHeadUpdate) + or { block.hash == ns.disk.head, block.height > ns.disk.headHeight }, + rethStates' = rethStates.set(node, { + disk: { + chain: ns.disk.chain.put(block.height, block), + head: block.hash, + headHeight: block.height, + }, + mem: { + phase: Ready, + validatedBlocks: ns.mem.validatedBlocks.union(Set(block.hash)), + pendingBuild: None, + }, + }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(npReq).append(fcuReq) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(fcuReq) }), + // Increment counter (consistent with respondNewPayload) + nextId' = nextId + 1, + } + } + + // --- rethUnchanged --- + // Passthrough: no Engine API activity this step. + // Exported for composition steps that don't interact with Reth. + action rethUnchanged: bool = all { + rethStates' = rethStates, + requestHistory' = requestHistory, + engineLastTraceEntry' = engineLastTraceEntry, + nextId' = nextId, + } + + // =========================================================================== + // LIFECYCLE ACTIONS + // =========================================================================== + + // --- rethStart --- + // Start Reth on a node. Transitions from Offline to Ready. + action rethStart(node: Node): bool = { + val ns = rethStates.get(node) + all { + ns.mem.phase == Offline, + rethStates' = rethStates.set(node, { + ...ns, + mem: readyRethMem, + }), + requestHistory' = requestHistory, + engineLastTraceEntry' = engineLastTraceEntry, + nextId' = nextId, + } + } + + // =========================================================================== + // FAULT ACTIONS + // =========================================================================== + + // --- rethCrash --- + // Node lost all state: reset disk + mem, clear request history. + action rethCrash(node: Node): bool = { + val ns = rethStates.get(node) + all { + ns.mem.phase != Offline, + rethStates' = rethStates.set(node, initRethNode), + requestHistory' = requestHistory.set(node, []), + engineLastTraceEntry' = Some({ node: node, entry: EngineFaultMsg(Crash) }), + nextId' = nextId, + } + } + + // --- rethRestart --- + // Node restarted: preserve disk state, reset mem, clear request history. + // Chain and head survive on disk. Validated blocks and pending builds lost. + action rethRestart(node: Node): bool = { + val ns = rethStates.get(node) + all { + ns.mem.phase != Offline, + rethStates' = rethStates.set(node, { disk: ns.disk, mem: readyRethMem }), + requestHistory' = requestHistory.set(node, []), + engineLastTraceEntry' = Some({ node: node, entry: EngineFaultMsg(Restart) }), + nextId' = nextId, + } + } + + // =========================================================================== + // INITIALIZATION + // =========================================================================== + + action init = { + val nodes = NODES.toSet() + all { + rethStates' = nodes.mapBy(n => initRethNode), + requestHistory' = nodes.mapBy(n => []), + engineLastTraceEntry' = None, + nextId' = 1, + } + } + + // =========================================================================== + // STEP: nondeterministic test driver + // =========================================================================== + // + // For standalone testing: a nondeterministic caller picks which Engine API + // call to make. The generator responds. This validates the contract + // independently of Emerald. + + action step = { + nondet node = NODES.toSet().oneOf() + val ns = rethStates.get(node) + any { + // Start Reth + rethStart(node), + // newPayload: Test driver explores ALL possible heights and validity scenarios. + // + // NOTE: This is deliberately MORE GENERAL than real usage in Emerald composition. + // In emerald_with_both_generators.qnt, newPayload is only called at heights + // driven by consensus progression (sequential: 1 → 2 → 3...). + // + // Here we test the Engine API contract exhaustively by: + // 1. Picking random heights (1 to MAX_HEIGHT) - tests out-of-order validation + // 2. Nondeterministically choosing valid/invalid parentHash - tests both paths + // + // This validates that the contract properties hold even under adversarial or + // nonsensical calling patterns, proving Reth's validation logic is correct + // regardless of how the caller behaves. + nondet height = 1.to(MAX_HEIGHT).oneOf() // Explore all heights (not just sequential) + nondet validParent = Set(true, false).oneOf() // Test both valid and invalid blocks + val parentHash = if (ns.disk.chain.has(height - 1)) + ns.disk.chain.get(height - 1).hash + else + -1 // Parent doesn't exist in chain + val block: Block = { + height: height, + hash: blockHash(height, nextId + 100), + // If validParent=true and parent exists: use correct parentHash (valid block) + // If validParent=false or parent missing: use -1 (invalid block) + parentHash: if (validParent and parentHash != -1) parentHash else -1, + } + respondNewPayload(node, block), + // forkchoiceUpdated: build request (always builds on current head) + respondBuildRequest(node), + // forkchoiceUpdated: head update (test driver respects Phase 1 constraints) + // + // NOTE: This explores forward head progression only, respecting the Phase 1 + // no-reorg constraint. In emerald_with_both_generators.qnt, head updates + // are driven by consensus Decided events (sequential: height 1 → 2 → 3...). + // + // Here we test: + // 1. Idempotent updates (same height/hash) + // 2. Forward progression (higher heights) + // 3. Skip-ahead scenarios (jumping multiple heights) + // + // The range starts at current headHeight (not 1) because respondHeadUpdate's + // guard blocks backward movement: headHeight > ns.disk.headHeight. + nondet updateHeight = ns.disk.headHeight.to(MAX_HEIGHT).oneOf() // Forward only + // Lookup the hash for the chosen height: + // - If same as current height: use current head (tests idempotency) + // - If block exists at updateHeight: use its hash (tests forward progress) + // - If block doesn't exist: use -1 (filtered by guard below) + val updateHash = if (updateHeight == ns.disk.headHeight) ns.disk.head + else if (ns.disk.chain.has(updateHeight)) ns.disk.chain.get(updateHeight).hash + else -1 + // Guard: only call respondHeadUpdate if we found a valid block + // Filters out cases where updateHeight has no block in chain yet + all { updateHash != -1, respondHeadUpdate(node, updateHash, updateHeight) }, + // getPayload + respondGetPayload(node), + // Faults + rethCrash(node), + rethRestart(node), + } + } + + // =========================================================================== + // CONTRACT PROPERTIES (checked as invariants) + // =========================================================================== + + // Build per-node EngineState for contract checking. + // Each node has its own Reth instance, so disk state and request history + // are checked independently per node. + pure def engineStateForNode( + ns: RethNodeState, + hist: List[EngineRequest], + node: Node + ): EngineState = { + disk: { + chain: ns.disk.chain, + head: ns.disk.head, + headHeight: ns.disk.headHeight, + }, + mem: { + request_history: Map(node -> hist), + }, + } + + // Full contract checked per-node + val contractInv = NODES.toSet().forall(n => + engineContract(engineStateForNode(rethStates.get(n), requestHistory.get(n), n)) + ) +} diff --git a/specs/engine_api_generator_test.qnt b/specs/engine_api_generator_test.qnt new file mode 100644 index 00000000..e839e3e3 --- /dev/null +++ b/specs/engine_api_generator_test.qnt @@ -0,0 +1,22 @@ +// -*- mode: Bluespec; -*- + +// Test module for engine_api_generator: instantiates with concrete nodes +// and checks the contract invariant via simulation. +// +// 4 nodes: consistent with channel API tests (allows fault tolerance +// exploration with one crashed node). + +module engine_api_generator_test { + import engine_api_contract.* from "engine_api_contract" + + pure val NODES = List("node1", "node2", "node3", "node4") + + import engine_api_generator( + NODES = NODES, + ) as gen from "engine_api_generator" + + // Re-export generator state for simulation + action init = gen::init + action step = gen::step + val contractInv = gen::contractInv +} From 392ff31a40d41feaaad0b2b4cd89e02de4751bb9 Mon Sep 17 00:00:00 2001 From: mpoke Date: Thu, 26 Feb 2026 09:52:51 +0000 Subject: [PATCH 10/20] refactor: unify work queue with WorkItem type and finalize naming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace PendingWork/ProcessingContext split with a flat List[WorkItem] queue where engine API calls and local Emerald state updates are interleaved as equal work items. This generalizes naturally to apps talking to multiple external components. Key changes: - WorkItem sum type: EngineCall | FinalizeGetValue | FinalizeReceivedProposal | FinalizeDecided - pendingWork: List[WorkItem] replaces Option[PendingWork] - stepAdvanceWork processes one item per step with uniform queue pop - Handlers renamed handle* → finalize* to reflect they update Emerald state - Stale proposal check moved to stepReceivedProposal (before enqueueing) - Removed rethUnchanged alias, PendingWork type, ProcessingContext type - Added TODOs for EngineCallSpec boilerplate and state separation Co-Authored-By: Claude Opus 4.6 --- specs/emerald_with_both_generators.qnt | 281 +++++++++++++------------ 1 file changed, 145 insertions(+), 136 deletions(-) diff --git a/specs/emerald_with_both_generators.qnt b/specs/emerald_with_both_generators.qnt index b1937009..67361610 100644 --- a/specs/emerald_with_both_generators.qnt +++ b/specs/emerald_with_both_generators.qnt @@ -33,6 +33,7 @@ // State follows the disk/mem convention from faults.qnt. // Extends emerald_with_generator.qnt with Engine API tracking state. +// TODO create README file with description of the composition approach, conventions, future work module emerald_with_both_generators { import basicSpells.* from "spells/basicSpells" import rareSpells.* from "spells/rareSpells" @@ -64,7 +65,12 @@ module emerald_with_both_generators { // Specifies which Engine API primitive action to call. // One variant per primitive action, carrying required parameters. - // TODO: why is this not part of the engine generator? + // + // TODO: EngineCallSpec and dispatchEngineCall are boilerplate — mechanically + // derivable from the generator's action signatures. They belong in (or next + // to) the engine generator as reusable consumer infrastructure, and are + // candidates for language-level automation (Quint could auto-generate a call + // enum + dispatcher when a spec imports a generator). type EngineCallSpec = | CallBuildRequest // respondBuildRequest(node) | CallGetPayload // respondGetPayload(node) @@ -72,19 +78,33 @@ module emerald_with_both_generators { | CallHeadUpdate({ headHash: eac::BlockHash, headHeight: eac::Height }) // respondHeadUpdate(node, headHash, headHeight) - // Handler-specific context carried through the queue for finalization. - // Each variant holds exactly the data the corresponding handler needs. - type ProcessingContext = - | ProcGetValue({ proposal: Proposal }) - | ProcReceivedProposal({ proposal: Proposal, block: eac::Block }) - | ProcDecided({ proposal: Proposal, block: eac::Block }) - - // Pending Engine API work: a list of remaining calls + context for finalization. - // When remainingCalls is empty, finalize using context. - type PendingWork = { - remainingCalls: List[EngineCallSpec], - context: ProcessingContext, - } + // A single unit of work in the node's processing queue. + // EngineCall: external calls to Reth (generic, any consumer would have the same). + // FinalizeX: local Emerald state updates after engine work completes (app-specific). + // Generalizes naturally: an app talking to multiple external components would + // add variants for each (e.g., MempoolCall, OracleCall) interleaved with local logic. + // + // TODO: Cleaner state separation between Emerald and generators. + // Currently Emerald reads reth::rethStates directly in several places: + // (a) Block construction: reads reth.disk.chain for parentHash at enqueue time + // (stepReceivedProposal, stepDecided) + // (b) Validity pre-check: computePayloadStatus guard at enqueue time (stepDecided) + // (c) Cross-component data flow: FinalizeReceivedProposal reads reth state to get + // validation result from preceding CallNewPayload + // (d) Phase check: stepConsensusReady checks reth phase to decide rethStart + // To eliminate this coupling: + // - EngineCall dispatch could write responses into Emerald's own state (e.g., + // lastResponse: Option[EngineResponse]), so handlers read local state not + // generator state. This fixes (c). + // - Block construction could become a work item itself (e.g., + // BuildValidationBlock) that reads Reth state and enqueues CallNewPayload. + // This fixes (a) and (b). + // - Phase check could use an observable flag published by the generator. Fixes (d). + type WorkItem = + | EngineCall(EngineCallSpec) + | FinalizeGetValue({ proposal: Proposal }) + | FinalizeReceivedProposal({ proposal: Proposal, block: eac::Block }) + | FinalizeDecided({ proposal: Proposal, block: eac::Block }) // --------------------------------------------------------------------------- // Emerald node state @@ -109,8 +129,8 @@ module emerald_with_both_generators { // Engine API tracking (ephemeral) head_block_hash: eac::BlockHash, // Current execution head validated_cache: Set[eac::BlockHash], // Cached validation results - // Non-atomic Engine API processing queue - pendingWork: Option[PendingWork], + // Sequential work queue: engine API calls + local handlers + pendingWork: List[WorkItem], } type EmeraldNodeState = { @@ -143,7 +163,7 @@ module emerald_with_both_generators { undecided_proposals: Set(), head_block_hash: 0, validated_cache: Set(), - pendingWork: None, + pendingWork: [], } pure val initEmeraldNode: EmeraldNodeState = { @@ -191,50 +211,40 @@ module emerald_with_both_generators { }) } - // GetValue: Proposer builds a value using Engine API. - // Called during finalization (after respondBuildRequest + respondGetPayload). - action handleGetValue(node: Node, proposal: Proposal): bool = { + // Update Emerald state after Engine API build (respondBuildRequest + respondGetPayload). + // Adds the proposer's proposal to undecided_proposals. + action finalizeGetValue(node: Node, proposal: Proposal, remaining: List[WorkItem]): bool = { val s = emeraldState.get(node) emeraldState' = emeraldState.set(node, { ...s, mem: { ...s.mem, undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)), - pendingWork: None, + pendingWork: remaining, }, }) } - // ReceivedProposal: Non-proposer learns about a proposal. - // Validates via Engine API (newPayload). Block tracking updated. - action handleReceivedProposal(node: Node, proposal: Proposal, blockHash: eac::BlockHash, valid: bool): bool = { + // Update Emerald state after Engine API validation (respondNewPayload). + // Adds proposal to undecided_proposals and caches validation result. + // Only called for current-height proposals — stale and future proposals + // are filtered at enqueue time in stepReceivedProposal. + action finalizeReceivedProposal(node: Node, proposal: Proposal, blockHash: eac::BlockHash, valid: bool, remaining: List[WorkItem]): bool = { val s = emeraldState.get(node) - if (proposal.height < s.mem.consensus_height) { - // Stale proposal — drop it - emeraldState' = emeraldState - } else if (proposal.height == s.mem.consensus_height) { - // Current height — actionable (called from finalization) - emeraldState' = emeraldState.set(node, { - ...s, - mem: { - ...s.mem, - undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)), - validated_cache: if (valid) s.mem.validated_cache.union(Set(blockHash)) else s.mem.validated_cache, - pendingWork: None, - }, - }) - } else { - // Future height — can't validate yet - emeraldState' = emeraldState.set(node, { - ...s, - mem: { ...s.mem, pending_proposals: s.mem.pending_proposals.union(Set(proposal)) }, - }) - } + emeraldState' = emeraldState.set(node, { + ...s, + mem: { + ...s.mem, + undecided_proposals: s.mem.undecided_proposals.union(Set(proposal)), + validated_cache: if (valid) s.mem.validated_cache.union(Set(blockHash)) else s.mem.validated_cache, + pendingWork: remaining, + }, + }) } - // Decided: Consensus decided on a value. - // Called during finalization (after respondNewPayload + respondHeadUpdate). - action handleDecided(node: Node, proposal: Proposal, decidedBlock: eac::Block): bool = { + // Update Emerald state after Engine API finalization (respondNewPayload + respondHeadUpdate). + // Commits decided proposal to disk, advances to next height, updates head. + action finalizeDecided(node: Node, proposal: Proposal, decidedBlock: eac::Block, remaining: List[WorkItem]): bool = { val s = emeraldState.get(node) val nextHeight = proposal.height + 1 emeraldState' = emeraldState.set(node, { @@ -253,7 +263,7 @@ module emerald_with_both_generators { undecided_proposals: Set(), head_block_hash: decidedBlock.hash, validated_cache: s.mem.validated_cache.union(Set(decidedBlock.hash)), - pendingWork: None, + pendingWork: remaining, }, }) } @@ -313,19 +323,11 @@ module emerald_with_both_generators { } // =========================================================================== - // RETH STATE PASSTHROUGH (for steps with no Engine API calls) - // =========================================================================== - - // Delegate to generator's published action (no need to know internal state vars) - // TODO: why is this needed and we cannot use directly reth::rethUnchanged? - action rethUnchanged: bool = reth::rethUnchanged - - // =========================================================================== - // NON-ATOMIC ENGINE API PROCESSING + // WORK QUEUE PROCESSING // =========================================================================== // Dispatch a single Engine API call to the appropriate Reth primitive action. - // TODO: should this be part of the engine generator? + // TODO: boilerplate — see EngineCallSpec TODO above. action dispatchEngineCall(node: Node, call: EngineCallSpec): bool = match call { | CallBuildRequest => reth::respondBuildRequest(node) @@ -334,47 +336,46 @@ module emerald_with_both_generators { | CallHeadUpdate(hu) => reth::respondHeadUpdate(node, hu.headHash, hu.headHeight) } - // Finalize processing by calling the appropriate Emerald handler. - // Called when all Engine API calls in the queue have been executed. - action finalizeProcessing(node: Node, pw: PendingWork): bool = - match pw.context { - | ProcGetValue(gv) => handleGetValue(node, gv.proposal) - | ProcReceivedProposal(rp) => - val rns = reth::rethStates.get(node) - val valid = reth::computePayloadStatus(rns, rp.block) == eac::Valid - handleReceivedProposal(node, rp.proposal, rp.block.hash, valid) - | ProcDecided(d) => handleDecided(node, d.proposal, d.block) - } - - // Process one Engine API call from the queue, or finalize if queue is empty. - // TODO: why is not finalizeProcessing one of the pending work items? - action stepAdvanceEngine(node: Node): bool = { + // Process the next work item from the queue. + // Pops the head, dispatches it, and advances the queue in one step. + action stepAdvanceWork(node: Node): bool = { val s = emeraldState.get(node) - // Extract with defaults — guard below ensures pendingWork is Some - val pw: PendingWork = match s.mem.pendingWork { - | Some(pw) => pw - | None => { - remainingCalls: [], - context: ProcGetValue({ proposal: { height: 0, round: 0, proposer: "", payload: 0 } }), - } - } + val remaining = s.mem.pendingWork.tail() all { - s.mem.pendingWork != None, - if (pw.remainingCalls.length() > 0) - all { - dispatchEngineCall(node, pw.remainingCalls.head()), - gen::genUnchanged, - emeraldState' = emeraldState.set(node, { - ...s, - mem: { ...s.mem, pendingWork: Some({ ...pw, remainingCalls: pw.remainingCalls.tail() }) }, - }), - } - else - all { - finalizeProcessing(node, pw), - gen::genUnchanged, - rethUnchanged, - } + s.mem.pendingWork.length() > 0, + match s.mem.pendingWork.head() { + | EngineCall(call) => + all { + dispatchEngineCall(node, call), + gen::genUnchanged, + emeraldState' = emeraldState.set(node, { + ...s, + mem: { ...s.mem, pendingWork: remaining }, + }), + } + | FinalizeGetValue(gv) => + all { + reth::rethUnchanged, + gen::genUnchanged, + finalizeGetValue(node, gv.proposal, remaining), + } + | FinalizeReceivedProposal(rp) => + // Cross-component data flow: read Reth state to get the validation + // result from the preceding CallNewPayload (which wrote to rethStates). + val rns = reth::rethStates.get(node) + val valid = reth::computePayloadStatus(rns, rp.block) == eac::Valid + all { + reth::rethUnchanged, + gen::genUnchanged, + finalizeReceivedProposal(node, rp.proposal, rp.block.hash, valid, remaining), + } + | FinalizeDecided(d) => + all { + reth::rethUnchanged, + gen::genUnchanged, + finalizeDecided(node, d.proposal, d.block, remaining), + } + } } } @@ -404,13 +405,13 @@ module emerald_with_both_generators { val startHeight = emeraldState.get(node).disk.last_decided_height + 1 val rns = reth::rethStates.get(node) all { - emeraldState.get(node).mem.pendingWork == None, + emeraldState.get(node).mem.pendingWork.length() == 0, gen::sendConsensusReady(node, startHeight), handleConsensusReady(node, startHeight), // Start Reth if not already running - // TODO (low priority) avoid accessing rns state + if (rns.mem.phase == reth::Offline) reth::rethStart(node) - else rethUnchanged, + else reth::rethUnchanged, } } @@ -429,7 +430,7 @@ module emerald_with_both_generators { action stepStartedRound(node: Node): bool = { val s = emeraldState.get(node).mem all { - emeraldState.get(node).mem.pendingWork == None, + emeraldState.get(node).mem.pendingWork.length() == 0, any { all { gen::sendStartedRound(node), @@ -440,7 +441,7 @@ module emerald_with_both_generators { handleStartedRound(node, s.consensus_height, s.consensus_round + 1), }, }, - rethUnchanged, + reth::rethUnchanged, } } @@ -450,17 +451,23 @@ module emerald_with_both_generators { val s = emeraldState.get(node) val proposal = buildProposal(s, node) all { - s.mem.pendingWork == None, + s.mem.pendingWork.length() == 0, gen::sendGetValue(node, proposal), - rethUnchanged, + reth::rethUnchanged, emeraldState' = emeraldState.set(node, { ...s, mem: { ...s.mem, - // TODO does this pattern work also if CallGetPayload depends on the response of CallBuildRequest? Or is this response stored in the engine generator? - pendingWork: Some({ - remainingCalls: [CallBuildRequest, CallGetPayload], - context: ProcGetValue({ proposal: proposal }), - }), + // Work items don't pass data to each other directly — they communicate + // through observable component state. The queue guarantees ordering so + // reads see prior writes. E.g., CallGetPayload reads the pendingBuild + // that CallBuildRequest wrote to rethStates; FinalizeGetValue could read + // the built block from reth::rethStates.get(node).disk.chain if needed + // (as FinalizeReceivedProposal already does for validation). + pendingWork: [ + EngineCall(CallBuildRequest), + EngineCall(CallGetPayload), + FinalizeGetValue({ proposal: proposal }), + ], }, }), } @@ -471,7 +478,7 @@ module emerald_with_both_generators { // handle immediately (buffer as pending, no Engine API needed). action stepReceivedProposal(node: Node, proposal: Proposal): bool = { val s = emeraldState.get(node) - // TODO (low priority) avoid accessing rns state + val rns = reth::rethStates.get(node) val parentHash = if (rns.disk.chain.has(proposal.height - 1)) rns.disk.chain.get(proposal.height - 1).hash @@ -479,20 +486,24 @@ module emerald_with_both_generators { -1 val block: eac::Block = validationBlock(proposal, parentHash) all { - s.mem.pendingWork == None, + s.mem.pendingWork.length() == 0, gen::sendReceivedProposal(node, proposal), - rethUnchanged, - // TODO what if the proposal is for an old height; the channel API generator drops them, but we should still cover that edge case here - emeraldState' = if (proposal.height == s.mem.consensus_height) - // Current height — enqueue Engine API validation + reth::rethUnchanged, + emeraldState' = if (proposal.height < s.mem.consensus_height) + // Stale proposal — drop it, no Engine API call. + // Currently unreachable (generator guards height >= node.height), + // but defensive for when independent crashes are modeled. + emeraldState + else if (proposal.height == s.mem.consensus_height) + // Current height — enqueue Engine API validation + local handler emeraldState.set(node, { ...s, mem: { ...s.mem, - pendingWork: Some({ - remainingCalls: [CallNewPayload({ block: block })], - context: ProcReceivedProposal({ proposal: proposal, block: block }), - }), + pendingWork: [ + EngineCall(CallNewPayload({ block: block })), + FinalizeReceivedProposal({ proposal: proposal, block: block }), + ], }}) else - // Future height — handle immediately, no Engine API needed + // Future height — buffer as pending, no Engine API needed emeraldState.set(node, { ...s, mem: { ...s.mem, pending_proposals: s.mem.pending_proposals.union(Set(proposal)), }}), @@ -504,7 +515,7 @@ module emerald_with_both_generators { // Guard: block must be valid (prevents enqueueing uncompleable work). action stepDecided(node: Node, proposal: Proposal): bool = { val s = emeraldState.get(node) - // TODO (low priority) avoid accessing rns state + val rns = reth::rethStates.get(node) val parentHash = if (rns.disk.chain.has(proposal.height - 1)) rns.disk.chain.get(proposal.height - 1).hash @@ -512,19 +523,17 @@ module emerald_with_both_generators { -1 val block: eac::Block = validationBlock(proposal, parentHash) all { - s.mem.pendingWork == None, + s.mem.pendingWork.length() == 0, // Guard: block must be valid (same as atomic respondValidateAndFinalize's guard) reth::computePayloadStatus(rns, block) == eac::Valid, gen::sendDecided(node, proposal), - rethUnchanged, + reth::rethUnchanged, emeraldState' = emeraldState.set(node, { ...s, mem: { ...s.mem, - pendingWork: Some({ - remainingCalls: [ - CallNewPayload({ block: block }), - CallHeadUpdate({ headHash: block.hash, headHeight: block.height }), - ], - context: ProcDecided({ proposal: proposal, block: block }), - }), + pendingWork: [ + EngineCall(CallNewPayload({ block: block })), + EngineCall(CallHeadUpdate({ headHash: block.hash, headHeight: block.height })), + FinalizeDecided({ proposal: proposal, block: block }), + ], }}), } } @@ -534,19 +543,19 @@ module emerald_with_both_generators { val h = emeraldState.get(node).mem.consensus_height val proposal = gen::decisions.get(h) all { - emeraldState.get(node).mem.pendingWork == None, + emeraldState.get(node).mem.pendingWork.length() == 0, gen::sendProcessSyncedValue(node), handleProcessSyncedValue(node, proposal), - rethUnchanged, + reth::rethUnchanged, } } // GetDecidedValue: Channel API only, no Engine API calls. action stepGetDecidedValue(node: Node, height: Height): bool = all { - emeraldState.get(node).mem.pendingWork == None, + emeraldState.get(node).mem.pendingWork.length() == 0, gen::sendGetDecidedValue(node, height), handleGetDecidedValue(node, height), - rethUnchanged, + reth::rethUnchanged, } // NodeCrash: Both generators + Emerald state reset. @@ -596,7 +605,7 @@ module emerald_with_both_generators { stepProcessSyncedValue(node), nondet height = 1.to(gen::MAX_HEIGHT).oneOf() stepGetDecidedValue(node, height), - stepAdvanceEngine(node), + stepAdvanceWork(node), stepNodeCrash(node), stepNodeRestart(node), } From fa8b415c3c8f4ae543c8b2d79d6a727c124162aa Mon Sep 17 00:00:00 2001 From: mpoke Date: Thu, 26 Feb 2026 10:15:10 +0000 Subject: [PATCH 11/20] refactor: reorganize invariants and update crash TODOs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Categorize invariants by scope: Emerald-only, Emerald↔Malachite, Emerald↔Reth - Remove chain_continuity_inv (Reth contract property, duplicated from reth::contractInv) - Add commented channelContractInv/engineContractInv for full contract verification - Update independent crash TODO with concrete design: deadlock analysis, work queue clearing, validated_cache handling, invariant gating on Reth phase Co-Authored-By: Claude Opus 4.6 --- specs/emerald_with_both_generators.qnt | 88 +++++++++++++++----------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/specs/emerald_with_both_generators.qnt b/specs/emerald_with_both_generators.qnt index 67361610..ac9dc049 100644 --- a/specs/emerald_with_both_generators.qnt +++ b/specs/emerald_with_both_generators.qnt @@ -560,23 +560,32 @@ module emerald_with_both_generators { // NodeCrash: Both generators + Emerald state reset. // No idle guard — faults can occur mid-processing (clears pendingWork). - // TODO: Model independent process crashes - // Currently crashes BOTH Emerald and Reth together, but they run in separate - // processes and can crash independently. Should add: - // - stepEmeraldCrash: crash Emerald only (Reth keeps running) - // - stepRethCrash: crash Reth only (Emerald keeps running) - // - stepBothCrash: crash both (current behavior) // - // Independent crashes test more realistic failure scenarios: - // - Emerald crashes: loses mem state (pending, undecided, validated_cache), - // but Reth continues validating; when Emerald restarts, must resync - // - Reth crashes: loses mem state (validatedBlocks, pendingBuild), but - // Emerald continues; subsequent Engine API calls may fail or require retry - // - Both crash: current model (coordinated failure) + // TODO: Model independent process crashes. + // Malachite+Emerald run in one process, Reth in another. Should replace + // stepNodeCrash/stepNodeRestart with 4 independent actions: // - // Impact on invariants: - // - validated_before_decided: must check Reth DISK chain (mem cleared on Reth crash) - // - head_tracks_consensus: Emerald may be ahead if Reth crashed and restarted + // - stepEmeraldCrash/Restart: gen::nodeCrash/Restart + handleNodeCrash/Restart, + // reth::rethUnchanged. Emerald+Malachite fail, Reth keeps running. + // + // - stepRethCrash: reth::rethCrash, gen::genUnchanged. Must also clear + // Emerald's pendingWork (engine calls can't execute against Offline Reth, + // and rethStart requires empty queue — deadlock otherwise) and + // validated_cache (references blocks no longer in Reth's chain). + // + // - stepRethRestart: reth::rethRestart, gen::genUnchanged. Must clear + // Emerald's pendingWork (pendingBuild is gone, queued CallGetPayload + // would fail). validated_cache can stay (disk chain preserved). + // + // Invariant impact: + // - head_tracks_consensus: after Reth crash, headHeight resets to 0 while + // last_decided_height stays. Must gate on reth phase != Offline. + // - validated_before_decided: after Reth crash, all evidence (mem + disk) + // is gone. Must gate on reth phase != Offline. + // - chainContinuity (reth contract): uses disk state only, robust to all crash types. + // + // No "both crash" convenience action needed — stepEmeraldCrash followed by + // stepRethCrash in consecutive steps achieves the same result. action stepNodeCrash(node: Node): bool = all { gen::nodeCrash(node), reth::rethCrash(node), @@ -585,7 +594,7 @@ module emerald_with_both_generators { // NodeRestart: Both generators + Emerald state reset (disk preserved). // No idle guard — faults can occur mid-processing (clears pendingWork). - // TODO: Same as stepNodeCrash - should model independent restarts + // TODO: See stepNodeCrash TODO — same independent crash split applies. action stepNodeRestart(node: Node): bool = all { gen::nodeRestart(node), reth::rethRestart(node), @@ -615,9 +624,15 @@ module emerald_with_both_generators { // INVARIANTS // =========================================================================== - // TODO This should be Emerald specific invariants, with an option to run this spec against both contracts + // Invariants are organized by scope: + // - Emerald-only: properties of Emerald's own state + // - Emerald ↔ Malachite: properties relating Emerald state to Channel API generator state + // - Emerald ↔ Reth: properties relating Emerald state to Engine API generator state + // The generators also expose contractInv (gen::contractInv, reth::contractInv) + // which check the full contract properties. These can be uncommented below + // to verify the composition doesn't violate either contract. - // --- Channel API invariants --- + // --- Emerald-only invariants --- // Safety: All nodes agree on decided blocks. val emerald_agreement = @@ -638,6 +653,16 @@ module emerald_with_both_generators { st.mem.consensus_height > st.disk.last_decided_height ) + // Lifecycle: No pending proposals at current height. + val no_pending_at_current_height = + NODES.toSet().forall(n => + val st = emeraldState.get(n) + st.mem.consensus_height > 0 implies + st.mem.pending_proposals.forall(p => p.height > st.mem.consensus_height) + ) + + // --- Cross-boundary invariants (Emerald ↔ Malachite) --- + // Completeness: All nodes know all decided proposals. val completion = NODES.toSet().forall(n => @@ -647,15 +672,7 @@ module emerald_with_both_generators { ) ) - // Lifecycle: No pending proposals at current height. - val no_pending_at_current_height = - NODES.toSet().forall(n => - val st = emeraldState.get(n) - st.mem.consensus_height > 0 implies - st.mem.pending_proposals.forall(p => p.height > st.mem.consensus_height) - ) - - // --- Engine API invariants --- + // --- Cross-boundary invariants (Emerald ↔ Reth) --- // head_tracks_consensus: After Decided(h), Reth's head height >= h. val head_tracks_consensus = @@ -684,15 +701,10 @@ module emerald_with_both_generators { } ) - // chain_continuity: Reth's canonical chain forms a linked list. - val chain_continuity_inv = - NODES.toSet().forall(n => - val rns = reth::rethStates.get(n) - rns.disk.chain.keys().forall(h => - h == 0 or { - rns.disk.chain.has(h - 1) and - rns.disk.chain.get(h).parentHash == rns.disk.chain.get(h - 1).hash - } - ) - ) + // --- Generator contract invariants --- + // Expensive: full contract property scans per step. Uncomment for + // full verification that the composition doesn't violate either contract. + // val channelContractInv = gen::contractInv + // val engineContractInv = reth::contractInv + } From 915414e0238b9d0d414dbd4aee615f0feb06fdee Mon Sep 17 00:00:00 2001 From: mpoke Date: Thu, 26 Feb 2026 13:52:17 +0100 Subject: [PATCH 12/20] add README with composition approach --- specs/README.md | 200 +++++++++++++++++++++++++ specs/emerald_with_both_generators.qnt | 3 +- specs/engine_api_generator.qnt | 101 +------------ 3 files changed, 202 insertions(+), 102 deletions(-) create mode 100644 specs/README.md diff --git a/specs/README.md b/specs/README.md new file mode 100644 index 00000000..f529f25e --- /dev/null +++ b/specs/README.md @@ -0,0 +1,200 @@ +# Emerald Specifications + +Formal specifications for Emerald, a modular framework combining [Malachite](https://github.com/informalsystems/malachite) consensus with [Reth](https://github.com/paradigmxyz/reth) execution for EVM networks. + +## Terminology + +- **Application**: the system being modeled (Emerald). Composes with external components treated as black boxes. +- **Component**: an external black box (Malachite, Reth). Publishes a contract + generator. +- **Boundary**: the API between application and component. Has a request side and a response side. + +The application can act as **server** at some boundaries (receives requests, sends responses) and **client** at others (sends requests, receives responses): + +| Boundary | Who sends requests | Who sends responses | +|---|---|---| +| Channel API | Malachite (component) | Emerald (application) | +| Engine API | Emerald (application) | Reth (component) | + +## Contracts + +A **contract** defines properties over a shared boundary (request/response history). The contract is authoritative — it is the specification of the boundary. + +Both sides make guarantees about what they produce: + +- **Component guarantees**: safety + liveness on the requests it sends (if component sends requests) or on the responses it sends (if component sends responses) +- **Application guarantees**: safety + liveness on the responses it sends (if application is server) or on the requests it sends (if application is client) + +Ordering properties are a subcategory of safety (constraints on valid sequences). + +For example: +- **Channel API contract**: Malachite guarantees safety + ordering on the requests it sends (agreement, validity, height monotonicity). Emerald guarantees correctness on its responses (assumptions in the contract). +- **Engine API contract**: Reth guarantees safety on the responses it sends (validationStability, buildIntegrity, headProgression). Emerald guarantees ordering on the requests it sends (buildLifecycle). + +### Contract Scope + +Contract scope depends on the component's nature, not the boundary type: +- **Channel API**: global (cross-node) — because Malachite is a consensus protocol where safety is defined across nodes +- **Engine API**: per-node — because each Reth is an independent local process + +## Generators + +A **generator** is a minimal state machine that produces traces satisfying the contract. The generator is a verified reference implementation — not authoritative, but useful for composition and testing. + +Generators publish: +- **Primitive actions** — one per API method (`send*` for request sources, `respond*` for request handlers) +- **Stutter action** — for steps that don't touch this boundary (`genUnchanged`, `rethUnchanged`) +- **Fault actions** — crash/restart following the disk/mem convention from `faults.qnt` +- **Pure helpers** — extracted logic reusable by the application (e.g., `computePayloadStatus`) +- **CallSpec + dispatcher** — boilerplate mapping call spec variants to generator actions (candidate for language-level automation) + +Generator drive model depends on the component's role: +- **Nondeterministic** (component sends requests): the generator chooses what to send (Channel API) +- **Reactive** (component sends responses): the generator responds to application requests (Engine API) + +## Composition + +The application composes generators by calling their **published actions** — it never writes to generator state variables directly. Reading observable generator state (e.g., `reth::rethStates.get(node).disk.chain`) is fine. + +Each composed step follows the pattern: +``` +all { + componentA::action(node), // or componentA::unchanged + componentB::action(node), // or componentB::unchanged + applicationStateUpdate(node), +} +``` + +Every generator's state must be accounted for in every step (either an action or the stutter/unchanged action). + +### Work Queue + +When a single incoming request requires multiple outgoing actions (to the same or different components) plus local state updates, they go into a sequential **work queue** (`pendingWork: List[WorkItem]`), processed one item per step: + +``` +Incoming request → enqueue work items → process one per step → done +``` + +`WorkItem` is a sum type combining: +- `EngineCall(spec)` — external call to a component (dispatched via CallSpec) +- `FinalizeX(context)` — local application state update + +For example, `stepGetValue` enqueues: +``` +[EngineCall(CallBuildRequest), EngineCall(CallGetPayload), FinalizeGetValue({proposal})] +``` + +Work items don't pass data to each other directly. They communicate through **observable component state**: the queue guarantees ordering, so each item reads the effects of prior items from the generator's state. + +### Generalization + +The work queue generalizes to any application that receives requests from one or more components and sends requests to one or more components: + +``` + ┌─────────────┐ + Component A ───►│ │───► Component B + (requests in) │ Application │ (requests out) + Component C ───►│ │───► Component D + (requests in) └─────────────┘ (requests out) +``` + +Each external component the application sends requests to needs: +- A **CallSpec** type — one variant per action, carrying parameters (e.g., `EngineCallSpec`) +- A **dispatcher** — maps CallSpec variants to generator actions (e.g., `dispatchEngineCall`) + +The application defines: +- **WorkItem** — combines CallSpec variants from all external components + local finalize handlers +- **Work queue** — `List[WorkItem]` processed one per step +- **Finalize handlers** — local state updates after external calls complete + +Adding a new external component (e.g., a mempool service) means adding its `CallSpec` variants to `WorkItem` and interleaving them with existing items. No changes to the queue processing infrastructure. + +Note: `CallSpec` types and dispatchers are boilerplate mechanically derivable from generator action signatures — candidates for language-level automation in Quint. + +## Conventions + +### Disk/Mem State Split + +All state follows the convention from `faults.qnt`: +- **Disk**: survives restart, lost on crash +- **Mem**: cleared on any fault (crash or restart) + +This applies uniformly across Emerald, Malachite (Channel API generator), and Reth (Engine API generator). Request/response histories are mem state. + +### Naming + +| Pattern | Meaning | +|---------|---------| +| `step*` | Composed transition (incoming request + enqueue work items) | +| `stepAdvanceWork` | Process next work queue item | +| `finalize*` | Local application state update (last item in a work sequence) | +| `handle*` | Direct application state update (not queue-dispatched, e.g., `handleConsensusReady`) | +| `respond*` | Engine API generator action (Reth responds to a request) | +| `send*` | Channel API generator action (Malachite sends a request) | + +### Invariant Categories + +Invariants are organized by which component boundaries they check: + +| Category | Examples | Reads | +|----------|----------|-------| +| Emerald-only | `emerald_agreement`, `no_pending_at_current_height` | `emeraldState` only | +| Emerald ↔ Malachite | `completion` | `emeraldState` + `gen::decisions` | +| Emerald ↔ Reth | `head_tracks_consensus`, `validated_before_decided` | `emeraldState` + `reth::rethStates` | + +Generator contracts (`gen::contractInv`, `reth::contractInv`) are available as commented-out invariants for full verification that the composition doesn't violate either contract. + +## File Map + +### Shared + +| File | Purpose | +|------|---------| +| `faults.qnt` | `FaultEvent` type + disk/mem convention | + +### Channel API (Malachite ↔ Emerald) + +| File | Purpose | +|------|---------| +| `channel_api_contract.qnt` | Declarative properties (safety + ordering on Malachite's requests) | +| `channel_api_generator.qnt` | Reference state machine producing valid request sequences | +| `channel_api_generator_test.qnt` | Test module (3 nodes) | + +### Engine API (Emerald ↔ Reth) + +| File | Purpose | +|------|---------| +| `engine_api_contract.qnt` | Declarative properties (response correctness + request ordering) | +| `engine_api_generator.qnt` | Reactive state machine modeling Reth's responses | +| `engine_api_generator_test.qnt` | Test module (4 nodes, nondeterministic driver) | + +### Composition + +| File | Purpose | +|------|---------| +| `emerald_with_generator.qnt` | Channel API only composition (Emerald + Malachite) | +| `emerald_with_generator_test.qnt` | Test module (3 nodes) | +| `emerald_with_both_generators.qnt` | Three-way composition (Emerald + Malachite + Reth) | +| `emerald_with_both_generators_test.qnt` | Test module (4 nodes) | + +### Legacy + +| File | Purpose | +|------|---------| +| `emerald.qnt`, `emerald_types.qnt`, `emerald_mbt.qnt`, `emerald_tests.qnt` | Earlier MBT artifacts, not actively maintained | + +## Future Work + +### State Separation +Emerald currently reads generator state directly in several places (block construction, validity pre-checks, cross-component data flow, phase checks). Cleaner alternatives: +- Engine call dispatch writes responses into Emerald's own state +- Block construction becomes a work item that reads Reth state at execution time +- Phase checks use observable flags published by generators + +### Independent Process Crashes +Malachite+Emerald run in one process, Reth in another. Currently crashes are coordinated. Should add independent crash/restart actions (`stepEmeraldCrash/Restart`, `stepRethCrash/Restart`). Key constraint: Reth crash must clear Emerald's work queue (deadlock otherwise) and validation cache. Invariants must gate on Reth not being offline. + +### Engine API Phase 2 +`exchangeCapabilities`, `getPayloadBodiesByRange/Hash`, SYNCING state. + +### Language-Level Automation +`EngineCallSpec` and `dispatchEngineCall` are boilerplate that Quint could auto-generate when a spec imports a generator. Related to the `satisfies`/`assumes` annotation proposal. diff --git a/specs/emerald_with_both_generators.qnt b/specs/emerald_with_both_generators.qnt index ac9dc049..0c038f0b 100644 --- a/specs/emerald_with_both_generators.qnt +++ b/specs/emerald_with_both_generators.qnt @@ -33,7 +33,6 @@ // State follows the disk/mem convention from faults.qnt. // Extends emerald_with_generator.qnt with Engine API tracking state. -// TODO create README file with description of the composition approach, conventions, future work module emerald_with_both_generators { import basicSpells.* from "spells/basicSpells" import rareSpells.* from "spells/rareSpells" @@ -524,7 +523,7 @@ module emerald_with_both_generators { val block: eac::Block = validationBlock(proposal, parentHash) all { s.mem.pendingWork.length() == 0, - // Guard: block must be valid (same as atomic respondValidateAndFinalize's guard) + // Guard: block must be valid (parent chain linkage) reth::computePayloadStatus(rns, block) == eac::Valid, gen::sendDecided(node, proposal), reth::rethUnchanged, diff --git a/specs/engine_api_generator.qnt b/specs/engine_api_generator.qnt index 0b4699da..3dfaf8f5 100644 --- a/specs/engine_api_generator.qnt +++ b/specs/engine_api_generator.qnt @@ -402,107 +402,8 @@ module engine_api_generator { } // =========================================================================== - // COMBINED ACTIONS (for composition) + // UTILITY ACTIONS (for composition) // =========================================================================== - // - // These actions combine primitive actions atomically for use in composition. - // The composition calls these instead of manipulating generator state directly. - // Primitive actions (respondBuildRequest, respondGetPayload, respondHeadUpdate) - // remain for standalone testing. - - // --- respondBuildAndGetPayload --- - // Atomically: forkchoiceUpdated(head, attrs=true) + getPayload(id). - // Used by stepGetValue in composition. Instant build model — no Building - // phase observable from outside. - // - // Constructs a new block on the current head, adds it to chain and - // validatedBlocks, appends both FCU and GetPayload to history. - action respondBuildAndGetPayload(node: Node): bool = { - val ns = rethStates.get(node) - val headHash = ns.disk.head - val pid = nextId - val newBlock: Block = { - height: ns.disk.headHeight + 1, - hash: blockHash(ns.disk.headHeight + 1, pid), - parentHash: headHash, - } - val fcuReq = ReqForkchoiceUpdated({ - headHash: headHash, - building: true, - respStatus: Valid, - respPayloadId: Some(pid), - }) - val gpReq = ReqGetPayload({ payloadId: pid, respBlock: newBlock }) - all { - // [IMPL] Phase check: internal state machine - or { ns.mem.phase == Ready, ns.mem.phase == Building }, - rethStates' = rethStates.set(node, { - disk: { - ...ns.disk, - // Don't overwrite existing chain entries (same rationale as respondNewPayload) - chain: if (not(ns.disk.chain.has(newBlock.height))) - ns.disk.chain.put(newBlock.height, newBlock) - else - ns.disk.chain, - }, - mem: { - phase: Ready, - validatedBlocks: ns.mem.validatedBlocks.union(Set(newBlock.hash)), - pendingBuild: None, - }, - }), - requestHistory' = requestHistory.set(node, - requestHistory.get(node).append(fcuReq).append(gpReq) - ), - engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(gpReq) }), - nextId' = pid + 1, - } - } - - // --- respondValidateAndFinalize --- - // Atomically: newPayload(block) + forkchoiceUpdated(block.hash, attrs=false). - // Used by stepDecided in composition. Validates the decided block and updates - // Reth's canonical head in one step. - // - // Guards: block must be valid (parent exists and matches), head must not - // regress (Phase 1 no-reorg constraint). - action respondValidateAndFinalize(node: Node, block: Block): bool = { - val ns = rethStates.get(node) - val status = computePayloadStatus(ns, block) - val npReq = ReqNewPayload({ block: block, respStatus: status }) - val fcuReq = ReqForkchoiceUpdated({ - headHash: block.hash, - building: false, - respStatus: Valid, - respPayloadId: None, - }) - all { - // [IMPL] Phase check: internal state machine - or { ns.mem.phase == Ready, ns.mem.phase == Building }, - // [CONTRACT] Block must be valid (parent chain linkage) - status == Valid, - // [PHASE1] headMonotonic: no reorgs (same as respondHeadUpdate) - or { block.hash == ns.disk.head, block.height > ns.disk.headHeight }, - rethStates' = rethStates.set(node, { - disk: { - chain: ns.disk.chain.put(block.height, block), - head: block.hash, - headHeight: block.height, - }, - mem: { - phase: Ready, - validatedBlocks: ns.mem.validatedBlocks.union(Set(block.hash)), - pendingBuild: None, - }, - }), - requestHistory' = requestHistory.set(node, - requestHistory.get(node).append(npReq).append(fcuReq) - ), - engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(fcuReq) }), - // Increment counter (consistent with respondNewPayload) - nextId' = nextId + 1, - } - } // --- rethUnchanged --- // Passthrough: no Engine API activity this step. From a4c76652caa16b9b29f64a5bf11a5fcc7e2509ea Mon Sep 17 00:00:00 2001 From: mpoke Date: Fri, 6 Mar 2026 17:59:43 +0100 Subject: [PATCH 13/20] clarify contract structure --- specs/channel_api_contract.qnt | 56 +++++++++++++++++++++------------- specs/engine_api_contract.qnt | 11 ++++--- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 850f4aa3..7c6066a8 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -9,10 +9,10 @@ // Models what the Malachite team would publish for applications to consume. // // This contract defines: -// 1. The request types for the Channel API -// 2. Safety guarantees (agreement, validity) -// 3. Ordering guarantees (declarative properties over request histories) -// 4. Assumptions (what the application must do for guarantees to hold) +// 1. The request/response types for the Channel API +// 2. Component guarantees (Malachite → requests): safety + ordering +// 3. Application guarantees (Emerald → responses): informal, to be formalized +// 4. Environment assumptions // // Both safety and ordering properties are checked as invariants on any // conforming generator (e.g., channel_api_generator.qnt). The generator @@ -148,8 +148,11 @@ module channel_api_contract { } // =========================================================================== - // SAFETY PROPERTIES + // COMPONENT GUARANTEES: SAFETY // =========================================================================== + // + // Properties on the requests Malachite sends. These are guarantees that + // Malachite provides to any application consuming the Channel API. // Agreement: For any two Decided requests across all nodes, if they are for // the same height, the decided proposals must be identical. @@ -247,13 +250,14 @@ module channel_api_contract { } // =========================================================================== - // ORDERING PROPERTIES + // COMPONENT GUARANTEES: ORDERING // =========================================================================== // - // These properties constrain the order in which Channel API requests are - // delivered to each node. They are expressed declaratively over per-node - // request histories, making them readable and auditable without understanding - // any generator's internal state machine. + // Properties on the order in which Malachite delivers Channel API requests + // to each node. These are guarantees that Malachite provides about request + // sequencing. Expressed declaratively over per-node request histories, + // making them readable and auditable without understanding any generator's + // internal state machine. // // Request histories contain only current-session requests (cleared on fault). // This simplifies all fold-based properties — no session boundary logic @@ -744,10 +748,14 @@ module channel_api_contract { } // =========================================================================== - // ASSUMPTIONS (what the application must do) + // APPLICATION GUARANTEES (Emerald → responses) // =========================================================================== // - // Stated informally. These constrain the application's behavior. + // Obligations on the responses Emerald sends back to Malachite. These are + // predominantly liveness obligations ("the application eventually responds + // with a correct value") with some safety mixed in (e.g., #3 requires + // response fields match the request). Stated informally — to be formalized + // as checkable properties in future work. // // 1. On ConsensusReady: the application MUST reply with a starting height // and validator set. @@ -768,22 +776,28 @@ module channel_api_contract { // // 6. On ProcessSyncedValue: the application MUST reply with the decoded // value, or None. + + // =========================================================================== + // ENVIRONMENT ASSUMPTIONS + // =========================================================================== + // + // External conditions required for both component and application + // guarantees to hold. Not obligations of either side. // - // 7. Environment: at most f validators are faulty, where n >= 3f+1. + // 7. At most f validators are faulty, where n >= 3f+1. // - // 8. Environment: the network eventually delivers messages between - // correct validators. + // 8. The network eventually delivers messages between correct validators. // - // 9. Voting power: all validators have equal voting power. The quorum - // threshold (strictly more than 2/3 of node count) assumes this. - // With non-uniform voting power, quorumDecision would need the - // validator set's total voting power instead of nNodes. + // 9. All validators have equal voting power. The quorum threshold + // (strictly more than 2/3 of node count) assumes this. With + // non-uniform voting power, quorumDecision would need the validator + // set's total voting power instead of nNodes. // =========================================================================== - // LIVENESS GUARANTEES (semi-formal) + // COMPONENT GUARANTEES: LIVENESS (semi-formal) // =========================================================================== // - // Under the assumptions above: + // Under the environment assumptions above: // // - For every height h, eventually Decided(h) is sent to all correct nodes. // diff --git a/specs/engine_api_contract.qnt b/specs/engine_api_contract.qnt index b1eb6e51..3e254e3b 100644 --- a/specs/engine_api_contract.qnt +++ b/specs/engine_api_contract.qnt @@ -9,9 +9,10 @@ // Models what the Reth team would publish for Emerald to consume. // // This contract defines: -// 1. The request types for the Engine API -// 2. Response correctness guarantees (what Reth guarantees) -// 3. Request ordering constraints (what Emerald must do) +// 1. The request/response types for the Engine API +// 2. Component guarantees (Reth → responses): response correctness +// 3. Application guarantees (Emerald → requests): request ordering +// 4. Phase 1 constraints // // Key structural difference from Channel API: // - Channel API: Malachite sends requests to Emerald (Emerald responds) @@ -147,7 +148,7 @@ module engine_api_contract { } // =========================================================================== - // RESPONSE CORRECTNESS PROPERTIES (Reth guarantees) + // COMPONENT GUARANTEES: RESPONSE CORRECTNESS // =========================================================================== // validationStability: Once newPayload(block) returns Valid, subsequent @@ -350,7 +351,7 @@ module engine_api_contract { } // =========================================================================== - // REQUEST ORDERING PROPERTIES (Emerald obligations) + // APPLICATION GUARANTEES: REQUEST ORDERING // =========================================================================== // buildLifecycle: getPayload(id) must follow a forkchoiceUpdated that From fe170035c91c79f7ed7ea8a0cf4c2fdf2d29d49e Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 9 Mar 2026 10:49:54 +0100 Subject: [PATCH 14/20] add channel api app guarantees example --- specs/channel_api_contract.qnt | 37 ++++++++++++++++++--- specs/channel_api_generator.qnt | 5 ++- specs/channel_api_generator_test.qnt | 1 + specs/emerald_with_both_generators_test.qnt | 9 +++++ specs/emerald_with_generator_test.qnt | 9 +++++ 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 7c6066a8..6ab33fd6 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -11,7 +11,7 @@ // This contract defines: // 1. The request/response types for the Channel API // 2. Component guarantees (Malachite → requests): safety + ordering -// 3. Application guarantees (Emerald → responses): informal, to be formalized +// 3. Application guarantees (Emerald → responses): consensusReadyResponse (formal); rest informal // 4. Environment assumptions // // Both safety and ordering properties are checked as invariants on any @@ -64,7 +64,7 @@ module channel_api_contract { // They are node-level events handled by clearing request histories. // See faults.qnt for the FaultEvent type. type ChannelRequest = - | ReqConsensusReady + | ReqConsensusReady({ respStartHeight: Height }) | ReqStartedRound({ height: Height, round: Round, proposer: Node }) | ReqGetValue({ height: Height, round: Round }) | ReqReceivedProposal({ proposal: Proposal }) @@ -78,7 +78,7 @@ module channel_api_contract { /// Extract the height from a request, if it has one. pure def requestHeight(e: ChannelRequest): Option[Height] = match e { - | ReqConsensusReady => None + | ReqConsensusReady(_) => None | ReqStartedRound(r) => Some(r.height) | ReqGetValue(r) => Some(r.height) | ReqReceivedProposal(r) => Some(r.proposal.height) @@ -95,7 +95,7 @@ module channel_api_contract { /// - ReqGetDecidedValue: intentionally queries past heights /// - ReqReceivedProposal: can arrive for future heights (buffered as pending) pure def isProgressRequest(e: ChannelRequest): bool = match e { - | ReqConsensusReady => false + | ReqConsensusReady(_) => false | ReqGetDecidedValue(_) => false | ReqReceivedProposal(_) => false | _ => true @@ -302,7 +302,7 @@ module channel_api_contract { hist.foldl({ isFirst: true, ok: true }, (acc, e) => if (not(acc.ok)) acc else match e { - | ReqConsensusReady => + | ReqConsensusReady(_) => if (not(acc.isFirst)) { isFirst: false, ok: false } else { isFirst: false, ok: true } | _ => if (acc.isFirst) { isFirst: false, ok: false } else acc @@ -777,6 +777,33 @@ module channel_api_contract { // 6. On ProcessSyncedValue: the application MUST reply with the decoded // value, or None. + // --- Formal application safety properties --- + + // consensusReadyResponse: The application's reply to ConsensusReady has + // a starting height >= 1. + // + // Consensus starts at height 1 or higher. Height 0 is never a valid + // starting point. The generator enforces this as a guard on + // sendConsensusReady; this property makes it an explicit application + // guarantee checkable independently of any generator. + // + // Source: Malachite start_height.rs — start_height is called with the + // height returned by the application. Consensus rejects height 0. + pure def consensusReadyResponse(s: ChannelState): bool = + s.mem.request_history.keys().forall(node => + s.mem.request_history.get(node).foldl(true, (ok, e) => + ok and match e { + | ReqConsensusReady(cr) => cr.respStartHeight >= 1 + | _ => true + } + ) + ) + + // Combined application safety properties + pure def applicationSafety(s: ChannelState): bool = and { + consensusReadyResponse(s), + } + // =========================================================================== // ENVIRONMENT ASSUMPTIONS // =========================================================================== diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 688eafc0..957a0d49 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -195,7 +195,7 @@ module channel_api_generator { // Contract: heightsPositive requires all request heights >= 1. // This guard ensures the starting height satisfies that property. replyStartHeight >= 1, - val req = ReqConsensusReady + val req = ReqConsensusReady({ respStartHeight: replyStartHeight }) all { nodeStates' = nodeStates.set(node, { ...ns, @@ -616,6 +616,9 @@ module channel_api_generator { // Ordering invariants from the contract val orderingInv = ordering(channelState) + // Application safety invariants from the contract + val applicationSafetyInv = applicationSafety(channelState) + // Full contract (safety + ordering) val contractInv = contract(channelState, NODES.length()) diff --git a/specs/channel_api_generator_test.qnt b/specs/channel_api_generator_test.qnt index e188b441..1bc742e1 100644 --- a/specs/channel_api_generator_test.qnt +++ b/specs/channel_api_generator_test.qnt @@ -24,4 +24,5 @@ module channel_api_generator_test { action init = gen::init action step = gen::step val contractInv = gen::contractInv + val applicationSafetyInv = gen::applicationSafetyInv } diff --git a/specs/emerald_with_both_generators_test.qnt b/specs/emerald_with_both_generators_test.qnt index 956cb185..5e8b7bd0 100644 --- a/specs/emerald_with_both_generators_test.qnt +++ b/specs/emerald_with_both_generators_test.qnt @@ -6,5 +6,14 @@ // 4 nodes: allows progress with one crashed node (3/4 > 2/3 quorum). module emerald_with_both_generators_test { + import rareSpells.* from "spells/rareSpells" import emerald_with_both_generators(NODES = List("node1", "node2", "node3", "node4")).* from "emerald_with_both_generators" + + // Liveness: every node eventually responds to ConsensusReady and starts + // consensus. Checked as bounded liveness over finite traces — semi-formal. + // Requires fair scheduling (the simulator's oneOf provides probabilistic + // fairness). Full liveness proof would require export to TLA+. + temporal allNodesStartConsensus = NODES.toSet().forall(node => + eventually(emeraldState.get(node).mem.phase != Uninitialized) + ) } diff --git a/specs/emerald_with_generator_test.qnt b/specs/emerald_with_generator_test.qnt index 3f519e3e..15622c00 100644 --- a/specs/emerald_with_generator_test.qnt +++ b/specs/emerald_with_generator_test.qnt @@ -6,5 +6,14 @@ // 4 nodes: allows progress with one crashed node (3/4 > 2/3 quorum). module emerald_with_generator_test { + import rareSpells.* from "spells/rareSpells" import emerald_with_generator(NODES = List("node1", "node2", "node3", "node4")).* from "emerald_with_generator" + + // Liveness: every node eventually responds to ConsensusReady and starts + // consensus. Checked as bounded liveness over finite traces — semi-formal. + // Requires fair scheduling (the simulator's oneOf provides probabilistic + // fairness). Full liveness proof would require export to TLA+. + temporal allNodesStartConsensus = NODES.toSet().forall(node => + eventually(emeraldState.get(node).mem.phase != Uninitialized) + ) } From b14637fc4f708210da0acd3812bd7043048c0c7d Mon Sep 17 00:00:00 2001 From: mpoke Date: Mon, 9 Mar 2026 12:15:58 +0100 Subject: [PATCH 15/20] add structured annotations to contracts and generators --- specs/channel_api_contract.qnt | 60 +++++++++++++++++++++++++ specs/channel_api_generator.qnt | 80 ++++++++++++++++++++++----------- specs/engine_api_contract.qnt | 21 +++++++++ 3 files changed, 134 insertions(+), 27 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 6ab33fd6..7d8e5249 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -154,6 +154,9 @@ module channel_api_contract { // Properties on the requests Malachite sends. These are guarantees that // Malachite provides to any application consuming the Channel API. + /// @guarantor component + /// @category safety + /// @scope global // Agreement: For any two Decided requests across all nodes, if they are for // the same height, the decided proposals must be identical. // @@ -184,6 +187,9 @@ module channel_api_contract { decidedByHeight.keys().forall(h => decidedByHeight.get(h).size() <= 1) } + /// @guarantor component + /// @category safety + /// @scope global // Validity: Every decided proposal was previously proposed by some node // via GetValue. // @@ -194,6 +200,9 @@ module channel_api_contract { s.disk.decisions.get(h).in(s.disk.all_proposals) ) + /// @guarantor component + /// @category safety + /// @scope global // Decisions contiguous: Decided heights have no gaps. If height h is // decided, then all heights 1..h-1 are also decided. // @@ -209,6 +218,9 @@ module channel_api_contract { h == 1 or s.disk.decisions.has(h - 1) ) + /// @guarantor component + /// @category safety + /// @scope global // quorumDecision: Every decided height has proposal support from strictly // more than 2/3 of the network. // @@ -269,6 +281,9 @@ module channel_api_contract { // // Source: derived from driver.qnt, consensus.qnt, and msgs.rs documentation. + /// @guarantor component + /// @category ordering + /// @scope per-node // heightsPositive: All request heights are >= 1. // // Consensus starts at height 1 (or higher after restart). Height 0 is @@ -287,6 +302,9 @@ module channel_api_contract { ) ) + /// @guarantor component + /// @category ordering + /// @scope per-node // consensusReadyFirst: ConsensusReady is the first request in the history, // and it appears at most once per session. // @@ -310,6 +328,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // getValueAfterStartedRound: GetValue(h, r) on node N is preceded by // StartedRound(h, r, proposer=N) for the same node. The node receiving // GetValue must have been declared as the proposer for that round. @@ -338,6 +359,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope global // getValueUnique: GetValue(h, r) is sent at most once globally — to at // most one node, at most once per node. // @@ -368,6 +392,9 @@ module channel_api_contract { counts.keys().forall(k => counts.get(k) <= 1) } + /// @guarantor component + /// @category ordering + /// @scope per-node // heightMonotonic: Heights are non-decreasing in a node's consensus progress // requests. // @@ -395,6 +422,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // decidedIsFinal: After Decided(h), all subsequent consensus progress requests // for the same node have height exactly h+1. // @@ -432,6 +462,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // heightAdvanceRequiresDecision: A node's consensus height only advances // after a decision at the previous height. // @@ -483,6 +516,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // receivedProposalNotToProposer: A node does not receive its own proposal // via ReceivedProposal. // @@ -502,6 +538,9 @@ module channel_api_contract { ) ) + /// @guarantor component + /// @category ordering + /// @scope global // syncedValueIsDecided: ProcessSyncedValue carries a proposal that was // decided at that height. // @@ -524,6 +563,9 @@ module channel_api_contract { ) ) + /// @guarantor component + /// @category ordering + /// @scope per-node // syncRequiresStartedRound: ProcessSyncedValue(h) requires a prior // StartedRound(h, _) at the same height. Malachite always enters a round // (via start_height → StartedRound) before sync can deliver values for @@ -548,6 +590,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // syncIsIrrevocable: After ProcessSyncedValue(h), no StartedRound or // GetValue requests can occur at the same height h. Once Malachite enters // the sync path for a height, it stays in sync until deciding — it does @@ -580,6 +625,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // roundsConsecutiveWithinHeight: Within the same height, StartedRound // requests have consecutive rounds (exactly +1), and the first round at // each height is 0. @@ -616,6 +664,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope per-node // decidedRequiresDeliveredProposal: Before Decided(p), Malachite must // have delivered p to the node. The delivery path determines whether // StartedRound is also required: @@ -675,6 +726,9 @@ module channel_api_contract { ).ok ) + /// @guarantor component + /// @category ordering + /// @scope global // receivedProposalExists: Every ReceivedProposal request references a // proposal that was previously created via GetValue. // @@ -694,6 +748,9 @@ module channel_api_contract { ) ) + /// @guarantor component + /// @category ordering + /// @scope global // proposerConsistency: For each (height, round), all StartedRound requests // across all nodes declare the same proposer. // @@ -779,6 +836,9 @@ module channel_api_contract { // --- Formal application safety properties --- + /// @guarantor application + /// @category safety + /// @scope per-node // consensusReadyResponse: The application's reply to ConsensusReady has // a starting height >= 1. // diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 957a0d49..db2c90a9 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -183,6 +183,17 @@ module channel_api_generator { // ACTIONS: Channel API messages from Malachite to the application // =========================================================================== + // Implementation details vs contract properties: + // Guards and behaviors in these actions fall into four categories: + // + // 1. CONTRACT ENFORCEMENT: directly enforces a named contract property + // 2. IMPLEMENTATION DETAILS: internal state machine, not observable by contract + // 3. OPTIMIZATIONS: search space bounds, not required by contract + // 4. ASSUMPTIONS: application guarantee constraints on nondeterministic inputs + // + // Inline comments below mark guards with [CONTRACT], [IMPL], [OPT], or + // [ASSUMPTION] to clarify their purpose. + // --- ConsensusReady --- // Malachite has initialized and is ready. Sent once per node. // The application replies with a starting height (replyStartHeight). @@ -191,9 +202,9 @@ module channel_api_generator { action sendConsensusReady(node: Node, replyStartHeight: Height): bool = { val ns = nodeStates.get(node) all { + // [IMPL] phase progression: must be Unstarted before ConsensusReady ns.mem.phase == Unstarted, - // Contract: heightsPositive requires all request heights >= 1. - // This guard ensures the starting height satisfies that property. + // [CONTRACT] heightsPositive + consensusReadyResponse: all request heights >= 1 replyStartHeight >= 1, val req = ReqConsensusReady({ respStartHeight: replyStartHeight }) all { @@ -221,16 +232,18 @@ module channel_api_generator { action sendStartedRound(node: Node): bool = { val ns = nodeStates.get(node) val h = ns.mem.height - // If the node already has proposals for this height (received at a - // prior height and buffered as pending), count it as support for - // each such proposal now that the node is at this height. + // [CONTRACT] quorumDecision: retroactive support — if the node already has + // proposals for this height (received at a prior height as pending), count + // it as support now that the node is at this height. val pendingAtHeight = ns.mem.deliveredProposals.filter(p => p.height == h) val updatedSupport = pendingAtHeight.fold(proposalSupport, (acc, p) => val existing = if (acc.has(p)) acc.get(p) else Set() acc.put(p, existing.union(Set(node))) ) all { + // [IMPL] phase progression: must be Started (after ConsensusReady or Decided) ns.mem.phase == Started, + // [OPT] search space bound: limits trace exploration ns.mem.height <= MAX_HEIGHT, val proposer = proposer_for(ns.mem.height, ns.mem.round) val req = ReqStartedRound({ @@ -265,12 +278,14 @@ module channel_api_generator { action sendGetValue(node: Node, replyProposal: Proposal): bool = { val ns = nodeStates.get(node) all { + // [IMPL] phase progression: must be InRound (after StartedRound) ns.mem.phase == InRound, + // [CONTRACT] getValueAfterStartedRound: only the proposer receives GetValue node == proposer_for(ns.mem.height, ns.mem.round), + // [CONTRACT] getValueUnique: at most once per (height, round) not(ns.mem.getValueSent.contains((ns.mem.height, ns.mem.round))), - // Assumption (not a Malachite guarantee): the application's reply matches - // the current (height, round, proposer). Documented as assumption #3 in the - // contract. The payload is the application's choice — not constrained here. + // [ASSUMPTION] application guarantee #3: reply matches current (height, round, proposer). + // The payload is the application's choice — not constrained here. replyProposal.height == ns.mem.height, replyProposal.round == ns.mem.round, replyProposal.proposer == node, @@ -278,6 +293,7 @@ module channel_api_generator { height: ns.mem.height, round: ns.mem.round, }) + // [CONTRACT] quorumDecision: proposer supports their own proposal val existing = if (proposalSupport.has(replyProposal)) proposalSupport.get(replyProposal) else Set() all { proposals' = proposals.union(Set(replyProposal)), @@ -310,16 +326,18 @@ module channel_api_generator { action sendReceivedProposal(node: Node, proposal: Proposal): bool = { val ns = nodeStates.get(node) all { + // [IMPL] phase progression: must have started (after ConsensusReady) ns.mem.phase != Unstarted, + // [CONTRACT] receivedProposalExists: proposal was created via GetValue proposal.in(proposals), - proposal.proposer != node, // Nodes don't receive their own proposals - // Optimization: real network can deliver stale proposals (Emerald drops them). - // Not enforced by the contract — restricts traces to reduce state space. + // [CONTRACT] receivedProposalNotToProposer: nodes don't receive their own proposals + proposal.proposer != node, + // [OPT] stale proposal filtering: real network can deliver stale proposals + // (Emerald drops them). Not enforced by the contract. proposal.height >= ns.mem.height, val req = ReqReceivedProposal({ proposal: proposal }) - // Only count support when the node is at the proposal's height. - // Future-height proposals are buffered as pending — the node hasn't - // participated in consensus at that height yet. + // [CONTRACT] quorumDecision: only count support when the node is at the + // proposal's height. Future-height proposals are pending — not voted on yet. val atCurrentHeight = proposal.height == ns.mem.height val existing = if (proposalSupport.has(proposal)) proposalSupport.get(proposal) else Set() all { @@ -356,23 +374,24 @@ module channel_api_generator { action sendDecided(node: Node, proposal: Proposal): bool = { val ns = nodeStates.get(node) all { + // [IMPL] phase progression: must be InRound or Syncing or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, + // [IMPL] height match: decision must be for the current height proposal.height == ns.mem.height, + // [CONTRACT] validity: decided proposal must exist (was created via GetValue) proposal.in(proposals), - // Malachite must have delivered the proposal to this node + // [CONTRACT] decidedRequiresDeliveredProposal: Malachite delivered the proposal ns.mem.deliveredProposals.contains(proposal), - // Optimization: in the normal (non-sync) path, the contract's - // decidedRequiresDeliveredProposal + roundsConsecutiveWithinHeight - // already constrain this. This guard further restricts the generator - // to avoid producing traces where a decision references a future round. + // [OPT] future round filtering: restricts generator to avoid decisions + // referencing a future round (contract's roundsConsecutiveWithinHeight + // already constrains this in the normal path) proposal.round <= ns.mem.round, - // Agreement: if already decided for this height, must be the same + // [CONTRACT] agreement: if already decided for this height, must be the same not(decisions.has(ns.mem.height)) or decisions.get(ns.mem.height) == proposal, - // Not already decided at this node for this height + // [IMPL] prevent duplicate: not already decided at this node for this height ns.disk.maxDecided < ns.mem.height, - // Quorum: strictly more than 2/3 of nodes must have received - // this specific proposal before any node can decide on it. - // Assumes equal voting power — uses node count as threshold. + // [CONTRACT] quorumDecision: strictly more than 2/3 of nodes must have + // received this specific proposal before any node can decide on it proposalSupport.has(proposal), proposalSupport.get(proposal).size() * 3 > NODES.length() * 2, // Record the decision @@ -401,8 +420,11 @@ module channel_api_generator { action sendStartedRoundAfterTimeout(node: Node): bool = { val ns = nodeStates.get(node) all { + // [IMPL] phase progression: must be InRound (timeout during a round) ns.mem.phase == InRound, + // [OPT] search space bound: limits round exploration ns.mem.round < MAX_ROUND, + // [OPT] search space bound: limits height exploration ns.mem.height <= MAX_HEIGHT, val newRound = ns.mem.round + 1 val proposer = proposer_for(ns.mem.height, newRound) @@ -435,8 +457,11 @@ module channel_api_generator { action sendProcessSyncedValue(node: Node): bool = { val ns = nodeStates.get(node) all { + // [IMPL] phase progression: must be InRound or Syncing or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, + // [CONTRACT] syncedValueIsDecided: synced value must have been decided decisions.has(ns.mem.height), + // [IMPL] prevent duplicate: not already decided at this node for this height ns.disk.maxDecided < ns.mem.height, val proposal = decisions.get(ns.mem.height) val req = ReqProcessSyncedValue({ proposal: proposal }) @@ -468,10 +493,9 @@ module channel_api_generator { action sendGetDecidedValue(node: Node, height: Height): bool = { val ns = nodeStates.get(node) all { - // Optimization: real Malachite can query any height — the app returns - // None for unavailable heights. These guards restrict traces to reduce - // state space; not enforced by the contract. + // [OPT] heights start at 1: real Malachite can query any height height >= 1, + // [OPT] only query past heights: restricts traces to reduce state space height < ns.mem.height, val req = ReqGetDecidedValue({ height: height }) all { @@ -500,6 +524,7 @@ module channel_api_generator { action nodeCrash(node: Node): bool = { val ns = nodeStates.get(node) all { + // [IMPL] must be running: can't crash a node that hasn't started ns.mem.phase != Unstarted, nodeStates' = nodeStates.set(node, initGenNode), requestHistory' = requestHistory.set(node, []), @@ -518,6 +543,7 @@ module channel_api_generator { action nodeRestart(node: Node): bool = { val ns = nodeStates.get(node) all { + // [IMPL] must be running: can't restart a node that hasn't started ns.mem.phase != Unstarted, nodeStates' = nodeStates.set(node, { disk: ns.disk, mem: initGenMem }), requestHistory' = requestHistory.set(node, []), diff --git a/specs/engine_api_contract.qnt b/specs/engine_api_contract.qnt index 3e254e3b..43aaf48b 100644 --- a/specs/engine_api_contract.qnt +++ b/specs/engine_api_contract.qnt @@ -151,6 +151,9 @@ module engine_api_contract { // COMPONENT GUARANTEES: RESPONSE CORRECTNESS // =========================================================================== + /// @guarantor component + /// @category safety + /// @scope per-node // validationStability: Once newPayload(block) returns Valid, subsequent // calls for the same block hash never return Invalid. // @@ -178,6 +181,9 @@ module engine_api_contract { ).ok ) + /// @guarantor component + /// @category safety + /// @scope per-node // buildIntegrity: getPayload(id) returns a block whose parentHash matches // the head from the forkchoiceUpdated that produced that payloadId. // @@ -210,6 +216,9 @@ module engine_api_contract { ).ok ) + /// @guarantor component + /// @category safety + /// @scope per-node // headProgression: After forkchoiceUpdated(hash) returns Valid, the // canonical head is updated to that hash. // @@ -243,6 +252,9 @@ module engine_api_contract { } ) + /// @guarantor component + /// @category safety + /// @scope per-node // validBeforeHead: forkchoiceUpdated(hash) returning Valid requires that // the block was previously known — either via newPayload returning Valid, // getPayload returning it (built by Reth), or already in the chain. @@ -277,6 +289,9 @@ module engine_api_contract { ).ok ) + /// @guarantor component + /// @category safety + /// @scope per-node // chainContinuity: Blocks in the canonical chain form a linked list // via parentHash. // @@ -296,6 +311,9 @@ module engine_api_contract { // PHASE 1 CONSTRAINTS (to be relaxed in Phase 2) // =========================================================================== + /// @guarantor component + /// @category phase1 + /// @scope per-node // headMonotonic: The canonical head height never decreases (no reorgs). // // Phase 1 constraint: Once the head advances to height h, it never moves @@ -354,6 +372,9 @@ module engine_api_contract { // APPLICATION GUARANTEES: REQUEST ORDERING // =========================================================================== + /// @guarantor application + /// @category ordering + /// @scope per-node // buildLifecycle: getPayload(id) must follow a forkchoiceUpdated that // returned that id. Each payloadId is consumed at most once. // From 6f27376c398daa6f362e8366aaec628c7ed14b46 Mon Sep 17 00:00:00 2001 From: mpoke Date: Tue, 10 Mar 2026 19:58:32 +0100 Subject: [PATCH 16/20] add witnesses to emerald_with_both_generators --- specs/canDecideTwoHeights_debug_report.md | 114 +++++++ ...emerald_with_both_generators_witnesses.qnt | 304 ++++++++++++++++++ 2 files changed, 418 insertions(+) create mode 100644 specs/canDecideTwoHeights_debug_report.md create mode 100644 specs/emerald_with_both_generators_witnesses.qnt diff --git a/specs/canDecideTwoHeights_debug_report.md b/specs/canDecideTwoHeights_debug_report.md new file mode 100644 index 00000000..dc3e25da --- /dev/null +++ b/specs/canDecideTwoHeights_debug_report.md @@ -0,0 +1,114 @@ +# Witness Debug Report: `canDecideTwoHeights` + +**Spec:** `emerald/specs/emerald_with_both_generators_witnesses.qnt` +**Date:** 2026-03-10 +**Result:** Witness not violated (scenario not reached by random simulation) + +--- + +## Goal Analysis + +**Witness Definition:** +```quint +val canDecideTwoHeights: bool = + NODES.toSet().forall(n => emeraldState.get(n).disk.last_decided_height < 2) +``` + +**Target Condition:** Some node with `last_decided_height >= 2` + +**Required Path:** +``` +init +→ height-1 full pipeline × quorum (3/4 nodes) +→ sendDecided(h=1) × quorum → FinalizeDecided → consensus_height = 2 +→ StartedRound(h=2) → GetValue(node2) → newPayload × quorum +→ sendDecided(h=2) → FinalizeDecided → last_decided_height = 2 +``` + +--- + +## Static Analysis + +**Actions That Advance Goal:** + +- **`sendDecided`** (`channel_api_generator.qnt`) — advances height after quorum + - ✓ `phase == InRound or Syncing` + - ✓ `proposal.height == ns.mem.height` + - ✓ `deliveredProposals.contains(proposal)` + - ✓ `proposalSupport.size() * 3 > NODES.length() * 2` (requires ≥3/4 nodes) + +- **`sendGetValue`** (`channel_api_generator.qnt`) — creates the height-2 proposal + - ✓ `phase == InRound at height 2` + - ✗ `node == proposer_for(2, 0) == "node2"` ← **PROPOSER CONSTRAINT** + +No static impossibility: 4 nodes, quorum = 3 — mathematically satisfiable. + +--- + +## Dynamic Analysis + +**Search Progression:** + +| Pass | Samples | Steps | Result | +|------|---------|-------|--------| +| 1 | 5,000 | 500 | No violation | +| 2 | 6,000 | 600 | No violation | + +**Relaxation Test:** + +| | Condition | +|---|---| +| Original | `forall(n => last_decided_height < 2)` | +| Relaxed | `not(exists(n1, n2 \| n1≠n2, both last_decided_height >= 1))` | +| Result | **NOT VIOLATED** (2,000 samples × 200 steps) | + +**Insight:** The blocker is upstream — two nodes never both complete height-1, so the height-2 pipeline never starts. + +**Sample Traces:** One node finishes height-1 and advances, but no second node completes `FinalizeDecided(h=1)`. The Working-at-h=2 state IS reachable (GW3 violated), confirming the first node enters the height-2 round. But without the height-2 proposer (node2) completing height-1 first, no height-2 proposal is ever created. + +--- + +## Guard Analysis + +**Goal Variable:** `last_decided_height` (needs to reach >= 2) + +**Guard witnesses tested:** + +| Guard | Result | Meaning | +|-------|--------|---------| +| GW1: one node has `last_decided_height >= 1` and `consensus_height >= 2` | ✓ VIOLATED | One node CAN complete height-1 and advance | +| GW2: two distinct nodes both have `last_decided_height >= 1` | ✗ NOT VIOLATED | **Confirmed blocker** | +| GW3: any node in `Working` phase at `consensus_height == 2` | ✓ VIOLATED | StartedRound at height 2 is reachable | +| GW4: any node has `undecided_proposals != Set()` at `consensus_height == 2` | ✗ NOT VIOLATED | No height-2 proposal ever created | + +**Blocking Guards:** + +- Two distinct nodes both reaching `last_decided_height >= 1`: the height-2 quorum (3/4 nodes) requires all key nodes to complete height-1 first, but random simulation never drives enough nodes to completion. +- `undecided_proposals != Set()` at `consensus_height == 2`: no height-2 proposal is ever created because node2 (the only valid proposer at h=2, r=0) never advances past height-1 in observed traces. + +**Satisfiable Guards:** + +- ✓ One node reaches `last_decided_height >= 1` and `consensus_height >= 2` +- ✓ One node enters `Working` phase at `consensus_height == 2` + +--- + +## Diagnosis + +**Category:** PROBABILISTIC_TRAP + +Random scheduler converges on one node, starving the required proposer (node2) of height-1 completion. + +Once the first node finishes the height-1 Engine API pipeline (~20+ steps), the random simulator preferentially keeps advancing that node's height-2 pipeline. "node2" — the sole valid proposer at h=2, r=0 per `proposer_for` — is perpetually stuck at height-1, so its `sendGetValue(h=2)` never fires, and no height-2 proposal ever enters any node's `undecided_proposals`. + +**Key Evidence:** GW1 violated (one node completes h=1), GW2 NOT violated (two nodes never both complete h=1), GW3 violated (Working at h=2 reachable), GW4 NOT violated (no undecided proposal at h=2), relaxed witness also NOT violated — all consistent with proposer starvation, not a spec bug. + +--- + +## Where to Investigate + +1. **`channel_api_generator.qnt` `sendGetValue` guard** — `proposer_for(2,0)` is hardcoded to "node2"; confirm node2 must complete height-1 before this fires and that no other node can substitute at r=0. + +2. **`emerald_with_both_generators.qnt` `stepDecided` / `finalizeDecided`** — verify the full ~20-step Engine API chain for `FinalizeDecided` and that quorum (3/4 nodes) must all complete it before any second `sendDecided` fires. + +3. **Use a biased scheduler or manual ITF trace** to confirm reachability: fix scheduling so all 4 nodes complete `last_decided_height >= 1` before any node advances further, then let the simulator proceed to height-2. diff --git a/specs/emerald_with_both_generators_witnesses.qnt b/specs/emerald_with_both_generators_witnesses.qnt new file mode 100644 index 00000000..2d0e5eb6 --- /dev/null +++ b/specs/emerald_with_both_generators_witnesses.qnt @@ -0,0 +1,304 @@ +// -*- mode: Bluespec; -*- + +// ============================================================================= +// Witness invariants for emerald_with_both_generators (three-way composition) +// ============================================================================= +// +// IMPORTANT: These are REACHABILITY CHECKS via negated invariants. +// Random simulation tries to VIOLATE these invariants. +// +// Violation = scenario is reachable ✓ (spec is expressive) +// No violation = scenario may be unreachable (investigate spec constraints) +// +// Usage: +// quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ +// --main=emerald_with_both_generators_witnesses \ +// --invariant= \ +// --max-steps= --max-samples=1000 --backend=rust +// +// Expected: Invariant VIOLATION (proves scenario is reachable) +// +// Note on step counts: The three-way composition has a work-queue model +// (one Engine API call dispatched per step). End-to-end scenarios need +// longer traces than comparable two-boundary specs. Empirical minimums +// per witness are documented in each run command. +// +// ============================================================================= +// Witness Catalog (8 liveness witnesses) +// ============================================================================= +// +// Fast (20-50 steps) — reach reliably with random simulation: +// • canReachWorking - At least one node enters Working phase +// • canAdvanceRound - At least one node reaches consensus round >= 1 +// • canHaveUndecidedProposal - At least one node has an undecided proposal +// +// Medium (200 steps) — reachable but require longer traces: +// • canReachSyncing - At least one node enters Syncing (sync path) +// • canReachDecision - At least one node decides at height >= 1 +// • canCommitBlock - At least one node commits a block to disk +// +// Hard (high step counts) — require targeted simulation or relaxation: +// • canDecideTwoHeights - At least one node decides at height >= 2 +// • canHavePendingProposal - At least one node buffers a future-height proposal +// +// Configuration: 4 nodes (same as emerald_with_both_generators_test) +// - Allows progress with one crashed node (3/4 > 2/3 quorum) +// ============================================================================= + +module emerald_with_both_generators_witnesses { + import basicSpells.* from "spells/basicSpells" + import rareSpells.* from "spells/rareSpells" + import emerald_with_both_generators(NODES = List("node1", "node2", "node3", "node4")).* from "emerald_with_both_generators" + + // =========================================================================== + // FAST WITNESSES (20-50 steps) + // =========================================================================== + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canReachWorking + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node enters the Working phase + // Rationale: Verifies the ConsensusReady → StartedRound path works. + // The Working phase means Emerald received StartedRound and is actively + // participating in a consensus round. Required for GetValue and + // ReceivedProposal to be processed. + // + // EXPECTED: Invariant VIOLATION (proves Working phase is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canReachWorking \ + // --max-steps=20 --max-samples=1000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canReachWorking: bool = + NODES.toSet().forall(n => emeraldState.get(n).mem.phase != Working) + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canAdvanceRound + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node reaches consensus round >= 1 (round timeout fired) + // Rationale: Verifies the timeout-triggered round advancement path works. + // When a round times out without a decision, Malachite increments the + // round and sends StartedRound(h, r+1). Exercises sendStartedRoundAfterTimeout + // in the generator and the roundsConsecutiveWithinHeight contract property. + // + // EXPECTED: Invariant VIOLATION (proves round advancement is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canAdvanceRound \ + // --max-steps=30 --max-samples=1000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canAdvanceRound: bool = + NODES.toSet().forall(n => emeraldState.get(n).mem.consensus_round < 1) + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canHaveUndecidedProposal + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node has an undecided proposal in its local set + // Rationale: Verifies the proposal reception pipeline. A node marks a + // proposal as "undecided" when it has been received for the current + // height (via ReceivedProposal + Engine API validation, or GetValue as + // proposer) but the height has not yet been decided. This is the + // intermediate liveness state between proposal arrival and commitment. + // + // EXPECTED: Invariant VIOLATION (proves undecided proposal state is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canHaveUndecidedProposal \ + // --max-steps=30 --max-samples=1000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canHaveUndecidedProposal: bool = + NODES.toSet().forall(n => emeraldState.get(n).mem.undecided_proposals == Set()) + + // =========================================================================== + // MEDIUM WITNESSES (200 steps) + // =========================================================================== + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canReachSyncing + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node enters the Syncing phase (ProcessSyncedValue) + // Rationale: Verifies the sync catch-up path is reachable. A node enters + // Syncing when it falls behind and receives a synced decided value from + // another node instead of participating in normal round consensus. + // Exercises syncRequiresStartedRound and syncIsIrrevocable contract properties. + // + // EXPECTED: Invariant VIOLATION (proves Syncing phase is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canReachSyncing \ + // --max-steps=200 --max-samples=2000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canReachSyncing: bool = + NODES.toSet().forall(n => emeraldState.get(n).mem.phase != Syncing) + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canReachDecision + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node decides at height >= 1 + // Rationale: Verifies the full three-way pipeline works end-to-end: + // ConsensusReady → StartedRound → GetValue (Engine API build) → + // ReceivedProposal (Engine API newPayload) → Decided → + // [newPayload + headUpdate + FinalizeDecided]. + // The most fundamental liveness check for the composition. + // + // Note: needs ~200 steps because the work-queue dispatches one Engine API + // call per transition, so a single decision takes ~20+ transitions even + // on a direct path. The random simulator needs room to explore. + // + // EXPECTED: Invariant VIOLATION (proves decision is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canReachDecision \ + // --max-steps=200 --max-samples=2000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canReachDecision: bool = + NODES.toSet().forall(n => emeraldState.get(n).disk.last_decided_height < 1) + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canCommitBlock + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node has latest_block set (a block committed to disk) + // Rationale: Verifies the complete Engine API finalization pipeline: + // Decided → enqueue [CallNewPayload, CallHeadUpdate, FinalizeDecided] → + // stepAdvanceWork × 3 → latest_block persisted to EmeraldDiskState. + // latest_block != None means a Reth block has been fully committed, + // Reth's head updated, and Emerald's disk state reflects the decision. + // Stronger than canReachDecision: checks the full finalization completes. + // + // EXPECTED: Invariant VIOLATION (proves block commitment is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canCommitBlock \ + // --max-steps=200 --max-samples=1000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canCommitBlock: bool = + NODES.toSet().forall(n => + match emeraldState.get(n).disk.latest_block { + | Some(_) => false + | None => true + } + ) + + // =========================================================================== + // HARD WITNESSES (require targeted simulation or relaxation) + // =========================================================================== + // + // These witnesses are valid reachability checks but are rarely found by + // pure random simulation because they require long sequential pipelines + // at low probability. They document correct spec behavior but may need + // /verify:debug-witness or manual trace construction to confirm. + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canDecideTwoHeights + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node decides at height >= 2 + // Rationale: Verifies the protocol can progress through multiple consecutive + // heights. Checks that decided_proposals accumulates, consensus_height + // advances after each decision, and the block chain grows (each block's + // parentHash links to the previous committed block). + // + // Hard to reach: requires completing the entire height-1 decision pipeline + // for multiple nodes (quorum), then the full height-2 pipeline. Each + // height requires ~20+ transitions; with 4 nodes the state space is large. + // The /verify:debug-witness skill can help relax constraints to find a path. + // + // EXPECTED: Invariant VIOLATION (proves multi-height progress is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canDecideTwoHeights \ + // --max-steps=500 --max-samples=10000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canDecideTwoHeights: bool = + NODES.toSet().forall(n => emeraldState.get(n).disk.last_decided_height < 2) + + // ────────────────────────────────────────────────────────────────────────── + // Witness: canHavePendingProposal + // ────────────────────────────────────────────────────────────────────────── + // Goal: At least one node buffers a future-height pending proposal + // Rationale: Verifies the proposal buffering path. When a node receives + // ReceivedProposal for a height > consensus_height, it stores it as + // "pending". Pending proposals are promoted to undecided by + // handleStartedRound when the node advances to that height. + // Exercises the pending_proposals lifecycle in Emerald state. + // + // Hard to reach: requires one node to be ahead at height h+1 (created a + // proposal there via GetValue) while another node is still at height h. + // Random simulation rarely creates this asymmetry without biased scheduling. + // The /verify:debug-witness skill can help find a targeted trace. + // + // EXPECTED: Invariant VIOLATION (proves pending proposal buffering is reachable) + // + // Run: quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --invariant=canHavePendingProposal \ + // --max-steps=500 --max-samples=10000 --backend=rust + // ────────────────────────────────────────────────────────────────────────── + val canHavePendingProposal: bool = + NODES.toSet().forall(n => emeraldState.get(n).mem.pending_proposals == Set()) + + // =========================================================================== + // DEBUG ARTIFACTS (canDecideTwoHeights — kept as reference, do not run) + // =========================================================================== + // + // These were used during /verify:debug-witness analysis to pinpoint the + // blocker for canDecideTwoHeights. Kept as commented-out documentation. + // + // Findings summary: + // GW1 VIOLATED — one node CAN complete height-1 and advance to h=2 + // GW2 NOT VIOLATED — two nodes NEVER both complete height-1 (the blocker) + // GW3 VIOLATED — StartedRound at height 2 IS reachable + // GW4 NOT VIOLATED — no undecided proposal ever exists at height 2 + // + // Relaxed witness (= GW2) also NOT VIOLATED — confirms the blocker. + // + // Root cause: The random scheduler converges on one node finishing + // height-1 while the remaining nodes (including node2, the only valid + // proposer at h=2,r=0) never complete their height-1 pipelines. + // Without node2 deciding height-1, no quorum forms for height-2. + // This is a probabilistic trap, not a spec bug. + // + // To confirm reachability, use a biased/fair scheduler or manual trace. + // + // // GW1: Any node decides height 1 and advances (consensus_height >= 2) + // // Expected: VIOLATED — confirmed violated + // val witness_guard_1: bool = + // not(NODES.toSet().exists(n => + // emeraldState.get(n).disk.last_decided_height >= 1 and + // emeraldState.get(n).mem.consensus_height >= 2 + // )) + // + // // GW2 / canDecideTwoHeights_relaxed: Two different nodes both decide height 1 + // // Expected: VIOLATED — NOT VIOLATED (confirmed blocker) + // val witness_guard_2: bool = + // not(NODES.toSet().exists(n1 => + // NODES.toSet().exists(n2 => + // n1 != n2 and + // emeraldState.get(n1).disk.last_decided_height >= 1 and + // emeraldState.get(n2).disk.last_decided_height >= 1 + // ) + // )) + // + // // GW3: Any node in Working phase at consensus height 2 + // // Expected: VIOLATED — confirmed violated + // val witness_guard_3: bool = + // not(NODES.toSet().exists(n => + // emeraldState.get(n).mem.phase == Working and + // emeraldState.get(n).mem.consensus_height == 2 + // )) + // + // // GW4: Any node has undecided proposals at consensus height 2 + // // Expected: VIOLATED — NOT VIOLATED (pipeline stalls without quorum) + // val witness_guard_4: bool = + // not(NODES.toSet().exists(n => + // emeraldState.get(n).mem.consensus_height == 2 and + // emeraldState.get(n).mem.undecided_proposals != Set() + // )) + +} From ceef8fcaadfac6285848b10438a8d353e0148feb Mon Sep 17 00:00:00 2001 From: Marius Date: Wed, 11 Mar 2026 11:00:25 +0000 Subject: [PATCH 17/20] add biased step and debug report for canDecideTwoHeights witness - Add biasedStep action to witnesses module: restricts node selection to nodes with last_decided_height < 1 until all nodes complete height-1, correcting the probabilistic starvation that prevents uniform random simulation from finding the witness - Add allKnownProposals helper to derive proposal set from Emerald state, avoiding the need for gen:: which is not re-exported from the composition - Update canDecideTwoHeights_debug_report.md: correct diagnosis (uniform random walk starvation, not scheduler preference), add round-timeout analysis, add Biased Step section with confirmed violation result Co-Authored-By: Claude Sonnet 4.6 --- specs/canDecideTwoHeights_debug_report.md | 65 ++++++++++++++++--- ...emerald_with_both_generators_witnesses.qnt | 56 ++++++++++++++++ 2 files changed, 113 insertions(+), 8 deletions(-) diff --git a/specs/canDecideTwoHeights_debug_report.md b/specs/canDecideTwoHeights_debug_report.md index dc3e25da..ccd782c8 100644 --- a/specs/canDecideTwoHeights_debug_report.md +++ b/specs/canDecideTwoHeights_debug_report.md @@ -1,8 +1,8 @@ # Witness Debug Report: `canDecideTwoHeights` **Spec:** `emerald/specs/emerald_with_both_generators_witnesses.qnt` -**Date:** 2026-03-10 -**Result:** Witness not violated (scenario not reached by random simulation) +**Date:** 2026-03-11 +**Result:** Witness not violated by uniform random simulation; violated by biased step (scenario confirmed reachable) --- @@ -97,18 +97,67 @@ No static impossibility: 4 nodes, quorum = 3 — mathematically satisfiable. **Category:** PROBABILISTIC_TRAP -Random scheduler converges on one node, starving the required proposer (node2) of height-1 completion. +Only one node ever completes height-1 under random simulation; the remaining three are stranded at height-1, making the height-2 quorum structurally unachievable. -Once the first node finishes the height-1 Engine API pipeline (~20+ steps), the random simulator preferentially keeps advancing that node's height-2 pipeline. "node2" — the sole valid proposer at h=2, r=0 per `proposer_for` — is perpetually stuck at height-1, so its `sendGetValue(h=2)` never fires, and no height-2 proposal ever enters any node's `undecided_proposals`. +By the time the first node calls `sendDecided(h=1)`, the quorum guard is already satisfied (3 nodes supported the proposal), so `sendDecided(h=1)` is also enabled for the other three nodes. However, the random simulator picks uniformly across all enabled actions. Completing the remaining three `sendDecided(h=1)` calls — each followed by ~20 Engine API work steps — before making further progress on the height-2 pipeline is a specific ordering that occurs with very low probability. There is no explicit bias toward one node; the three remaining nodes are probabilistically starved in the uniform random walk. -**Key Evidence:** GW1 violated (one node completes h=1), GW2 NOT violated (two nodes never both complete h=1), GW3 violated (Working at h=2 reachable), GW4 NOT violated (no undecided proposal at h=2), relaxed witness also NOT violated — all consistent with proposer starvation, not a spec bug. +Round timeouts do not rescue the situation. `sendStartedRoundAfterTimeout` is a per-node action: it advances only the firing node's generator from `InRound(h=2, r=0)` to `InRound(h=2, r=1)`, where `proposer_for(2,1) = "node3"`. But node3's generator is still in `InRound(h=1)` — it never completed height-1. The `sendGetValue` guard requires `phase == InRound` at the target height, so node3 cannot act as proposer at height-2 regardless of how many rounds node1 advances through. The other potential proposers at higher rounds face the same constraint. + +The height-2 quorum guard (`proposalSupport.size() * 3 > NODES.length() * 2`, i.e. ≥3 nodes) is therefore unreachable: with only one node at height-2, at most one node can ever support a height-2 proposal. + +**Key Evidence:** GW1 violated (one node completes h=1 and advances), GW2 NOT violated (only one node ever completes h=1 — not two), GW3 violated (Working at h=2 reachable for that one node), GW4 NOT violated (no height-2 proposal is ever created), relaxed witness also NOT violated — all consistent with probabilistic starvation of height-1 completion for nodes 2–4, not a spec bug. + +--- + +## Biased Step + +The diagnosis was confirmed by implementing a biased step action in `emerald_with_both_generators_witnesses.qnt`. The biased step corrects the scheduler distribution by restricting node selection: while any node has `last_decided_height < 1`, only those behind nodes are eligible to act. Once all four nodes complete height-1, the step reverts to uniform random selection across all nodes. + +```quint +action biasedStep = { + val behindNodes = NODES.toSet().filter(n => + emeraldState.get(n).disk.last_decided_height < 1 + ) + val nodePool = if (behindNodes != Set()) behindNodes else NODES.toSet() + nondet node = nodePool.oneOf() + any { + stepConsensusReady(node), + stepStartedRound(node), + stepGetValue(node), + nondet proposal = allKnownProposals.oneOf() + stepReceivedProposal(node, proposal), + nondet proposal = allKnownProposals.oneOf() + stepDecided(node, proposal), + stepProcessSyncedValue(node), + stepAdvanceWork(node), + } +} +``` + +**Design notes:** +- `allKnownProposals` aggregates proposals from each node's `undecided_proposals ∪ pending_proposals ∪ decided_proposals`, avoiding the need for `gen::proposals` which is not re-exported from the composition module. +- `stepGetDecidedValue` is omitted — it requires `gen::MAX_HEIGHT` (also not re-exported) and is not on the critical path to height-2. +- Fault actions (`stepNodeCrash`, `stepNodeRestart`) are omitted — a crash resets `last_decided_height` to 0, re-adding the node to `behindNodes` and trapping the simulation before the all-complete condition is ever satisfied. + +**Result:** Invariant violated in 594ms (~99 traces/second, 200 samples × 500 steps). + +``` +quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + --main=emerald_with_both_generators_witnesses \ + --step=biasedStep \ + --invariant=canDecideTwoHeights \ + --max-steps=500 --max-samples=200 --backend=rust +# [violation] Found an issue (594ms at 99 traces/second). +``` + +This confirms `canDecideTwoHeights` is a valid reachability witness. The scenario is reachable; uniform random simulation simply cannot find it because it requires all four nodes to complete the ~20-step height-1 Engine API pipeline in a coordinated order before any node advances to height-2. --- ## Where to Investigate -1. **`channel_api_generator.qnt` `sendGetValue` guard** — `proposer_for(2,0)` is hardcoded to "node2"; confirm node2 must complete height-1 before this fires and that no other node can substitute at r=0. +1. **`channel_api_generator.qnt` `sendDecided` guard** — once the quorum for height-1 is met, `sendDecided(h=1)` is enabled for all four nodes simultaneously; confirm the ~20-step Engine API work chain that must complete per node before any can advance to height-2. -2. **`emerald_with_both_generators.qnt` `stepDecided` / `finalizeDecided`** — verify the full ~20-step Engine API chain for `FinalizeDecided` and that quorum (3/4 nodes) must all complete it before any second `sendDecided` fires. +2. **`channel_api_generator.qnt` `sendGetValue` / `sendStartedRoundAfterTimeout` guards** — `sendGetValue` requires `phase == InRound` at the target height; nodes still at height-1 cannot act as proposer at height-2 even if another node's timeout advances the round there. Confirm no path exists for a height-1 node to skip ahead. -3. **Use a biased scheduler or manual ITF trace** to confirm reachability: fix scheduling so all 4 nodes complete `last_decided_height >= 1` before any node advances further, then let the simulator proceed to height-2. +3. ~~**Use a biased scheduler or manual ITF trace** to confirm reachability: force all 4 nodes to complete `sendDecided(h=1)` (and their Engine API chains) before any node's height-2 pipeline begins, then let the simulator proceed to height-2.~~ **Resolved** — see Biased Step below. diff --git a/specs/emerald_with_both_generators_witnesses.qnt b/specs/emerald_with_both_generators_witnesses.qnt index 2d0e5eb6..531337cd 100644 --- a/specs/emerald_with_both_generators_witnesses.qnt +++ b/specs/emerald_with_both_generators_witnesses.qnt @@ -301,4 +301,60 @@ module emerald_with_both_generators_witnesses { // emeraldState.get(n).mem.undecided_proposals != Set() // )) + // =========================================================================== + // BIASED STEP (canDecideTwoHeights) + // =========================================================================== + // + // The random simulator cannot find canDecideTwoHeights because it + // probabilistically starves nodes 2–4 at height-1, preventing the height-2 + // quorum from ever forming. This biased step corrects the distribution by + // restricting node selection: while any node has last_decided_height < 1, + // only behind nodes are eligible. Once all four nodes complete height-1, + // the step reverts to uniform random selection. + // + // Fault actions (stepNodeCrash, stepNodeRestart) are intentionally excluded: + // a crash resets last_decided_height to 0, re-adding the node to behindNodes + // and preventing the all-complete precondition from ever being satisfied. + // + // Run: + // quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses \ + // --step=biasedStep \ + // --invariant=canDecideTwoHeights \ + // --max-steps=500 --max-samples=1000 --backend=rust + // + // Expected: Invariant VIOLATION (proves two-height progress is reachable) + // =========================================================================== + // All proposals that any node has ever seen (undecided, pending, or decided). + // These are a subset of gen::proposals — valid inputs to stepReceivedProposal + // and stepDecided — but accessible without going through gen::. + // stepGetDecidedValue is omitted (needs gen::MAX_HEIGHT; not on the critical + // path to height-2). + pure def allKnownProposals = + NODES.toSet().fold(Set(), (acc, n) => + acc + .union(emeraldState.get(n).mem.undecided_proposals) + .union(emeraldState.get(n).mem.pending_proposals) + .union(emeraldState.get(n).disk.decided_proposals) + ) + + action biasedStep = { + val behindNodes = NODES.toSet().filter(n => + emeraldState.get(n).disk.last_decided_height < 1 + ) + val nodePool = if (behindNodes != Set()) behindNodes else NODES.toSet() + nondet node = nodePool.oneOf() + any { + stepConsensusReady(node), + stepStartedRound(node), + stepGetValue(node), + nondet proposal = allKnownProposals.oneOf() + stepReceivedProposal(node, proposal), + nondet proposal = allKnownProposals.oneOf() + stepDecided(node, proposal), + stepProcessSyncedValue(node), + stepAdvanceWork(node), + } + } + } From 258b12f821e2040b86163c02555881e58623735d Mon Sep 17 00:00:00 2001 From: Marius Date: Wed, 11 Mar 2026 14:08:45 +0100 Subject: [PATCH 18/20] trace for canReachDecision --- specs/canReachDecision_trace.itf.json | 58358 ++++++++++++++++ specs/canReachDecision_trace.txt | 17249 +++++ specs/canReachDecision_trace_explanation.md | 148 + ...emerald_with_both_generators_witnesses.qnt | 44 + 4 files changed, 75799 insertions(+) create mode 100644 specs/canReachDecision_trace.itf.json create mode 100644 specs/canReachDecision_trace.txt create mode 100644 specs/canReachDecision_trace_explanation.md diff --git a/specs/canReachDecision_trace.itf.json b/specs/canReachDecision_trace.itf.json new file mode 100644 index 00000000..c3c2da57 --- /dev/null +++ b/specs/canReachDecision_trace.itf.json @@ -0,0 +1,58358 @@ +{ + "#meta": { + "format": "ITF", + "format-description": "https://apalache-mc.org/docs/adr/015adr-trace.html", + "source": "emerald_with_both_generators_witnesses.qnt", + "status": "violation", + "description": "Created by Quint on Wed Mar 11 2026 11:35:21 GMT+0000 (Coordinated Universal Time)", + "timestamp": 1773228921560 + }, + "vars": [ + "emerald_with_both_generators::gen::decisions", + "emerald_with_both_generators::gen::lastEntry", + "emerald_with_both_generators::gen::nodeStates", + "emerald_with_both_generators::gen::proposalSupport", + "emerald_with_both_generators::gen::proposals", + "emerald_with_both_generators::gen::requestHistory", + "emerald_with_both_generators::reth::engineLastTraceEntry", + "emerald_with_both_generators::reth::nextId", + "emerald_with_both_generators::reth::requestHistory", + "emerald_with_both_generators::reth::rethStates", + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState" + ], + "states": [ + { + "#meta": { + "index": 0 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 1 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 2 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 3 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 4 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 5 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 6 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 7 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 8 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 9 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 10 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 11 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 12 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 13 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 14 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 15 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 16 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 17 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 18 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 19 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqGetValue", + "value": { + "height": { + "#bigint": "1" + }, + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [ + { + "#tup": [ + { + "#bigint": "1" + }, + { + "#bigint": "0" + } + ] + } + ] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqGetValue", + "value": { + "height": { + "#bigint": "1" + }, + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallBuildRequest", + "value": { + "#tup": [] + } + } + }, + { + "tag": "EngineCall", + "value": { + "tag": "CallGetPayload", + "value": { + "#tup": [] + } + } + }, + { + "tag": "FinalizeGetValue", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 20 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 21 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 22 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 23 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 24 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 25 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 26 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 27 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 28 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 29 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 30 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 31 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 32 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 33 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 34 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 35 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 36 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 37 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 38 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 39 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 40 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 41 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 42 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 43 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 44 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 45 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 46 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 47 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 48 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "1" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 49 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 50 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 51 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 52 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 53 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 54 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 55 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Offline", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 56 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 57 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 58 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 59 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "1" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 60 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Crash", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "2" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 61 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "3" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 62 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "3" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 63 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "3" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + } + }, + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 64 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeReceivedProposal", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 65 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 66 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node3" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 67 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 68 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 69 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "FaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 70 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineFaultMsg", + "value": { + "tag": "Restart", + "value": { + "#tup": [] + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "EngineCall", + "value": { + "tag": "CallHeadUpdate", + "value": { + "headHash": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + } + } + }, + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 71 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node4" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 72 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 73 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "1" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [ + { + "tag": "FinalizeDecided", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + }, + { + "#meta": { + "index": 74 + }, + "emerald_with_both_generators::gen::decisions": { + "#map": [ + [ + { + "#bigint": "1" + }, + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + ] + }, + "emerald_with_both_generators::gen::lastEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "ChannelMsg", + "value": { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + "node": "node1" + } + }, + "emerald_with_both_generators::gen::nodeStates": { + "#map": [ + [ + "node1", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "InRound", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node2", + { + "disk": { + "maxDecided": { + "#bigint": "1" + } + }, + "mem": { + "deliveredProposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "2" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node3", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "0" + }, + "phase": { + "tag": "Unstarted", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ], + [ + "node4", + { + "disk": { + "maxDecided": { + "#bigint": "0" + } + }, + "mem": { + "deliveredProposals": { + "#set": [] + }, + "getValueSent": { + "#set": [] + }, + "height": { + "#bigint": "1" + }, + "phase": { + "tag": "Started", + "value": { + "#tup": [] + } + }, + "round": { + "#bigint": "0" + } + } + } + ] + ] + }, + "emerald_with_both_generators::gen::proposalSupport": { + "#map": [ + [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + }, + { + "#set": [ + "node1", + "node2", + "node3", + "node4" + ] + } + ] + ] + }, + "emerald_with_both_generators::gen::proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "emerald_with_both_generators::gen::requestHistory": { + "#map": [ + [ + "node1", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + ] + ], + [ + "node2", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + }, + { + "tag": "ReqStartedRound", + "value": { + "height": { + "#bigint": "1" + }, + "proposer": "node2", + "round": { + "#bigint": "1" + } + } + }, + { + "tag": "ReqReceivedProposal", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + }, + { + "tag": "ReqDecided", + "value": { + "proposal": { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [ + { + "tag": "ReqConsensusReady", + "value": { + "respStartHeight": { + "#bigint": "1" + } + } + } + ] + ] + ] + }, + "emerald_with_both_generators::reth::engineLastTraceEntry": { + "tag": "Some", + "value": { + "entry": { + "tag": "EngineMsg", + "value": { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + }, + "node": "node2" + } + }, + "emerald_with_both_generators::reth::nextId": { + "#bigint": "4" + }, + "emerald_with_both_generators::reth::requestHistory": { + "#map": [ + [ + "node1", + [] + ], + [ + "node2", + [ + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqNewPayload", + "value": { + "block": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + }, + { + "tag": "ReqForkchoiceUpdated", + "value": { + "building": false, + "headHash": { + "#bigint": "1001" + }, + "respPayloadId": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "respStatus": { + "tag": "Valid", + "value": { + "#tup": [] + } + } + } + } + ] + ], + [ + "node3", + [] + ], + [ + "node4", + [] + ] + ] + }, + "emerald_with_both_generators::reth::rethStates": { + "#map": [ + [ + "node1", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "1001" + }, + "headHeight": { + "#bigint": "1" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ], + [ + { + "#bigint": "1" + }, + { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "chain": { + "#map": [ + [ + { + "#bigint": "0" + }, + { + "hash": { + "#bigint": "0" + }, + "height": { + "#bigint": "0" + }, + "parentHash": { + "#bigint": "0" + } + } + ] + ] + }, + "head": { + "#bigint": "0" + }, + "headHeight": { + "#bigint": "0" + } + }, + "mem": { + "pendingBuild": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "validatedBlocks": { + "#set": [] + } + } + } + ] + ] + }, + "emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState": { + "#map": [ + [ + "node1", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Working", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node2", + { + "disk": { + "decided_proposals": { + "#set": [ + { + "height": { + "#bigint": "1" + }, + "payload": { + "#bigint": "100" + }, + "proposer": "node1", + "round": { + "#bigint": "0" + } + } + ] + }, + "last_decided_height": { + "#bigint": "1" + }, + "last_decided_payload": { + "tag": "Some", + "value": { + "#bigint": "100" + } + }, + "latest_block": { + "tag": "Some", + "value": { + "hash": { + "#bigint": "1001" + }, + "height": { + "#bigint": "1" + }, + "parentHash": { + "#bigint": "0" + } + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "2" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "1001" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [ + { + "#bigint": "1001" + } + ] + } + } + } + ], + [ + "node3", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "0" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Uninitialized", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ], + [ + "node4", + { + "disk": { + "decided_proposals": { + "#set": [] + }, + "last_decided_height": { + "#bigint": "0" + }, + "last_decided_payload": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "latest_block": { + "tag": "None", + "value": { + "#tup": [] + } + } + }, + "mem": { + "consensus_height": { + "#bigint": "1" + }, + "consensus_round": { + "#bigint": "0" + }, + "head_block_hash": { + "#bigint": "0" + }, + "pendingWork": [], + "pending_proposals": { + "#set": [] + }, + "phase": { + "tag": "Ready", + "value": { + "#tup": [] + } + }, + "undecided_proposals": { + "#set": [] + }, + "validated_cache": { + "#set": [] + } + } + } + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/specs/canReachDecision_trace.txt b/specs/canReachDecision_trace.txt new file mode 100644 index 00000000..268d73e4 --- /dev/null +++ b/specs/canReachDecision_trace.txt @@ -0,0 +1,17249 @@ +An example execution: + +[State 0] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: None, + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::engineLastTraceEntry: None, + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 1] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: None, + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 2] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: None, + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 3] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: None, + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 4] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: None, + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 5] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 6] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 7] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 8] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 9] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 10] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 11] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 12] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 13] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 14] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 15] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 16] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 17] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 18] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: Map(), + emerald_with_both_generators::gen::proposals: Set(), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 19] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqGetValue({ height: 1, round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set((1, 0)), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqGetValue({ height: 1, round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallBuildRequest), + EngineCall(CallGetPayload), + FinalizeGetValue({ + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 20] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 21] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node2", round: 1 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 22] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 23] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 24] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node2" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 25] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> [], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 26] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 27] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [], + "node3" -> [], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 28] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node3" -> [], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 29] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 30] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> Set("node1") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 31] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 32] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 33] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 34] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node2", round: 1 })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 35] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 36] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 37] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 38] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 39] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 40] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 41] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 42] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 43] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 44] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node3" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 45] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node4" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 46] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node4" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 47] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 48] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 1, + emerald_with_both_generators::reth::requestHistory: + Map("node1" -> [], "node2" -> [], "node3" -> [], "node4" -> []), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 49] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 50] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 51] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 52] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 53] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 54] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 55] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + })), + node: "node3" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Offline, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 56] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 57] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 58] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 59] +{ + emerald_with_both_generators::gen::decisions: Map(), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 1 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 60] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Crash), node: "node1" }), + emerald_with_both_generators::reth::nextId: 2, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 61] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + })), + node: "node2" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 3, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 62] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 3, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 63] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::reth::nextId: 3, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 } + })), + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 64] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node4" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + })), + node: "node3" + }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: + [ + FinalizeReceivedProposal({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 65] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 66] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node3" }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 67] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 68] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 69] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ entry: FaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 70] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ entry: EngineFaultMsg(Restart), node: "node1" }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + EngineCall(CallHeadUpdate({ headHash: 1001, headHeight: 1 })), + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 71] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node4" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 1001, + headHeight: 1 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 72] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: ChannelMsg(ReqConsensusReady({ respStartHeight: 1 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> [ReqConsensusReady({ respStartHeight: 1 })], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 1001, + headHeight: 1 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 73] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 1001, + headHeight: 1 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 1, + head_block_hash: 0, + pendingWork: + [ + FinalizeDecided({ + block: { hash: 1001, height: 1, parentHash: 0 }, + proposal: + { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + pending_proposals: Set(), + phase: Working, + undecided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[State 74] +{ + emerald_with_both_generators::gen::decisions: + Map(1 -> { height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::lastEntry: + Some({ + entry: + ChannelMsg(ReqStartedRound({ height: 1, proposer: "node1", round: 0 })), + node: "node1" + }), + emerald_with_both_generators::gen::nodeStates: + Map( + "node1" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: InRound, + round: 0 + } + }, + "node2" -> + { + disk: { maxDecided: 1 }, + mem: + { + deliveredProposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + getValueSent: Set(), + height: 2, + phase: Started, + round: 0 + } + }, + "node3" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 0, + phase: Unstarted, + round: 0 + } + }, + "node4" -> + { + disk: { maxDecided: 0 }, + mem: + { + deliveredProposals: Set(), + getValueSent: Set(), + height: 1, + phase: Started, + round: 0 + } + } + ), + emerald_with_both_generators::gen::proposalSupport: + Map( + { height: 1, payload: 100, proposer: "node1", round: 0 } -> + Set("node1", "node2", "node3", "node4") + ), + emerald_with_both_generators::gen::proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + emerald_with_both_generators::gen::requestHistory: + Map( + "node1" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }) + ], + "node2" -> + [ + ReqConsensusReady({ respStartHeight: 1 }), + ReqStartedRound({ height: 1, proposer: "node1", round: 0 }), + ReqStartedRound({ height: 1, proposer: "node2", round: 1 }), + ReqReceivedProposal({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }), + ReqDecided({ + proposal: { height: 1, payload: 100, proposer: "node1", round: 0 } + }) + ], + "node3" -> [], + "node4" -> [ReqConsensusReady({ respStartHeight: 1 })] + ), + emerald_with_both_generators::reth::engineLastTraceEntry: + Some({ + entry: + EngineMsg(ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + })), + node: "node2" + }), + emerald_with_both_generators::reth::nextId: 4, + emerald_with_both_generators::reth::requestHistory: + Map( + "node1" -> [], + "node2" -> + [ + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqNewPayload({ + block: { hash: 1001, height: 1, parentHash: 0 }, + respStatus: Valid + }), + ReqForkchoiceUpdated({ + building: false, + headHash: 1001, + respPayloadId: None, + respStatus: Valid + }) + ], + "node3" -> [], + "node4" -> [] + ), + emerald_with_both_generators::reth::rethStates: + Map( + "node1" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node2" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 1001, + headHeight: 1 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set(1001) } + }, + "node3" -> + { + disk: + { + chain: + Map( + 0 -> { hash: 0, height: 0, parentHash: 0 }, + 1 -> { hash: 1001, height: 1, parentHash: 0 } + ), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + }, + "node4" -> + { + disk: + { + chain: Map(0 -> { hash: 0, height: 0, parentHash: 0 }), + head: 0, + headHeight: 0 + }, + mem: { pendingBuild: None, phase: Ready, validatedBlocks: Set() } + } + ), + emerald_with_both_generators_witnesses::emerald_with_both_generators::emeraldState: + Map( + "node1" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Working, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node2" -> + { + disk: + { + decided_proposals: + Set({ height: 1, payload: 100, proposer: "node1", round: 0 }), + last_decided_height: 1, + last_decided_payload: Some(100), + latest_block: Some({ hash: 1001, height: 1, parentHash: 0 }) + }, + mem: + { + consensus_height: 2, + consensus_round: 0, + head_block_hash: 1001, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set(1001) + } + }, + "node3" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 0, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Uninitialized, + undecided_proposals: Set(), + validated_cache: Set() + } + }, + "node4" -> + { + disk: + { + decided_proposals: Set(), + last_decided_height: 0, + last_decided_payload: None, + latest_block: None + }, + mem: + { + consensus_height: 1, + consensus_round: 0, + head_block_hash: 0, + pendingWork: [], + pending_proposals: Set(), + phase: Ready, + undecided_proposals: Set(), + validated_cache: Set() + } + } + ) +} + +[violation] Found an issue (159ms at 6 traces/second). +Use --verbosity=3 to show executions. +Use --seed=0xecfbd9e43e8f7986 --backend=rust to reproduce. diff --git a/specs/canReachDecision_trace_explanation.md b/specs/canReachDecision_trace_explanation.md new file mode 100644 index 00000000..35401b26 --- /dev/null +++ b/specs/canReachDecision_trace_explanation.md @@ -0,0 +1,148 @@ +# Trace Explanation: `canReachDecision` + +**Check Type:** witness +**Result:** VIOLATED (scenario reached ✓) +**Trace Length:** 74 steps +**Seed:** `0xecfbd9e43e8f7986` + +--- + +## Initial State (Step 0) + +All four nodes are Uninitialized (no ConsensusReady received). +The channel API and Engine API histories are empty. +Each Reth instance is Offline with only the genesis block (hash=0) in chain. + +--- + +## Phase 1: Chaotic Initialization (Steps 1–53) + +The first 53 steps are dominated by ConsensusReady, Crash, and Restart events firing in arbitrary order. No node stays stable long enough to complete a consensus round. + +Key events in this phase: + +| Step | Event | Effect | +|------|-------|--------| +| 1 | ConsensusReady → node4 | node4: Uninitialized → Ready, ch=1 | +| 2–3 | ConsensusReady → node3, node2 | node3, node2: Ready | +| 4 | StartedRound(h=1,r=0,proposer=node1) → node3 | node3: Working | +| 5 | Restart node3 | node3: back to Uninitialized | +| 7 | Crash node3 | wiped again | +| 8 | ConsensusReady → node1 | node1: Ready | +| 11 | Crash node1 | node1 lost | +| 12 | Restart node2 | node2 wiped | +| 17 | StartedRound(h=1,r=0,proposer=node1) → node1 | node1: Working | +| 18 | StartedRound(h=1,r=0,proposer=node1) → node2 | node2: Working | +| 19 | GetValue(h=1,r=0) → node1 | node1 is proposer, builds block payload=100 | +| 20 | Crash node1 | proposal builder crashes mid-flight | +| 21 | StartedRound(h=1,r=1,proposer=node2) → node2 | round timeout fires; node2 is proposer at r=1 | +| 40 | ReceivedProposal({h=1,payload=100,proposer=node1,r=0}) → node2 | node2 validates proposal; support count increases | +| 41 | Crash node1 | | +| 54 | Crash node1 | node1: Working → Uninitialized | +| 55 | ReceivedProposal({h=1,payload=100,proposer=node1,r=0}) → node3 | proposalSupport: {node2, node3} | +| 56–58 | ConsensusReady → node1; StartedRound(h=1,r=0) → node1, node2 | node1, node2: Working | +| 59 | ReceivedProposal({h=1,payload=100,proposer=node1,r=0}) → node4 | proposalSupport: {node2, node3, node4} = 3 nodes ✓ quorum | + +Despite repeated crashes and restarts, proposal `{h=1, payload=100, proposer=node1, round=0}` (payload = height×100 + round) was built in step 19 and persists in the generator's global proposals set across all node faults. Support accumulates as nodes receive it across multiple attempts. + +Quorum satisfied at step 59: `3×3 > 4×2` (9 > 8). + +--- + +## Phase 2: Decision (Step 60) + +**Step 60:** `Decided({h=1, payload=100, proposer=node1, r=0}) → node2` + +| Field | Change | +|-------|--------| +| `gen::nodeStates["node2"].mem.phase` | InRound → Started | +| `gen::nodeStates["node2"].mem.height` | 1 → 2 | +| `emeraldState["node2"].mem.pendingWork` | `[]` → `[CallNewPayload, CallHeadUpdate, FinalizeDecided]` | + +The generator sends `EvDecided` to node2. Emerald handles it by enqueuing three Engine API operations. The consensus decision is recorded in the generator (`gen::decisions[1] = proposal`). node2's generator phase advances to Started at height 2. + +--- + +## Phase 3: Engine API Pipeline (Steps 61–74) + +The three work items are dispatched one per `stepAdvanceWork` call. Other nodes' faults and restarts interleave but don't affect node2's queue. + +**Step 61:** `stepAdvanceWork(node2)` — dispatches `CallNewPayload` + +| Field | Change | +|-------|--------| +| `reth::requestHistory["node2"]` | `+= ReqNewPayload({block: {height:1, hash:1001, parentHash:0}, respStatus: Valid})` | +| `reth::rethStates["node2"].disk.chain[1]` | `{height:1, hash:1001, parentHash:0}` | +| `reth::rethStates["node2"].mem.validatedBlocks` | `{} → {1001}` | +| `emeraldState["node2"].mem.validated_cache` | `{} → {1001}` | +| `pendingWork` | `[CallHeadUpdate, FinalizeDecided]` | + +Reth validates the block (hash = 1×1000+1 = 1001, parentHash=0 = genesis). Block is added to Reth's chain and marked valid. Emerald caches the validation result. + +_Steps 62–70: fault/recovery events for node1, node3, node4 — node2's work queue unaffected._ + +**Step 71:** `stepAdvanceWork(node2)` — dispatches `CallHeadUpdate` + +| Field | Change | +|-------|--------| +| `reth::requestHistory["node2"]` | `+= ReqForkchoiceUpdated({headHash: 1001, building: false, respStatus: Valid})` | +| `reth::rethStates["node2"].disk.head` | `0 → 1001` | +| `reth::rethStates["node2"].disk.headHeight` | `0 → 1` | +| `pendingWork` | `[FinalizeDecided]` | + +Reth advances its canonical head to block 1001 (height 1). The execution engine now considers the decided block as the chain tip. + +_Steps 72–73: ConsensusReady for node4, node1 — node2's FinalizeDecided still pending._ + +**Step ~74:** `stepAdvanceWork(node2)` — dispatches `FinalizeDecided` + +| Field | Change | +|-------|--------| +| `emeraldState["node2"].disk.last_decided_height` | `0 → 1` | +| `emeraldState["node2"].disk.last_decided_payload` | `None → Some(100)` | +| `emeraldState["node2"].disk.latest_block` | `None → Some({hash:1001, height:1, parentHash:0})` | +| `emeraldState["node2"].disk.decided_proposals` | `Set() → Set({h:1, payload:100, proposer:node1, r:0})` | +| `emeraldState["node2"].mem.consensus_height` | `1 → 2` | +| `emeraldState["node2"].mem.phase` | `Working → Ready` | +| `emeraldState["node2"].mem.head_block_hash` | `0 → 1001` | +| `emeraldState["node2"].mem.pendingWork` | `[FinalizeDecided] → []` | + +Emerald commits the decision to disk. The block built by Reth is recorded as `latest_block`. `consensus_height` advances to 2. node2 is now Ready to begin height 2. + +--- + +## Final State (Step 74) + +| Node | `last_decided_height` | `consensus_height` | `phase` | +|------|-----------------------|--------------------|---------| +| node1 | 0 | 1 | Working | +| **node2** | **1** | **2** | **Ready** | +| node3 | 0 | 0 | Uninitialized | +| node4 | 0 | 1 | Ready | + +**node2 Reth:** `headHeight=1`, `chain={0→genesis, 1→{hash:1001}}`, `validatedBlocks={1001}` + +✓ **SCENARIO REACHED:** `canReachDecision` violated (expected) + +`node2.last_decided_height = 1 ≥ 1`, falsifying `forall(n => last_decided_height < 1)`. The three-way composition (Malachite → Emerald → Reth) successfully completed a full height-1 decision end-to-end. + +--- + +## Summary + +The trace demonstrates an end-to-end decision at height 1 via node2, despite substantial fault activity across all four nodes. Proposal `{h=1, payload=100, proposer=node1, round=0}` was built in step 19 and survived multiple node1 crashes because the generator's `proposals` set is global and persists across node faults. Quorum (3/4 nodes: node2, node3, node4) was assembled by step 59. + +Once node2 received `EvDecided` (step 60), the Engine API pipeline ran across ~14 steps: `CallNewPayload` (step 61), `CallHeadUpdate` (step 71), and `FinalizeDecided` (~step 72–74). Only after all three work items completed did `last_decided_height` advance to 1, confirming the non-atomic work-queue model requires multiple transitions to finalize a single decision. + +--- + +## Reproduction + +```bash +quint run emerald/specs/emerald_with_both_generators_witnesses.qnt \ + --main=emerald_with_both_generators_witnesses \ + --invariant=canReachDecision \ + --seed=0xecfbd9e43e8f7986 \ + --max-steps=200 --max-samples=2000 \ + --verbosity=3 --backend=rust +``` diff --git a/specs/emerald_with_both_generators_witnesses.qnt b/specs/emerald_with_both_generators_witnesses.qnt index 531337cd..64f56ddc 100644 --- a/specs/emerald_with_both_generators_witnesses.qnt +++ b/specs/emerald_with_both_generators_witnesses.qnt @@ -301,6 +301,50 @@ module emerald_with_both_generators_witnesses { // emeraldState.get(n).mem.undecided_proposals != Set() // )) + // =========================================================================== + // MINIMAL TRACE: canReachDecision + // =========================================================================== + // + // Deterministic 16-step path to a height-1 decision on node1. + // node4 is uninvolved. node2 and node3 contribute to quorum but their + // Engine API work queues are not drained (not needed for the decision). + // + // Sequence: + // 1–3: ConsensusReady for node1/2/3 (Reth starts, consensus_height=1) + // 4–6: StartedRound(h=1,r=0,proposer=node1) to node1/2/3 (→ Working) + // 7–10: GetValue + 3×AdvanceWork on node1 + // CallBuildRequest: FCU(building=true) → payloadId=1 + // CallGetPayload: getPayload(1) → block{h=1,hash=1001} + // FinalizeGetValue: proposal{h=1,payload=100} → undecided + // 11–12: ReceivedProposal to node2, node3 (proposalSupport: node1+2+3 = 3/4 ✓) + // 13–16: Decided + 3×AdvanceWork on node1 + // CallNewPayload: newPayload(block{h=1}) → Valid + // CallHeadUpdate: FCU(headHash=1001) → Valid, head=1001 + // FinalizeDecided: last_decided_height=1, latest_block=Some(...) + // + // Run: quint test emerald/specs/emerald_with_both_generators_witnesses.qnt \ + // --main=emerald_with_both_generators_witnesses + // =========================================================================== + run minimalCanReachDecision = + init + .then(stepConsensusReady("node1")) + .then(stepConsensusReady("node2")) + .then(stepConsensusReady("node3")) + .then(stepStartedRound("node1")) + .then(stepStartedRound("node2")) + .then(stepStartedRound("node3")) + .then(stepGetValue("node1")) + .then(stepAdvanceWork("node1")) // CallBuildRequest + .then(stepAdvanceWork("node1")) // CallGetPayload + .then(stepAdvanceWork("node1")) // FinalizeGetValue + .then(stepReceivedProposal("node2", { height: 1, payload: 100, proposer: "node1", round: 0 })) + .then(stepReceivedProposal("node3", { height: 1, payload: 100, proposer: "node1", round: 0 })) + .then(stepDecided("node1", { height: 1, payload: 100, proposer: "node1", round: 0 })) + .then(stepAdvanceWork("node1")) // CallNewPayload + .then(stepAdvanceWork("node1")) // CallHeadUpdate + .then(stepAdvanceWork("node1")) // FinalizeDecided + .expect(not(canReachDecision)) + // =========================================================================== // BIASED STEP (canDecideTwoHeights) // =========================================================================== From 4b61ecfe8b90bd2e968063723d529fdbc73a2e61 Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 17 Mar 2026 11:45:58 +0100 Subject: [PATCH 19/20] add more clarity to contract guarantees --- specs/channel_api_contract.qnt | 16 +++++++-------- specs/channel_api_generator.qnt | 8 ++++---- specs/channel_api_generator_test.qnt | 2 +- specs/engine_api_contract.qnt | 30 ++++++++++++++++++---------- specs/engine_api_generator.qnt | 9 +++++++-- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index 7d8e5249..bfcd39e8 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -148,7 +148,7 @@ module channel_api_contract { } // =========================================================================== - // COMPONENT GUARANTEES: SAFETY + // CLIENT GUARANTEES: SAFETY // =========================================================================== // // Properties on the requests Malachite sends. These are guarantees that @@ -262,7 +262,7 @@ module channel_api_contract { } // =========================================================================== - // COMPONENT GUARANTEES: ORDERING + // CLIENT GUARANTEES: ORDERING // =========================================================================== // // Properties on the order in which Malachite delivers Channel API requests @@ -798,14 +798,14 @@ module channel_api_contract { // FULL CONTRACT // =========================================================================== - // All properties a conforming generator must satisfy. - pure def contract(s: ChannelState, nNodes: int): bool = and { + // Client (Malachite) guarantees: safety + ordering properties. + pure def componentGuarantees(s: ChannelState, nNodes: int): bool = and { safety(s, nNodes), ordering(s), } // =========================================================================== - // APPLICATION GUARANTEES (Emerald → responses) + // SERVER GUARANTEES (Emerald → responses) // =========================================================================== // // Obligations on the responses Emerald sends back to Malachite. These are @@ -859,8 +859,8 @@ module channel_api_contract { ) ) - // Combined application safety properties - pure def applicationSafety(s: ChannelState): bool = and { + // Server (Emerald) guarantees: safety properties on responses. + pure def applicationGuarantees(s: ChannelState): bool = and { consensusReadyResponse(s), } @@ -881,7 +881,7 @@ module channel_api_contract { // set's total voting power instead of nNodes. // =========================================================================== - // COMPONENT GUARANTEES: LIVENESS (semi-formal) + // CLIENT GUARANTEES: LIVENESS (semi-formal) // =========================================================================== // // Under the environment assumptions above: diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index db2c90a9..4498b15f 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -642,10 +642,10 @@ module channel_api_generator { // Ordering invariants from the contract val orderingInv = ordering(channelState) - // Application safety invariants from the contract - val applicationSafetyInv = applicationSafety(channelState) + // Server (Emerald) guarantees from the contract + val applicationGuaranteesInv = applicationGuarantees(channelState) - // Full contract (safety + ordering) - val contractInv = contract(channelState, NODES.length()) + // Client (Malachite) guarantees: safety + ordering + val contractInv = componentGuarantees(channelState, NODES.length()) } diff --git a/specs/channel_api_generator_test.qnt b/specs/channel_api_generator_test.qnt index 1bc742e1..da8615f2 100644 --- a/specs/channel_api_generator_test.qnt +++ b/specs/channel_api_generator_test.qnt @@ -24,5 +24,5 @@ module channel_api_generator_test { action init = gen::init action step = gen::step val contractInv = gen::contractInv - val applicationSafetyInv = gen::applicationSafetyInv + val applicationGuaranteesInv = gen::applicationGuaranteesInv } diff --git a/specs/engine_api_contract.qnt b/specs/engine_api_contract.qnt index 43aaf48b..11344335 100644 --- a/specs/engine_api_contract.qnt +++ b/specs/engine_api_contract.qnt @@ -10,8 +10,8 @@ // // This contract defines: // 1. The request/response types for the Engine API -// 2. Component guarantees (Reth → responses): response correctness -// 3. Application guarantees (Emerald → requests): request ordering +// 2. Server guarantees (Reth → responses): response correctness +// 3. Client guarantees (Emerald → requests): request ordering // 4. Phase 1 constraints // // Key structural difference from Channel API: @@ -77,9 +77,9 @@ // in isolation (useful for Reth developers). // // Generator checking strategy: -// The generator checks: NODES.toSet().forall(n => engineContract(stateForNode(n))) -// This means: "Every Reth instance independently satisfies the contract." -// Compare to Channel API: contract(globalState) checks cross-node properties +// The generator checks: NODES.toSet().forall(n => componentGuarantees(stateForNode(n))) +// This means: "Every Reth instance independently satisfies the server-side contract." +// Compare to Channel API: componentGuarantees(globalState) checks cross-node properties // like agreement over all nodes simultaneously. module engine_api_contract { @@ -148,7 +148,7 @@ module engine_api_contract { } // =========================================================================== - // COMPONENT GUARANTEES: RESPONSE CORRECTNESS + // SERVER GUARANTEES: RESPONSE CORRECTNESS // =========================================================================== /// @guarantor component @@ -369,7 +369,7 @@ module engine_api_contract { } // =========================================================================== - // APPLICATION GUARANTEES: REQUEST ORDERING + // CLIENT GUARANTEES: REQUEST ORDERING // =========================================================================== /// @guarantor application @@ -409,10 +409,20 @@ module engine_api_contract { // FULL CONTRACT // =========================================================================== - // All properties a conforming generator must satisfy. - pure def engineContract(s: EngineState): bool = and { + // Server (Reth) guarantees: response correctness + phase 1 constraints. + pure def componentGuarantees(s: EngineState): bool = and { responseCorrectness(s), - requestOrdering(s), phase1Constraints(s), } + + // Client (Emerald) guarantees: request ordering. + pure def applicationGuarantees(s: EngineState): bool = and { + requestOrdering(s), + } + + // Full contract: both sides. + pure def engineContract(s: EngineState): bool = and { + componentGuarantees(s), + applicationGuarantees(s), + } } diff --git a/specs/engine_api_generator.qnt b/specs/engine_api_generator.qnt index 3dfaf8f5..0d5e7e5e 100644 --- a/specs/engine_api_generator.qnt +++ b/specs/engine_api_generator.qnt @@ -577,8 +577,13 @@ module engine_api_generator { }, } - // Full contract checked per-node + // Server (Reth) guarantees checked per-node val contractInv = NODES.toSet().forall(n => - engineContract(engineStateForNode(rethStates.get(n), requestHistory.get(n), n)) + componentGuarantees(engineStateForNode(rethStates.get(n), requestHistory.get(n), n)) + ) + + // Client (Emerald) guarantees checked per-node — verified by the composition + val applicationGuaranteesInv = NODES.toSet().forall(n => + applicationGuarantees(engineStateForNode(rethStates.get(n), requestHistory.get(n), n)) ) } From 6b73b18d22ce4e1bd99b415ec03e9f74c8181008 Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 17 Mar 2026 17:13:52 +0100 Subject: [PATCH 20/20] add readability conventions --- specs/channel_api_contract.qnt | 36 ++++--- specs/channel_api_generator.qnt | 133 +++++++++++++++---------- specs/emerald_with_both_generators.qnt | 46 ++++----- specs/emerald_with_generator.qnt | 41 +++----- specs/engine_api_contract.qnt | 41 ++++---- specs/engine_api_generator.qnt | 53 +++++++--- 6 files changed, 194 insertions(+), 156 deletions(-) diff --git a/specs/channel_api_contract.qnt b/specs/channel_api_contract.qnt index bfcd39e8..52d64cc1 100644 --- a/specs/channel_api_contract.qnt +++ b/specs/channel_api_contract.qnt @@ -35,6 +35,27 @@ module channel_api_contract { import basicSpells.* from "spells/basicSpells" + // =========================================================================== + // CONTRACTS + // =========================================================================== + + // Client (Malachite) guarantees: safety + ordering properties. + pure def componentGuarantees(s: ChannelState, nNodes: int): bool = and { + safety(s, nNodes), + ordering(s), + } + + // Server (Emerald) guarantees: safety properties on responses. + pure def applicationGuarantees(s: ChannelState): bool = and { + consensusReadyResponse(s), + } + + // Full contract: both sides. + pure def channelContract(s: ChannelState, nNodes: int): bool = and { + componentGuarantees(s, nNodes), + applicationGuarantees(s), + } + // =========================================================================== // TYPES (derived from AppMsg in msgs.rs) // =========================================================================== @@ -794,16 +815,6 @@ module channel_api_contract { decidedRequiresDeliveredProposal(s), } - // =========================================================================== - // FULL CONTRACT - // =========================================================================== - - // Client (Malachite) guarantees: safety + ordering properties. - pure def componentGuarantees(s: ChannelState, nNodes: int): bool = and { - safety(s, nNodes), - ordering(s), - } - // =========================================================================== // SERVER GUARANTEES (Emerald → responses) // =========================================================================== @@ -859,11 +870,6 @@ module channel_api_contract { ) ) - // Server (Emerald) guarantees: safety properties on responses. - pure def applicationGuarantees(s: ChannelState): bool = and { - consensusReadyResponse(s), - } - // =========================================================================== // ENVIRONMENT ASSUMPTIONS // =========================================================================== diff --git a/specs/channel_api_generator.qnt b/specs/channel_api_generator.qnt index 4498b15f..3b0f1a7c 100644 --- a/specs/channel_api_generator.qnt +++ b/specs/channel_api_generator.qnt @@ -28,6 +28,17 @@ // - Disk: maxDecided (survives restart) // - Mem: phase, height, round, deliveredProposals, getValueSent (reset on fault) // - Request histories are mem state (cleared on fault, current session only) +// +// Phase transitions: +// Unstarted ──sendConsensusReady──────────────> Started +// Started ──sendStartedRound────────────────> InRound +// InRound ──sendStartedRoundAfterTimeout─────> InRound (new round, same height) +// InRound ──sendDecided─────────────────────> Started (height h+1) +// InRound ──sendProcessSyncedValue──────────> Syncing +// Syncing ──sendProcessSyncedValue──────────> Syncing +// Syncing ──sendDecided─────────────────────> Started (height h+1) +// * ──nodeCrash──────────────────────────> Unstarted (all state lost) +// * ──nodeRestart────────────────────────> Unstarted (disk preserved) module channel_api_generator { import basicSpells.* from "spells/basicSpells" @@ -202,23 +213,25 @@ module channel_api_generator { action sendConsensusReady(node: Node, replyStartHeight: Height): bool = { val ns = nodeStates.get(node) all { - // [IMPL] phase progression: must be Unstarted before ConsensusReady - ns.mem.phase == Unstarted, // [CONTRACT] heightsPositive + consensusReadyResponse: all request heights >= 1 replyStartHeight >= 1, + // [IMPL] phase progression: must be Unstarted before ConsensusReady + ns.mem.phase == Unstarted, val req = ReqConsensusReady({ respStartHeight: replyStartHeight }) all { + // state update nodeStates' = nodeStates.set(node, { ...ns, mem: { ...ns.mem, phase: Started, height: replyStartHeight, round: 0 }, }), + proposals' = proposals, + decisions' = decisions, + proposalSupport' = proposalSupport, + // bookkeeping lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), requestHistory' = requestHistory.set(node, requestHistory.get(node).append(req) ), - proposals' = proposals, - decisions' = decisions, - proposalSupport' = proposalSupport, } } } @@ -252,17 +265,19 @@ module channel_api_generator { proposer: proposer, }) all { + // state update nodeStates' = nodeStates.set(node, { ...ns, mem: { ...ns.mem, phase: InRound }, }), + proposals' = proposals, + decisions' = decisions, + proposalSupport' = updatedSupport, + // bookkeeping lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), requestHistory' = requestHistory.set(node, requestHistory.get(node).append(req) ), - proposals' = proposals, - decisions' = decisions, - proposalSupport' = updatedSupport, } } } @@ -278,10 +293,6 @@ module channel_api_generator { action sendGetValue(node: Node, replyProposal: Proposal): bool = { val ns = nodeStates.get(node) all { - // [IMPL] phase progression: must be InRound (after StartedRound) - ns.mem.phase == InRound, - // [CONTRACT] getValueAfterStartedRound: only the proposer receives GetValue - node == proposer_for(ns.mem.height, ns.mem.round), // [CONTRACT] getValueUnique: at most once per (height, round) not(ns.mem.getValueSent.contains((ns.mem.height, ns.mem.round))), // [ASSUMPTION] application guarantee #3: reply matches current (height, round, proposer). @@ -289,6 +300,11 @@ module channel_api_generator { replyProposal.height == ns.mem.height, replyProposal.round == ns.mem.round, replyProposal.proposer == node, + // [IMPL] phase progression: must be InRound (after StartedRound) + ns.mem.phase == InRound, + // [CONTRACT] getValueAfterStartedRound: only the proposer receives GetValue + // Note: placed after [IMPL] phase check to avoid calling proposer_for at height 0 + node == proposer_for(ns.mem.height, ns.mem.round), val req = ReqGetValue({ height: ns.mem.height, round: ns.mem.round, @@ -296,6 +312,7 @@ module channel_api_generator { // [CONTRACT] quorumDecision: proposer supports their own proposal val existing = if (proposalSupport.has(replyProposal)) proposalSupport.get(replyProposal) else Set() all { + // state update proposals' = proposals.union(Set(replyProposal)), nodeStates' = nodeStates.set(node, { ...ns, @@ -305,13 +322,14 @@ module channel_api_generator { deliveredProposals: ns.mem.deliveredProposals.union(Set(replyProposal)), }, }), + decisions' = decisions, + // Proposer supports their specific proposal + proposalSupport' = proposalSupport.put(replyProposal, existing.union(Set(node))), + // bookkeeping lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), requestHistory' = requestHistory.set(node, requestHistory.get(node).append(req) ), - decisions' = decisions, - // Proposer supports their specific proposal - proposalSupport' = proposalSupport.put(replyProposal, existing.union(Set(node))), } } } @@ -326,12 +344,12 @@ module channel_api_generator { action sendReceivedProposal(node: Node, proposal: Proposal): bool = { val ns = nodeStates.get(node) all { - // [IMPL] phase progression: must have started (after ConsensusReady) - ns.mem.phase != Unstarted, // [CONTRACT] receivedProposalExists: proposal was created via GetValue proposal.in(proposals), // [CONTRACT] receivedProposalNotToProposer: nodes don't receive their own proposals proposal.proposer != node, + // [IMPL] phase progression: must have started (after ConsensusReady) + ns.mem.phase != Unstarted, // [OPT] stale proposal filtering: real network can deliver stale proposals // (Emerald drops them). Not enforced by the contract. proposal.height >= ns.mem.height, @@ -341,6 +359,7 @@ module channel_api_generator { val atCurrentHeight = proposal.height == ns.mem.height val existing = if (proposalSupport.has(proposal)) proposalSupport.get(proposal) else Set() all { + // state update nodeStates' = nodeStates.set(node, { ...ns, mem: { @@ -348,16 +367,17 @@ module channel_api_generator { deliveredProposals: ns.mem.deliveredProposals.union(Set(proposal)), }, }), - lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), - requestHistory' = requestHistory.set(node, - requestHistory.get(node).append(req) - ), proposals' = proposals, decisions' = decisions, proposalSupport' = if (atCurrentHeight) proposalSupport.put(proposal, existing.union(Set(node))) else proposalSupport, + // bookkeeping + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) + ), } } } @@ -374,41 +394,44 @@ module channel_api_generator { action sendDecided(node: Node, proposal: Proposal): bool = { val ns = nodeStates.get(node) all { - // [IMPL] phase progression: must be InRound or Syncing - or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, - // [IMPL] height match: decision must be for the current height - proposal.height == ns.mem.height, // [CONTRACT] validity: decided proposal must exist (was created via GetValue) proposal.in(proposals), // [CONTRACT] decidedRequiresDeliveredProposal: Malachite delivered the proposal ns.mem.deliveredProposals.contains(proposal), - // [OPT] future round filtering: restricts generator to avoid decisions - // referencing a future round (contract's roundsConsecutiveWithinHeight - // already constrains this in the normal path) - proposal.round <= ns.mem.round, // [CONTRACT] agreement: if already decided for this height, must be the same not(decisions.has(ns.mem.height)) or decisions.get(ns.mem.height) == proposal, - // [IMPL] prevent duplicate: not already decided at this node for this height - ns.disk.maxDecided < ns.mem.height, // [CONTRACT] quorumDecision: strictly more than 2/3 of nodes must have // received this specific proposal before any node can decide on it proposalSupport.has(proposal), proposalSupport.get(proposal).size() * 3 > NODES.length() * 2, + // [IMPL] phase progression: must be InRound or Syncing + or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, + // [IMPL] height match: decision must be for the current height + proposal.height == ns.mem.height, + // [IMPL] prevent duplicate: not already decided at this node for this height + ns.disk.maxDecided < ns.mem.height, + // [OPT] future round filtering: restricts generator to avoid decisions + // referencing a future round (contract's roundsConsecutiveWithinHeight + // already constrains this in the normal path) + proposal.round <= ns.mem.round, + // state update // Record the decision decisions' = decisions.put(ns.mem.height, proposal), // Move to next height val req = ReqDecided({ proposal: proposal }) all { + // state update nodeStates' = nodeStates.set(node, { disk: { ...ns.disk, maxDecided: ns.mem.height }, mem: { ...ns.mem, phase: Started, height: ns.mem.height + 1, round: 0 }, }), + proposals' = proposals, + proposalSupport' = proposalSupport, + // bookkeeping lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), requestHistory' = requestHistory.set(node, requestHistory.get(node).append(req) ), - proposals' = proposals, - proposalSupport' = proposalSupport, } } } @@ -434,17 +457,19 @@ module channel_api_generator { proposer: proposer, }) all { + // state update nodeStates' = nodeStates.set(node, { ...ns, mem: { ...ns.mem, phase: InRound, round: newRound }, }), + proposals' = proposals, + decisions' = decisions, + proposalSupport' = proposalSupport, + // bookkeeping lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), requestHistory' = requestHistory.set(node, requestHistory.get(node).append(req) ), - proposals' = proposals, - decisions' = decisions, - proposalSupport' = proposalSupport, } } } @@ -457,15 +482,16 @@ module channel_api_generator { action sendProcessSyncedValue(node: Node): bool = { val ns = nodeStates.get(node) all { - // [IMPL] phase progression: must be InRound or Syncing - or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, // [CONTRACT] syncedValueIsDecided: synced value must have been decided decisions.has(ns.mem.height), + // [IMPL] phase progression: must be InRound or Syncing + or { ns.mem.phase == InRound, ns.mem.phase == Syncing }, // [IMPL] prevent duplicate: not already decided at this node for this height ns.disk.maxDecided < ns.mem.height, val proposal = decisions.get(ns.mem.height) val req = ReqProcessSyncedValue({ proposal: proposal }) all { + // state update nodeStates' = nodeStates.set(node, { ...ns, mem: { @@ -474,14 +500,15 @@ module channel_api_generator { deliveredProposals: ns.mem.deliveredProposals.union(Set(proposal)), }, }), - lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), - requestHistory' = requestHistory.set(node, - requestHistory.get(node).append(req) - ), proposals' = proposals, decisions' = decisions, // No support update — proposal is already decided, quorum was already met. proposalSupport' = proposalSupport, + // bookkeeping + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) + ), } } } @@ -499,14 +526,16 @@ module channel_api_generator { height < ns.mem.height, val req = ReqGetDecidedValue({ height: height }) all { - lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), - requestHistory' = requestHistory.set(node, - requestHistory.get(node).append(req) - ), + // state update nodeStates' = nodeStates, proposals' = proposals, decisions' = decisions, proposalSupport' = proposalSupport, + // bookkeeping + lastEntry' = Some({ node: node, entry: ChannelMsg(req) }), + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(req) + ), } } } @@ -526,13 +555,15 @@ module channel_api_generator { all { // [IMPL] must be running: can't crash a node that hasn't started ns.mem.phase != Unstarted, + // state update nodeStates' = nodeStates.set(node, initGenNode), - requestHistory' = requestHistory.set(node, []), - lastEntry' = Some({ node: node, entry: FaultMsg(Crash) }), proposals' = proposals, decisions' = decisions, // Disk state — votes already cast don't un-happen proposalSupport' = proposalSupport, + // bookkeeping + requestHistory' = requestHistory.set(node, []), + lastEntry' = Some({ node: node, entry: FaultMsg(Crash) }), } } @@ -545,13 +576,15 @@ module channel_api_generator { all { // [IMPL] must be running: can't restart a node that hasn't started ns.mem.phase != Unstarted, + // state update nodeStates' = nodeStates.set(node, { disk: ns.disk, mem: initGenMem }), - requestHistory' = requestHistory.set(node, []), - lastEntry' = Some({ node: node, entry: FaultMsg(Restart) }), proposals' = proposals, decisions' = decisions, // Disk state — votes already cast don't un-happen proposalSupport' = proposalSupport, + // bookkeeping + requestHistory' = requestHistory.set(node, []), + lastEntry' = Some({ node: node, entry: FaultMsg(Restart) }), } } diff --git a/specs/emerald_with_both_generators.qnt b/specs/emerald_with_both_generators.qnt index 0c038f0b..650aa5ae 100644 --- a/specs/emerald_with_both_generators.qnt +++ b/specs/emerald_with_both_generators.qnt @@ -1,37 +1,27 @@ // -*- mode: Bluespec; -*- // ============================================================================= -// Emerald + Channel API Generator + Engine API Generator Composition -// ============================================================================= -// -// Three-way composition connecting both boundaries: -// Channel API Generator → Emerald handlers → Engine API Generator +// Composition: Emerald ↔ Malachite (Channel API) ↔ Reth (Engine API) // -// Architecture: -// - Channel API generator models Malachite sending requests to Emerald -// - Emerald handlers process requests and make Engine API calls -// - Engine API generator models Reth responding to Emerald's calls +// Boundaries: +// gen (channel_api_generator) — Malachite → Emerald [nondeterministic] +// reth (engine_api_generator) — Emerald → Reth [reactive] // -// Mapping from Channel API requests to Engine API requests (from Emerald's app.rs): -// | Channel API Request | Engine API Requests | -// |-----------------------|-----------------------------------------------| -// | ConsensusReady | (none — Phase 2 adds exchangeCapabilities) | -// | StartedRound | none | -// | GetValue | forkchoiceUpdated(head, attrs) → getPayload | -// | ReceivedProposal | newPayload(block) | -// | Decided | newPayload(block) → forkchoiceUpdated(hash) | -// | ProcessSyncedValue | none (validation deferred to Decided) | +// Invariants checked here: +// emerald_agreement, consensus_height_gt_last_decided_height, no_pending_at_current_height +// (Emerald-only) +// completion (Emerald ↔ Malachite) +// head_tracks_consensus, validated_before_decided (Emerald ↔ Reth) // -// Non-atomic Engine API composition: -// Channel API events are received in one transition, then Engine API calls -// are executed one-per-transition via a queue + continuation pattern. -// This exposes intermediate states (e.g., mid-processing crashes) that -// the atomic model would hide. Interleaving model: fault-only for the -// same node (no new Channel events while processing), full interleaving -// for other nodes. -// -// State follows the disk/mem convention from faults.qnt. -// Extends emerald_with_generator.qnt with Engine API tracking state. +// Step mapping — Channel API request → Engine API work queue: +// stepConsensusReady → gen::sendConsensusReady → reth::rethStart +// stepStartedRound → gen::sendStartedRound → reth::rethUnchanged +// stepGetValue → gen::sendGetValue → [CallBuildRequest, CallGetPayload, FinalizeGetValue] +// stepReceivedProposal → gen::sendReceivedProposal → [CallNewPayload, FinalizeReceivedProposal] +// stepDecided → gen::sendDecided → [CallNewPayload, CallHeadUpdate, FinalizeDecided] +// stepProcessSyncedValue → gen::sendProcessSyncedValue → reth::rethUnchanged +// stepAdvanceWork → dispatches head WorkItem from pendingWork queue +// ============================================================================= module emerald_with_both_generators { import basicSpells.* from "spells/basicSpells" diff --git a/specs/emerald_with_generator.qnt b/specs/emerald_with_generator.qnt index 4d455142..84f19f29 100644 --- a/specs/emerald_with_generator.qnt +++ b/specs/emerald_with_generator.qnt @@ -1,36 +1,23 @@ // -*- mode: Bluespec; -*- // ============================================================================= -// Emerald + Channel API Generator Composition -// ============================================================================= -// -// Composes the Channel API reference generator with Emerald's handler logic. -// Replaces the Choreo-based listen_* functions and Extensions oracle from -// emerald.qnt with the generator's state machine. -// -// Architecture: -// Generator picks node + action -> Generator updates its own state -// -> Emerald handler updates emeraldState +// Composition: Emerald ↔ Malachite (Channel API) // -// Each step is: all { gen::sendX(node), handleX(node) } -// Generator and Emerald actions fire atomically, each assigning their own -// state variables. +// Boundaries: +// gen (channel_api_generator) — Malachite → Emerald [nondeterministic] // -// Remaining dependencies on generator state: -// - gen::proposals: nondeterministic proposal selection in step (trace exploration) -// - gen::decisions: synced value lookup + completion invariant (network truth) -// - gen::MAX_HEIGHT: bounds nondeterministic height selection in step +// Invariants checked here: +// emerald_agreement, consensus_height_gt_last_decided_height, completion +// no_pending_at_current_height // -// State follows the disk/mem convention from faults.qnt: -// - Disk: decided_proposals, last_decided_height, last_decided_payload (survive restart) -// - Mem: phase, consensus_height, consensus_round, pending_proposals, undecided_proposals (reset on fault) -// -// Proposal lifecycle (pending → undecided → decided): -// - pending (mem): received at height > consensus_height, can't validate yet -// - undecided (mem): received at height == consensus_height, actionable -// - decided (disk): committed decisions, survive restart -// -// Scope: Normal lifecycle + timeouts + sync + crash/restart. +// Step mapping: +// stepConsensusReady → gen::sendConsensusReady + handleConsensusReady +// stepStartedRound → gen::sendStartedRound + handleStartedRound +// stepGetValue → gen::sendGetValue + handleGetValue +// stepReceivedProposal → gen::sendReceivedProposal + handleReceivedProposal +// stepDecided → gen::sendDecided + handleDecided +// stepProcessSyncedValue → gen::sendProcessSyncedValue + handleProcessSyncedValue +// ============================================================================= module emerald_with_generator { import basicSpells.* from "spells/basicSpells" diff --git a/specs/engine_api_contract.qnt b/specs/engine_api_contract.qnt index 11344335..c7a5af36 100644 --- a/specs/engine_api_contract.qnt +++ b/specs/engine_api_contract.qnt @@ -85,6 +85,27 @@ module engine_api_contract { import basicSpells.* from "spells/basicSpells" + // =========================================================================== + // CONTRACTS + // =========================================================================== + + // Server (Reth) guarantees: response correctness + phase 1 constraints. + pure def componentGuarantees(s: EngineState): bool = and { + responseCorrectness(s), + phase1Constraints(s), + } + + // Client (Emerald) guarantees: request ordering. + pure def applicationGuarantees(s: EngineState): bool = and { + requestOrdering(s), + } + + // Full contract: both sides. + pure def engineContract(s: EngineState): bool = and { + componentGuarantees(s), + applicationGuarantees(s), + } + // =========================================================================== // TYPES (abstract — no real EVM types, protocol-level structure) // =========================================================================== @@ -405,24 +426,4 @@ module engine_api_contract { buildLifecycle(s), } - // =========================================================================== - // FULL CONTRACT - // =========================================================================== - - // Server (Reth) guarantees: response correctness + phase 1 constraints. - pure def componentGuarantees(s: EngineState): bool = and { - responseCorrectness(s), - phase1Constraints(s), - } - - // Client (Emerald) guarantees: request ordering. - pure def applicationGuarantees(s: EngineState): bool = and { - requestOrdering(s), - } - - // Full contract: both sides. - pure def engineContract(s: EngineState): bool = and { - componentGuarantees(s), - applicationGuarantees(s), - } } diff --git a/specs/engine_api_generator.qnt b/specs/engine_api_generator.qnt index 0d5e7e5e..369fd370 100644 --- a/specs/engine_api_generator.qnt +++ b/specs/engine_api_generator.qnt @@ -29,6 +29,14 @@ // // Block hash abstraction: deterministic hash = height * 1000 + index. // Genesis block: height 0, hash 0, parentHash 0. +// +// Phase transitions: +// Offline ──rethStart──────────────────────────> Ready +// Ready ──respondForkchoiceUpdated (attrs)───> Building +// Building ──respondGetPayload───────────────────> Ready +// Building ──respondForkchoiceUpdated (no attrs)─> Ready (head update only) +// * ──rethCrash──────────────────────────> Offline (all state lost) +// * ──rethRestart────────────────────────> Ready (disk preserved) module engine_api_generator { import basicSpells.* from "spells/basicSpells" @@ -209,6 +217,7 @@ module engine_api_generator { // [OPT] Height bounds: search space optimization (real Reth handles arbitrary heights) block.height >= 1, block.height <= MAX_HEIGHT, + // state update rethStates' = rethStates.set(node, { disk: { ...ns.disk, @@ -228,14 +237,15 @@ module engine_api_generator { ns.mem.validatedBlocks, }, }), - requestHistory' = requestHistory.set(node, - requestHistory.get(node).append(request) - ), - engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), // Increment counter to ensure standalone test driver generates unique // block hashes (blockHash uses nextId). Without this, consecutive // respondNewPayload calls at the same height produce hash collisions. nextId' = nextId + 1, + // bookkeeping + requestHistory' = requestHistory.set(node, + requestHistory.get(node).append(request) + ), + engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), } } @@ -267,6 +277,7 @@ module engine_api_generator { all { // [IMPL] Phase check: internal state machine, not observable by contract or { ns.mem.phase == Ready, ns.mem.phase == Building }, + // state update rethStates' = rethStates.set(node, { ...ns, mem: { @@ -275,11 +286,12 @@ module engine_api_generator { pendingBuild: Some({ payloadId: nextId, parentHash: headHash, parentHeight: ns.disk.headHeight }), }, }), + nextId' = nextId + 1, + // bookkeeping requestHistory' = requestHistory.set(node, requestHistory.get(node).append(request) ), engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), - nextId' = nextId + 1, } } @@ -301,9 +313,6 @@ module engine_api_generator { respPayloadId: None, }) all { - // [IMPL] Phase check: internal state machine, not observable by contract - or { ns.mem.phase == Ready, ns.mem.phase == Building }, - // [CONTRACT] validBeforeHead: block must already exist in chain before finalization ns.disk.chain.has(headHeight) and ns.disk.chain.get(headHeight).hash == headHash, @@ -321,7 +330,10 @@ module engine_api_generator { // NOTE: Real Reth supports reorgs — this is a modeling simplification or { headHash == ns.disk.head, headHeight > ns.disk.headHeight }, - // State updates: Only disk.head changes, chain itself is unchanged + // [IMPL] Phase check: internal state machine, not observable by contract + or { ns.mem.phase == Ready, ns.mem.phase == Building }, + + // state update (only disk.head changes, chain itself is unchanged) rethStates' = rethStates.set(node, { disk: { chain: ns.disk.chain, // Chain unchanged (block already added earlier) @@ -334,11 +346,12 @@ module engine_api_generator { pendingBuild: ns.mem.pendingBuild, }, }), + nextId' = nextId, + // bookkeeping requestHistory' = requestHistory.set(node, requestHistory.get(node).append(request) ), engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), - nextId' = nextId, } } @@ -372,12 +385,13 @@ module engine_api_generator { } val request =ReqGetPayload({ payloadId: build.payloadId, respBlock: newBlock }) all { + // [CONTRACT] buildLifecycle: payloadId must exist (part of single-use token property) + ns.mem.pendingBuild != None, // [IMPL] getPayloadRequiresBuilding: stricter than contract requires // Contract only requires prior forkchoiceUpdated with this payloadId (buildLifecycle) // This guard adds phase ordering: must still be in Building state ns.mem.phase == Building, - // [CONTRACT] buildLifecycle: payloadId must exist (part of single-use token property) - ns.mem.pendingBuild != None, + // state update rethStates' = rethStates.set(node, { disk: { ...ns.disk, @@ -393,11 +407,12 @@ module engine_api_generator { pendingBuild: None, }, }), + nextId' = nextId, + // bookkeeping requestHistory' = requestHistory.set(node, requestHistory.get(node).append(request) ), engineLastTraceEntry' = Some({ node: node, entry: EngineMsg(request) }), - nextId' = nextId, } } @@ -425,13 +440,15 @@ module engine_api_generator { val ns = rethStates.get(node) all { ns.mem.phase == Offline, + // state update rethStates' = rethStates.set(node, { ...ns, mem: readyRethMem, }), + nextId' = nextId, + // bookkeeping requestHistory' = requestHistory, engineLastTraceEntry' = engineLastTraceEntry, - nextId' = nextId, } } @@ -445,10 +462,12 @@ module engine_api_generator { val ns = rethStates.get(node) all { ns.mem.phase != Offline, + // state update rethStates' = rethStates.set(node, initRethNode), + nextId' = nextId, + // bookkeeping requestHistory' = requestHistory.set(node, []), engineLastTraceEntry' = Some({ node: node, entry: EngineFaultMsg(Crash) }), - nextId' = nextId, } } @@ -459,10 +478,12 @@ module engine_api_generator { val ns = rethStates.get(node) all { ns.mem.phase != Offline, + // state update rethStates' = rethStates.set(node, { disk: ns.disk, mem: readyRethMem }), + nextId' = nextId, + // bookkeeping requestHistory' = requestHistory.set(node, []), engineLastTraceEntry' = Some({ node: node, entry: EngineFaultMsg(Restart) }), - nextId' = nextId, } }