site: rebuilt after fud-a
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
8703d9e731
commit
acd6f86cb2
3 changed files with 11 additions and 12 deletions
|
|
@ -496,7 +496,6 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:
|
||||||
<div class="tbl"><table><thead><tr><th>Verify of PC 2's proof of block 59507 shard 0 (1,272,897 bytes) on the Apple M5 Max</th><th>Setup</th><th>Verify</th><th>Verdict</th></tr></thead><tbody><tr><td>Before: shipped host, <code>ProverClient::from_env</code> + two key setups</td><td>125.82 s</td><td>0.383 s</td><td>NOT VERIFIED, no reason given</td></tr><tr><td>Before, as the node saw it (blocks 59373 and 59402)</td><td>138.6 s and 114.4 s in all</td><td>0.409 s and 0.104 s</td><td>NOT VERIFIED</td></tr><tr><td>After: pinned key, light verifier (<code>program-id</code> host, same proof)</td><td>2.085 s</td><td>0.002 s (refused on the program id before any field arithmetic)</td><td>NOT VERIFIED, <code>program id 0x05db1aca...61a3 IS NOT OURS 0x0dfade07...be16a</code>; 2.35 s wall, exit 3</td></tr><tr><td>After, known-good case: block 56 shard 0 proven with the pinned ELF on this Mac (<code>--mode compressed</code>, 558,137 cycles, prove 1,066 s under load 113), verified against its real statement</td><td>1.323 s</td><td>0.108 s</td><td>VERIFIED, <code>program id ... (ours)</code>; 1.80 s wall, exit 0</td></tr></tbody></table></div>
|
<div class="tbl"><table><thead><tr><th>Verify of PC 2's proof of block 59507 shard 0 (1,272,897 bytes) on the Apple M5 Max</th><th>Setup</th><th>Verify</th><th>Verdict</th></tr></thead><tbody><tr><td>Before: shipped host, <code>ProverClient::from_env</code> + two key setups</td><td>125.82 s</td><td>0.383 s</td><td>NOT VERIFIED, no reason given</td></tr><tr><td>Before, as the node saw it (blocks 59373 and 59402)</td><td>138.6 s and 114.4 s in all</td><td>0.409 s and 0.104 s</td><td>NOT VERIFIED</td></tr><tr><td>After: pinned key, light verifier (<code>program-id</code> host, same proof)</td><td>2.085 s</td><td>0.002 s (refused on the program id before any field arithmetic)</td><td>NOT VERIFIED, <code>program id 0x05db1aca...61a3 IS NOT OURS 0x0dfade07...be16a</code>; 2.35 s wall, exit 3</td></tr><tr><td>After, known-good case: block 56 shard 0 proven with the pinned ELF on this Mac (<code>--mode compressed</code>, 558,137 cycles, prove 1,066 s under load 113), verified against its real statement</td><td>1.323 s</td><td>0.108 s</td><td>VERIFIED, <code>program id ... (ours)</code>; 1.80 s wall, exit 0</td></tr></tbody></table></div>
|
||||||
<p>Before: 127.0 s wall per proof on the Apple M5 Max (the node saw 114 s to 139 s). After: 1.8 s to 2.4 s wall, under the 2 s target for the verify call itself; the remaining 1.3 s to 2.1 s is SP1's light verifier construction plus paging a 58 MB binary under load, and would shrink in a long-lived verifier process. Unit tests (<code>cargo test -p igneum-prove-host --bin igneum-prove-host</code>): the embedded files hash to the manifest, the embedded keys derive the manifest's ids, a changed file is refused; the ignored test re-runs SP1's setup on the embedded ELFs and gets the pinned ids. <code>tools/ci/pinned-guests-check.sh</code> was shown failing on an empty <code>elf/</code> and passing on the pinned one.</p>
|
<p>Before: 127.0 s wall per proof on the Apple M5 Max (the node saw 114 s to 139 s). After: 1.8 s to 2.4 s wall, under the 2 s target for the verify call itself; the remaining 1.3 s to 2.1 s is SP1's light verifier construction plus paging a 58 MB binary under load, and would shrink in a long-lived verifier process. Unit tests (<code>cargo test -p igneum-prove-host --bin igneum-prove-host</code>): the embedded files hash to the manifest, the embedded keys derive the manifest's ids, a changed file is refused; the ignored test re-runs SP1's setup on the embedded ELFs and gets the pinned ids. <code>tools/ci/pinned-guests-check.sh</code> was shown failing on an empty <code>elf/</code> and passing on the pinned one.</p>
|
||||||
<p>What every machine must do: the pinned shard id <code>0x0dfade07...be16a</code> differs from every id now running (Mac <code>0x0559759b...</code>, PC 2 <code>0x05db1aca...</code>), so this is a guest change for the whole devnet, and proofs in flight at the switch are rejected by a verifier that has moved. Rollout order (proving/README.md, "Pinned guest programs"): provers off on every machine; wait until <code>igneum_getProvingStatus</code> shows an empty pool on every node; install the host built from this <code>elf/</code> on every node (Mac DMG; PCs through <code>igneum-prove-wsl2.zip</code>, whose package carries <code>elf/</code>, so the WSL build embeds the same files); confirm <code>igneum-prove-host --mode id</code> prints the same shard id everywhere; provers back on. From then on a differing id is impossible without a change to the committed <code>elf/</code>.</p>
|
<p>What every machine must do: the pinned shard id <code>0x0dfade07...be16a</code> differs from every id now running (Mac <code>0x0559759b...</code>, PC 2 <code>0x05db1aca...</code>), so this is a guest change for the whole devnet, and proofs in flight at the switch are rejected by a verifier that has moved. Rollout order (proving/README.md, "Pinned guest programs"): provers off on every machine; wait until <code>igneum_getProvingStatus</code> shows an empty pool on every node; install the host built from this <code>elf/</code> on every node (Mac DMG; PCs through <code>igneum-prove-wsl2.zip</code>, whose package carries <code>elf/</code>, so the WSL build embeds the same files); confirm <code>igneum-prove-host --mode id</code> prints the same shard id everywhere; provers back on. From then on a differing id is impossible without a change to the committed <code>elf/</code>.</p>
|
||||||
<p><<<<<<< HEAD</p>
|
|
||||||
<h2 id="5-october-2026-afternoon-live-devnet-real-transactions-the-first-non-empty-shard-proven-and-paid-and-the-exporter-s-block-structure-fixed-execution-engineer">5 October 2026 (afternoon), live devnet: real transactions, the first non-empty shard proven and paid, and the exporter's block structure fixed (execution engineer)</h2>
|
<h2 id="5-october-2026-afternoon-live-devnet-real-transactions-the-first-non-empty-shard-proven-and-paid-and-the-exporter-s-block-structure-fixed-execution-engineer">5 October 2026 (afternoon), live devnet: real transactions, the first non-empty shard proven and paid, and the exporter's block structure fixed (execution engineer)</h2>
|
||||||
<p>Until this run the devnet had carried no transaction at all, so every one of the 349 shards paid before 15:35 UTC was empty (0 pgas). <code>tools/txgen/run.mjs</code> (new; viem for EIP-1559 signing, otherwise Node 22 built-ins) funds generated wallets from the devnet dev-fee key (<code>~/.config/igneum/dev-fee-devnet.json</code>, keys of the generated wallets in <code>~/.config/igneum/txgen/wallets.json</code>, mode 0600) and sends transfers between them at a steady rate through one node's EVM RPC; <code>tools/txgen/proving-watch.mjs</code> samples the proving layer during a run and builds the per-block report afterwards. Both runs went through the Apple M5 Max node (127.0.0.1:26800) under <code>tools/lock/with-lock.sh run</code>, with PC 2's RTX 5090 (app 0.3.8, SP1 CUDA under WSL2) as the only prover and the Apple M5 Max node as the verifier. Chain id 4463, gas price quote 3 gwei (1 gwei execution base, 1 gwei proving base at ratio 1.0, 1 gwei tip), <code>eth_estimateGas</code> 25,380 for a transfer.</p>
|
<p>Until this run the devnet had carried no transaction at all, so every one of the 349 shards paid before 15:35 UTC was empty (0 pgas). <code>tools/txgen/run.mjs</code> (new; viem for EIP-1559 signing, otherwise Node 22 built-ins) funds generated wallets from the devnet dev-fee key (<code>~/.config/igneum/dev-fee-devnet.json</code>, keys of the generated wallets in <code>~/.config/igneum/txgen/wallets.json</code>, mode 0600) and sends transfers between them at a steady rate through one node's EVM RPC; <code>tools/txgen/proving-watch.mjs</code> samples the proving layer during a run and builds the per-block report afterwards. Both runs went through the Apple M5 Max node (127.0.0.1:26800) under <code>tools/lock/with-lock.sh run</code>, with PC 2's RTX 5090 (app 0.3.8, SP1 CUDA under WSL2) as the only prover and the Apple M5 Max node as the verifier. Chain id 4463, gas price quote 3 gwei (1 gwei execution base, 1 gwei proving base at ratio 1.0, 1 gwei tip), <code>eth_estimateGas</code> 25,380 for a transfer.</p>
|
||||||
<div class="tbl"><table><thead><tr><th>Run</th><th>Window (UTC)</th><th>Wallets</th><th>Sent</th><th>Included</th><th>Included per s</th><th>Latency p50 / p90 / max (s)</th><th>Blocks with content</th><th>Transfers per content block p50 / p90 / max</th><th>Failures</th><th>Fees paid (IGN)</th></tr></thead><tbody><tr><td>1, master code</td><td>15:37:30 to 15:57:30</td><td>16</td><td>2,275</td><td>2,161 (103 pending at the cut, all with a receipt 20 s later)</td><td>1.86</td><td>40.7 / 110.8 / 209</td><td>59</td><td>8 / 92 / 224</td><td>60: 49 "replacement underpriced", 10 dropped, 1 skipped (9 of the 11 executed later, see below)</td><td>0.091</td></tr><tr><td>2, fixed code</td><td>15:59:34 to 16:14:34</td><td>16</td><td>1,650</td><td>1,633 (17 pending at the cut)</td><td>1.71</td><td>45.7 / 128.7 / 253</td><td>48</td><td>10 / 99 / 224</td><td>0 (0 nonce retries, 0 deferred)</td><td>0.069</td></tr></tbody></table></div>
|
<div class="tbl"><table><thead><tr><th>Run</th><th>Window (UTC)</th><th>Wallets</th><th>Sent</th><th>Included</th><th>Included per s</th><th>Latency p50 / p90 / max (s)</th><th>Blocks with content</th><th>Transfers per content block p50 / p90 / max</th><th>Failures</th><th>Fees paid (IGN)</th></tr></thead><tbody><tr><td>1, master code</td><td>15:37:30 to 15:57:30</td><td>16</td><td>2,275</td><td>2,161 (103 pending at the cut, all with a receipt 20 s later)</td><td>1.86</td><td>40.7 / 110.8 / 209</td><td>59</td><td>8 / 92 / 224</td><td>60: 49 "replacement underpriced", 10 dropped, 1 skipped (9 of the 11 executed later, see below)</td><td>0.091</td></tr><tr><td>2, fixed code</td><td>15:59:34 to 16:14:34</td><td>16</td><td>1,650</td><td>1,633 (17 pending at the cut)</td><td>1.71</td><td>45.7 / 128.7 / 253</td><td>48</td><td>10 / 99 / 224</td><td>0 (0 nonce retries, 0 deferred)</td><td>0.069</td></tr></tbody></table></div>
|
||||||
|
|
@ -507,7 +506,7 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:
|
||||||
<p>The 72803 cause, in the exporter, not the core. The core's tx accumulator (<code>executor.rs Carry::absorb</code>) hashes every transaction's including miner and blue flag, skipped copies included, and the link hashes the block index; the node enumerates every mergeset block, empty ones included (<code>exec/executor.rs</code>), with the chain block itself last. The export (<code>igneum_exportSegments</code>) listed entries per block as executed-then-skipped with no position, no empty blocks and no miner on a skipped copy, and <code>igneum-prove-export blocks_of</code> sorted them by sequence (every skipped copy behind every executed one), merged consecutive blocks of one miner, dropped the empty blocks and gave a block of skipped copies only the previous block's miner or the zero address. Shown on the Apple M5 Max with the old exporter binary (built from master at 16:03): block 72803 rebuilt under the zero address, link_out 0x362fef10... against the node's 0x111a55ac...; block 72854 (an empty block before the 205 transfers, no skipped copy) link_out 0xd34e57b7... against the node's 0x85f27dc1..., roots equal. 72704 verified only because its transaction block came first.</p>
|
<p>The 72803 cause, in the exporter, not the core. The core's tx accumulator (<code>executor.rs Carry::absorb</code>) hashes every transaction's including miner and blue flag, skipped copies included, and the link hashes the block index; the node enumerates every mergeset block, empty ones included (<code>exec/executor.rs</code>), with the chain block itself last. The export (<code>igneum_exportSegments</code>) listed entries per block as executed-then-skipped with no position, no empty blocks and no miner on a skipped copy, and <code>igneum-prove-export blocks_of</code> sorted them by sequence (every skipped copy behind every executed one), merged consecutive blocks of one miner, dropped the empty blocks and gave a block of skipped copies only the previous block's miner or the zero address. Shown on the Apple M5 Max with the old exporter binary (built from master at 16:03): block 72803 rebuilt under the zero address, link_out 0x362fef10... against the node's 0x111a55ac...; block 72854 (an empty block before the 205 transfers, no skipped copy) link_out 0xd34e57b7... against the node's 0x85f27dc1..., roots equal. 72704 verified only because its transaction block came first.</p>
|
||||||
<p>The fix, both sides ours. Fork (<code>vendor/igneum-node-txgen</code>, branch <code>txgen-export</code>, <code>exec/src/rpc.rs</code>): the export names the mergeset per segment ("blocks": hash, miner, blue, txCount, empty blocks included) and gives every entry "block" and "position" from the executor's boundaries (body order), skipped copies with their block's miner; records without boundaries keep the old shape. Exporter (<code>proving/igneum-prove/export/src/main.rs blocks_of</code>): rebuilds from those fields block for block; an old export is kept in its order and a block of skipped copies whose miner it does not name is refused instead of guessed. <code>tools/prove-fixtures/complete-export.mjs</code> completes an old export with the mergeset from <code>igneum_getSegment</code> (which names every skipped copy's block) for the fixtures. Fixtures <code>proving/fixtures/block-72803-skipped-copies.json</code> and <code>block-72854-empty-block-first.json</code>, each with <code><name>.node-plan.json</code> beside it (the node's <code>igneum_getShardPlan</code>); <code>export/tests/fixtures.rs check_against_node_plan</code> asserts the cut's links, roots, gas, pgas and counts against the node's shard by shard, which the exporter-versus-core checks could not see. Known-failed shown: the old 72854 fixture under that check fails on "links (block index, block gas and pgas, tx accumulator)"; known-good: both new fixtures match the node's link_out exactly. Three unit tests on <code>blocks_of</code> (the 0.3.9 shape with an empty block, a skipped copy between two executed transactions and a block of skipped copies only; a count mismatch refused; the old shape kept in order and the skipped-only block refused). <code>cargo test --release -p igneum-prove-export</code>: 3 + 2 tests pass over 9 fixtures. The guest is untouched (no change under <code>core/</code>). The node side needs the 0.3.9 build and rollout; until every prover exports from a 0.3.9 node, a shard whose transaction block follows an empty block, or whose copies were all skipped, fails the veto.</p>
|
<p>The fix, both sides ours. Fork (<code>vendor/igneum-node-txgen</code>, branch <code>txgen-export</code>, <code>exec/src/rpc.rs</code>): the export names the mergeset per segment ("blocks": hash, miner, blue, txCount, empty blocks included) and gives every entry "block" and "position" from the executor's boundaries (body order), skipped copies with their block's miner; records without boundaries keep the old shape. Exporter (<code>proving/igneum-prove/export/src/main.rs blocks_of</code>): rebuilds from those fields block for block; an old export is kept in its order and a block of skipped copies whose miner it does not name is refused instead of guessed. <code>tools/prove-fixtures/complete-export.mjs</code> completes an old export with the mergeset from <code>igneum_getSegment</code> (which names every skipped copy's block) for the fixtures. Fixtures <code>proving/fixtures/block-72803-skipped-copies.json</code> and <code>block-72854-empty-block-first.json</code>, each with <code><name>.node-plan.json</code> beside it (the node's <code>igneum_getShardPlan</code>); <code>export/tests/fixtures.rs check_against_node_plan</code> asserts the cut's links, roots, gas, pgas and counts against the node's shard by shard, which the exporter-versus-core checks could not see. Known-failed shown: the old 72854 fixture under that check fails on "links (block index, block gas and pgas, tx accumulator)"; known-good: both new fixtures match the node's link_out exactly. Three unit tests on <code>blocks_of</code> (the 0.3.9 shape with an empty block, a skipped copy between two executed transactions and a block of skipped copies only; a count mismatch refused; the old shape kept in order and the skipped-only block refused). <code>cargo test --release -p igneum-prove-export</code>: 3 + 2 tests pass over 9 fixtures. The guest is untouched (no change under <code>core/</code>). The node side needs the 0.3.9 build and rollout; until every prover exports from a 0.3.9 node, a shard whose transaction block follows an empty block, or whose copies were all skipped, fails the veto.</p>
|
||||||
<p>Also noted: the collect job uploads the first 256 KiB of a log file, so a tail needs <code>--command "powershell -NoProfile -Command Get-Content -Tail 500 logs\app-....log"</code>.</p>
|
<p>Also noted: the collect job uploads the first 256 KiB of a log file, so a tail needs <code>--command "powershell -NoProfile -Command Get-Content -Tail 500 logs\app-....log"</code>.</p>
|
||||||
<p>Commands: <code>tools/lock/with-lock.sh run node tools/txgen/run.mjs --duration 1200 --rate 2 --wallets 16 --fund 2 --cap 40 --summary <file></code>; <code>node tools/txgen/proving-watch.mjs watch --interval 30 --duration 1560 --out <jsonl></code>; <code>node tools/txgen/proving-watch.mjs report --summary <summary.json> --pc2-log <collected app log></code>; <code>node tools/prove-fixtures/complete-export.mjs seq.json out.json 72803,72854</code>; <code>igneum-prove-export out.json 72803 proving/fixtures/block-72803-skipped-copies.json</code>. =======</p>
|
<p>Commands: <code>tools/lock/with-lock.sh run node tools/txgen/run.mjs --duration 1200 --rate 2 --wallets 16 --fund 2 --cap 40 --summary <file></code>; <code>node tools/txgen/proving-watch.mjs watch --interval 30 --duration 1560 --out <jsonl></code>; <code>node tools/txgen/proving-watch.mjs report --summary <summary.json> --pc2-log <collected app log></code>; <code>node tools/prove-fixtures/complete-export.mjs seq.json out.json 72803,72854</code>; <code>igneum-prove-export out.json 72803 proving/fixtures/block-72803-skipped-copies.json</code>.</p>
|
||||||
<h2 id="5-october-2026-evening-fud-ledger-sweep-round-6">5 October 2026 (evening), FUD ledger sweep round 6</h2>
|
<h2 id="5-october-2026-evening-fud-ledger-sweep-round-6">5 October 2026 (evening), FUD ledger sweep round 6</h2>
|
||||||
<p>Owner: the consensus engineer and cryptographer agent, worktree <code>igneum-wt-fud-a</code> (branch <code>fud-a</code>), 15:45 to 16:40 UTC. The Mac was loaded throughout (two cargo builds, a txgen run and a fee-switch simnet by other agents; load average over 100), so every figure below is a count, an index, a byte or a number from another machine; the only millisecond figures are the browser verifier's, taken as ratios and labelled. Live reads through the Apple M5 Max node's wRPC (<code>ws://127.0.0.1:28640</code>) and the log intake (Neon HTTP SQL, lines split server-side), never a restart.</p>
|
<p>Owner: the consensus engineer and cryptographer agent, worktree <code>igneum-wt-fud-a</code> (branch <code>fud-a</code>), 15:45 to 16:40 UTC. The Mac was loaded throughout (two cargo builds, a txgen run and a fee-switch simnet by other agents; load average over 100), so every figure below is a count, an index, a byte or a number from another machine; the only millisecond figures are the browser verifier's, taken as ratios and labelled. Live reads through the Apple M5 Max node's wRPC (<code>ws://127.0.0.1:28640</code>) and the log intake (Neon HTTP SQL, lines split server-side), never a restart.</p>
|
||||||
<p><strong>Rolled-out fixes, the live evidence (F23, F24, G12, X18, M30, M31, F25, M20, M26, M27, X21).</strong> The 0.3.5 cut at 06:33 UTC (master 2054ae3, fork 20139145) carried <code>fud-consensus</code>, <code>m20-pruning</code> and <code>miner-reliability</code>; every reachable app machine was on the node line by 09:32 UTC and the hand nodes and the seed restarted on it for the proving activation (<code>docs/plans/release-0.3.6.md</code> 8j, "live devnet: the first shards proven"). Node logs of the five app machines over the 10 hours to 15:45 UTC, one intake query (<code>scratchpad fud-a/nodelines.mjs</code>):</p>
|
<p><strong>Rolled-out fixes, the live evidence (F23, F24, G12, X18, M30, M31, F25, M20, M26, M27, X21).</strong> The 0.3.5 cut at 06:33 UTC (master 2054ae3, fork 20139145) carried <code>fud-consensus</code>, <code>m20-pruning</code> and <code>miner-reliability</code>; every reachable app machine was on the node line by 09:32 UTC and the hand nodes and the seed restarted on it for the proving activation (<code>docs/plans/release-0.3.6.md</code> 8j, "live devnet: the first shards proven"). Node logs of the five app machines over the 10 hours to 15:45 UTC, one intake query (<code>scratchpad fud-a/nodelines.mjs</code>):</p>
|
||||||
|
|
@ -528,7 +527,7 @@ th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:
|
||||||
<p><strong>M1, M16, P14, F16</strong>: arithmetic and documents, no run. M1: the version 2 program space from the generator's draws (slot subset 48.4 bits, operation entropy 3.26 bits, about 770 bits of operations and registers per program, about 1,550 with rotation, bit and mask fields, capped by the 256-bit seed). M16: <code>docs/analysis/m16-recompute-attacker-2026-10-05.md</code>. P14: <code>next_base_fee</code> in <code>igneum/exec/src/executor.rs:501</code> is the one controller; spec 05 section 5.1 now says so. F16: the two options priced from <code>sim/results_v2.md</code> H and M5 and the cloud F21 numbers, in the ledger entry.</p>
|
<p><strong>M1, M16, P14, F16</strong>: arithmetic and documents, no run. M1: the version 2 program space from the generator's draws (slot subset 48.4 bits, operation entropy 3.26 bits, about 770 bits of operations and registers per program, about 1,550 with rotation, bit and mask fields, capped by the 256-bit seed). M16: <code>docs/analysis/m16-recompute-attacker-2026-10-05.md</code>. P14: <code>next_base_fee</code> in <code>igneum/exec/src/executor.rs:501</code> is the one controller; spec 05 section 5.1 now says so. F16: the two options priced from <code>sim/results_v2.md</code> H and M5 and the cloud F21 numbers, in the ledger entry.</p>
|
||||||
<p><strong>C4, the overlay against GHOSTDAG, measured</strong> (<code>tools/finality-attacks/c4.mjs</code>, the live node line <code>target-036</code> 2b6d23ef, fast time, 3 nodes, 100-ms proxied links, ports 29800+; "weight against work": side B with four keys and 70% of the weight table, side A with two keys and 30%; at the cut the rates swap, A at 0.6 and B at 0.4 blocks/s for 150 s, so A builds the heavier chain while only B can certify; heal window 200 s). The first run went out with the override unapplied (the harness library reads it at import; fixed the same hour) and is kept as the rule v2 control:</p>
|
<p><strong>C4, the overlay against GHOSTDAG, measured</strong> (<code>tools/finality-attacks/c4.mjs</code>, the live node line <code>target-036</code> 2b6d23ef, fast time, 3 nodes, 100-ms proxied links, ports 29800+; "weight against work": side B with four keys and 70% of the weight table, side A with two keys and 30%; at the cut the rates swap, A at 0.6 and B at 0.4 blocks/s for 150 s, so A builds the heavier chain while only B can certify; heal window 200 s). The first run went out with the override unapplied (the harness library reads it at import; fixed the same hour) and is kept as the rule v2 control:</p>
|
||||||
<div class="tbl"><table><thead><tr><th>Run</th><th>Rule</th><th>New locks during the split A / B</th><th>First lock A / B (s)</th><th>Blue score A / B at the heal</th><th>Sinks after the heal</th><th>Final chain</th><th>Conflicting certificates</th><th>Disagreeing locked indices</th></tr></thead><tbody><tr><td>control</td><td>v2 (the live devnet's rule), <code>min_daa</code> 120</td><td>4 / 3</td><td>133 / 9</td><td>335 / 296</td><td>apart (n0 on its own)</td><td>none (a finality fork, F21)</td><td>1 on n0</td><td>1</td></tr><tr><td>off</td><td>no certificates (<code>min_daa</code> never)</td><td>0 / 0</td><td>none / none</td><td>330 / 301</td><td>one sink on all three</td><td>A's (the heavier)</td><td>0</td><td>0; B's nodes re-determined 2 indices onto A's chain; n0 reconnected 36 s after the heal</td></tr><tr><td>on, split 150 s</td><td>v3 from checkpoint DAA 0</td><td>0 / 2</td><td>none / 39</td><td>326 / 313</td><td>apart</td><td>none</td><td>3 on n0</td><td>2 (n0 reconnected 66 s after the heal, A's chain past the 120-DAA table by then)</td></tr><tr><td>on, split 90 s</td><td>v3</td><td>0 / 2</td><td>none / 3</td><td>278 / 265</td><td>apart</td><td>none</td><td>3 on n0</td><td>2 (n0 reconnected 6 s after the heal, A's chain at about 58 DAA, inside the table)</td></tr></tbody></table></div>
|
<div class="tbl"><table><thead><tr><th>Run</th><th>Rule</th><th>New locks during the split A / B</th><th>First lock A / B (s)</th><th>Blue score A / B at the heal</th><th>Sinks after the heal</th><th>Final chain</th><th>Conflicting certificates</th><th>Disagreeing locked indices</th></tr></thead><tbody><tr><td>control</td><td>v2 (the live devnet's rule), <code>min_daa</code> 120</td><td>4 / 3</td><td>133 / 9</td><td>335 / 296</td><td>apart (n0 on its own)</td><td>none (a finality fork, F21)</td><td>1 on n0</td><td>1</td></tr><tr><td>off</td><td>no certificates (<code>min_daa</code> never)</td><td>0 / 0</td><td>none / none</td><td>330 / 301</td><td>one sink on all three</td><td>A's (the heavier)</td><td>0</td><td>0; B's nodes re-determined 2 indices onto A's chain; n0 reconnected 36 s after the heal</td></tr><tr><td>on, split 150 s</td><td>v3 from checkpoint DAA 0</td><td>0 / 2</td><td>none / 39</td><td>326 / 313</td><td>apart</td><td>none</td><td>3 on n0</td><td>2 (n0 reconnected 66 s after the heal, A's chain past the 120-DAA table by then)</td></tr><tr><td>on, split 90 s</td><td>v3</td><td>0 / 2</td><td>none / 3</td><td>278 / 265</td><td>apart</td><td>none</td><td>3 on n0</td><td>2 (n0 reconnected 6 s after the heal, A's chain at about 58 DAA, inside the table)</td></tr></tbody></table></div>
|
||||||
<p>Reading (the NEW finding, ledger C4). With the module off GHOSTDAG alone converges on the heavier chain and the losing side's records re-determine (F24 works when the chain moves). With the module on the overlay holds during the split (A, with 30% of the frozen table, locks nothing; B locks 7 and 8) and then fails at the heal in the shipped node: B's certificates for blocks off n0's chain are "kept pending until the chain decides (no lock at this index)", n0's chain never decides because GHOSTDAG keeps its heavier tip and nothing turns the certificate into a fork-choice constraint, and once n0's last lock (index 7, DAA 209) is one window old (DAA 329) the frozen table stops applying on A's chain ("no frozen table (no lock on this chain inside the window)"), A's two keys are 100% of A's own window (B's post-cut blocks are red there) and n0 locks 10, 11, 12 alone; B's certificates for 10 and 11 then log CONFLICTING on n0 (n0 log, 16:27:04 to 16:29:54 UTC). A finality fork from a 96-s honest partition, no attacker, table intact at the heal; the 150-s run and the v2 control end the same way. The spec's fork choice ("GHOSTDAG among tips through all certified checkpoints", 3.5) is therefore implemented only for certificates over blocks already on the node's chain. Fix named in the ledger entry: verify an off-chain certificate against the table at its own block and let it constrain fork choice (a certificate-driven reorg), then re-determine. Raw: <code>scratchpad fud-a/c4-results-*.md</code>, node logs <code>c4-on90-tmp/</code>, <code>c4-v2-control-tmp/</code>. >>>>>>> fud-a</p></article>
|
<p>Reading (the NEW finding, ledger C4). With the module off GHOSTDAG alone converges on the heavier chain and the losing side's records re-determine (F24 works when the chain moves). With the module on the overlay holds during the split (A, with 30% of the frozen table, locks nothing; B locks 7 and 8) and then fails at the heal in the shipped node: B's certificates for blocks off n0's chain are "kept pending until the chain decides (no lock at this index)", n0's chain never decides because GHOSTDAG keeps its heavier tip and nothing turns the certificate into a fork-choice constraint, and once n0's last lock (index 7, DAA 209) is one window old (DAA 329) the frozen table stops applying on A's chain ("no frozen table (no lock on this chain inside the window)"), A's two keys are 100% of A's own window (B's post-cut blocks are red there) and n0 locks 10, 11, 12 alone; B's certificates for 10 and 11 then log CONFLICTING on n0 (n0 log, 16:27:04 to 16:29:54 UTC). A finality fork from a 96-s honest partition, no attacker, table intact at the heal; the 150-s run and the v2 control end the same way. The spec's fork choice ("GHOSTDAG among tips through all certified checkpoints", 3.5) is therefore implemented only for certificates over blocks already on the node's chain. Fix named in the ledger entry: verify an off-chain certificate against the table at its own block and let it constrain fork choice (a certificate-driven reorg), then re-determine. Raw: <code>scratchpad fud-a/c4-results-*.md</code>, node logs <code>c4-on90-tmp/</code>, <code>c4-v2-control-tmp/</code>.</p></article>
|
||||||
</div>
|
</div>
|
||||||
<p class="gen">Generated from the repository at build time. Times are UTC. Machine names are model names.</p>
|
<p class="gen">Generated from the repository at build time. Times are UTC. Machine names are model names.</p>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -232,23 +232,23 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"date": "2026-10-03",
|
"date": "2026-10-03",
|
||||||
"text": "RTX 5090, memory-hard dataset",
|
"text": "RTX 5090 first run",
|
||||||
"short": "RTX 5090 on the memory-hard dataset"
|
"short": "RTX 5090 first run"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"date": "2026-10-03",
|
"date": "2026-10-03",
|
||||||
"text": "Proto-opencl: OpenCL path built and proven without AMD silicon",
|
"text": "AMD gfx1036 , AMD OpenCL 2.1 driver 3652.0",
|
||||||
"short": "OpenCL worker built and proven without AMD silicon"
|
"short": "AMD integrated GPU runs the hash through OpenCL"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"date": "2026-10-03",
|
"date": "2026-10-03",
|
||||||
"text": "RTX 5090 through NVIDIA OpenCL",
|
"text": "First devnet blocks on the real lottery hash: CPU, then Metal GPU, three worker implementations",
|
||||||
"short": "RTX 5090 through NVIDIA OpenCL"
|
"short": "First devnet blocks on the real lottery hash"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"date": "2026-10-03",
|
"date": "2026-10-03",
|
||||||
"text": "Igneum-node devnet v0: 3-node igneum-devnet at 1 BPS with the 80/20 coinbase and vote_key_hash",
|
"text": "Windows node package: igneumd cross-compiled for x86_64-pc-windows-gnu, two-peer sync test",
|
||||||
"short": "Devnet v0: three nodes at one block per second"
|
"short": "Windows node package: cross-compiled, two-peer sync"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue