Skip to content

v2.3.6

Choose a tag to compare

@warioishere warioishere released this 24 Sep 18:06
· 116 commits to main since this release

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 bestDiffNotificationsEnabled still decides.

API

  • nextResetAt comes from the reset cron's own schedule computation.
  • /api/pplns/fees: maxMinerOutputs is the number of miners the coinbase cut actually publishes (it overstated that by two to three). With [pplns.coinbase_autoscale] enabled, coinbaseWeightBudget reports 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.1 is stored as cgminer/sv2), and the downstream report uses it too.

Stratum

  • [stratum] job_retention_ms now applies to SV2 as well; SV2 used a fixed ten minutes. The key is optional with a default of 600000.
  • 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/Santiago on 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 FOUND log line printed the template id under the name height.

Removed

  • The per-session share warmup (warmup_shares). It was configured and shown in the UI but never enforced; the PPLNS min_difficulty is the gate. /api/pplns/fees no longer returns warmupShares.
  • The external share submission endpoints POST /api/share and GET /api/share/top-difficulties. Nothing ever submitted to them; the external_shares_entity table stays.
  • Prometheus metrics that were never emitted. /metrics serves the stream-consumer lag, the parked-block depths, vardiff adjustments and accepted_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
  • A 2.3.5 binary does not start with the cleaned config: driver and warmup_shares were 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-ui change for the PPLNS port-gate callout; without it the callout disappears because warmupShares is gone. That UI change also works against 2.3.5.
  • Local test setup: the test Redis needs --databases 544.