View in context in the libbitcoin Slack #general mirror.
master, 2026-07-21/23: system 8f0c082, database 6cf5992, network 12ff6dc, node 5ae5d93, server 6828fdd.
Toolchain: VS 2026 (18.8.12021.73), toolset *v145*, vs2026 solutions. Dependency: *UltrafastSecp256k1-vc145 4.5.0.0*.
v145 is required, not preferred — the vc143 package references __std_rotate, which exists only in the v145 STL, so it will not link against any v143 toolset.
msbuild libbitcoin-<repo>.sln /p:Configuration=StaticRelease /p:Platform=x64 /p:PreferredToolArchitecture=x64 /p:Option-sha=true /p:Option-ultrafast=true /p:Option-cuda=true /m:2 /p:MultiProcessorCompilation=false
Option-ultrafast defines WITH_ULTRAFAST → HAVE_ULTRAFAST and sets Linkage-ultrafast=static. Option-cuda links secp256k1_gpu_host + secp256k1_cuda + cudart_static and adds /INCLUDE:secp256k1_gpu_columns_provider_anchor. *Both default to false* — build without them and it compiles clean, links no GPU, and silently runs CPU-only. Verify with a 25.6 MB .nv_fatb section in the resulting binary. (/m:2 + MultiProcessorCompilation=false only works around C1060: out of heap space on bs.vcxproj.)
*Runtime config* (non-defaults only)
ini [bitcoin] milestone = 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f:0 checkpoint = 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f:0 [node] batch_signatures = 100000 maximum_concurrency = 4000 delay_inbound = false thread_priority = true memory_priority = true
milestone is height 950,000 and bypass = is_under_checkpoint(height) || is_milestone(link), so defaults skip script/signature validation for ~99.3% of the chain. Pinned to genesis, nothing is bypassed.
batch_signatures is the only GPU-related knob in libbitcoin — upstream default is now 0 (inline CPU verify). Non-zero routes through the ufsecp bridge, which binds CUDA via UFSECP_LBTC_AUTO. No device selector, no env var. Process ran under a Job Object at 75% CPU cap.
*Results — 959,516 blocks, all signature-verified*
- 22,450 s elapsed; tip reached at ~3 h, remainder idle at tip
- signature verification: *219 s total* — ecdsa_secs 11 s over 27,835 batches, schnorr_secs 208 s over 9,951 batches
- 27,834 of 27,835 ECDSA batches completed under the log's 1 s resolution; the single 11 s outlier is first-batch CUDA context/module load
- observed per-batch rates 4–8M sigs/sec, consistent with the aggregate
*What limited it — storage, per the run's own disk sampler (33,501 samples)*
Reads climb from 27 MB/s to a 3,309 MB/s 15-minute average, peaking at 5,166 MB/s. Writes stay bursty and modest. That is prevout resolution: random lookups into the archive tables, growing with inputs-per-block and table size.
archived − validated gap: p50 1,337, p90 3,954, max *4,000* — exactly maximum_concurrency. Download was pinned at its ceiling waiting on validation to drain, so this was validation-limited, not bandwidth-limited. Raising the window would not help.