• v1.26.0 29a91a7881

    v1.26.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m55s
    CI / Rust fmt (push) Successful in 1m10s
    CI / Rust test (push) Successful in 5m41s
    CI / UI (SvelteKit) (push) Successful in 1m16s
    CI / Security Audit (push) Successful in 1m18s
    docs / build (push) Successful in 36s
    Release / Docker Multi-Arch (push) Successful in 20m18s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 10m53s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 9m34s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 10m15s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 11m30s
    Release / Linux AppImage (aarch64) (push) Successful in 10m34s
    Release / Linux AppImage (x86_64) (push) Successful in 9m36s
    Release / Cosign sign artifacts (push) Successful in 26s
    Release / Forgejo Release (push) Successful in 37s
    Stable

    dvb-projekt released this 2026-09-07 11:33:16 +00:00 | 290 commits to main since this release

    The release that came out of measuring instead of guessing: the whole
    "new block → new job" chain was taken apart with microsecond timestamps on
    the reference pool and on an Umbrel Home, and most of what follows is what
    the numbers said to build. A full documentation sweep against the code went
    with it (details under Documentation).

    Added

    • Health warning when ZMQ is configured but silent. A pool whose
      zmq_hashblock_addr points at an unreachable or non-publishing socket
      used to fall back to the poll tick without a word — new blocks arrived up
      to job_refresh_secs late (Distortions observed 10–15 s stalls of this
      kind on other pools). The GBT template source now counts tip changes it
      discovered by polling while ZMQ watchers are configured; after two such
      tips the health banner shows bitcoin_zmq_hashblock_silent (suppressible,
      translated in all eight languages) and the log names the likely cause.
      A real ZMQ event resets the counter. Not applicable to the IPC template
      source, which pushes tips itself.
    • SIGTERM shuts the daemon down gracefully (Unix). docker stop and
      systemctl stop without a KillSignal override send SIGTERM, which used
      to kill the process outright: no flush of the rejected-share buffer, no
      clean session ends, no IPC template destroy. Now it triggers the same
      orderly shutdown as Ctrl-C.
    • [server] reuse_port binds every listener with SO_REUSEPORT, so a
      new daemon can take over the ports while the old one still serves — the
      basis for restarts without a listener gap (Packaging → Zero-downtime
      restart). Off by default, Unix only.
    • Fuzz-smoke tests for both protocol parsers run in the normal test
      suite: random bytes, mutated valid input and random frames through the
      Sv2 session state machine, plus noise and mutated JSON through the V1
      request parser and hex helpers — several thousand cases each, no panics
      allowed. Same entry points a libFuzzer target would use.
    • Template latency chain as metrics. Every template now carries its
      timing (source knew the tip → raw data fetched → mapped), the job loop
      logs tip_to_job_ms per new block, /api/overview carries the last
      values, and /metrics exports warppool_template_fetch_ms,
      warppool_template_map_ms and warppool_tip_to_job_ms. What the
      standalone probe measured on the reference box is now visible on every
      installation.
    • template_source = "auto" and DVB_WARPPOOL_TEMPLATE_SOURCE env
      override. The daemon probes the IPC socket once at start (configured
      path, or the Umbrel-derived one) and runs the IPC template source when
      the node answers, GBT otherwise — logged with the reason. Container
      deployments can set the env to auto so a Core ≥ 31 node with -ipcbind
      gets the 5–12 ms template path without anyone editing config.toml.
    • Per-IP connect limit before the Sv2 handshake. The Sv2 listener now
      shares the V1 rate limiter (connect bucket, auto-bans, IP gating), so a
      single IP has one budget across both ports. The NOISE handshake costs the
      server two ECDH operations and a Schnorr signature per attempt; a flood of
      connections could burn CPU without ever opening a session. Limited
      connections are dropped before act2, exactly like V1 connects.
    • Sv2 handshake diagnostics. Every stage of the NOISE handshake and the
      first frames after it now log at debug: act1 received, V1-on-Sv2-port
      detection, act1 rejected, act2 sent, peer closed without a frame (client
      rejected act2), first frame failed to decrypt (with the framing hint that
      bit more than one implementer: header as its own 22-byte AEAD chunk, then
      payload, no length prefix), the decoded SetupConnection fields, and the
      reason behind every SetupConnectionError. Troubleshooting page updated
      with the line-by-line reading guide.
    • Node tuning for block latency, measured and documented. The wizard's
      bitcoin.conf snippet now recommends blockreconstructionextratxn=1000
      when the key is absent: on the reference node the default extra pool
      (100) forced a compact-block round trip on every block, 1000 removed it
      on 10 of 36 blocks and cut the median reconstruction from 90–150 ms to
      60 ms. A new handbook page walks the whole chain — peering, reconstruction,
      validation, the cost of a restart, and how to measure it — with the numbers
      from the reference box and an Umbrel Home.
    • ipc-latency-probe (bitcoin-ipc crate binary): runs beside a pool
      against the same node and splits “node knows the block → template mapped”
      into ZMQ→waitNext, getBlock, the three small IPC calls, and the
      mapping step. IpcClient::fetch_parts_timed exposes the per-call
      durations for the same purpose.

    Changed

    • Umbrel package sets DVB_WARPPOOL_TEMPLATE_SOURCE=auto: with the
      Bitcoin app's IPC Mining Interface toggle on (Bitcoin app ≥ 1.3.0 / Core
      31), the pool takes the IPC template path automatically; otherwise it runs
      GBT + ZMQ exactly as before.
    • IPC template mapping runs in parallel across cores (order-preserving,
      scoped threads, templates ≥ 512 transactions); measured 43 → 28 ms median
      on the 4-vCPU reference box.

    Documentation

    • Full sweep against the code before this minor release. Corrected: the
      job_refresh_secs default (30 s via the CLI default, 90 s is the ESP32
      recommendation — the docs claimed 90), three places that still said a
      renewed TLS certificate needs a daemon restart (hot-reload has shipped
      since v1.22.0), the metrics' worker/wallet counter semantics after
      v1.25.6, SECURITY.md statements that no longer matched the code (unsafe
      inventory, CORS behaviour, UPnP "whitelist", non-existent external probes,
      IPv6 auto-ban scope, the HTTP-API rate limit behind a proxy, API-token
      scopes), README claims about TOTP replay protection, an APNs scaffold and
      /healthz contents, the reverse-proxy recipes (proxies must replace
      X-Forwarded-For, not append), ARCHITECTURE's schema column names, task
      list and "migrations", stale Sv2 phase notes, ten relative links that
      broke in the published handbook, and every version/test-count stamp. New
      handbook pages: Node Tuning for Block Latency, Peering Between Pools;
      new troubleshooting entries for silent ZMQ, Sv2 handshakes and
      low-difficulty diagnostics; the manuals carry the September 2026 edition.

    dvb-WarpPool v1.26.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.26.0 (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