Graduates the consensus layer from the in-process LockstepCluster simulation to
a genuinely distributed node that decides from messages it receives over QUIC.
- joule-code-collab: add RoundNode — a single node's view of one lockstep BFT
round (validate, vote, tally, commit), holding only its own state. Two honest
nodes that received the same proposal set and per-node vote sets compute a
byte-identical log, with no leader, because validation is deterministic and
commits apply in op_id order. Unit test drives independent node states with a
Byzantine node withholding votes: a non-member's op is refused, the valid ops
commit at 2f+1, and all honest logs are byte-identical.
- joule-moq: add generate_self_signed_der + QuicEndpoint::server_from_der /
client_from_der so a transport consumer can carry the shared cert as raw DER
without depending on rustls types.
- lockstep-quic (new crate): a node binary that derives a deterministic signed
membership from indices, forms a QUIC mesh over joule-moq, exchanges signed
proposals and vote sets with round barriers, and commits via RoundNode — then
prints the agreed-log hash.
Live-verified: loopback n=4 (f=1, threshold 3) — four independent processes
commit a byte-identical log (same blake3 hash); and cross-machine n=2 over real
QUIC between two Macs — both commit the same log. The full n=4 cross-machine
mesh is blocked by an environment-specific outbound-dial issue on two of the
hosts (firewall ruled out — disabled there; the same binary succeeds loopback-n4
and cross-machine-n2), left for follow-up; the consensus and transport code are
not implicated.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
(cherry picked from commit a083120a0f)
48 lines
1.4 KiB
TOML
48 lines
1.4 KiB
TOML
[workspace]
|
|
resolver = "2"
|
|
members = [
|
|
"crates/joule-code-schema",
|
|
"crates/joule-code-cargo",
|
|
"crates/joule-code-receipt",
|
|
"crates/joule-code-cascade",
|
|
"crates/joule-code-collab",
|
|
"crates/joule-code-conformance",
|
|
"crates/joule-code-jcp",
|
|
"crates/joule-code-joulecontract",
|
|
"crates/joule-code-spec",
|
|
"crates/joule-code-review",
|
|
"crates/joule-code-remediate",
|
|
"crates/joule-code-release",
|
|
"crates/joule-code-reviewer",
|
|
"crates/joule-code-identity",
|
|
"crates/jwp",
|
|
"crates/joule-moq",
|
|
"crates/lockstep-quic",
|
|
]
|
|
|
|
[workspace.package]
|
|
version = "0.2.0"
|
|
edition = "2021"
|
|
license = "Apache-2.0"
|
|
repository = "https://github.com/transaction-science/open-standards"
|
|
rust-version = "1.85"
|
|
|
|
[workspace.dependencies]
|
|
joule-code-schema = { path = "crates/joule-code-schema" }
|
|
joule-code-spec = { path = "crates/joule-code-spec" }
|
|
joule-code-review = { path = "crates/joule-code-review" }
|
|
joule-code-release = { path = "crates/joule-code-release" }
|
|
joule-code-reviewer = { path = "crates/joule-code-reviewer" }
|
|
joule-code-identity = { path = "crates/joule-code-identity" }
|
|
joule-code-cargo = { path = "crates/joule-code-cargo" }
|
|
joule-code-receipt = { path = "crates/joule-code-receipt" }
|
|
joule-code-cascade = { path = "crates/joule-code-cascade" }
|
|
|
|
blake3 = "1"
|
|
ed25519-dalek = "2"
|
|
ciborium = "0.2"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
base64 = "0.22"
|
|
hex = "0.4"
|
|
thiserror = "2"
|