4NK_miner/tools/import_signet_descriptors.sh

79 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)"
ENV_FILE="$ROOT_DIR/.env"
if [ ! -f "$ENV_FILE" ]; then
echo "Fichier d'env introuvable: $ENV_FILE" >&2
exit 1
fi
# shellcheck disable=SC1090
source "$ENV_FILE"
cli() {
docker exec "$BITCOIN_CONTAINER" sh -lc "bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf -signet $*"
}
cli_stdin() {
local subcmd="$1"; shift || true
docker exec -i "$BITCOIN_CONTAINER" sh -lc "bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf -signet -stdin $subcmd"
}
extract_checksum() {
sed -n 's/.*"checksum"[[:space:]]*:[[:space:]]*"\([a-z0-9]\{8\}\)".*/\1/p' | tr -d '\n'
}
wallet_is_descriptors() {
cli -rpcwallet="$MINING_WALLET" getwalletinfo 2>/dev/null | grep -q '"descriptors"[[:space:]]*:[[:space:]]*true'
}
wallet_exists() {
cli -rpcwallet="$MINING_WALLET" getwalletinfo >/dev/null 2>&1
}
ensure_descriptors_wallet() {
local wallet_path="/home/bitcoin/.bitcoin/signet/wallets/$MINING_WALLET"
if wallet_exists && wallet_is_descriptors; then
return 0
fi
cli -rpcwallet="$MINING_WALLET" unloadwallet "$MINING_WALLET" >/dev/null 2>&1 || true
docker exec "$BITCOIN_CONTAINER" sh -lc "if [ -d '$wallet_path' ]; then rm -rf '$wallet_path'; fi"
cli createwallet "$MINING_WALLET" false true "" true true true false >/dev/null
}
ensure_descriptors_wallet
DESC_EXT_ORIG="wsh(multi(1,[$MINING_FINGERPRINT/$MINING_PATH_PREFIX]$MINING_XPRV/0/*))"
DESC_INT_ORIG="wsh(multi(1,[$MINING_FINGERPRINT/$MINING_PATH_PREFIX]$MINING_XPRV/1/*))"
CS_EXT=$(printf '%s' "$DESC_EXT_ORIG" | cli_stdin getdescriptorinfo | extract_checksum)
CS_INT=$(printf '%s' "$DESC_INT_ORIG" | cli_stdin getdescriptorinfo | extract_checksum)
DESC_EXT="$DESC_EXT_ORIG#$CS_EXT"
DESC_INT="$DESC_INT_ORIG#$CS_INT"
PAYLOAD_MINER=$(printf '[{"desc":"%s","timestamp":"now","active":true,"range":[0,1000]},{"desc":"%s","timestamp":"now","active":true,"internal":true,"range":[0,1000]}]' "$DESC_EXT" "$DESC_INT")
printf '%s\n' "$PAYLOAD_MINER" | cli_stdin importdescriptors | cat
# Adresse coinbase: si vide, utiliser getnewaddress du wallet (garanti p2wsh multisig)
if [ -z "${COINBASE_ADDRESS:-}" ]; then
ADDR=$(cli -rpcwallet="$MINING_WALLET" getnewaddress coinbase bech32)
tmpfile=$(mktemp)
awk -v addr="$ADDR" 'BEGIN{updated=0} /^COINBASE_ADDRESS=/{print "COINBASE_ADDRESS=" addr; updated=1; next} {print} END{if(updated==0) print "COINBASE_ADDRESS=" addr}' "$ENV_FILE" > "$tmpfile"
mv "$tmpfile" "$ENV_FILE"
echo "COINBASE_ADDRESS=$ADDR"
else
echo "COINBASE_ADDRESS=$COINBASE_ADDRESS"
fi
if [ -n "${CHALLENGE_ALLPUBS:-}" ]; then
CHALL_PRIV_ORIG=$(printf '%s' "$CHALLENGE_ALLPUBS" | sed -E "s#\[$MINING_FINGERPRINT/$MINING_PATH_PREFIX\]tpub[[:alnum:]]+#[$MINING_FINGERPRINT/$MINING_PATH_PREFIX]$MINING_XPRV#g")
CS_CHALL=$(printf '%s' "$CHALL_PRIV_ORIG" | cli_stdin getdescriptorinfo | extract_checksum)
CHALL_PRIV="$CHALL_PRIV_ORIG#$CS_CHALL"
PAYLOAD_CHAL=$(printf '[{"desc":"%s","timestamp":"now","active":false,"range":[0,1000]}]' "$CHALL_PRIV")
printf '%s\n' "$PAYLOAD_CHAL" | cli_stdin importdescriptors | cat
fi
echo "Import terminé."