-
v1.26.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m55sCI / Rust fmt (push) Successful in 1m10sCI / Rust test (push) Successful in 5m41sCI / UI (SvelteKit) (push) Successful in 1m16sCI / Security Audit (push) Successful in 1m18sdocs / build (push) Successful in 36sRelease / Docker Multi-Arch (push) Successful in 20m18sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 10m53sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 9m34sRelease / Linux .deb + .rpm (amd64) (push) Successful in 10m15sRelease / Linux .deb + .rpm (arm64) (push) Successful in 11m30sRelease / Linux AppImage (aarch64) (push) Successful in 10m34sRelease / Linux AppImage (x86_64) (push) Successful in 9m36sRelease / Cosign sign artifacts (push) Successful in 26sRelease / Forgejo Release (push) Successful in 37sreleased this
2026-09-07 11:33:16 +00:00 | 290 commits to main since this releaseThe 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_addrpoints at an unreachable or non-publishing socket
used to fall back to the poll tick without a word — new blocks arrived up
tojob_refresh_secslate (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 showsbitcoin_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 stopand
systemctl stopwithout aKillSignaloverride send SIGTERM, which used
to kill the process outright: no flush of the rejected-share buffer, no
clean session ends, no IPC templatedestroy. Now it triggers the same
orderly shutdown as Ctrl-C. [server] reuse_portbinds every listener withSO_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
logstip_to_job_msper new block,/api/overviewcarries the last
values, and/metricsexportswarppool_template_fetch_ms,
warppool_template_map_msandwarppool_tip_to_job_ms. What the
standalone probe measured on the reference box is now visible on every
installation. template_source = "auto"andDVB_WARPPOOL_TEMPLATE_SOURCEenv
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 toautoso 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 atdebug: 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 decodedSetupConnectionfields, and the
reason behind everySetupConnectionError. Troubleshooting page updated
with the line-by-line reading guide. - Node tuning for block latency, measured and documented. The wizard's
bitcoin.confsnippet now recommendsblockreconstructionextratxn=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_timedexposes 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_secsdefault (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
/healthzcontents, 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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Health warning when ZMQ is configured but silent. A pool whose