All checks were successful
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 1m56s
standards workspaces build + test / aac-rs (pull_request) Successful in 46s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 42s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 39s
standards workspaces build + test / map-rs (pull_request) Successful in 32s
standards workspaces build + test / mesh-rs (pull_request) Successful in 37s
standards workspaces build + test / openpay (pull_request) Successful in 2m0s
smart-byte conformance gate / Validate conformance JSON files (pull_request) Successful in 3s
smart-byte conformance gate / Second implementation reproduces every vector (pull_request) Successful in 3s
smart-byte conformance gate / Spec changes require vector-pack updates (pull_request) Successful in 4s
smart-byte conformance gate / VERSIONS.md and README.md must exist (pull_request) Successful in 3s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m53s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m20s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m24s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m11s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 2m44s
standards workspaces build + test / arl-rs (pull_request) Successful in 4m0s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 3m24s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 2m43s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 3m6s
standards workspaces build + test / sense-rs (pull_request) Successful in 3m9s
standards workspaces build + test / macOS energy backend (jcp-energy) (pull_request) Successful in 2m46s
The review found the pack and its checkers wrong in ways two agreeing implementations could not catch. Spec: - Identity spec §2.1, §2.3, §2.4 and §4 step 1 told a verifier to re-encode an object canonically. A verifier written to them accepts said-009, the re-encoding attack §2.5 exists to refuse. All four now require received bytes to be canonical already. - New §2.6 fixes how a SAID-addressed object is received: canonical bytes, then the SAID they state, then the SAID they arrived under, and only then deduplication. - §2.3 forbids simple values other than false, true and null. - §3.3/§3.4 say a key is a byte string, as said-007 already encoded it. Vectors: - Lockstep vectors separate the hash a node broadcast from the one it computed, and give each node's outcome and dissent log from its own view. The old single view called a node a "liar" while modelling divergence; lockstep-006/007 now pin treatise §13.4's transport liar, who commits in its own view while its peers log it. - Gossip vectors carry generic SAID-addressed objects. Envelope-shaped ones with null or filler provenance are bytes a provenance-checking node must refuse (treatise §8.3), so they could not be MUST-pass. `expected_held` now carries the bytes held. - New canon-020 (simple value) and sig-007 (a key spelled with y = p + 3, a second spelling of a valid point that ed25519-dalek alone accepts). - SAID vector descriptions no longer claim fidelity to treatise §8 or a frame the data never mentions. Checkers: - Both now check the pack whole. An empty pack, a deleted vector the spec cites, a deleted class, or an unlisted class all fail; before, an empty pack passed both checkers. - The Python checker no longer uses `assert`. Under `python -O` it passed a corrupted pack. - Both refuse JSON that names a member twice. - The Rust verifier no longer panics on an empty stated SAID. - The gossip expectations come from smart-byte-core's inbox, so every value in the pack is now the reference implementation's. Falsified: - The Rust verifier catches 19 of 19 planted defects, each on its own vector, plus the empty-pack, deleted-vector, deleted-class, unlisted-class and duplicate-member cases. - The Python checker catches 15 of 15 planted defects in both normal and -O modes, plus the same pack-level cases. regeneration.md is consolidated into one accurate entry, which corrects the earlier claim that no draft vector was passable. VERSIONS.md rule 4 and the README now scope supersession to frozen packs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
341 lines
15 KiB
JSON
341 lines
15 KiB
JSON
[
|
||
{
|
||
"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": []
|
||
}
|
||
}
|
||
]
|