Docs: devnet-v4 integration section (merge order, devnet v4 rules, compatibility, cut-over commands) and bench-log entry
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
50ad9198d2
commit
bcce17e8da
2 changed files with 106 additions and 1 deletions
|
|
@ -500,3 +500,26 @@ Simulator, seeds 7 to 9 (`attacks.py --scenario ts --ts-rules tight`), forger at
|
|||
Base-profile regression, 3-seed means, 3 October against 4 October: record 102.8 against 91.0 s settled (first within 10% 70.3 against 68.5 s); up50 154.4 against 154.4; down50 782.3 against 762.2 (worst gap 78.3 against 73.9 s); epoch30 87.6 against 87.6; hop10 239.4 against 245.1; polluted 70.1 against 74.9 (seed 9: 78.9 against 92.0), peak 8.0x against 11.4x; steady std unchanged. All means within 10%; the two profiles with an idle gap move, because a gap over 60 T is paid back as three 20 T steps instead of one clamped step.
|
||||
Test network (3 `igneumd` nodes from the fix plus the `diff-attacks` template hook on a scratch branch, ports 28500 to 28521, appdir `/tmp/igneum-diff-fix`, genesis bits `0x1f010000`, honest 4-thread miner A on node 1 for 15 min, forger F 4 threads honest on node 2 for 5 min then on node 3 with the offset, two runs): earliest allowed stamp (offset -1e9 ms, floored by the rules; 986 blocks, 823 chain, 0 rejected): chain rate 0.82 blocks/s honest (60 to 300 s) at difficulty 102,226, 0.88 during forging (300 to 900 s) at 100,134, 0.83 in the last 300 s at 106,141, all-blocks rate 1.00 / 1.02 / 0.95, forger offsets -10 to -90 s (mean -23), hash A 0.110 MH/s, F 0.109. Latest allowed stamp (+9,000 ms; 1,028 blocks, 829 chain, 0 rejected): 0.78 honest at 102,382, 0.89 forging at 96,717, 0.89 last 300 s at 102,754, all-blocks 0.95 / 1.09 / 1.11, offsets +9 to +26 s, hash A 0.112, F 0.111. Flat within the CPU miners' noise; the 3 October rule on the same schedule fell to 0.24 blocks/s at 275,135 and 0.59 at 170,222 (bench-log entry above). Records in `/tmp/igneum-diff-fix/ts-past-igneum/record.csv` and `ts-future-igneum/record.csv` (not archived into the repo).
|
||||
Not done: the DAG effect of forged stamps on red and merged blocks (one chain in the simulator); the clock of a header whose parent arrived through a pruning proof starts from the raw stamp (one window of exposure after a sync, unmeasured); upstream's timestamp integration tests assume the 132 s bounds and were not re-run; the hopper's 0.7-point excess over Kaspa's rule stays open.
|
||||
|
||||
## 4 October 2026, devnet-v4 integration: nine branches merged, 3-node test network on the merged node, Windows cross-build (release engineer)
|
||||
|
||||
Machine: Apple M5 Max, shared (load 8 to 16, another agent's build and the live devnet running throughout), rustc stable, every build and test at nice 19 with 6 jobs into `vendor/igneum-node/target-integration`. Branch `devnet-v4` of `vendor/igneum-node`, head `dc749905`; merge order, conflicts and the cut-over commands in `docs/fork-divergence.md`, "Integration 4 Oct 2026". The hot swap was not in master (no `pow_epoch` in `2a00ff55`); it was captured from the uncommitted hotswap worktree as `a4224689` and merged first. Build times: first release build 3 min 37 s, the execution layer's crates 6 min more, the Windows cross-build 4 min 49 s from a warm dependency cache (`proto-cuda/windows-node/cross-build.sh vendor/igneum-node-v4 6`).
|
||||
Tests: 628 passed, 0 failed, 24 ignored across the 21 touched crates (`--no-fail-fast`), then kaspa-p2p-flows 30 of 30 after the `estimated_header_size` fix (the header's `voteKeyHash` field was not counted since `815cd00f`). Three Kaspa UTXO-body tests are ignored with the reason (the execution layer retires UTXO transactions from bodies); two p2p-lib test modules were brought to the pair-shaped `BlockBody`.
|
||||
Test network, 02:02:27 to 02:18:53 BST: 3 `igneumd` on `igneum-devnet-880` (gRPC 28800/28810/28820, p2p 28801/28811/28821, wRPC JSON 28802/28812/28822, eth RPC 28803/28813/28823; node 2 and 3 `--addpeer` node 1, node 3 also node 2), override file `genesis_bits` 0x1f010000 (2^16) and finality interval 30, depth 20, window 300 DAA, dust 5, presence 20, aggregators 8, ban 300, `min_daa` 300, fallback 15; `IGNEUM_POW_EPOCH_BLOCKS=300`, `IGNEUM_POW_EPOCH_LEAD=60` (a short epoch so the hourly swap crosses boundaries inside the run; the devnet values are 3,600 and 600). Miners m1, m2, m3 (`igneum-miner mine ... 3 960 --engine igneum-pow --payout-label mN --evm-address 0x7099...79C8`), 0.078 MH/s each (3 threads on the loaded machine), 375 / 342 / 338 blocks found, 0 rejected.
|
||||
|
||||
| Measure | Value |
|
||||
|---|---|
|
||||
| Blocks accepted per node (PoW accepted lines) | 1,055 / 1,055 / 1,055, 0 rejected, 0 invalid |
|
||||
| Block rate | 95 to 1,026 blocks between the 0-s and 900-s samples: 1.03 blocks/s; 1,055 in 960 s |
|
||||
| Sink identical on all 3 nodes | 31 of 31 samples; peers 2 on every node at every sample; max tips 2 |
|
||||
| Difficulty (dual-lane rule) | 56,268 at 20 s, 155,835 peak at 90 s, 110,533 at 900 s |
|
||||
| Epoch boundaries (DAA 300, 600, 900) | first block of the new epoch accepted 2.23 / 0.50 / 1.47 s after the last of the old; inter-accept gap over the run median 0.59 s, p90 2.21 s, max 7.27 s |
|
||||
| Caches built per node | 4 (genesis day plus the three epoch seeds); miners' CPU program and cache for a new seed ready in 191 to 212 ms |
|
||||
| Finality | window filling to DAA 300, paused one sample, active from 270 s (DAA 363); first lock checkpoint 11 (blue 331) by 3 of 3 voters at 100%; 24 locks to checkpoint 34, same index on all 3 nodes at every sample; checkpoint 12 locked at 2 of 3 votes (68.1% of active and of total) |
|
||||
| Lock latency (miner, proposed to locked over RPC) | median 1,011 / 1,012 / 1,010 ms, max 1,988 / 2,716 / 1,965 ms; 34 of 34 votes accepted per miner |
|
||||
| EVM smoke (`tools/evm-smoke`, copy outside the repo, `IGNEUM_RPCS` on 28803/28813/28823) | 84 of 85 checks in 118 s: chain id 4463, miner balance 428.5 IGN at chain block 113 (the `IGNA` payout address), three accounts funded, 59 transfers executed in 10 chain blocks (max 17 per block, 33 to 91 us execution per block), deploy, call, receipts, logs, revert, developer share, state roots identical across nodes; the failing check is "duplicates landed in parallel blocks within 6 attempts" (identical copies to two nodes landed once in 2 of 6 attempts, the conflicting pair never both), which needs parallel blocks the PoW network did not produce in that 36 s (tips 1 at most samples) |
|
||||
| `igneum-exec-diff` on the smoke export | segments 0 to 198, 59 transactions compared, 8 accounts, 0 mismatches |
|
||||
| Harness scenario 5 (ports 28900+, copy of `tools/harness`) | 63 cases (46 RPC, 17 p2p): node up on every case, 0 cache builds (RSS flat, node log 1 build = the honest day), the M15 p2p cases disconnected by the strike guard: PASS |
|
||||
| Harness scenario 2 (copy adapted to the merged rules; the repo copy probes 132 s and `pmt+1`) | live: floor-2 and floor-1 rejected, floor and floor+1 accepted where floor = max(pmt + 1, parent - 10 s); future flip between +10.00 and +10.02 s; sim: honest 0.908 b/s, ahead +0.2%, oscillate -0.7% over 1,200 virtual s: PASS |
|
||||
|
||||
Binaries: `target-integration/release/{igneumd 40,463,680 B, igneum-miner 7,916,096 B, igneum-exec-diff, igneum-inject, igneum-p2p-probe, igneum-harness-sim}`; `target-integration/x86_64-pc-windows-gnu/release/{igneumd.exe 50,169,344 B, igneum-miner.exe 10,045,440 B}`; package `/tmp/igneum-integration/igneum-node-windows-v4.zip` (32,946,104 B). Not done: the GPU `prepare` hot-swap path on the merged miner (CPU miners only here), the cut-over itself, v4 builds for the Mac seed relay and igneum-seed-1, the repo harness's scenario 2 rules and its scenario 5 summary text (stale "built a cache on HEAD" wording while the per-case data says 0 builds).
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ Implements `docs/design/execution-layer.md` D1 to D10 and section 8.2 on a 3-nod
|
|||
| Decision | v0 choice | Why it is open |
|
||||
|---|---|---|
|
||||
| 8 or 18 decimals | Kaspa's 8 (`SOMPI_PER_KASPA`), so one coin is 100,000,000 units and the cap is 4e17 units, inside u64 | The zkEVM side expects 18 decimals (wei). 18 decimals put the cap at 4e27, which does not fit u64, so the UTXO amount type, mass rules and every RPC amount would change. Decide with the execution engineer before the EVM bridge; a fixed 1e10 scaling at the bridge is the alternative. |
|
||||
| Epoch seed | Devnet seed rule with a lead (hot swap, 3 Oct 2026): the seed of epoch `k` is the hash of the last selected-chain block whose DAA score is below `k x EPOCH - LEAD` (`EPOCH` 3,600, `LEAD` 600 DAA score, about 10 minutes at 1 block/s; `kaspa_consensus_core::igneum::{POW_EPOCH_BLOCKS, POW_EPOCH_LEAD, pow_epoch_seed_score}`); genesis for epoch 0. Every block template carries `pow_epoch` (`RpcPowEpochInfo`: epoch length and lead, the template's epoch index and seed, the boundary DAA score, the next epoch's seed once the sink has reached `boundary - LEAD`, the day index and the next one), so a miner sends `prepare` to its GPU worker one lead ahead and the worker swaps programs at the boundary with no pause and no process exit. Before 3 Oct 2026 evening: the last selected-chain block below the epoch's start score (no lead). `IGNEUM_POW_EPOCH_BLOCKS` and `IGNEUM_POW_EPOCH_LEAD` override both for private test networks (the lead is clamped below the epoch length); `IGNEUM_DEVNET_GENESIS_BITS` overrides the devnet genesis difficulty for such a network (the genesis hash moves, so it never peers with the real devnet). | This is the devnet stand-in for the 20-minute VDF lead of spec 04 (section 4.3: `C(e)` is the checkpoint at least 1,200 DAA s before the epoch, the VDF takes 600 s, so the program is knowable 10 minutes early). The design uses a 10-minute class-group VDF over a certified checkpoint (bench-log, proto-vdf); the devnet rule keeps the lead and drops the delay, so it is grindable in principle (a miner choosing which block sits at the seed score) and needs the VDF and checkpoints to close. The hash binding (`igneum-pow/src/bind.rs`) is unchanged. |
|
||||
| Epoch seed | Devnet seed rule with a lead (hot swap, 3 Oct 2026): the seed of epoch `k` is the hash of the last selected-chain block whose DAA score is below `k x EPOCH - LEAD` (`EPOCH` 3,600, `LEAD` 600 DAA score, about 10 minutes at 1 block/s; `kaspa_consensus_core::igneum::{POW_EPOCH_BLOCKS, POW_EPOCH_LEAD, pow_epoch_seed_score}`); genesis for epoch 0. Every block template carries `pow_epoch` (`RpcPowEpochInfo`: epoch length and lead, the template's epoch index and seed, the boundary DAA score, the next epoch's seed once the sink is a quarter of the lead past `boundary - LEAD` (the selected chain still flips between sibling tips right at the seed score; the quarter leaves three quarters of the lead for the prepare), the day index and the next one), so a miner sends `prepare` to its GPU worker one lead ahead and the worker swaps programs at the boundary with no pause and no process exit. Before 3 Oct 2026 evening: the last selected-chain block below the epoch's start score (no lead). `IGNEUM_POW_EPOCH_BLOCKS` and `IGNEUM_POW_EPOCH_LEAD` override both for private test networks (the lead is clamped below the epoch length); `IGNEUM_DEVNET_GENESIS_BITS` overrides the devnet genesis difficulty for such a network (the genesis hash moves, so it never peers with the real devnet). | This is the devnet stand-in for the 20-minute VDF lead of spec 04 (section 4.3: `C(e)` is the checkpoint at least 1,200 DAA s before the epoch, the VDF takes 600 s, so the program is knowable 10 minutes early). The design uses a 10-minute class-group VDF over a certified checkpoint (bench-log, proto-vdf); the devnet rule keeps the lead and drops the delay, so it is grindable in principle (a miner choosing which block sits at the seed score) and needs the VDF and checkpoints to close. The hash binding (`igneum-pow/src/bind.rs`) is unchanged. |
|
||||
| Day seed for the 256 MiB cache | `"igneum-day/" \|\| day_le64` with `day = header.timestamp / 86,400,000` | Timestamps are miner-chosen inside the two timestamp rules, so a day boundary can be straddled by a few blocks; harmless for a cache seed. On branch `r3-fixes` the day seed is computed only after the future and past-median checks pass (M15 below), so an arbitrary past day no longer reaches the engine. Spec 01 O-1.10 proposes the first epoch seed of the day instead, which waits for the VDF schedule. |
|
||||
| Lane hash to 256-bit target | Lane hash (64 bits) in the top 64 bits, low 192 bits zero; `pow <= target` is exactly `lane <= target >> 192` | Closed for the binding (3 Oct 2026, `igneum-pow/src/bind.rs`: the init words commit to the nonce-zeroed header hash and the high nonce word). Still open: the block level for pruning proofs reads `calc_level_from_pow` on a value whose low 192 bits are zero (`leading_zeros(lane)` shifted), and pruning-proof validation itself still uses the stub. |
|
||||
| GPU workers and the hourly program | Hot swap (3 Oct 2026): the serve protocol has `prepare <epoch_seed_hex> <day_seed_hex> [<pack_dir>]`; the worker compiles the next program (and builds the next day's dataset) in the background, keeps at most two programs and two datasets resident, answers `prepared <epoch> <day> <ms> ...`, switches instantly on the first job with the prepared pair and drops the old pair after it. Metal compiles from the seed; OpenCL builds `<pack_dir>/kernel_bound.cl` at runtime; CUDA runs nvcc to two cubins in the background and loads them through the driver API (`cudaGetDriverEntryPoint`). The miner (`igneum-miner --worker`) writes the pack for the prepared seeds under `--prepare-packs` and sends `prepare` as soon as the template reports the next seed; `--exit-on-seed-change` (exit 42, launcher rebuild) is the fallback for a worker whose ready line says `prepare 0`. A worker crash is restarted by the miner after a random 5 to 60 s. | Measured on the Metal worker across a short-epoch test network: see `docs/bench-log.md`, hot-swap entry. CUDA and OpenCL prepare paths are written and compile-checked (OpenCL ran on the M5 Max through Apple's OpenCL); the CUDA path has not run on NVIDIA hardware yet. |
|
||||
|
|
@ -160,3 +160,85 @@ Implements `docs/design/execution-layer.md` D1 to D10 and section 8.2 on a 3-nod
|
|||
| 32 and after | 64 on | 0 | 0 | 0 |
|
||||
|
||||
Split of 3,168,808,781: producer 2,535,047,025 (80%, plus the rounding remainder), proving pool 633,761,756 (20%). Total over the schedule: under the 4,000,000,000-coin cap by less than 100 coins (test `total_emission_stays_under_the_cap`).
|
||||
|
||||
## Integration 4 Oct 2026: branch `devnet-v4` (release engineer)
|
||||
|
||||
One branch, `devnet-v4` in `vendor/igneum-node` (worktree `vendor/igneum-node-v4`, head `dc749905`), merges every branch of 3 and 4 October in the order below. Every merge was built (`cargo build --release -p kaspad -p igneum-miner -p igneum-exec --features kaspad/igneum-pow`, `CARGO_TARGET_DIR=vendor/igneum-node/target-integration`, nice 19, 6 jobs) and its branch tests passed before the next merge. Commit messages carry the conflict notes; this section is the summary and the cut-over guide. Nothing of the live devnet (node 1 on 26610/26611, the observer peer on 26640/26641/28640, the seed relay on 26680) was touched; the test network ran on ports 28800 to 28923 under `/tmp/igneum-integration`.
|
||||
|
||||
| # | Merged | Commit | Conflicts | Resolution |
|
||||
|---|---|---|---|---|
|
||||
| 0 | master | `2a00ff55` | | Finality v2 and the BLS miner. The hot swap was NOT in master: `git grep` finds no `pow_epoch`, `POW_EPOCH_LEAD` or `RpcPowEpochInfo` anywhere in `2a00ff55`, so the fin-fixes merge note above ("master already contains the hot-swap branch") was wrong. The hot swap lived only as the uncommitted working tree of `vendor/igneum-node-hotswap` (13 files, 832 insertions on top of the rename commit). It was captured as commit `a4224689` on branch `hotswap-wip` (a new worktree; the hotswap worktree was not touched). |
|
||||
| 1 | hotswap-wip | `a4224689` | `igneum/miner/src/main.rs` (14 hunks) | The BLS `Identity` and the `Voter` are kept and threaded through the hot swap's pipelined worker: one BLS identity and one voter per `--identities` label (`<label>-i`), the voters ticked by a background task off the mining loop; `Seeder` keeps master's genesis discovery plus the hot swap's per-block memo and `walk_calls`. Everything else merged clean (`pow_epoch` on the template beside the finality fields). |
|
||||
| 2 | fin-fixes | `da1eb889` | none | |
|
||||
| 3 | r3-fixes | `8684775f` | none | `validate_header` keeps the r3 order and `epoch_seed` keeps the lead; both call `check_pow_and_calc_block_level` last. |
|
||||
| 4 | execution-layer | `b7fca5a0` | `Cargo.lock`, `rpc/service/src/service.rs`, `igneum/miner/src/main.rs` | The template carries both `pow_epoch` and the execution layer's EVM selection. Miner: `--vote-key-hash` is gone (the vote key hash is now the hash of a BLS key, so nobody holds an EVM key for its low 20 bytes); the payout address moves into the body as the coinbase extra-data tag `IGNA || 40 hex`, see "devnet v4 rules" below; `--hold-ms` and `--network simnet` kept. Lock: ours, then cargo resolved the alloy and revm entries (`aab9bb8a`). |
|
||||
| 5 | difficulty | `52eacad9` | `consensus/core/src/config/params.rs`, `consensus/core/src/igneum.rs`, `igneum/miner/src/main.rs` | The hardened commit (10 s timestamp rules, sanitised clock, 2^128 floor) had landed at 00:21 UTC, so no wait. Both master and difficulty had added `OverrideParams.genesis_bits`: one declaration kept, `difficulty_rule` beside it. `igneum.rs`: `PowEpochInfo` and the `pow_epoch_*` functions kept beside `DifficultyRule` and the `difficulty` module. Miner: ours (master's `Seeder` is a superset). One deliberate change beyond the text: the window manager's epoch length is `pow_epoch_blocks()` (3,600 on the devnet, the `IGNEUM_POW_EPOCH_BLOCKS` override on test networks), not the constant, so the difficulty rule's epoch lane and the program change agree on every network. |
|
||||
| 6 | harness | `f42af9a2` | `Cargo.toml`, `Cargo.lock` | Both member lists kept (execution crates and harness crates). |
|
||||
| 7 | windows-node | `352495f6` | none | |
|
||||
| 8 | exec-attacks | `63ff5d99` | none | |
|
||||
| 9 | diff-attacks | `4806e21c` | `consensus/src/processes/difficulty.rs` | The branch's `should_panic` flood reproduction is superseded by the hardened commit's `igneum_flood_at_85_blocks_per_second_stops_at_the_minimum_target`; the hardened test kept. |
|
||||
|
||||
Test-only and bug-fix commits after the merges: `04b5a16d` (p2p convert tests: `BlockBody` is a pair, `BlockMessage` has `evm_transactions`; the execution branch had not updated them, so `cargo test -p kaspa-p2p-lib` did not compile), `0e5124c6` (three Kaspa UTXO-body tests marked `ignore` with the reason: `validate_body_in_isolation_test`, `validate_body_in_context_test`, `double_search_disqualified_test` build bodies with UTXO transactions, which the execution layer rejects as `UtxoTransactionsRetired`; they failed on that branch before the merge), `dc749905` (`estimated_header_size` in `protocol/flows/src/v10/request_headers.rs` counted four hash fields; the header has carried `voteKeyHash` since `815cd00f`, so IBD header chunks were under-estimated by one hash field per header and `estimated_header_size_covers_protobuf_size` failed; a real bug on master, fixed).
|
||||
|
||||
Full suites at the end (`cargo test --release --no-fail-fast` over kaspa-consensus-core, kaspa-consensus, kaspa-pow, kaspa-p2p-flows, kaspa-p2p-lib, kaspa-rpc-core, kaspa-grpc-core, kaspa-rpc-service, kaspa-notify, kaspa-mining, kaspa-addressmanager, kaspa-connectionmanager, kaspa-database, kaspa-addresses, kaspa-txscript, igneum-exec, igneum-evm-types, igneum-miner, igneum-harness-sim, igneum-p2p-probe, kaspad, with `igneum-pow` on): 628 passed, 0 failed, 24 ignored (the 3 above plus the pre-existing ignored measurements) before the request_headers fix; kaspa-p2p-flows 30 of 30 after it. Per crate: consensus-core 75, consensus 83, pow 11, p2p-flows 30, p2p-lib 18, rpc-core 131, grpc-core 9, notify 20, mining 52, database 22 + 7, txscript 155, addresses 3, addressmanager 1, exec 6, evm-types 3, kaspad 2.
|
||||
|
||||
### Devnet v4 rules that exist only in this integration
|
||||
|
||||
| Rule | Where | Why |
|
||||
|---|---|---|
|
||||
| EVM payout address in the body: a miner appends `IGNA || 40 lowercase hex` to its template extra data beside the `IGNK` key reveal (`igneum-miner mine ... --evm-address 0x...`); the executor pays the block's rewards there (`kaspa_consensus_core::evm::{MINER_ADDRESS_TAG, miner_address_extra_data, miner_address_in, block_miner_evm_address}`, `igneum_exec::service::miner_address_of` reads the coinbase of every segment block). A block without the tag keeps the devnet v3 truncation (low 20 bytes of `vote_key_hash`), which with BLS keys is an address nobody holds. | `consensus/core/src/evm.rs`, `igneum/exec/src/service.rs`, `igneum/miner/src/main.rs` | The execution agent's merge plan (design 10.4) asked for a body `miner` field or `--evm-address`; the coinbase extra data is the body field the merkle root, the store and the wire already carry, so no format moved. Design 1.1's dedicated 20-byte field stays open. One unit test (`miner_address_round_trips_through_the_coinbase_payload`). |
|
||||
| Difficulty epoch lane length = `pow_epoch_blocks()` | `consensus/src/consensus/services.rs` | Same value as before on the devnet (3,600); only differs under the test-network override. |
|
||||
|
||||
### Compatibility: devnet v4 is a new chain from the same genesis
|
||||
|
||||
A v4 node cannot follow the chain the devnet has mined since 3 October: (1) the body store format is `BlockBody(utxo_txs, evm_txs)` (execution layer), so the old database does not open; (2) the difficulty rule on `igneum-devnet` is `IgneumDual`, so the old headers' bits (Kaspa's sampled DAA) fail the difficulty check; (3) the timestamp rules are 10 s both ways, which old headers were never held to; (4) the coinbase payload cap is 16,384 (v2). The genesis, the network id `igneum-devnet`, the ports and the address prefix are unchanged, so the cut-over is: every node and the Windows package together, each node with an empty data directory, the old directory moved aside. An old miner (pre-hot-swap `igneum-miner.exe`) walks the epoch seed without the lead, so its blocks are rejected from the first epoch boundary (DAA 3,600): the PC switches to the new exe at the same time.
|
||||
|
||||
### Test network, 4 Oct 2026 02:02 to 02:18 BST (full numbers in docs/bench-log.md)
|
||||
|
||||
3 `igneumd` from `target-integration/release` on `igneum-devnet-880` (override file: `genesis_bits` 0x1f010000, finality window 300 DAA with `min_daa` 300; env `IGNEUM_POW_EPOCH_BLOCKS=300`, `IGNEUM_POW_EPOCH_LEAD=60`, so the swap crossed three boundaries in 16 minutes; stated here because the real devnet values are 7,200, 3,600 and 600), 3 CPU miners `--engine igneum-pow` at 3 threads, every miner voting, all paying one EVM address. 1,055 blocks accepted on every node, 0 rejected, sink identical on all three at 31 of 31 samples, difficulty 56,268 to 110,533 (dual-lane rule holding about 1.1 blocks/s on 0.23 MH/s). Boundaries at DAA 300, 600 and 900: the first block of the new epoch was accepted 2.23, 0.50 and 1.47 s after the last of the old (median inter-block gap 0.59 s, p90 2.21 s), every node built exactly 4 caches (genesis day plus three seeds), every miner's CPU program and cache for the new seed ready in 191 to 212 ms. Finality: window filling until DAA 300, first lock at checkpoint 11 (blue score 331, 3 of 3 voters, 100%), 24 locks to checkpoint 34, identical on all nodes, lock latency median 1.01 s (max 2.7 s), 34 of 34 votes accepted per miner. EVM: `tools/evm-smoke` 84 of 85 checks (chain id 4463, the miner funded at the `IGNA` address, 59 transfers executed across 10 chain blocks, contract deploy, call, receipts, logs, revert, state roots identical on the three nodes); the one failing check wants duplicate sends to land in parallel blocks within six attempts, and this PoW network had one tip at most samples, so no parallel block appeared in that window (the check was written for simnet miners paced by `--hold-ms`). `igneum-exec-diff` over the smoke's export: 199 segments, 59 transactions, 8 accounts, 0 mismatches. Harness scenario 5 on the merged node: 63 cases (46 RPC, 17 p2p), node up on every case, 0 cache builds (the five M15 cases that built on `d62708a8` built nothing here; the node log shows one build, the honest day), the p2p M15 cases disconnected the peer (strike guard). Scenario 2 adapted to the merged timestamp rules in a copy of the harness (the repo copy still probes 132 s and `pmt+1`): rejected below `max(pmt + 1, parent - 10 s)`, accepted at the floor, future flip between +10.00 and +10.02 s; stretch drift in the simulator +0.2% and -0.7% (PASS). Not exercised: the GPU `prepare` path (CPU miners only; the Metal, CUDA and OpenCL workers are unchanged by this integration).
|
||||
|
||||
### Binaries (built from `dc749905`)
|
||||
|
||||
| File | Path | Size |
|
||||
|---|---|---|
|
||||
| igneumd (Mac, arm64) | `vendor/igneum-node/target-integration/release/igneumd` | 40,463,680 bytes |
|
||||
| igneum-miner (Mac) | `vendor/igneum-node/target-integration/release/igneum-miner` | 7,916,096 bytes |
|
||||
| igneum-exec-diff, igneum-inject, igneum-p2p-probe, igneum-harness-sim (Mac) | `vendor/igneum-node/target-integration/release/` | |
|
||||
| igneumd.exe (Windows x86_64) | `vendor/igneum-node/target-integration/x86_64-pc-windows-gnu/release/igneumd.exe` | 50,169,344 bytes (imports libstdc++-6.dll as before; `make-package.sh` ships the three mingw DLLs) |
|
||||
| igneum-miner.exe (Windows) | `vendor/igneum-node/target-integration/x86_64-pc-windows-gnu/release/igneum-miner.exe` | 10,045,440 bytes |
|
||||
| Windows package | `/tmp/igneum-integration/igneum-node-windows-v4.zip` (made with `proto-cuda/windows-node/make-package.sh vendor/igneum-node-v4 <zip>`; `vendor/igneum-node-v4/target` is a symlink to `target-integration` for that script) | 32,946,104 bytes |
|
||||
|
||||
### Cut-over (NOT performed; the morning session does it)
|
||||
|
||||
The live node is `./target/release/kaspad` (pid 72039, started from `vendor/igneum-node`) under `caffeinate -dims` (pid 72041); the observer peer is `igneum-obsnode` (pid 73692) with `tools/observer/observer.mjs` (pid 74029, cwd the repo root, `IGNEUM_RPC` ws://127.0.0.1:28640); the Mac seed relay is pid 72139 from `target-finality`. All from `/Users/joshm/Projects/igneum`:
|
||||
|
||||
```
|
||||
# 1. stop node 1 (caffeinate exits with it) and move the v3 database aside (devnet v4 is a new chain, see Compatibility)
|
||||
kill -INT 72039; while kill -0 72039 2>/dev/null; do sleep 1; done
|
||||
mv /tmp/igneum-devnet/node1 /tmp/igneum-devnet/node1-v3-2026-10-04
|
||||
|
||||
# 2. start igneumd v4 with the same appdir, rpclisten and listen, plus the two peers
|
||||
cd /Users/joshm/Projects/igneum/vendor/igneum-node
|
||||
nohup caffeinate -dims target-integration/release/igneumd --devnet --nodnsseed --disable-upnp --enable-unsynced-mining \
|
||||
--appdir=/tmp/igneum-devnet/node1 --rpclisten=0.0.0.0:26610 --listen=0.0.0.0:26611 \
|
||||
--addpeer=188.245.5.161:26611 --addpeer=192.168.68.67:26611 --nologfiles > /tmp/igneum-devnet/node1-v4.out 2>&1 &
|
||||
# the execution layer starts with it (eth_ JSON-RPC on 127.0.0.1:26790; --evm-disable turns it off)
|
||||
|
||||
# 3. restart the observer peer from the same binary (fresh appdir) and observer.mjs
|
||||
kill -INT 73692; kill -INT 74029
|
||||
nohup target-integration/release/igneumd --devnet --nodnsseed --disable-upnp --appdir=/tmp/igneum-devnet/observer-v4 \
|
||||
--rpclisten=127.0.0.1:26640 --rpclisten-json=127.0.0.1:28640 --listen=127.0.0.1:26641 --connect=127.0.0.1:26611 \
|
||||
--nologfiles > /tmp/igneum-devnet/observer-v4.out 2>&1 &
|
||||
cd /Users/joshm/Projects/igneum && IGNEUM_RPC=ws://127.0.0.1:28640 nohup node tools/observer/observer.mjs > /tmp/igneum-devnet/observer-mjs-v4.out 2>&1 &
|
||||
# block numbers restart at 0 on the new chain; LIVE_TABLE_PREFIX=v4_ keeps the v3 rows apart if wanted
|
||||
|
||||
# 4. the Mac seed relay (pid 72139) and igneum-seed-1 (188.245.5.161) need the same binary: the relay from
|
||||
# target-integration with its current flags (infra/seed-nodes/addpeer-from-mac.sh), the VM through
|
||||
# infra/seed-nodes/provision-seed.sh (it builds from a source tarball of the worktree; point it at vendor/igneum-node-v4).
|
||||
# Until they run v4 they offer the v3 chain, which a v4 node rejects.
|
||||
|
||||
# 5. the Windows package: /tmp/igneum-integration/igneum-node-windows-v4.zip (igneumd.exe, igneum-miner.exe, DLLs, src.zip);
|
||||
# the PC's START-NODE.bat flags are unchanged; the miner adds --evm-address <its payout address> if it wants EVM rewards.
|
||||
```
|
||||
|
||||
Where to read the run: `/tmp/igneum-integration/net/logs/` (node and miner logs), `/tmp/igneum-integration/net/samples.jsonl` (30-s samples), `/tmp/igneum-integration/net/smoke.log`, `/tmp/igneum-integration/harness/results/`, `/tmp/igneum-integration/cross-build.log`.
|
||||
|
|
|
|||
Loading…
Reference in a new issue