Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions contrib/devtools/verify-evalscript-copy.sh
Original file line number Diff line number Diff line change
@@ -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 <commit_hash>

export LC_ALL=C

set -euo pipefail

if [ "$#" -ne 1 ]; then
echo "Usage: $0 <commit_hash>"
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
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
27 changes: 27 additions & 0 deletions src/bench/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Loading