The RandomX skip in RandomXValidationRequired() has never fired in production.
It skips verification below the last in-index checkpoint, but the DRAGONX
checkpoint table ended at 2,838,000 while ASSETCHAINS_RANDOMX_VALIDATION is
2,838,976 -- the window was empty by 976 blocks. Every block since the RandomX
activation has been fully verified, at ~65ms per hash on the fastest x86 core
available and ~180ms on a typical user machine.
Extends the table by 388 entries at stride 1000, from 2,839,000 to 3,226,000
(tip - ~5,600, far beyond any reorg this chain has produced; max observed depth
is 3-4). Blocks requiring a RandomX verify drop from 391,447 to ~5,500. The
same extension carries the existing script/zk-proof skip (fScriptChecks,
fExpensiveChecks) over the same range.
Checkpoint data verification, before it went anywhere near source:
- generated on a continuously-synced node
- all 388 hashes identical on 4 other full nodes (388/388 on each)
- reverse-verified hash -> height, all on the active chain
- re-extracted from the patched file and diffed against the verified set
- 2,838 pre-existing entries unchanged; all 3,226 ascending and unique
Trailer fields computed from RPC, not util/checkpoints.pl, which greps a
rotating debug.log and assumes 1440 blk/day (DragonX is 2400).
Also switches all three build scripts from -DARCH=native to -DARCH=default.
RandomX's CMakeLists maps ARCH=native to -march=native, tuning the binary to
the build host: a Zen4 build emitted 746 AVX-512 instructions into
librandomx.a, and every seed reports avx512f=no, so that binary would SIGILL
inside RandomX fleet-wide -- and on any user CPU older than the build machine.
build-win.sh had the same flag, so shipped Windows binaries inherited it.
ARCH=default keeps -maes and per-file -mssse3/-mavx2, so the portable baseline
costs essentially nothing. Note build.sh skips cmake entirely when
src/RandomX/build/ exists, so a stale dir silently preserves the old ARCH.
Validated on an isolated datadir on an EPYC seed, bootstrap -> tip:
- below 3,226,000 (RandomX skipped): 91.3 blk/s (22,823 blocks / 250s)
- at/above 3,226,000 (verified): 4.7 blk/s
~19x at the boundary. The 4.7 blk/s baseline matches a same-day restore on
the old binary, corroborating it independently.
- gettxoutsetinfo at height 3,231,951 BYTE-IDENTICAL to a live node
(hash_serialized 4885c2374ef8b84c648b97d560a57cfcc99bb979142dc89c2a5ccbc90a1f1692,
222,635 txs/txouts, 15,826,352 bytes, total 667909.93689180)
- synced through all 388 new checkpoints with zero rejections
- verifychain 4 (500) and 3 (2000) both true
Binary: v1.0.3-bf3c33c53-dirty, stripped md5 fe83d70fec5b50c38bf65ea6c733ffa9
Checkpoints decay at 2,400 blocks/day; regenerating them belongs on the
release checklist.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
DragonX utilities
Scripts in this directory are used by DragonX developers in the process of development or in releasing a new version of DragonX.
Utilities in this directory:
build.sh
Compile DragonX full node code. This is the main build entrypoint.
build-arm.sh
Compile DragonX full node code for ARM architecture. has not worked for some time
build-arm-xcompile.sh
Cross-Compile DragonX full node code for ARM architecture on an x86 build server.
build-debian-package.sh
Builds an x86 Debian package for DragonX.
build-debian-package-ARM.sh
Builds an ARM Debian package for DragonX.
build-mac.sh
Compile DragonX full node code for mac. NOTE: This is likely broken.
build-win.sh
Compile DragonX full node code for windows
bootstrap-dragonx.sh
Download and apply a DRAGONX blockchain bootstrap so a new node can sync quickly. Safely preserves wallet.dat and configuration files, and verifies the archive against checksums and (once configured) a detached signature. See sign-bootstrap.md for the signing procedure.
sign-bootstrap.md
Documentation for maintainers on how to create the signing keypair and sign the DRAGONX.zip bootstrap archive that bootstrap-dragonx.sh verifies.
checkpoints.pl
Generate checkpoint data for chainparams.cpp . This automates the creation of block heights and block hashes by asking dragonxd (via dragonx-cli) for the data and then generating the C++ code needed to embed them in the DragonX source code.
docker-entrypoint.sh
Script to use DragonX with Docker.
docker-hush-cli.sh
Convenience script to run dragonx-cli in a running Docker container.
replace.pl
Replace a string in a set of files by another string. Very useful for updating a variable name or value across many files, or updating copyrights.
security-check.py
Perform basic ELF security checks on a series of executables.
symbol-check.py
A script to check that the (Linux) executables produced by gitian only contain allowed gcc, glibc and libstdc++ version symbols. This makes sure they are still compatible with the minimum supported Linux distribution versions.
Example usage after a gitian build:
find ../gitian-builder/build -type f -executable | xargs python util/symbol-check.py
If only supported symbols are used the return value will be 0 and the output will be empty.
If there are 'unsupported' symbols, the return value will be 1 a list like this will be printed:
.../64/test_bitcoin: symbol memcpy from unsupported version GLIBC_2.14
.../64/test_bitcoin: symbol __fdelt_chk from unsupported version GLIBC_2.15
.../64/test_bitcoin: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15
.../64/test_bitcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15
gen-manpages.sh
A small script to automatically create manpages in ../../doc/man by running the release binaries with the -help option. This requires help2man which can be found at: https://www.gnu.org/software/help2man/
When you type "make manpages" it runs this script.
gen-linux-binary-release.sh
Generate linux release binary.