Changes since 1.1.14 (released 2025-11-05).
Highlights
- Cross-platform ASIC/hardware timelord support for Linux (x86_64 and arm64), macOS ARM64, and Windows, including emulator coverage.
- ARM64 NUDUPL and MASM VDF paths, plus proof-construction and arithmetic performance improvements.
- Hardening for discriminant/proof bounds, strict BQFC deserialization, buffer handling, and Windows LLP64 correctness.
- macOS and Windows release bundles (now signed, notarized and installable), GMP 6.3.0, and atomic GitHub release-asset publishing.
- Python 3.11–3.14 wheels, PEP 561 type stubs, and refreshed timelord/ASIC documentation.
Thanks to our contributors: @Frank-Buss, @manoj398, @OverActiveBladderSystem and @xearl4.
Upgrade notes
- Python 3.11 or newer is now required. Python 3.9 and 3.10 are no longer supported.
- Wheels are built for CPython 3.11–3.14 on Linux x86_64/arm64, macOS Intel/Apple Silicon, and Windows x64.
- The minimum supported macOS version is now 15.
- The Python extension module moved to the private
chiavdf._chiavdf;import chiavdfand the public API are unchanged. - Windows release binaries are now signed with Azure Artifact Signing instead of DigiCert, and the Windows zip places DLLs beside the executables.
Core
- ARM64 NUDUPL VDF path — The main VDF loop now uses the C++ NUDUPL implementation on ARM64, with x86-only pipeline and assembly paths guarded so Apple Silicon and Linux aarch64 get a fast, maintainable native path. (#298)
- MASM VDF path and base-integer VDF — Integrates the ARM64 NUDUPL work into the core, adds a MASM assembly path for Windows, and adds listener/profile support so Windows builds can use the optimized implementation. (#300)
- Cross-platform hardware VDF client —
hw_vdf_clientnow builds on Linux, macOS arm64 and Windows, with FT4222 driver provisioning scripts for each OS and hardening of the callback and prover paths. (#299) - Faster proof checking —
qfb_nucompnow reuses per-thread GMP scratch space asqfb_nuduplalready did, and exponents are checked four bits at a time, reducing allocation and work in the proof checker. (#431), thanks @OverActiveBladderSystem! - Bounded ASIC proof checkpoints — ASIC proof construction now bounds its checkpoints and shares a single NUCOMP scratch across persistent aux workers, keeping memory use predictable. (#434)
- Glitched ASIC proofs are dropped — An invalid intermediate value from the hardware now causes that proof to be discarded instead of terminating the process or stalling the session. (#435)
- Auto-frequency PLL bounds — The hardware auto-frequency loop now stays within the PLL frequency table at both ends instead of stepping past it. (#440)
- Windows LLP64 correctness — Fixes 64-bit integer truncation in
Reducerandxgcd_partialon 64-bit Windows, wherelongis 32 bits, so results match Linux and macOS. (#419), thanks @manoj398! - Windows 128-bit integer backend — Removes non-standard
stdtrait specializations from the vendoreduint128_tand unifies backend selection underCHIAVDF_USE_UINT128_T_FALLBACK, fixing builds on newer MSVC toolsets. (#375) - Windows MPIR CPU detection — Windows builds now pin the MPIR build that selects code paths by CPUID feature detection, so binaries run correctly across CPU generations. (#423)
- GMP 6.3.0 — Updates GMP to 6.3.0 with patches so Linux builds work correctly on older CPUs without BMI2. (#270)
- Prover header cleanup — Fixes a One Definition Rule mismatch in
Prover::GetFormand consolidatesProver/ParallelProverinto a single shared declaration. (#306, #307, #308), thanks @xearl4 for #306! - Test-only code out of production builds — Test-only headers in
vdf.hare now gated behindVDF_TEST, so production builds such asvdf_clientno longer compile the unused reference path. (#396) --versionflag —vdf_client,vdf_bench,hw_testandhw_vdf_clientnow print their embedded version with--version. (#314)- Python type stubs — chiavdf now ships PEP 561
py.typedand__init__.pyistubs, checked bystubtestin CI. (#366)
Hardening
- Input validation for discriminants and proofs — Adds explicit runtime bounds checks for discriminant size and form serialization in the verifier and BQFC paths, replacing assert-only assumptions, and makes
vdf_clientsession parsing return clean errors. (#331) - Discriminant size validation —
CreateDiscriminantnow rejects non-positive, oversized and non-multiple-of-8 sizes and empty seeds. (#286) - Strict BQFC canonical forms — Strict-mode BQFC decoding now accepts only reduced forms, so each form has a single canonical encoding. (#335)
- Session setup buffer checks —
InitSessioninvdf_clientnow validates sizes before using them. (#296), thanks @Frank-Buss! - Checked parameter conversions —
ApproximateParametersreplaces unchecked float/integer casts with range-checked conversions. (#316) - Tiny-iteration
ProveSlow— Guards parameter estimation for very small iteration counts, fixing a crash on macOS ARM. (#318)
Signing and release packaging
- macOS release bundle — Adds signed macOS ARM64/x86_64 Homebrew-ready release bundles with private FTDI libraries and portable install names. (#319)
- GMP bundled on macOS — The macOS release zip now bundles GMP, so the hardened-runtime binaries launch without depending on Homebrew paths. (#437)
- Signed, notarized macOS
.pkg— Adds a Developer ID Installer–signed, notarized and stapled.pkgto the macOS release assets alongside the Homebrew zip. (#443) - Windows bundle and winget packaging — Adds a Windows CLI bundle, release-artifact upload and signing for release builds. (#323)
- Windows zip layout — The Windows zip now places the MPIR and FTDI DLLs beside the executables so they launch without extra setup. (#436)
- Azure Artifact Signing — Windows release signing moves from DigiCert to Azure Artifact Signing, authenticating with an OIDC federated credential instead of stored certificate secrets. (#444)
- Ubuntu ARM64 packages — Builds and uploads
.debpackages for both Ubuntu x86_64 and arm64. (#320) - Atomic release publishing — GitHub release assets are attached only after every matrix job succeeds, instead of piecemeal from each job. (#438)
- Downstream trigger after all builds — The release notification to downstream packaging now runs in its own job after every build finishes. (#321)
- Release 1.2.0 — Bumps the Rust crate to 1.2.0 and requires Python 3.11+. (#442)
Build and CI
- Unified CI workflow — Merges the
vdf_clientandhw_vdf_clientworkflows into one cross-platform workflow, and reorders regressions after the hardware smoke tests. (#311, #324) - macOS 15 minimum — Raises the macOS minimum and runners to 15, and fixes the resulting Intel build and packaging issues. (#326, #327)
- Windows CI fixes — Fixes Windows assembly CI and aligns optimized test coverage with other platforms. (#304)
- Less warning noise — Reduces compiler warnings across Ubuntu, macOS and Windows and fixes Windows optimized build regressions. (#315)
- Runner naming — Uses GitHub's
ubuntu-24.04-armrunner label and simplifies non-matrix jobs. (#347) - Python version support — Raised the floor to 3.10, then retired 3.10 wheels and moved package CI to Python 3.12 with a single pinned cibuildwheel version. (#389, #333, #428)
- Wheel build fixes — Fixes the cibuildwheel skip pattern, unblocks setuptools-scm 10.2.3 wheel builds on macOS/Windows, and downloads GMP from the kernel.org mirror after
ftp.gnu.orgtimeouts. (#288, #411, #418) - Node 24 actions — Replaces the unmaintained stale fork with
actions/stalev11 and moves the MSVC setup step to a Node 24 action. (#448, #445) - Managed workflow updates — Syncs the shared dependency review, commit-signing and Dependabot workflows from the organization template, including tighter workflow permissions. (#284, #329, #332, #340, #341, #342, #343, #344, #346, #360, #363, #378, #382, #393, #399, #406, #412, #420, #421, #422, #424, #426, #446)
Tests
- GoogleTest regressions — Adds regression tests for
vdf_clientsession parsing, compressed form/proof deserialization and tiny-iterationProveSlow, consolidated into fewer test binaries. (#313, #317) - ASIC failure tests — Tightens the abandoned-interior proof tests so they exercise the cancellation mechanism they are named for. (#447)
- Fuzzing — Rust fuzz targets now use typed
Arbitraryinputs and cover recursion and larger iteration counts; the fuzzer builds with hardening and Rust bindings build on macOS; the cargo-fuzz install falls back when nightly drifts. (#290, #289, #358)
Documentation
- Timelord and ASIC guides — Rewrites
README_ASIC.mdas a build and operations guide for Linux, macOS and Windows, adds software vs. ASIC timelord setup paths to the README, and moves historical competition background to its own file. (#432, #441) - License — Updates the copyright year to 2026. (#295)
Dependencies
- Python build: pybind11 ≥3.1.0 (with the matching CMake fallback), setuptools ≥84.0.0, setuptools-scm ≥10.3.4. (#353, #402, #349, #388, #401, #350, #381, #385, #391, #417)
- Rust: bindgen 0.73.2, cmake 0.1.58, libfuzzer-sys 0.4.13. (#263, #409, #294, #345, #309, #372)
- GitHub Actions: routine Dependabot bumps of checkout, cache, upload/download-artifact, github-script, setup-qemu, codeql-action, configure-aws-credentials, import-codesign-certs, crates-io-auth-action and dependency-review-action. (#285, #292, #293, #302, #310, #328, #330, #336, #337, #351, #352, #355, #356, #357, #361, #364, #365, #370, #371, #373, #374, #377, #379, #380, #384, #386, #387, #390, #392, #394, #395, #398, #403, #405, #407, #408, #413, #414, #415, #416, #427, #429, #430)