From 3be4501c8dcae692b5ef770b680785d72026b9d1 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:21:00 +0000 Subject: [PATCH] release-0.3.6 plan: the fork results, miner-latency in after its three gates, the release dev-fee address Fork release-0.3.6 final tip 2b6d23ef = a11455e7 (testnet-params merged, the fee height switch) + cf369022 (the release dev-fee address 0x7F45d7d7272e57639BeBb739A60B05bB2CD4C126, docs/design/miner-dev-fee.md updated here) + the miner-latency merge, which landed only after the miner suite (15 passed), the 3-node fast-time run (243 blocks, 0 rejected, 0 red, sinks agree, switched p50 46 to 52 ms) and the dev-fee harness (8 of 8 fee blocks on chain, control at 0) passed on the merged tree. Co-Authored-By: Claude Fable 5.1 --- docs/design/miner-dev-fee.md | 7 +++--- docs/plans/release-0.3.6.md | 49 +++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/docs/design/miner-dev-fee.md b/docs/design/miner-dev-fee.md index d0ec4032..479be688 100644 --- a/docs/design/miner-dev-fee.md +++ b/docs/design/miner-dev-fee.md @@ -33,7 +33,7 @@ Source: `vendor/igneum-node-v4` branch `dev-fee`, `igneum/miner/src/main.rs`, se | `igneum-miner mine ... --dev-fee ` | whole percent of templates; default 1; `--dev-fee 0` turns it off | | Start line, on | `dev fee 1% (1 block in 100) to 0x
; --dev-fee 0 turns it off` | | Start line, off | `dev fee off (--dev-fee 0); the default is 1% (1 block in 100) to 0x
` | -| Start line, no release address | `dev fee off: no release address is set (DEV_FEE_ADDRESS placeholder in igneum/miner/src/main.rs)` | +| Start line, no release address (a build whose `DEV_FEE_ADDRESS` is not 40 hex; none since 5 October 2026) | `dev fee off: no release address is set (DEV_FEE_ADDRESS placeholder in igneum/miner/src/main.rs)` | | Per fee block accepted | `dev-fee block ` | | Status line (CPU and worker modes) and `MINER SUMMARY` | `fee=N` | | `igneum-miner payouts ` | blocks per `IGNA` payout address over every block the node holds, with the share; the dev address is tagged `(dev fee)` | @@ -47,7 +47,7 @@ extra config. | Constant (`igneum/miner/src/main.rs`) | Value | Network | |---|---|---| -| `DEV_FEE_ADDRESS` | the placeholder string `DEV_FEE_ADDRESS`; **the project lead fills it before any public release**. While it is not 40 hex the fee is off outside the devnet and the miner says so at start | mainnet, testnet | +| `DEV_FEE_ADDRESS` | `0x7F45d7d7272e57639BeBb739A60B05bB2CD4C126`: the project lead's payout address from the Igneum Wallet, given 5 October 2026, EIP-55 checksum verified, on file at `~/.config/igneum/dev-fee-release.json`; set on the fork's `release-0.3.6` (commit cf369022). Were it ever not 40 hex the fee would be off outside the devnet and the miner would say so at start | mainnet, testnet | | `DEV_FEE_ADDRESS_DEVNET` | `0xdfaea67368f3e3753397d878f97efe6aa8020c2e` | devnet and simnet only | The devnet address was generated on 4 October 2026 with the app's own key derivation (secp256k1, keccak of the @@ -59,7 +59,8 @@ have no value and the devnet may be reset; this address is never a release addre - Unit tests (`cargo test --release -p igneum-miner dev_fee_tests`): exactly 100 fee templates in 10,000 at 1%, at positions 99, 199, ...; 0 at `--dev-fee 0`; 2, 3, 5, 10, 50 and 100% exact over 10,000; a fee template carries the - dev `IGNA` address and the user's unchanged key reveal; the release placeholder keeps the fee off outside the devnet. + dev `IGNA` address and the user's unchanged key reveal; the release address pays the fee on mainnet and testnet (and + never the devnet address), and a non-hex placeholder keeps the fee off. - Test network: `node tools/dev-fee/run.mjs` (two nodes on 29900+, fast-time profile, proof of work skipped and the genesis target at the floor, three CPU stub miners: two at the default fee and one control at `--dev-fee 0`), then `igneum-miner payouts` on the peer node. The numbers are in `docs/bench-log.md` under "the software dev fee measured". diff --git a/docs/plans/release-0.3.6.md b/docs/plans/release-0.3.6.md index 5494ac7d..30d49d8b 100644 --- a/docs/plans/release-0.3.6.md +++ b/docs/plans/release-0.3.6.md @@ -47,15 +47,39 @@ On top of the merge, the fee height switch (section 5), in the same branch: | `shard_proving_gas_budget_at(daa)` | `consensus/core/src/proving.rs` | | every reader takes a DAA score; `execute_segment` picks the set by the block's DAA score and raises the carried base fees to its floors; the inspector carries the block's pgas table (modexp reads it); `next_base_fee` takes floor and denominator; the pool's `add` and `select` and every RPC quote use the tip's DAA score plus one; the shard plan uses the segment's; one new executor test | `igneum/exec/src/{config,executor,pgas,pool,proving,rpc,service}.rs` | +On top of that, two more fork commits: + +| Commit | What | +|---|---| +| cf369022 | `DEV_FEE_ADDRESS` = `0x7F45d7d7272e57639BeBb739A60B05bB2CD4C126`, the release dev-fee payout address (testnet and mainnet; the project lead, 5 October 2026, EIP-55 checksum verified, on file at `~/.config/igneum/dev-fee-release.json`); `DEV_FEE_ADDRESS_DEVNET` unchanged; the placeholder test replaced by `the_release_address_pays_the_fee_outside_the_devnet` (`cargo test -p igneum-miner dev_fee`: 5 passed). `docs/design/miner-dev-fee.md` updated on this branch | +| 2b6d23ef | the merge of fork `miner-latency` (section 2), the final tip of `release-0.3.6` | + ### 1c. What is out | Branch | Why | |---|---| -| fork `miner-latency` (0f88b6d6, `vendor/igneum-node-latency`, one commit over `devnet-v4`) and the app repository's local `miner-latency` (dd47ff3: `tools/miner-latency/run.mjs`, its plan and bench-log entries; never pushed to origin) | see section 2 | +| the app repository's local `miner-latency` (dd47ff3, worktree `igneum-wt-latency`: `tools/miner-latency/run.mjs`, `docs/plans/miner-latency.md`, two bench-log entries; never pushed to origin) | not part of this task; it conflicts with `testnet-adopt` only in `docs/bench-log.md` (both appended entries) and can be merged at any time. The harness was run from that worktree for section 2 | -## 2. The miner-latency decision +## 2. The miner-latency decision: IN -(filled in below once the merged tree's miner tests and the 3-node fast-time run have been read) +Fork `miner-latency` (0f88b6d6, `vendor/igneum-node-latency`, one commit over `devnet-v4`: the NewBlockTemplate +subscription in the miner, node-side template prewarm, workers switching without draining the batch, `--poll-templates` +and `--job-ms`) was merged on a side branch first (`release-0.3.6-latency`, worktree `vendor/igneum-node-036-lat`, +c07093ce) and landed on `release-0.3.6` (2b6d23ef) only after both gates passed on the merged tree: + +| Gate | Command | Result | +|---|---|---| +| Miner tests | `cargo test -p igneum-miner` on c07093ce | ok: 15 passed, 0 failed | +| 3-node fast-time run | `node tools/miner-latency/run.mjs --mode subscribe` (from `igneum-wt-latency`, `IGNEUMD` and `IGNEUM_MINER` = the release build of c07093ce in `vendor/igneum-node/target-036-lat/release`, under the `run` lock, 08:11 to 08:16Z) | 3 nodes up (peers 2/1/1 throughout), 3 CPU miners at 2 threads for 295 s: 82 + 81 + 80 blocks accepted, 0 rejected; chain blocks 228, merged blue 15, merged red 0, tips mean 1.03 max 2, sinks agree; 236 to 241 template switches per miner, notified p50 14 to 16 ms, template p50 20 to 24 ms, switched p50 46 to 52 ms (p90 118 to 130 ms, max 194 to 372 ms); node prewarm 52 to 56 builds a minute, mean 3 to 4.5 ms; 1 to 2 stale submits per miner; no error, panic or WORKER FAULT line in any miner log | +| The dev fee through the new feed | `node tools/dev-fee/run.mjs --secs 180` on the same binaries (two nodes, three stub miners, two at the default fee and one at `--dev-fee 0`, then `igneum-miner payouts`; 08:17 to 08:20Z) | pass: miner-a found=327 fee=4, miner-b found=301 fee=4, control miner-c found=309 fee=0 (0 `dev-fee block` lines); `payouts` on both nodes: 938 blocks, the devnet dev address 8 blocks = the miners' counters, 1.27% of the fee-paying miners' blocks against the 1% expectation | + +The conflicts (13 hunks in `igneum/miner/src/main.rs`, the 0.3.5 dev fee and X21 mismatch guard against the latency +rewrite of the template path) were resolved by keeping both sides: the feed takes the dev fee and requests one +template in 100 with it, as the 0.3.5 fetcher did; the continuous CPU loop carries the fee through `Work.dev_fee` +and counts fee blocks; the found path runs `check_found` into the mismatch guard; `WorkEngine::Real` holds the +day-keyed `EpochRef` of M30. The 3-node run above showed `fee=0` on every miner: 243 blocks found at 1 in 100 +templates expects about 2.4 fee blocks, and zero has a probability of about 9%, so the dev-fee harness was run as +the third gate; it showed the fee riding through the new feed (8 of 8 fee blocks on chain, the control at 0). ## 3. Test results, with the command @@ -77,7 +101,19 @@ Every build ran through the main checkout's lock, `/Users/joshm/Projects/igneum/ ### 3b. The node fork (worktree `vendor/igneum-node-036`) -(filled in below) +| Fork tip | Command | Result | +|---|---|---| +| a11455e7 (testnet-params merged, the fee switch) | `cargo test -p kaspa-consensus-core` with `IGNEUM_FAST_TIME_FILE=/infra/fast-time/override-60x.json` (the fast-time test wants every override field; the main checkout's file predates `fees`) | ok: 101 passed, 0 failed, 2 ignored (lib) + 7 (db_compat); among them `igneum_testnet_identity`, `override_params_carry_the_fees`, `override_params_carry_the_fees_v1_activation`, `consensus_digest_keeps_the_0_3_5_value_until_the_fee_switch_is_set` (pins 9409dedac4bf... for the devnet params), `consensus_digest_covers_every_consensus_field_and_nothing_else` (the fee switch in its list), `test_genesis_hashes`, `fast_time_60x_file_is_the_devnet_at_60x`; 07:41Z | +| a11455e7 | `cargo test -p igneum-exec` | ok: 11 passed, 0 failed; among them `the_fee_switch_meters_by_the_block_daa_score` (a block below the switch meters 200 intrinsic pgas and keeps its base fees; the block at the switch meters 300 and its base fees jump to the v1 floors) and the bomb tests re-sized to fit both tables; 07:43Z | +| a11455e7 | `cargo test -p kaspa-consensus --features igneum-pow -- finality` | ok: 8 passed, 0 failed (92 filtered), 125.9 s | +| a11455e7 | `cargo test -p kaspa-consensus --features igneum-pow -- difficulty` | ok: 15 passed, 0 failed | +| a11455e7 | `cargo test -p igneum-miner` | ok: 12 passed, 0 failed (the guard and dev-fee tests) | +| c07093ce (miner-latency merged on the side branch `release-0.3.6-latency`, worktree `vendor/igneum-node-036-lat`, `CARGO_TARGET_DIR=target-036-lat`) | `cargo test -p igneum-miner` | ok: 15 passed, 0 failed (the 12 above and `job_size_follows_the_target_ms`, `cpu_found_nonce_is_matched_to_its_own_work`, `worker_found_hash_is_matched_to_its_own_template`) | +| c07093ce | 3-node fast-time run (section 2) | pass (section 2) | +| cf369022 (the release dev-fee address) | `cargo test -p igneum-miner dev_fee` | ok: 5 passed | +| 2b6d23ef (the final tip: cf369022 plus the latency merge) | `cargo test -p igneum-miner` | ok: 15 passed, 0 failed | + +Not built here: the release binaries for the three platforms (section 4b). ## 4. The morning cut, in order @@ -132,8 +168,9 @@ node tools/ship-app.mjs 0.3.6 \ ``` The 0.3.6 binaries are NOT built yet (this plan stops at the suites; section 3b says what was and was not built). -Build them as 0.3.5's section 4a did: Mac `cargo build --release -j 4 -p kaspad -p igneum-miner --features -kaspad/igneum-pow` with `CARGO_TARGET_DIR=vendor/igneum-node/target-036`; Windows through +Build them from fork 2b6d23ef as 0.3.5's section 4a did: Mac `cargo build --release -j 4 -p kaspad -p igneum-miner +--features kaspad/igneum-pow` with `CARGO_TARGET_DIR=vendor/igneum-node/target-036` (the release build in +`target-036-lat` is of c07093ce, one commit short: no release dev-fee address); Windows through `proto-cuda/windows-node/cross-build.sh`; Linux through `infra/cross/build-linux.sh`. The push to master triggers `windows.yml`, which now verifies the inputs of 4a before it builds the app.