v2.3.6
Block booking: one settlement path, nothing silently dropped
- The confirmation watcher and the immediate apply settle a found block through one shared function instead of two copies that had already drifted apart.
- A parked block that nothing can book (a Group-Solo block with an unusable group id, or a parked block without a parsed coinbase) moves to the unbookable store instead of being deleted. Its frozen distribution is the only record of what the coinbase paid.
- SV1 and SV2 blocks are booked through the strict whole-transaction coinbase decode that JDP already used. A coinbase with trailing bytes books nothing instead of being read as a prefix.
- The block-found gate compares the share hash against the exact compact target for SV1 and SV2, not a floating-point difficulty.
- A solution the TDP worker never took is no longer reported as a found block. It is logged as a lost block instead of creating a found-block row, a push and a booking that can never confirm.
- JDP: every proven JDC-found block is booked. The allocate blob is built by one encoder for the designated payout output.
Group-Solo
- Window mode buckets rejects and trims them with the window.
- A kick removes the member from the group's own payout layout.
- A member with only rejected shares keeps a row in the group distribution.
- The window trim drops an entry that would go negative, the same rule the PPLNS trim already had.
Notifications
- Best-difficulty messages now reach addresses subscribed on Telegram or ntfy alone. The cron used to scan mobile push subscriptions only, so those users never got one whatever their setting said. Each subscription's own
bestDiffNotificationsEnabledstill decides.
API
nextResetAtcomes from the reset cron's own schedule computation./api/pplns/fees:maxMinerOutputsis the number of miners the coinbase cut actually publishes (it overstated that by two to three). With[pplns.coinbase_autoscale]enabled,coinbaseWeightBudgetreports the live autoscaled budget instead of the configured floor. The group fee comes from the Group-Solo engine's resolved configuration.- Timestamps on the push endpoints use the same ISO format as every other endpoint (
…Z). - Every hashrate field is rounded; per-worker and per-session hashrate were the exceptions.
- SV2 user agents are normalised by the same rule as SV1 (
cgminer/4.11.1is stored ascgminer/sv2), and the downstream report uses it too.
Stratum
[stratum] job_retention_msnow applies to SV2 as well; SV2 used a fixed ten minutes. The key is optional with a default of600000.- sv2-apps v0.8.0 (stratum-core 0.6.0).
- One extranonce allocator for all ports; the worker partitions are unchanged. SV2 now logs partition exhaustion and a failed group job build.
Fixes
- The Group-Solo reset cron panicked on a day without a local midnight (for example
America/Santiagoon its spring-forward day); after that the group never reset again. - The block reconcile check read the genesis block on a short chain and logged a warning on every fresh start.
- The SV1
BLOCK FOUNDlog line printed the template id under the nameheight.
Removed
- The per-session share warmup (
warmup_shares). It was configured and shown in the UI but never enforced; the PPLNSmin_difficultyis the gate./api/pplns/feesno longer returnswarmupShares. - The external share submission endpoints
POST /api/shareandGET /api/share/top-difficulties. Nothing ever submitted to them; theexternal_shares_entitytable stays. - Prometheus metrics that were never emitted.
/metricsserves the stream-consumer lag, the parked-block depths, vardiff adjustments andaccepted_share_undecodable_dropped_total. - Config keys nothing read (see Upgrade notes).
Internal
- Many duplicated implementations are merged into one: the coinbase prefix serializer and witness assembler, the accepted-share stream consumer, the SV1/SV2 block submit path, the share and session sinks, the slot bucketing of the chart endpoints, the address normalizer and more. Behaviour and wire formats are unchanged; the API JSON of the chart endpoints is pinned by characterization tests.
Upgrade notes
- Delete these keys from your config before starting 2.3.6. Every config struct rejects unknown keys, so a leftover key is a boot failure, not a warning:
- top level:
api_secure - the whole
[bitcoin_zmq]and[aggregation]sections [database]:driver,max_query_time_ms,run_migrations[redis]:ttl_secs[sv2]:ed25519_authority_seed_hex,cert_signed_part[debug]:noise_debug[pplns]:warmup_shares[notifications.telegram]and[notifications.ntfy]:diff_notifications
- top level:
- A 2.3.5 binary does not start with the cleaned config:
driverandwarmup_shareswere required there. - Check
[stratum] job_retention_ms: it now also governs SV2. - No new database migrations. The Redis and stream formats are unchanged, so the processes can be swapped one after another.
- The UI needs the matching
blitzpool-uichange for the PPLNS port-gate callout; without it the callout disappears becausewarmupSharesis gone. That UI change also works against 2.3.5. - Local test setup: the test Redis needs
--databases 544.