diff --git a/contrib/devtools/verify-evalscript-copy.sh b/contrib/devtools/verify-evalscript-copy.sh new file mode 100755 index 000000000000..b57f6536325d --- /dev/null +++ b/contrib/devtools/verify-evalscript-copy.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# Copyright (c) 2026 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# Verifies that a commit copies EvalScript() without modifying the function body. +# Usage: ./contrib/devtools/verify-evalscript-copy.sh + +export LC_ALL=C + +set -euo pipefail + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +readonly COMMIT="$1" +readonly PARENT="${COMMIT}^" +readonly FILE="src/script/interpreter.cpp" + +TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/verify-evalscript-copy.XXXXXX") +readonly TEMP_DIR +readonly ORIGINAL_BODY="${TEMP_DIR}/original_body" +readonly COPIED_BODY="${TEMP_DIR}/copied_body" + +cleanup() { + rm -f "$ORIGINAL_BODY" "$COPIED_BODY" + rmdir "$TEMP_DIR" +} +trap cleanup EXIT + +extract_body() { + local revision="$1" + local signature_pattern="$2" + local output="$3" + + git show "${revision}:${FILE}" | awk -v signature_pattern="$signature_pattern" ' + complete { next } + !found && $0 ~ signature_pattern { found = 1; next } + found { + print + opens = gsub(/{/, "{") + closes = gsub(/}/, "}") + if (opens > 0) seen_open = 1 + brace_count += opens - closes + if (seen_open && brace_count == 0) complete = 1 + } + END { + if (!complete) exit 1 + } + ' > "$output" +} + +echo "=== Verifying EvalScript copy in commit $COMMIT ===" + +if ! extract_body "$PARENT" '^bool EvalScript.*ScriptExecutionData& execdata, ScriptError' "$ORIGINAL_BODY"; then + echo "ERROR: Could not extract original EvalScript from parent commit" + exit 1 +fi +if ! extract_body "$COMMIT" '^bool EvalScript.*varops_budget' "$COPIED_BODY"; then + echo "ERROR: Could not extract copied EvalScript from commit" + exit 1 +fi + +echo "Original body: $(wc -l < "$ORIGINAL_BODY" | tr -d ' ') lines" +echo "Copied body: $(wc -l < "$COPIED_BODY" | tr -d ' ') lines" + +if BODY_DIFF=$(diff -u "$ORIGINAL_BODY" "$COPIED_BODY" 2>&1); then + echo "SUCCESS: Function bodies are identical" +else + echo "FAILURE: Function bodies differ" + echo "$BODY_DIFF" + exit 1 +fi diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 865167bbced0..2724dea27dfa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -120,6 +120,8 @@ add_library(bitcoin_consensus STATIC EXCLUDE_FROM_ALL script/interpreter.cpp script/script.cpp script/script_error.cpp + script/valtype_stack.cpp + script/val64.cpp uint256.cpp ) target_link_libraries(bitcoin_consensus diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt index 16eb29250f50..d5faaaa1332c 100644 --- a/src/bench/CMakeLists.txt +++ b/src/bench/CMakeLists.txt @@ -52,6 +52,20 @@ add_executable(bench_bitcoin xor.cpp ) +add_executable(bench_varops + bench_varops.cpp + bench.cpp + nanobench.cpp +) + +target_link_libraries(bench_varops + core_interface + test_util + bitcoin_node + secp256k1 + Boost::headers +) + include(TargetDataSources) target_raw_data_sources(bench_bitcoin NAMESPACE benchmark::data data/block413567.raw @@ -82,4 +96,17 @@ add_test(NAME bench_sanity_check_high_priority COMMAND bench_bitcoin -sanity-check -priority-level=high ) +add_test(NAME bench_varops_rejects_unknown_opcode + COMMAND bench_varops --silent + --opcodes OP_NOP OP_DOES_NOT_EXIST +) +set_tests_properties(bench_varops_rejects_unknown_opcode PROPERTIES WILL_FAIL TRUE) + +add_test(NAME bench_varops_reports_output_failure + COMMAND bench_varops --silent --epochs 1 + --opcodes OP_NOP + --file ${CMAKE_CURRENT_BINARY_DIR}/bench_varops_missing_directory/results.csv +) +set_tests_properties(bench_varops_reports_output_failure PROPERTIES WILL_FAIL TRUE) + install_binary_component(bench_bitcoin) diff --git a/src/bench/bench_varops.cpp b/src/bench/bench_varops.cpp new file mode 100644 index 000000000000..70842f6da1bf --- /dev/null +++ b/src/bench/bench_varops.cpp @@ -0,0 +1,2435 @@ +// Copyright (c) 2025-2026 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include +#include +#include +#include