aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorpablomartin4btc <pablomartin4btc@gmail.com>2023-10-13 00:53:15 -0300
committerpablomartin4btc <pablomartin4btc@gmail.com>2023-11-13 19:01:07 -0300
commit11b7269d83a56f919f9dddb7f7c72a96d428627f (patch)
tree6e42fed979d41062c394632a1586af97b3813782 /contrib
parent5ea4fc05edde66c5c90383bc054590dfbdb2b645 (diff)
script: Enhance validations in utxo_snapshot.sh
- Ensure that the snapshot height is higher than the pruned block height when the node is pruned. - Validate the correctness of the file path and check if the file already exists. - Make network activity disablement optional for the user. - Ensure the reconsiderblock command is triggered on exit, even in the case of user interruption (Ctrl-C). Co-authored-by: Chris Heyes <22148308+hazeycode@users.noreply.github.com> Co-authored-by: Sjors Provoost <sjors@sprovoost.nl>
Diffstat (limited to 'contrib')
-rwxr-xr-xcontrib/devtools/utxo_snapshot.sh58
1 files changed, 54 insertions, 4 deletions
diff --git a/contrib/devtools/utxo_snapshot.sh b/contrib/devtools/utxo_snapshot.sh
index dee25ff67b..80336954a9 100755
--- a/contrib/devtools/utxo_snapshot.sh
+++ b/contrib/devtools/utxo_snapshot.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
#
-# Copyright (c) 2019 The Bitcoin Core developers
+# Copyright (c) 2019-2023 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
@@ -8,6 +8,8 @@ export LC_ALL=C
set -ueo pipefail
+NETWORK_DISABLED=false
+
if (( $# < 3 )); then
echo 'Usage: utxo_snapshot.sh <generate-at-height> <snapshot-out-path> <bitcoin-cli-call ...>'
echo
@@ -26,9 +28,60 @@ OUTPUT_PATH="${1}"; shift;
# Most of the calls we make take a while to run, so pad with a lengthy timeout.
BITCOIN_CLI_CALL="${*} -rpcclienttimeout=9999999"
+# Check if the node is pruned and get the pruned block height
+PRUNED=$( ${BITCOIN_CLI_CALL} getblockchaininfo | awk '/pruneheight/ {print $2}' | tr -d ',' )
+
+if (( GENERATE_AT_HEIGHT < PRUNED )); then
+ echo "Error: The requested snapshot height (${GENERATE_AT_HEIGHT}) should be greater than the pruned block height (${PRUNED})."
+ exit 1
+fi
+
+# Early exit if file at OUTPUT_PATH already exists
+if [[ -e "$OUTPUT_PATH" ]]; then
+ (>&2 echo "Error: $OUTPUT_PATH already exists or is not a valid path.")
+ exit 1
+fi
+
+# Validate that the path is correct
+if [[ "${OUTPUT_PATH}" != "-" && ! -d "$(dirname "${OUTPUT_PATH}")" ]]; then
+ (>&2 echo "Error: The directory $(dirname "${OUTPUT_PATH}") does not exist.")
+ exit 1
+fi
+
+function cleanup {
+ (>&2 echo "Restoring chain to original height; this may take a while")
+ ${BITCOIN_CLI_CALL} reconsiderblock "${PIVOT_BLOCKHASH}"
+
+ if $NETWORK_DISABLED; then
+ (>&2 echo "Restoring network activity")
+ ${BITCOIN_CLI_CALL} setnetworkactive true
+ fi
+}
+
+function early_exit {
+ (>&2 echo "Exiting due to Ctrl-C")
+ cleanup
+ exit 1
+}
+
+# Prompt the user to disable network activity
+read -p "Do you want to disable network activity (setnetworkactive false) before running invalidateblock? (Y/n): " -r
+if [[ "$REPLY" =~ ^[Yy]*$ || -z "$REPLY" ]]; then
+ # User input is "Y", "y", or Enter key, proceed with the action
+ NETWORK_DISABLED=true
+ (>&2 echo "Disabling network activity")
+ ${BITCOIN_CLI_CALL} setnetworkactive false
+else
+ (>&2 echo "Network activity remains enabled")
+fi
+
# Block we'll invalidate/reconsider to rewind/fast-forward the chain.
PIVOT_BLOCKHASH=$($BITCOIN_CLI_CALL getblockhash $(( GENERATE_AT_HEIGHT + 1 )) )
+# Trap for normal exit and Ctrl-C
+trap cleanup EXIT
+trap early_exit INT
+
(>&2 echo "Rewinding chain back to height ${GENERATE_AT_HEIGHT} (by invalidating ${PIVOT_BLOCKHASH}); this may take a while")
${BITCOIN_CLI_CALL} invalidateblock "${PIVOT_BLOCKHASH}"
@@ -39,6 +92,3 @@ else
(>&2 echo "Generating UTXO snapshot...")
${BITCOIN_CLI_CALL} dumptxoutset "${OUTPUT_PATH}"
fi
-
-(>&2 echo "Restoring chain to original height; this may take a while")
-${BITCOIN_CLI_CALL} reconsiderblock "${PIVOT_BLOCKHASH}"