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>
150 lines
4.2 KiB
Bash
Executable File
150 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright (c) 2016-2024 The Hush developers
|
|
# Distributed under the GPLv3 software license, see the accompanying
|
|
# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
|
|
|
set -eu -o pipefail
|
|
|
|
# Check if cmake, a new dependency for randomx support, is installed on system and exits if it is not
|
|
if ! [ -x "$(command -v cmake)" ]; then
|
|
echo 'Error: cmake is not installed. Install cmake and try again.' >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! [ -x "$(command -v autoreconf)" ]; then
|
|
echo 'Error: autoconf is not installed. Install autoconf and try again.' >&2
|
|
echo 'On Debian-like systems: apt install autoconf' >&2
|
|
exit 1
|
|
fi
|
|
|
|
function cmd_pref() {
|
|
if type -p "$2" > /dev/null; then
|
|
eval "$1=$2"
|
|
else
|
|
eval "$1=$3"
|
|
fi
|
|
}
|
|
cat <<'EOF'
|
|
.~~~~~~~~~~~~~~~~.
|
|
{{ Building Hush!! }}
|
|
`~~~~~~~~~~~~~~~~`
|
|
\ ^__^
|
|
\ (@@)\_______
|
|
(__)\ HUSH )\/\ $
|
|
z zz ||----w | z |
|
|
zz zz z || z ||xxx z z|z zz
|
|
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
|
|
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
|
|
EOF
|
|
|
|
# If a g-prefixed version of the command exists, use it preferentially.
|
|
function gprefix() {
|
|
cmd_pref "$1" "g$2" "$2"
|
|
}
|
|
|
|
gprefix READLINK readlink
|
|
cd "$(dirname "$("$READLINK" -f "$0")")/.."
|
|
|
|
# Allow user overrides to $MAKE. Typical usage for users who need it:
|
|
# MAKE=gmake ./util/build.sh -j$(nproc)
|
|
if [[ -z "${MAKE-}" ]]; then
|
|
MAKE=make
|
|
fi
|
|
|
|
# Allow overrides to $BUILD and $HOST for porters. Most users will not need it.
|
|
# BUILD=i686-pc-linux-gnu ./util/build.sh
|
|
if [[ -z "${BUILD-}" ]]; then
|
|
BUILD="$(./depends/config.guess)"
|
|
fi
|
|
if [[ -z "${HOST-}" ]]; then
|
|
HOST="$BUILD"
|
|
fi
|
|
|
|
# Allow users to set arbitrary compile flags. Most users will not need this.
|
|
if [[ -z "${CONFIGURE_FLAGS-}" ]]; then
|
|
CONFIGURE_FLAGS=""
|
|
fi
|
|
|
|
if [ "x$*" = 'x--help' ]
|
|
then
|
|
cat ./util/dragon.txt
|
|
cat <<EOF
|
|
Welcome To The Hush Build System, Here Be Dragons!
|
|
Usage:
|
|
$0 --help
|
|
Show this help message and exit.
|
|
$0 [ --enable-lcov || --disable-tests ] [ --disable-mining ] [ --disable-libs ] [ MAKEARGS... ]
|
|
Build Hush and most of its transitive dependencies from source. MAKEARGS are applied to both dependencies and Hush itself.
|
|
If --enable-lcov is passed, Hush is configured to add coverage instrumentation, thus enabling "make cov" to work.
|
|
If --disable-tests is passed instead, the Hush tests are not built.
|
|
If --disable-mining is passed, Hush is configured to not build any mining code. It must be passed after the test arguments, if present.
|
|
It must be passed after the test/mining arguments, if present.
|
|
EOF
|
|
exit 0
|
|
fi
|
|
|
|
set -x
|
|
|
|
# If --enable-lcov is the first argument, enable lcov coverage support:
|
|
LCOV_ARG=''
|
|
HARDENING_ARG='--enable-hardening'
|
|
TEST_ARG=''
|
|
if [ "x${1:-}" = 'x--enable-lcov' ]
|
|
then
|
|
LCOV_ARG='--enable-lcov'
|
|
HARDENING_ARG='--disable-hardening'
|
|
shift
|
|
elif [ "x${1:-}" = 'x--disable-tests' ]
|
|
then
|
|
TEST_ARG='--enable-tests=no'
|
|
shift
|
|
fi
|
|
|
|
# If --disable-mining is the next argument, disable mining code:
|
|
MINING_ARG=''
|
|
if [ "x${1:-}" = 'x--disable-mining' ]
|
|
then
|
|
MINING_ARG='--enable-mining=no'
|
|
shift
|
|
fi
|
|
|
|
# Just show the useful info
|
|
eval "$MAKE" --version | head -n2
|
|
as --version | head -n1
|
|
as --version | tail -n1
|
|
ld -v
|
|
|
|
HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1
|
|
|
|
./autogen.sh
|
|
|
|
CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g -rdynamic'
|
|
|
|
# Build CryptoConditions stuff
|
|
WD=$PWD
|
|
cd src/cc
|
|
echo $PWD
|
|
./makecustom
|
|
cd $WD
|
|
|
|
# Build RandomX
|
|
cd src/RandomX
|
|
if [ -d "build" ]
|
|
then
|
|
ls -la build/librandomx*
|
|
else
|
|
mkdir build && cd build
|
|
# ARCH=default, NOT native. RandomX's CMakeLists maps ARCH=native to -march=native, which
|
|
# tunes the binary to the BUILD machine. Measured 2026-08-21: a build on the Zen4 pool box
|
|
# emitted 746 AVX-512 (zmm) instructions into librandomx.a, and every seed reports
|
|
# avx512f=no -- that binary SIGILLs inside RandomX on the whole fleet, and on any user CPU
|
|
# older than the build host. ARCH=default still enables -maes plus per-file -mssse3/-mavx2
|
|
# for argon2, so the portable baseline costs ~nothing.
|
|
cmake -DARCH=default ..
|
|
make
|
|
fi
|
|
|
|
cd $WD
|
|
|
|
"$MAKE" "$@" V=1
|