diff --git a/docs/fud-ledger.md b/docs/fud-ledger.md index da25983a2..832029966 100644 --- a/docs/fud-ledger.md +++ b/docs/fud-ledger.md @@ -296,6 +296,8 @@ Evidence: design doc Finality v2, Residual risks bullet 3. Fix: overclaims list, Sweep (5 October 2026, evening): stated. `site/litepaper.html`, Finality ends with the pool sentence (overclaim 33); Governance opens with "governed by the hashrate that powers it", pool concentration named as the governance risk with the devnet measurement, top-3 keys 34.5% of 8,090 blocks (ledger sweep, X14 run). Overclaim 43. +Narrowed (7 October 2026, the pool lane, mission item 11): a conforming pool holds no vote. Pool-0 (`pool/`, spec 09) names the member's own vote key in every header it issues and holds no key of its own, so its hashers' weight is theirs (measured on the private fast-time runs of 5 and 7 October: every pool block carried the finding member's key); and the open pool (spec 09 section 9.12, `igneum-pool --open`) has no operator at all: every member builds its own templates from its own node, and a block pays the window from its own coinbase by the executor's split rule. The litepaper's sentence stays true of a custodial pool (`vote_mode: pool`, refused by the member's client by default and visible on chain as one key per payout address); the next litepaper pass should say "a custodial pool" where it says "pools". + ### F11. VDFs are exotic "A class-group VDF with Wesolowski proofs in a consensus-critical path, in a project with no cryptographer. Chia needed years and still got timelord ASICs." @@ -655,6 +657,8 @@ Answer: Correct. Stratum v2 job declaration lets a hasher choose transactions wh Evidence: none in repository. Fix: overclaims list, item 45. +Narrowed (7 October 2026, the pool lane): on Igneum the vote key in a pool's header is the member's, not the pool's (spec 09 section 9.6, built in `pool/` since 5 October and in the open pool since 7 October), so the vote-key caveat no longer applies to a conforming pool. Transaction choice: still the pool's in mode A (mode C, the member's own template, is designed and not built); in the open pool the member's own node chooses the transactions, since the member builds every template, which is Stratum v2's job declaration without an operator to decline it. The litepaper's "pools can be bypassed on transaction choice" stays, with "and in the open pool there is no pool to bypass" when it is next edited. + Cross-reference (external review, 3 October 2026, night): whether members use declared templates is measured under O-9.5; concentration reporting is X14. Sweep (5 October 2026, evening): stated. `site/litepaper.html`, Governance bullet "Pools can be bypassed on transaction choice", a pool may decline, vote keys stay with the pool, label Designed with spec section 9 (overclaim 44). diff --git a/docs/plans/pool.md b/docs/plans/pool.md index 732241fbc..8ff1c005b 100644 --- a/docs/plans/pool.md +++ b/docs/plans/pool.md @@ -326,3 +326,111 @@ its pack is prepared ahead (the pool's `seeds` line carries `next_epoch_seed` fo the next member row); a member on a reconnect now keeps its worker and its compiled pair; a pool operator's verifier sees the sized correction within 10 s of a member's first shares (one share per 10 s per member from then on) instead of 5 minutes of a 190-share-a-second flood; the 10-member load figure is still owed and now has a clean form to run in. + +## 10. 7 October 2026: pool-0 finished, TLS, and the open pool (mission item 11) + +Branch `pool-finish` on `release-0.3.19` 44eee05b with the four daemon commits of `pool-v0-rebase` cherry-picked +(the node fork pinned for the pool work is 0.3.19, whose kaspa-pow needs the latency ladder's igneum-pow; master +b92a5fd4 does not carry it, so the branch sits on the release tree); fork branch `pool-finish-node` on +`release-0.3.19-node` dc141409 with `pool-v0-rebase` merged (the pool-mode miner). Ordered by the project lead on 7 October 2026, +10:1x UK, built in the order of mission 2.11: pool-0, TLS and the page rows, the share sidechain. + +### 10.1 Pool-0 + +What 2.11 asks of pool-0 was in v0 (section 2): the member's vote key in every header, the pool with no key and no +vote, PPLNS, a payout round every 60 s, a 1 percent fee. What was missing was the fee published beside the dev fee +(reinvent 3.5): `welcome.share_scheme` now carries `software_dev_fee_percent` (0 in pool mode: the pool's fee is the only +fee), the page's Fees row says both, and `site/miner.html`'s dev-fee card says pool-0 charges the same 1 percent so solo +and pool cost the same and the choice is about variance alone. The jobs and seeds lines carry the latency ladder's rung +(`shadow_reps`) beside the class and the era, which 0.3.19's program needs; a member checks it against its own node as it +checks the seed, the class and the era (a pool that could choose the rung could choose the program). + +### 10.2 TLS (spec 9.3, O-9.7 closed, Q67) + +`pool/src/tls.rs`: rustls 0.23 with ring, TLS 1.3 only. `--tls-cert`/`--tls-key` (a chain from a trusted root) or +`--tls-self-signed` (a P-256 pair made under the data dir on first start, read back afterwards; the pin +`BLAKE2b("igneum-pool-cert-pin-v1" || DER)` printed at start, shown on the page and in `/api/stats`). The member +(`igneum/miner/src/pool.rs`, fork): `--pool-tls` (the Mozilla roots, the pool's host as the server name) or `--pool-pin +` (a verifier that accepts exactly the pinned certificate). The binding: both sides export 32 bytes with the label +`EXPORTER-igneum-pool-binding` and the chain id (8 bytes LE) as the context; the member signs `igneum-pool-binding-v1/ +|| chain id LE || exporter` under its vote key with its own tag (`DST_BINDING`, `consensus/core/src/finality.rs`); the +pool verifies it against the member's key and refuses the `authorize` with `bye` otherwise. Tests: `finality.rs` +(the signature holds for one exporter and one chain id, is no proof of possession); `tls.rs` (a self-signed pair read +back with one pin, a pinned handshake, both sides' exporters equal, the binding verified on its own connection and +refused on a second, a wrong pin never handshakes). Testnet and mainnet refuse to start in the clear without +`--allow-plain`; the devnet's local daemons stay plain. HiveOS: `pools://` or `POOL_PIN=` (`packaging/hive`). + +### 10.3 The page rows (polish Q68 to Q73) + +| Row | Done | +|---|---| +| Q68 | the page's node line: "node ok, ", "node syncing", "no template", "node unreachable since