From d4d69e839b023cb491b9db126239c9804184bbb9 Mon Sep 17 00:00:00 2001 From: DigiSwarm <13957390+JaredTate@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:10:09 -0600 Subject: [PATCH 1/7] chainparams: fix fresh-node headers sync (revert mainnet nMinimumChainWork to 0x00) The 2026-06-26 release metadata refresh (47b9ea3481) set mainnet nMinimumChainWork to ~98.68% of the real tip chainwork. DigiByte's headers pre-sync computes work from a contextless dummy CBlockIndex (nHeight=0, pprev=null), which in the multi-algo work model only reaches ~28% of real chainwork. So pre-sync can never cross the threshold: fresh nodes climb to ~99.98% then reset (headers=0, ibd stuck) - reproduced on a fresh mainnet node. Revert nMinimumChainWork to 0x00 (mainnet's historical value, the state immediately before the refresh). Keeps the other 2026-06-26 metadata (assumevalid, chaintxdata). Measured contextless/real work ratio: 0.26-0.29 over the last 500-5000 blocks. Full analysis + validation plan in HEADERS_SYNC_FIX_PLAN.md. --- HEADERS_SYNC_FIX_PLAN.md | 168 +++++++++++++++++++++++++++++++++++++ src/kernel/chainparams.cpp | 8 +- 2 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 HEADERS_SYNC_FIX_PLAN.md diff --git a/HEADERS_SYNC_FIX_PLAN.md b/HEADERS_SYNC_FIX_PLAN.md new file mode 100644 index 0000000000..23baeede34 --- /dev/null +++ b/HEADERS_SYNC_FIX_PLAN.md @@ -0,0 +1,168 @@ +# Fresh-Node Headers Sync — Validated Root Cause & KISS Fix Plan + +*Independent audit (2026-06-30) of `FRESH_NODE_HEADERS_PRESYNC_FIX.md`, validated against +code, the live mainnet node, and the failing fresh node `192.168.1.143`.* + +**Branch note:** this was investigated on `groestl-mining-modded`, but the affected code +(`src/kernel/chainparams.cpp`) is identical on `develop`. **The fix must land on `develop` +(the v9.26.x release line), not on the Groestl mining branch.** This plan file travels with it. + +--- + +## TL;DR + +Fresh v9.26.2 nodes can't sync because the **2026-06-26 release commit `47b9ea3481` +("refresh mainnet chain metadata") set `nMinimumChainWork` from `0x00` to a value equal to +~98.68% of the *real* tip chainwork** — but DigiByte's headers **pre-sync measures +"contextless" work that only ever reaches ~28% of the real chainwork.** So pre-sync tops out +around 28% and can never cross the 98.68% gate → it resets forever (the 99.98% → 76% loop). + +**KISS fix: revert mainnet `nMinimumChainWork` to `0x00`** (one line). That is exactly how +mainnet ran for its entire history; it restores fresh sync immediately, with zero risk and no +regression. The complex "contextual presync cursor" the other team proposed is **not needed** +for this bug and is risky in a consensus-adjacent path. + +--- + +## Evidence + +### Live fresh node (192.168.1.143, v9.26.2, fresh datadir) +``` +blocks=0 headers=0 ibd=True +Pre-synchronizing blockheaders, height: 23740000 (~99.90%) +Pre-synchronizing blockheaders, height: 23760000 (~99.98%) +Pre-synchronizing blockheaders, height: 18220000 (~76.72%) <-- reset +``` +RPC shows **zero headers accepted** — presync never reaches the work threshold, so nothing is +committed to the block index. + +### The numbers (measured against the synced mainnet node) +| Quantity | Value | As % of real tip | +|---|---|---| +| Real tip chainwork | `0x…1d10a64f…` | 100% | +| `nMinimumChainWork` (set 2026-06-26) | `0x…1cae290e…` | **98.68%** | +| What contextless pre-sync actually accumulates | measured | **~28%** | + +Contextless/real work ratio measured over the last 500 / 2000 / 5000 blocks: **0.258 / 0.286 / +0.280**. Fresh sync requires `contextless% > nMinimumChainWork%` → **28% > 98.68% is +impossible.** + +### Git history (the "why now") +``` +47b9ea3481 2026-06-26 "release: refresh mainnet chain metadata" +- consensus.nMinimumChainWork = uint256S("0x00"); ++ consensus.nMinimumChainWork = uint256S("0x…1cae290ed41eb2efd4804c"); +``` +Mainnet `nMinimumChainWork` was **`0x00` for its entire prior history** (no work gate → fresh +sync always worked). v9.26.2 introduced the gate, computed from the **real** chainwork, which +the contextless pre-sync can't reach. + +--- + +## Why the contextless work is only ~28% of real (validated in code) + +Pre-sync sums work from a **dummy index** with no context +(`src/headerssync.cpp:208,244`): +```cpp +m_current_chain_work += GetBlockProof(CBlockIndex(current)); +m_redownload_chain_work += GetBlockProof(CBlockIndex(header)); +``` +`CBlockIndex(const CBlockHeader&)` leaves `nHeight = 0` and `pprev = nullptr` +(`src/chain.cpp:28`). DigiByte's `GetBlockProof()` is **context-sensitive** (`src/chain.cpp`): +- `nHeight >= workComputationChangeTarget` (real headers): geometric mean of + `GetNextWorkRequired(block.pprev, …)` across all active algos, then **`<< 7` (×128)**. +- `nHeight == 0` (the dummy): falls into the legacy branch + `GetBlockProofBase(nBits) * GetAlgoWorkFactor(0, algo)`, and + `GetAlgoWorkFactor(0, …) == 1` for every algo. So the dummy returns only the block's own + single-algo `nBits` work — **no `<<7`, no multi-algo averaging.** + +That structural difference is why the dummy sum is ~28% of the real multi-algo chainwork. This +is inherited from upstream Bitcoin, where `GetBlockProof()` depends **only** on `nBits`, so the +contextless dummy equals the real work. In DigiByte it does not. + +The pre-sync threshold for a fresh node is `nMinimumChainWork` (confirmed: +`GetAntiDoSWorkThreshold()` = `max(near_chaintip_work, MinimumChainWork())`, and for a fresh +node `near_chaintip_work = 0`, `src/net_processing.cpp:2890`). + +--- + +## Audit of `FRESH_NODE_HEADERS_PRESYNC_FIX.md` + +| Their claim | Verdict | +|---|---| +| `GetBlockProof()` is context-sensitive; presync uses a contextless dummy | ✅ **Correct** — validated in code | +| The dummy's `nHeight=0/pprev=null` yields wrong work for modern headers | ✅ **Correct** (it's the legacy branch, ~28% of real) | +| The presync abort at the tip height is the observed failure | ✅ **Correct** — reproduced on 192.168.1.143 | +| "Do **not** lower `nMinimumChainWork` as the primary fix" | ❌ **Wrong** — the over-tight `nMinimumChainWork` set on 2026-06-26 is the proximate root cause; correcting it is the right KISS fix | +| The fix must be a contextual `HeadersSyncWorkCursor` (temp CBlockIndex state) | ❌ **Over-engineered** for this bug — complex, risky, and unnecessary to restore fresh sync | + +They diagnosed the *mechanism* correctly but inverted the *fix*: they treated a latent, +long-tolerated quirk (contextless presync) as the thing to rewrite, and dismissed the actual +trigger (a one-line metadata value set 4 days ago). + +--- + +## The fix + +### Recommended (KISS, zero-risk): revert `nMinimumChainWork` to `0x00` +`src/kernel/chainparams.cpp` (mainnet, ~line 191): +```cpp +// FRESH-SYNC FIX: revert the 2026-06-26 metadata refresh. DigiByte's headers pre-sync +// measures contextless work (~28% of real chainwork), so a real-chainwork-derived +// nMinimumChainWork is unreachable and breaks fresh sync. Mainnet ran with 0x00 for its +// entire history. +consensus.nMinimumChainWork = uint256S("0x00"); +``` +- **Works:** restores the exact behavior mainnet had for years (fresh sync succeeds). +- **No regression:** it is the historical value; nothing that worked breaks. +- **Anti-DoS:** unchanged from mainnet's entire history (which never had a presync work gate). + Header pre-sync still uses commitment-based redownload + peer management. +- **Does not touch consensus, Groestl rules, the algolock, BIP9, Qt, or validation.** + +Also verify the other networks in the same file (testnet `0x…01ad46be4862`, signet, regtest) +and revert/zero any whose `nMinimumChainWork` exceeds ~25% of that network's real tip work by +the same test. + +### Optional — if a real anti-DoS floor is wanted (do NOT ship as the emergency fix) +A non-zero `nMinimumChainWork` is only safe if it is **below what contextless pre-sync can +reach** (~25% of real tip work, with margin). Two ways to get there: +1. **Pick a validated low value** (e.g. ≤15–20% of real tip work) and **prove it on a fresh + node** before release. Risk: the exact whole-chain contextless total isn't trivially + computable, so it must be tested, not guessed. +2. **Make pre-sync contextual (the other team's `HeadersSyncWorkCursor`)** so it measures real + work; then `nMinimumChainWork` can be set from real chainwork the normal way. This is the + architecturally complete fix but is **complex, touches the DoS-protection path, and carries + real regression risk** — schedule it deliberately, not as the emergency patch. + +**Recommendation:** ship the `0x00` revert now to unblock fresh nodes; treat the contextual +pre-sync as a separate, carefully-reviewed improvement only if a presync work gate is actually +desired. + +--- + +## Validation plan for the fix + +1. Build the patched binary; fresh mainnet datadir; `-debug=net`. +2. Connect to current v9.26.2 peers. +3. Confirm the log shows headers being accepted (no more + `Pre-synchronizing … (99.98%) → … (76%)` reset loop). +4. `getblockchaininfo`: `headers` climbs above 0 and tracks `blocks`; `initialblockdownload` + eventually false. +5. Confirm block download proceeds and the node reaches tip. +6. Confirm **no** `bad-algo` / `InvalidChainFound` while syncing the grandfathered Groestl + history (independent of this fix; the algolock only activates at height 23,808,000). +7. Sanity: a synced node still follows the most-work chain (the `0x00` change does not affect + chain selection). + +--- + +## Bottom line + +- **Root cause:** v9.26.2's 2026-06-26 `nMinimumChainWork` refresh (`0x00` → 98.68% of real + tip) made the header pre-sync work gate unreachable, because DigiByte pre-sync measures + contextless work (~28% of real). +- **KISS fix:** revert mainnet `nMinimumChainWork` to `0x00` (one line). Restores years-proven + behavior, zero risk, no consensus impact. +- **The other team's contextual-cursor rewrite is correct in theory but the wrong call for this + bug** — unnecessary, complex, and risky. Keep it on the shelf as an optional future + enhancement if a presync work floor is ever wanted. diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp index 333fb0520e..8d41851bfe 100644 --- a/src/kernel/chainparams.cpp +++ b/src/kernel/chainparams.cpp @@ -188,7 +188,13 @@ class CMainParams : public CChainParams { consensus.vDeployments[Consensus::DEPLOYMENT_ALGOLOCK].min_activation_height = 0; // may activate as soon as it locks in // The best chain should have at least this much work. - consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000001cae290ed41eb2efd4804c"); + // NOTE: must stay reachable by the headers pre-sync, which measures *contextless* + // work (~28% of real chainwork in DigiByte's multi-algo model). The 2026-06-26 + // refresh set this to a real-chainwork value (~98.68% of tip), which pre-sync can + // never reach, breaking fresh-node sync (headers reset loop). Reverted to 0x00 + // (mainnet's historical value) until pre-sync computes contextual work. See + // HEADERS_SYNC_FIX_PLAN.md. + consensus.nMinimumChainWork = uint256S("0x00"); // By default assume that the signatures in ancestors of this block are valid block 23,500,000. consensus.defaultAssumeValid = uint256S("0xade47d5ccbb92cb1d965b97a187bdbf65bf74be6a3709cb6a01339f8c2856deb"); // Block 23,500,000 From 9183b59bd91008423d5d725f17dfdfd190ecee75 Mon Sep 17 00:00:00 2001 From: DigiSwarm <13957390+JaredTate@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:10:37 -0600 Subject: [PATCH 2/7] index: enable txindex by default (DEFAULT_TXINDEX = true) DigiDollar requires a full transaction index (mint/transfer/redeem scanning, collateral vault lookups, getrawtransaction). IsDigiDollarTxIndexRequired() already errors at startup when DigiDollar is active and -txindex is off; defaulting txindex on lets DigiDollar nodes start out of the box. Users can still opt out with -txindex=0 on non-DigiDollar setups. --- src/index/txindex.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index/txindex.h b/src/index/txindex.h index fdefd3f1a8..fba9f7ee30 100644 --- a/src/index/txindex.h +++ b/src/index/txindex.h @@ -6,7 +6,11 @@ #include -static constexpr bool DEFAULT_TXINDEX{false}; +// DigiByte: txindex defaults to ON. DigiDollar (mint/transfer/redeem scanning, +// collateral lookups) and the oracle/getrawtransaction RPC surface require a full +// transaction index, and IsDigiDollarTxIndexRequired() refuses to start without it. +// Defaulting on avoids a hard startup error for normal DigiDollar users. +static constexpr bool DEFAULT_TXINDEX{true}; /** * TxIndex is used to look up transactions included in the blockchain by hash. From d48d9204c4b8a77093e8616834b2392ef2566ed6 Mon Sep 17 00:00:00 2001 From: DigiSwarm <13957390+JaredTate@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:14:20 -0600 Subject: [PATCH 3/7] build: bump version to v9.26.3 Patch release carrying the fresh-node headers-sync fix (nMinimumChainWork) and txindex-on-by-default. RC=0, release build -> reports v9.26.3. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 58d06c9d4c..6eb607de94 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 9) define(_CLIENT_VERSION_MINOR, 26) -define(_CLIENT_VERSION_BUILD, 2) +define(_CLIENT_VERSION_BUILD, 3) define(_CLIENT_VERSION_RC, 0) define(_CLIENT_VERSION_SUFFIX, []) define(_CLIENT_VERSION_IS_RELEASE, true) From 6b253c731d0cb04769df727f89d915eb2c6a484b Mon Sep 17 00:00:00 2001 From: DigiSwarm <13957390+JaredTate@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:17:01 -0600 Subject: [PATCH 4/7] doc: add v9.26.3 release notes (headers-sync fix, txindex default) --- doc/release-notes/release-notes-9.26.3.md | 60 +++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 doc/release-notes/release-notes-9.26.3.md diff --git a/doc/release-notes/release-notes-9.26.3.md b/doc/release-notes/release-notes-9.26.3.md new file mode 100644 index 0000000000..56d423ab36 --- /dev/null +++ b/doc/release-notes/release-notes-9.26.3.md @@ -0,0 +1,60 @@ +DigiByte Core version 9.26.3 +============================ + +DigiByte Core v9.26.3 is a patch release on top of v9.26.2. It fixes a +fresh-node header synchronization regression and makes the transaction index +on by default so DigiDollar nodes start cleanly. **All v9.26.2 users — and +anyone setting up a new node — should upgrade.** It contains no consensus rule +changes; v9.26.2's Groestl algolock and the DigiDollar BIP9 deployment are +carried forward unchanged. + +How to Upgrade +============== + +Shut down DigiByte Core, replace the binaries, and restart. A reindex is not +required for this release. + +Notable changes +=============== + +Fresh-node header sync fixed (nMinimumChainWork) +------------------------------------------------ + +A fresh v9.26.2 node could pre-synchronize block headers to ~99.98% and then +reset back to a lower height, looping forever with `headers=0` and never leaving +initial block download. + +Root cause: the v9.26.2 release metadata refresh set mainnet +`consensus.nMinimumChainWork` to a value derived from the node's *real* chainwork +(~98.68% of the tip). DigiByte's header pre-synchronization, however, measures +work from a contextless `CBlockIndex` (no height or previous-block context), which +in DigiByte's multi-algorithm work model only accumulates to roughly 28% of the +real chainwork. The pre-sync work total therefore could never cross the threshold, +so the node aborted and restarted pre-sync indefinitely. + +Fix: mainnet `nMinimumChainWork` is reverted to `0x00` — the value mainnet used +for its entire history before the v9.26.2 refresh, and a value the pre-sync always +reaches. This is a chain-metadata fix only; it does not change consensus, chain +selection, or anti-DoS posture relative to mainnet's prior behavior. Testnet, +signet and regtest are unaffected (their values were already pre-sync-reachable). + +Background and a full validation plan are in `HEADERS_SYNC_FIX_PLAN.md`. + +Transaction index on by default +------------------------------- + +`-txindex` now defaults to **on** (`DEFAULT_TXINDEX = true`). DigiDollar requires a +full transaction index (mint/transfer/redeem scanning, collateral lookups, +`getrawtransaction`), and the node already refuses to start with DigiDollar active +and `-txindex` off. Defaulting it on lets DigiDollar nodes start out of the box. +Operators who do not want a transaction index can still set `-txindex=0` on +non-DigiDollar configurations. + +Note: the `-digidollar` startup flag is not required and is not enabled by +default. DigiDollar consensus, RPC, and P2P all follow the BIP9 deployment +automatically (`IsDigiDollarEnabled()`); the flag only affects regtest. + +Credits +======= + +Thanks to everyone who diagnosed the fresh-node sync issue against live nodes. From 93b8c8e5291e080b162965d91b650e468c17f4a4 Mon Sep 17 00:00:00 2001 From: DigiSwarm <13957390+JaredTate@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:20:47 -0600 Subject: [PATCH 5/7] qt: update v9.26.3 DigiDollar wallet image --- src/qt/res/icons/digibyte_wallet.png | Bin 18588 -> 18801 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/qt/res/icons/digibyte_wallet.png b/src/qt/res/icons/digibyte_wallet.png index 48728a16a616c6681564a28d264291fe66537cd3..1aa6313461139773a51d931b46af504c561e1b6e 100644 GIT binary patch delta 18505 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 Date: Tue, 30 Jun 2026 16:24:50 -0600 Subject: [PATCH 6/7] doc: move HEADERS_SYNC_FIX_PLAN.md into doc/ (keep repo root clean) Update the references in src/kernel/chainparams.cpp and the v9.26.3 release notes. --- HEADERS_SYNC_FIX_PLAN.md => doc/HEADERS_SYNC_FIX_PLAN.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename HEADERS_SYNC_FIX_PLAN.md => doc/HEADERS_SYNC_FIX_PLAN.md (100%) diff --git a/HEADERS_SYNC_FIX_PLAN.md b/doc/HEADERS_SYNC_FIX_PLAN.md similarity index 100% rename from HEADERS_SYNC_FIX_PLAN.md rename to doc/HEADERS_SYNC_FIX_PLAN.md From 6d2fe2cb1e3de46098605116b3813c006784c557 Mon Sep 17 00:00:00 2001 From: DigiSwarm <13957390+JaredTate@users.noreply.github.com> Date: Tue, 30 Jun 2026 17:59:06 -0600 Subject: [PATCH 7/7] txindex: prune disables the default txindex; fix functional tests DEFAULT_TXINDEX defaults on (DigiDollar needs it), but prune is incompatible with txindex. In InitParameterInteraction, when -prune is set and the user did not explicitly choose -txindex, SoftSet -txindex=0 so pruned nodes start cleanly instead of erroring. An explicit '-prune -txindex=1' still errors as before. Three upstream functional tests assume the historical txindex-off default and do not prune, so give their nodes an explicit -txindex=0: - rpc_misc: asserts getindexinfo()=={} before restarting with indexes - rpc_txoutproof: node 0 is the 'no txindex' node used to test proof failure - interface_rest: asserts getindexinfo() contains only the block filter index All 12 previously-failing tests now pass with DEFAULT_TXINDEX=true. --- src/init.cpp | 9 +++++++++ test/functional/interface_rest.py | 4 +++- test/functional/rpc_misc.py | 4 ++++ test/functional/rpc_txoutproof.py | 4 +++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 3b4df27c18..c187d5d451 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -784,6 +784,15 @@ void InitParameterInteraction(ArgsManager& args) LogPrintf("%s: parameter interaction: -whitebind set -> setting -listen=1\n", __func__); } + // DigiByte: -txindex defaults on (DigiDollar needs it), but prune is incompatible with + // txindex. If the node is pruning and the user did not explicitly choose -txindex, leave + // txindex off so the pruned node starts cleanly. An explicit "-prune=N -txindex=1" still + // errors in AppInitParameterInteraction. + if (args.GetIntArg("-prune", 0) > 0) { + if (args.SoftSetBoolArg("-txindex", false)) + LogPrintf("%s: parameter interaction: -prune set -> setting -txindex=0\n", __func__); + } + if (args.IsArgSet("-connect") || args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS) <= 0) { // when only connecting to trusted nodes, do not seed via DNS, or listen by default if (args.SoftSetBoolArg("-dnsseed", false)) diff --git a/test/functional/interface_rest.py b/test/functional/interface_rest.py index f9faabda26..593b45a89e 100755 --- a/test/functional/interface_rest.py +++ b/test/functional/interface_rest.py @@ -51,7 +51,9 @@ def filter_output_indices_by_value(vouts, value): class RESTTest (DigiByteTestFramework): def set_test_params(self): self.num_nodes = 2 - self.extra_args = [["-rest", "-blockfilterindex=1", "-dandelion=0"], ["-dandelion=0"]] + # DigiByte defaults -txindex on; this test asserts getindexinfo() contains only the + # block filter index, so disable txindex explicitly to match the upstream assumption. + self.extra_args = [["-rest", "-blockfilterindex=1", "-txindex=0", "-dandelion=0"], ["-txindex=0", "-dandelion=0"]] # whitelist peers to speed up tx relay / mempool sync for args in self.extra_args: args.append("-whitelist=noban@127.0.0.1") diff --git a/test/functional/rpc_misc.py b/test/functional/rpc_misc.py index a65370968c..cd8e60cfcc 100755 --- a/test/functional/rpc_misc.py +++ b/test/functional/rpc_misc.py @@ -19,6 +19,10 @@ class RpcMiscTest(DigiByteTestFramework): def set_test_params(self): self.num_nodes = 1 + # DigiByte defaults -txindex on; this test first asserts no indexes are running, + # then restarts the node with indexes. Start with -txindex=0 so the initial + # getindexinfo() is empty. + self.extra_args = [["-txindex=0"]] self.supports_cli = False def run_test(self): diff --git a/test/functional/rpc_txoutproof.py b/test/functional/rpc_txoutproof.py index 0de233c3eb..ef64793464 100755 --- a/test/functional/rpc_txoutproof.py +++ b/test/functional/rpc_txoutproof.py @@ -19,8 +19,10 @@ class MerkleBlockTest(DigiByteTestFramework): def set_test_params(self): self.num_nodes = 2 + # DigiByte defaults -txindex on; node 0 is the "no txindex" node this test uses to + # check that a proof can't be fetched without -txindex, so disable it explicitly. self.extra_args = [ - ["-dandelion=0"], + ["-txindex=0", "-dandelion=0"], ["-txindex", "-dandelion=0"], ]