• v1.25.5 5285434e7c

    v1.25.5
    All checks were successful
    CI / Rust clippy (push) Successful in 1m40s
    CI / Rust fmt (push) Successful in 1m13s
    CI / Rust test (push) Successful in 5m34s
    CI / UI (SvelteKit) (push) Successful in 1m12s
    CI / Security Audit (push) Successful in 1m31s
    docs / build (push) Successful in 35s
    Release / Docker Multi-Arch (push) Successful in 20m20s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 10m56s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m10s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 10m59s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 11m51s
    Release / Linux AppImage (aarch64) (push) Successful in 10m57s
    Release / Linux AppImage (x86_64) (push) Successful in 10m8s
    Release / Cosign sign artifacts (push) Successful in 28s
    Release / Forgejo Release (push) Successful in 36s
    Stable

    dvb-projekt released this 2026-08-02 08:41:25 +00:00 | 7 commits to main since this release

    The answer to "why do my Stratum V2 miners sit at 2-4% rejects?" — plus the
    reason their connections kept dying. Both verified against the live miners
    before tagging: nine block changes without a single reject (previously every
    one produced a burst, 9.6 on average), and 75 minutes without one connection
    abort (previously five in 68 minutes).

    Fixed

    • Block-change jobs are now future jobs, activated by SetNewPrevHash.
      Every Sv2 job went out as "mine immediately" (min_ntime set) followed
      unconditionally by a SetNewPrevHash. Per spec, "immediately" means against
      the prev hash the miner currently knows — on a block change, the old one.
      Spec-conformant firmware therefore hashed the new merkle root against the
      stale tip until the next 30-second refresh tick, and every one of those
      shares came back as low-difficulty. Measured live: all 60 rejects in a
      50-minute window sat within 90 seconds of a block change, median 16 s. Now
      a block change ships the job as future (min_ntime empty) and the
      SetNewPrevHash activates it; a template refresh ships an immediately
      active job and no SetNewPrevHash at all (sending one there was itself
      off-spec). The daemon's clean_jobs flag — which V1 has always received —
      now reaches the Sv2 path too. Stratum V1 never had this problem: its
      mining.notify carries the prev hash inside the job.
    • Sv2 connections no longer die with Noise(Aead("Error")). The
      encrypted-frame reader had two await points with an AEAD-nonce advance
      between them, running inside tokio::select! — and every other branch
      firing (the VarDiff idle tick, a job broadcast, a V1 line in the
      translator) cancels the in-flight read. If that landed while a frame was
      only partially received, the reader lost stream bytes or treated payload
      ciphertext as a fresh header, the next tag check failed, and the connection
      died — live, sessions lasted anywhere from 2 to 67 minutes, costing the
      miner its in-flight work each time. The reader is now cancellation-safe:
      bytes land in a persistent buffer, and decryption happens only once the
      complete record is buffered. Both the server loop and the translator's
      client use it.
    • The V1↔V2 translator understands future jobs. It paired job and prev
      hash strictly by job id, which only ever matched because every push carried
      a fresh SetNewPrevHash. It now pairs an immediately-active job with the
      latest known prev hash and takes its ntime from the job — without this,
      refreshes would have stopped reaching V1 miners behind the translator.

    Added

    • Opt-in diagnostics behind the existing lowdiff_diag log target: rejected
      shares are re-checked against every job in the history, and every job push
      logs the history decision (new_block, ring length, prev-hash heads).
      These two lines are how both bugs above were found.

    dvb-WarpPool v1.25.5 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.25.5 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads