[ { "name": "lockstep-001-unanimous-commit", "description": "All four nodes report the post-frame state hash they computed, and all agree. The threshold is floor(2·4/3)+1 = 3, so the frame commits, every node's outcome is a clean commit (treatise §13.3), and no dissent is logged. State hashes are opaque 32-byte values compared for equality. Each node's outcome comes from its own view: the hashes its peers reported plus the one it computed itself (§13.3, §13.4).", "node_count": 4, "frame_number": 184237, "node_reported_hashes": { "node_1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "node_2": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "node_3": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "node_4": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }, "node_computed_hashes": { "node_1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "node_2": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "node_3": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "node_4": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }, "expected_threshold": 3, "expected_commit": true, "expected_state_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "expected_outcomes": { "node_1": "clean_commit", "node_2": "clean_commit", "node_3": "clean_commit", "node_4": "clean_commit" }, "expected_dissent_logs": { "node_1": [], "node_2": [], "node_3": [], "node_4": [] } }, { "name": "lockstep-002-supermajority-commit", "description": "Three of four nodes agree. node_4's state diverged, and it reports the hash it computed. The threshold of 3 is met: nodes 1–3 commit with dissent, and each writes one dissent-log entry naming node_4 (treatise §14.1). node_4 sees a supermajority on a hash that is not its own — minority divergence — so it halts and writes nothing.", "node_count": 4, "frame_number": 184238, "node_reported_hashes": { "node_1": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_2": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_3": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_4": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" }, "node_computed_hashes": { "node_1": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_2": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_3": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_4": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" }, "expected_threshold": 3, "expected_commit": true, "expected_state_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "expected_outcomes": { "node_1": "commit_with_dissent", "node_2": "commit_with_dissent", "node_3": "commit_with_dissent", "node_4": "minority_divergence" }, "expected_dissent_logs": { "node_1": [ { "frame": 184238, "dissenting_peers": [ "node_4" ], "local_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "supermajority_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } ], "node_2": [ { "frame": 184238, "dissenting_peers": [ "node_4" ], "local_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "supermajority_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } ], "node_3": [ { "frame": 184238, "dissenting_peers": [ "node_4" ], "local_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "supermajority_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } ], "node_4": [] } }, { "name": "lockstep-003-threshold-not-met", "description": "No hash is reported by more than two of the four nodes. None reaches the threshold of 3, so the frame does not commit and every node's outcome is a cluster split (§13.3). No dissent is logged: dissent is divergence from a committed hash (§14.2), and there is none.", "node_count": 4, "frame_number": 184239, "node_reported_hashes": { "node_1": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "node_2": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "node_3": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", "node_4": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" }, "node_computed_hashes": { "node_1": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "node_2": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "node_3": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", "node_4": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" }, "expected_threshold": 3, "expected_commit": false, "expected_state_hash": null, "expected_outcomes": { "node_1": "cluster_split", "node_2": "cluster_split", "node_3": "cluster_split", "node_4": "cluster_split" }, "expected_dissent_logs": { "node_1": [], "node_2": [], "node_3": [], "node_4": [] } }, { "name": "lockstep-004-three-nodes-one-diverged-split", "description": "The n = 3 exception (treatise §13.2). The threshold is 3, so one node whose state diverged leaves 2 of the 3 votes the frame needs. The cluster detects the divergence but cannot tolerate it: every node halts with a cluster split.", "node_count": 3, "frame_number": 184240, "node_reported_hashes": { "node_1": "1111111111111111111111111111111111111111111111111111111111111111", "node_2": "1111111111111111111111111111111111111111111111111111111111111111", "node_3": "2222222222222222222222222222222222222222222222222222222222222222" }, "node_computed_hashes": { "node_1": "1111111111111111111111111111111111111111111111111111111111111111", "node_2": "1111111111111111111111111111111111111111111111111111111111111111", "node_3": "2222222222222222222222222222222222222222222222222222222222222222" }, "expected_threshold": 3, "expected_commit": false, "expected_state_hash": null, "expected_outcomes": { "node_1": "cluster_split", "node_2": "cluster_split", "node_3": "cluster_split" }, "expected_dissent_logs": { "node_1": [], "node_2": [], "node_3": [] } }, { "name": "lockstep-005-seven-nodes-two-dissenters", "description": "Seven nodes, threshold 5: five agree and two diverged nodes report hashes of their own. The frame commits. The dissent entry names both dissenters in ascending order, so every committing node writes the same entry (§14.2).", "node_count": 7, "frame_number": 184241, "node_reported_hashes": { "node_1": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_2": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_3": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_4": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_5": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_6": "6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b", "node_7": "7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c" }, "node_computed_hashes": { "node_1": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_2": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_3": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_4": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_5": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "node_6": "6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b", "node_7": "7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c" }, "expected_threshold": 5, "expected_commit": true, "expected_state_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "expected_outcomes": { "node_1": "commit_with_dissent", "node_2": "commit_with_dissent", "node_3": "commit_with_dissent", "node_4": "commit_with_dissent", "node_5": "commit_with_dissent", "node_6": "minority_divergence", "node_7": "minority_divergence" }, "expected_dissent_logs": { "node_1": [ { "frame": 184241, "dissenting_peers": [ "node_6", "node_7" ], "local_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "supermajority_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a" } ], "node_2": [ { "frame": 184241, "dissenting_peers": [ "node_6", "node_7" ], "local_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "supermajority_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a" } ], "node_3": [ { "frame": 184241, "dissenting_peers": [ "node_6", "node_7" ], "local_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "supermajority_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a" } ], "node_4": [ { "frame": 184241, "dissenting_peers": [ "node_6", "node_7" ], "local_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "supermajority_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a" } ], "node_5": [ { "frame": 184241, "dissenting_peers": [ "node_6", "node_7" ], "local_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", "supermajority_hash": "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a" } ], "node_6": [], "node_7": [] } }, { "name": "lockstep-006-transport-liar-is-logged", "description": "Treatise §13.4: node_4 computed the honest hash but broadcast another. Its peers see 3-of-4 agreement and record node_4 in their dissent logs. node_4 tallies its own honest hash, sees unanimity and commits cleanly: its lie surfaces only in its peers' logs, which is why the dissent log is the substrate's misbehaviour signal (§14).", "node_count": 4, "frame_number": 184242, "node_reported_hashes": { "node_1": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_2": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_3": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_4": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" }, "node_computed_hashes": { "node_1": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_2": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_3": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "node_4": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" }, "expected_threshold": 3, "expected_commit": true, "expected_state_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "expected_outcomes": { "node_1": "commit_with_dissent", "node_2": "commit_with_dissent", "node_3": "commit_with_dissent", "node_4": "clean_commit" }, "expected_dissent_logs": { "node_1": [ { "frame": 184242, "dissenting_peers": [ "node_4" ], "local_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "supermajority_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } ], "node_2": [ { "frame": 184242, "dissenting_peers": [ "node_4" ], "local_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "supermajority_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } ], "node_3": [ { "frame": 184242, "dissenting_peers": [ "node_4" ], "local_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "supermajority_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } ], "node_4": [] } }, { "name": "lockstep-007-three-node-transport-liar", "description": "§13.2 and §13.4 together. At n = 3 a node that broadcasts a hash other than the one it computed splits the honest pair, who halt. The liar sees its own honest hash agree with both peers and commits. The reported hashes reach no supermajority, so the frame's public record is no commit.", "node_count": 3, "frame_number": 184243, "node_reported_hashes": { "node_1": "1111111111111111111111111111111111111111111111111111111111111111", "node_2": "1111111111111111111111111111111111111111111111111111111111111111", "node_3": "2222222222222222222222222222222222222222222222222222222222222222" }, "node_computed_hashes": { "node_1": "1111111111111111111111111111111111111111111111111111111111111111", "node_2": "1111111111111111111111111111111111111111111111111111111111111111", "node_3": "1111111111111111111111111111111111111111111111111111111111111111" }, "expected_threshold": 3, "expected_commit": false, "expected_state_hash": null, "expected_outcomes": { "node_1": "cluster_split", "node_2": "cluster_split", "node_3": "clean_commit" }, "expected_dissent_logs": { "node_1": [], "node_2": [], "node_3": [] } } ]