Skip to content

v0.9.0

Choose a tag to compare

@plebhash plebhash released this 04 Nov 13:50
a1034e1

General release information

Highlights of this release:

This release aligns the application stack with stratum-core 0.7.0 (stratum v1.13.0), closes the four-part Job Declarator Client hardening plan tracked in #38, adds Bitcoin Core v32 support to bitcoin_core_sv2 together with block submission over IPC, and continues the Loupe audit hardening across Pool, JDS, JDC and tProxy. The repository also moved to a single Cargo workspace with one lockfile.

Notable highlights include:

  • The Job Declarator Client (JDC) job declaration flow was reworked in four steps: a mining job token is spent exactly once and only on work sent upstream, work that finds no token waits for one, and templates are kept only while JDC can still use them (#930); JDS token answers are acted on once and checked whole before any of them is kept, and coinbase constraints are computed with checked arithmetic so an output that does not fit stops JDC at startup instead of reserving a wrapped-around number (#939); a Pool/JDS pair whose setup JDC cannot use is skipped instead of started without, only the upstream channel open JDC is waiting for is accepted, and a Pool assigning a target above max_target or an unusable extranonce layout triggers fallback (#947); every declaration and custom job moves through its stages (Undeclared, Declared, Proposed, Acknowledged) once, and what a job, a chain tip or a downstream channel owned is released when it ends (#949).
  • JDC and tProxy keep invalid hashrates and targets away from the upstream: a downstream nominal_hash_rate or max_target the channel constructor refuses is answered with the constructor's error code instead of being forwarded, and the aggregated hashrate in the upstream UpdateChannel saturates at Hashrate::MAX instead of overflowing.
  • bitcoin_core_sv2 gained a v32x runtime targeting Bitcoin Core 32.x, and jd-server now submits solved blocks to Bitcoin Core through the new Mining.submitBlock IPC method, which makes PushSolution propagate. The JDP path was hardened: supplied transactions that do not match the declaration are rejected with invalid-job, and declared wtxid lists, resolved transaction data and the mempool mirror are bounded in block weight.
  • Pool payout policy is bound per connection: the first successful channel open binds it, a later open resolving to different coinbase outputs is rejected with incompatible-payout-mode, and a rejected open can no longer redirect the coinbase of channels already on the connection.
  • JDS binds each allocated mining job token to the user_identifier that requested it, and the Pool answers invalid-mining-job-token on a SetCustomMiningJob whose channel identity does not match.
  • tProxy channel state no longer leaks under channel churn: share sequence counters, emptied client groups and per-channel job state are released when a channel closes in either direction, with churn tests asserting the collections return to baseline.
  • Fallback coordination in JDC and tProxy is now a CancellationToken plus a TaskTracker: tracked work counts from the moment the future exists until it is dropped, so there is no acknowledgement to forget and no wakeup mistaken for completion.
  • Every application paces accept() retries by 100 ms after a failed accept, so file descriptor or buffer exhaustion no longer spins a core and floods the log.
  • stratum-apps handles SIGTERM as well as SIGINT for graceful shutdown, and its config feature now gates the config crate so minimal builds pull in about 45 fewer crates.
  • Mainnet example configs for Pool, JDS and JDC pay the coinbase reward to the SRI community multisig instead of individual contributors' addresses.
  • Development workflow: all crates live in one Cargo workspace with a single Cargo.lock; CI lints every app crate with default features disabled; AGENTS.md documents attribute and comment placement, audit-finding triage and outcome-based reviews; SECURITY.md was added.
  • The application stack is aligned with the latest stratum-core 0.7.0 release, picking up the buffer_sv2, codec_sv2/framing_sv2 and channels_sv2 hardening, the spec field renames (ntime_start, target, max_target) and F32 validation.

What's Changed

  • pool payout policy isolation for solo mining by @lucasbalieiro in #857
  • Merge all crates into a single cargo workspace by @bit-aloo in #875
  • chore(deps): update stratum-core to 28149a8 by @SV2-bot in #900
  • docs(agents): warn against stealing comments when inserting items by @plebhash in #907
  • rename target message fields, aligning with spec cleanup by @plebhash in #845
  • feat(jds): bind mining job tokens to user_identity and check it on SetCustomMiningJob by @nulllpc in #839
  • docs(agents): define a schema for issues triaged from audit findings by @GitGab19 in #912
  • chore(deps): update stratum-core to 9566663 by @SV2-bot in #916
  • pay mainnet coinbase reward to SRI community multisig in config examples by @plebhash in #883
  • chore(deps): update stratum-core to c31ed53 by @SV2-bot in #918
  • chore(deps): update stratum-core to b1f678c by @SV2-bot in #919
  • catch attributes stolen by inserted items, in AGENTS.md and in CI by @plebhash in #917
  • build(stratum-apps): gate config crate on feature by @rkuester in #922
  • chore(deps): update stratum-core to 7e1c61a by @SV2-bot in #924
  • stratum-apps: refine shutdown signal handling (support SIGTERM) by @plebhash in #915
  • bitcoin_core_sv2 hardening by @plebhash in #856
  • chore(deps): update stratum-core to 31f8074 by @SV2-bot in #927
  • docs(agents): keep the fix suggestions out of audit issues by @plebhash in #925
  • ci: serve the yanked zip 3.0.0 to semver checks from git by @GitGab19 in #928
  • harden tProxy channel state, difficulty targets and upstream endpoint changes by @GitGab19 in #909
  • buffer_sv2 hardening companion by @bit-aloo in #903
  • refactor: track fallback work by future lifetime by @plebhash in #936
  • chore(deps): update stratum-core to 4a716fa by @SV2-bot in #940
  • fix JDC coinbase-only custom jobs, template retention and work waiting for job tokens by @GitGab19 in #930
  • codec_sv2 and framing_sv2 hardening companion by @bit-aloo in #938
  • chore(deps): update stratum-core to aee52d3 by @SV2-bot in #954
  • chore(deps): update stratum-core to fe69910 by @SV2-bot in #956
  • docs: add SECURITY.md by @plebhash in #959
  • fix JDC handling of JDS token answers and changing coinbase outputs by @GitGab19 in #939
  • fix: pace accept() retries after a failed accept by @plebhash in #955
  • fix JDC upstream setup, channel opening and refused downstream requests by @GitGab19 in #947
  • chore(deps): update stratum-core to d1d30f3 by @SV2-bot in #962
  • bitcoin_core_sv2: Bitcoin Core v32 by @plebhash in #911
  • chore(deps): update stratum-core to 73c7803 by @SV2-bot in #964
  • chore(deps): update stratum-core to d4244eb by @SV2-bot in #965
  • chore(deps): update stratum-core to a9f886d by @SV2-bot in #966
  • chore(deps): update stratum-core to 7067d56 by @SV2-bot in #967
  • chore(deps): update stratum-core to bb0bae0 by @SV2-bot in #969
  • chore(deps): update stratum-core to a86d5af by @SV2-bot in #970
  • fix JDC custom job stages and the state they leave behind by @GitGab19 in #949
  • chore(deps): update stratum-core to 7b85f90 by @SV2-bot in #972
  • chore(deps): update stratum-core to 59ba5d2 by @SV2-bot in #973
  • fix: keep invalid hashrates and targets away from the upstream by @lucasbalieiro in #957

New Contributors

Full Changelog: v0.8.0...v0.9.0