79 lines
3.1 KiB
Bash
Executable File
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é."
|