feat: Implémentation du transfert automatique de fonds

- Scripts de transfert automatique de fonds du wallet mining vers le relay
- Vérification automatique des fonds insuffisants
- Monitoring continu des fonds
- Intégration dans docker-compose
- Documentation complète des scripts
- Résolution automatique du problème de fonds pour le pairing
This commit is contained in:
Nicolas Cantu 2025-09-20 16:02:37 +00:00
parent 790ae52fcf
commit fa13f34e0d
7 changed files with 610 additions and 0 deletions

View File

@ -68,6 +68,7 @@ services:
- ./relay/sdk_relay.conf:/home/bitcoin/.conf:ro
- sdk_data:/home/bitcoin/.4nk
- bitcoin_data:/home/bitcoin/.bitcoin
- ./scripts/funds:/scripts/funds:ro
ports:
- "127.0.0.1:8090:8090"
- "127.0.0.1:8091:8091"
@ -256,3 +257,4 @@ networks:
ipam:
config:
- subnet: 172.20.0.0/16

View File

@ -0,0 +1,186 @@
# Transfert Automatique de Fonds
## Vue d'ensemble
Ce système implémente un mécanisme automatique de transfert de fonds du wallet mining vers le relay en cas de fonds insuffisants. Cela résout automatiquement le problème de fonds pour le processus de pairing.
## Scripts Disponibles
### 1. `scripts/funds/simple_transfer.sh`
Script de base pour transférer des fonds du wallet mining vers le relay.
**Usage:**
```bash
./scripts/funds/simple_transfer.sh [amount]
```
**Paramètres:**
- `amount`: Montant à transférer en BTC (par défaut: 0.01)
**Fonctionnalités:**
- Vérification de la connectivité Bitcoin
- Vérification des soldes des wallets
- Génération d'une adresse pour le relay
- Transfert de fonds
- Confirmation de la transaction
- Redémarrage du relay
### 2. `scripts/funds/check_and_transfer_funds.sh`
Script d'intégration qui vérifie les fonds et lance un transfert si nécessaire.
**Usage:**
```bash
./scripts/funds/check_and_transfer_funds.sh [min_amount]
```
**Paramètres:**
- `min_amount`: Montant minimum requis en BTC (par défaut: 0.001)
**Fonctionnalités:**
- Vérification des fonds du relay dans la configuration
- Vérification du solde du wallet relay dans Bitcoin Core
- Transfert automatique si fonds insuffisants
- Transfère 10x le montant minimum requis
### 3. `scripts/funds/monitor_funds.sh`
Script de monitoring continu des fonds du relay.
**Usage:**
```bash
./scripts/funds/monitor_funds.sh [interval_seconds]
```
**Paramètres:**
- `interval_seconds`: Intervalle de vérification en secondes (par défaut: 30)
**Fonctionnalités:**
- Monitoring continu des fonds
- Vérification de l'état du relay
- Transfert automatique si fonds insuffisants
- Affichage des statistiques en temps réel
### 4. `scripts/funds/startup_funds_check.sh`
Script de vérification des fonds au démarrage.
**Usage:**
```bash
./scripts/funds/startup_funds_check.sh
```
**Fonctionnalités:**
- Attente du démarrage des services
- Vérification de la connectivité Bitcoin
- Vérification de l'état du relay
- Lancement du transfert automatique si nécessaire
### 5. `scripts/startup-with-funds-check.sh`
Script de démarrage complet avec vérification des fonds.
**Usage:**
```bash
./scripts/startup-with-funds-check.sh
```
**Fonctionnalités:**
- Démarrage des services Docker Compose
- Attente du démarrage complet
- Vérification et transfert automatique des fonds
## Intégration dans les Applications
### Docker Compose
Le volume `./scripts/funds:/scripts/funds:ro` est monté dans le conteneur `sdk_relay` pour permettre l'accès aux scripts.
### Démarrage Automatique
Utilisez `./scripts/startup-with-funds-check.sh` pour démarrer les services avec vérification automatique des fonds.
### Monitoring Continu
Lancez `./scripts/funds/monitor_funds.sh` en arrière-plan pour un monitoring continu des fonds.
## Configuration
### Variables d'Environnement
- `MINING_WALLET`: Nom du wallet mining (par défaut: "mining_mnemonic")
- `RELAY_WALLET`: Nom du wallet relay (par défaut: "default")
- `COOKIE_FILE`: Chemin vers le fichier cookie Bitcoin (par défaut: "/home/bitcoin/.bitcoin/signet/.cookie")
### Montants par Défaut
- Montant minimum: 0.001 BTC (100,000 sats)
- Montant de transfert par défaut: 0.01 BTC (1,000,000 sats)
- Multiplicateur de transfert: 10x le montant minimum
## Dépannage
### Problèmes Courants
1. **bc non installé**
```bash
sudo apt-get install -y bc
```
2. **Permissions insuffisantes**
```bash
chmod +x scripts/funds/*.sh
```
3. **Wallet non chargé**
Les scripts chargent automatiquement le wallet relay si nécessaire.
4. **Transaction non confirmée**
Les scripts génèrent automatiquement des blocs pour confirmer les transactions.
### Logs
Les scripts affichent des logs colorés pour faciliter le débogage:
- 🔵 [INFO]: Informations générales
- 🟢 [SUCCESS]: Opérations réussies
- 🟡 [WARNING]: Avertissements
- 🔴 [ERROR]: Erreurs
## Exemples d'Utilisation
### Transfert Manuel
```bash
# Transférer 0.01 BTC
./scripts/funds/simple_transfer.sh 0.01
# Transférer 0.1 BTC
./scripts/funds/simple_transfer.sh 0.1
```
### Vérification et Transfert Automatique
```bash
# Vérifier et transférer si nécessaire (minimum 0.001 BTC)
./scripts/funds/check_and_transfer_funds.sh 0.001
# Vérifier et transférer si nécessaire (minimum 0.01 BTC)
./scripts/funds/check_and_transfer_funds.sh 0.01
```
### Monitoring Continu
```bash
# Monitoring toutes les 30 secondes
./scripts/funds/monitor_funds.sh
# Monitoring toutes les 60 secondes
./scripts/funds/monitor_funds.sh 60
```
### Démarrage Complet
```bash
# Démarrage avec vérification des fonds
./scripts/startup-with-funds-check.sh
```
## Sécurité
- Les scripts utilisent des montants par défaut sécurisés
- Vérification des soldes avant transfert
- Confirmation des transactions
- Logs détaillés pour audit
## Maintenance
- Les scripts sont conçus pour être robustes et auto-réparateurs
- Monitoring continu disponible
- Redémarrage automatique du relay après transfert
- Gestion des erreurs et retry automatique

View File

@ -0,0 +1,229 @@
#!/bin/bash
# Script de transfert automatique de fonds du wallet mining vers le relay
# Usage: ./auto_transfer_funds.sh [amount] [relay_address]
set -e
# Configuration
MINING_WALLET="mining_mnemonic"
RELAY_WALLET="default"
BITCOIN_RPC_URL="bitcoin:38332"
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
MIN_AMOUNT=0.001 # Montant minimum à transférer (0.001 BTC = 100,000 sats)
DEFAULT_AMOUNT=0.01 # Montant par défaut (0.01 BTC = 1,000,000 sats)
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonctions de logging
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Fonction pour vérifier la connectivité Bitcoin
check_bitcoin_connectivity() {
log_info "Vérification de la connectivité Bitcoin..."
if ! docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" getblockchaininfo > /dev/null 2>&1; then
log_error "Impossible de se connecter au nœud Bitcoin"
return 1
fi
log_success "Connexion Bitcoin OK"
return 0
}
# Fonction pour vérifier le solde du wallet mining
check_mining_balance() {
log_info "Vérification du solde du wallet mining..."
local balance=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" getbalance 2>/dev/null || echo "0")
if [ "$balance" = "0" ]; then
log_error "Wallet mining vide ou inaccessible"
return 1
fi
log_success "Solde wallet mining: $balance BTC"
echo "$balance"
return 0
}
# Fonction pour vérifier le solde du wallet relay
check_relay_balance() {
log_info "Vérification du solde du wallet relay..."
# Charger le wallet relay s'il n'est pas déjà chargé
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
local balance=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
log_info "Solde wallet relay: $balance BTC"
echo "$balance"
return 0
}
# Fonction pour générer une adresse pour le relay
generate_relay_address() {
log_info "Génération d'une adresse pour le relay..."
# Charger le wallet relay
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
local address=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getnewaddress "relay_funding" 2>/dev/null)
if [ -z "$address" ]; then
log_error "Impossible de générer une adresse pour le relay"
return 1
fi
log_success "Adresse générée: $address"
echo "$address"
return 0
}
# Fonction pour transférer des fonds
transfer_funds() {
local amount=$1
local address=$2
log_info "Transfert de $amount BTC vers $address..."
local txid=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" sendtoaddress "$address" "$amount" 2>/dev/null)
if [ -z "$txid" ]; then
log_error "Échec du transfert de fonds"
return 1
fi
log_success "Transfert effectué. TXID: $txid"
echo "$txid"
return 0
}
# Fonction pour confirmer une transaction
confirm_transaction() {
local txid=$1
local address=$2
log_info "Confirmation de la transaction $txid..."
# Générer des blocs pour confirmer la transaction
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" generatetoaddress 6 "$address" > /dev/null 2>&1
# Vérifier les confirmations
local confirmations=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" gettransaction "$txid" 2>/dev/null | jq -r '.confirmations // 0')
if [ "$confirmations" -gt 0 ]; then
log_success "Transaction confirmée ($confirmations confirmations)"
return 0
else
log_warning "Transaction non confirmée (confirmations: $confirmations)"
return 1
fi
}
# Fonction pour vérifier les fonds du relay dans le fichier de configuration
check_relay_funds_in_config() {
log_info "Vérification des fonds du relay dans la configuration..."
local outputs_count=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
log_info "Nombre d'outputs du relay: $outputs_count"
echo "$outputs_count"
return 0
}
# Fonction principale
main() {
local amount=${1:-$DEFAULT_AMOUNT}
local relay_address=${2:-""}
log_info "=== TRANSFERT AUTOMATIQUE DE FONDS ==="
log_info "Montant: $amount BTC"
# Vérifications préliminaires
if ! check_bitcoin_connectivity; then
exit 1
fi
# Vérifier le solde du wallet mining
local mining_balance=$(check_mining_balance)
if [ $? -ne 0 ]; then
exit 1
fi
# Vérifier si le montant demandé est disponible
if (( $(echo "$mining_balance < $amount" | bc -l) )); then
log_error "Solde insuffisant dans le wallet mining ($mining_balance BTC < $amount BTC)"
exit 1
fi
# Vérifier le solde actuel du relay
local relay_balance=$(check_relay_balance)
# Vérifier les fonds dans la configuration du relay
local outputs_count=$(check_relay_funds_in_config)
# Si le relay a déjà des fonds, ne pas transférer
if (( $(echo "$relay_balance > 0" | bc -l) )) || [ "$outputs_count" -gt 0 ]; then
log_info "Le relay a déjà des fonds (balance: $relay_balance BTC, outputs: $outputs_count)"
log_success "Aucun transfert nécessaire"
exit 0
fi
# Générer une adresse pour le relay si non fournie
if [ -z "$relay_address" ]; then
relay_address=$(generate_relay_address)
if [ $? -ne 0 ]; then
exit 1
fi
fi
# Effectuer le transfert
local txid=$(transfer_funds "$amount" "$relay_address")
if [ $? -ne 0 ]; then
exit 1
fi
# Confirmer la transaction
if confirm_transaction "$txid" "$relay_address"; then
log_success "Transfert de fonds réussi et confirmé"
# Redémarrer le relay pour qu'il détecte les nouveaux fonds
log_info "Redémarrage du relay pour détecter les nouveaux fonds..."
docker compose restart sdk_relay
log_success "Relay redémarré. Les fonds devraient être détectés dans quelques secondes."
else
log_warning "Transfert effectué mais non confirmé. Le relay pourrait ne pas détecter les fonds immédiatement."
fi
log_success "=== TRANSFERT AUTOMATIQUE TERMINÉ ==="
}
# Vérifier que bc est installé
if ! command -v bc &> /dev/null; then
log_error "bc n'est pas installé. Installation..."
sudo apt-get update && sudo apt-get install -y bc
fi
# Exécuter la fonction principale
main "$@"

View File

@ -0,0 +1,44 @@
#!/bin/bash
# Script d'intégration pour vérifier et transférer des fonds automatiquement
# Usage: ./check_and_transfer_funds.sh [min_amount]
set -e
MIN_AMOUNT=${1:-0.001} # Montant minimum en BTC (par défaut 0.001 BTC = 100,000 sats)
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
RELAY_WALLET="default"
echo "=== VÉRIFICATION ET TRANSFERT AUTOMATIQUE DE FONDS ==="
# Vérifier les fonds du relay dans la configuration
echo "Vérification des fonds du relay..."
OUTPUTS_COUNT=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
if [ "$OUTPUTS_COUNT" -gt 0 ]; then
echo "Le relay a déjà des fonds ($OUTPUTS_COUNT outputs). Aucun transfert nécessaire."
exit 0
fi
# Vérifier le solde du wallet relay dans Bitcoin Core
echo "Vérification du solde du wallet relay dans Bitcoin Core..."
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
RELAY_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
if [ "$(echo "$RELAY_BALANCE >= $MIN_AMOUNT" | bc -l)" = "1" ]; then
echo "Le relay a suffisamment de fonds ($RELAY_BALANCE BTC >= $MIN_AMOUNT BTC). Aucun transfert nécessaire."
exit 0
fi
echo "Fonds insuffisants détectés. Lancement du transfert automatique..."
echo "Solde actuel: $RELAY_BALANCE BTC"
echo "Montant minimum requis: $MIN_AMOUNT BTC"
# Lancer le script de transfert
TRANSFER_AMOUNT=$(echo "$MIN_AMOUNT * 10" | bc -l) # Transférer 10x le montant minimum
echo "Transfert de $TRANSFER_AMOUNT BTC..."
# Exécuter le script de transfert
./scripts/funds/simple_transfer.sh "$TRANSFER_AMOUNT"
echo "=== VÉRIFICATION ET TRANSFERT TERMINÉ ==="

46
scripts/funds/monitor_funds.sh Executable file
View File

@ -0,0 +1,46 @@
#!/bin/bash
# Script de monitoring des fonds du relay
# Usage: ./monitor_funds.sh [interval_seconds]
set -e
INTERVAL=${1:-30} # Intervalle de vérification en secondes (par défaut 30s)
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
RELAY_WALLET="default"
echo "=== MONITORING DES FONDS DU RELAY ==="
echo "Intervalle de vérification: $INTERVAL secondes"
echo "Appuyez sur Ctrl+C pour arrêter"
while true; do
echo ""
echo "--- $(date) ---"
# Vérifier les fonds du relay dans la configuration
OUTPUTS_COUNT=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
echo "Outputs du relay: $OUTPUTS_COUNT"
# Vérifier le solde du wallet relay dans Bitcoin Core
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
RELAY_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
echo "Solde wallet relay: $RELAY_BALANCE BTC"
# Vérifier le solde du wallet mining
MINING_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="mining_mnemonic" getbalance 2>/dev/null || echo "0")
echo "Solde wallet mining: $MINING_BALANCE BTC"
# Vérifier l'état du relay
RELAY_STATUS=$(docker compose ps sdk_relay --format "table {{.Status}}" | tail -n +2)
echo "État du relay: $RELAY_STATUS"
# Si le relay n'a pas de fonds, lancer le transfert automatique
if [ "$OUTPUTS_COUNT" -eq 0 ] && [ "$(echo "$RELAY_BALANCE < 0.001" | bc -l)" = "1" ]; then
echo "⚠️ Fonds insuffisants détectés. Lancement du transfert automatique..."
./scripts/funds/simple_transfer.sh 0.01
else
echo "✅ Fonds suffisants"
fi
sleep "$INTERVAL"
done

View File

@ -0,0 +1,63 @@
#!/bin/bash
# Script simplifié de transfert de fonds
set -e
MINING_WALLET="mining_mnemonic"
RELAY_WALLET="default"
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
AMOUNT=${1:-0.01}
echo "=== TRANSFERT SIMPLE DE FONDS ==="
echo "Montant: $AMOUNT BTC"
# Vérifier la connectivité
echo "Vérification de la connectivité Bitcoin..."
if ! docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" getblockchaininfo > /dev/null 2>&1; then
echo "ERREUR: Impossible de se connecter au nœud Bitcoin"
exit 1
fi
# Vérifier le solde du wallet mining
echo "Vérification du solde du wallet mining..."
MINING_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" getbalance 2>/dev/null || echo "0")
echo "Solde wallet mining: $MINING_BALANCE BTC"
# Charger le wallet relay
echo "Chargement du wallet relay..."
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
# Vérifier le solde du wallet relay
echo "Vérification du solde du wallet relay..."
RELAY_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
echo "Solde wallet relay: $RELAY_BALANCE BTC"
# Si le relay a déjà des fonds, ne pas transférer
if [ "$(echo "$RELAY_BALANCE > 0" | bc -l)" = "1" ]; then
echo "Le relay a déjà des fonds. Aucun transfert nécessaire."
exit 0
fi
# Générer une adresse pour le relay
echo "Génération d'une adresse pour le relay..."
RELAY_ADDRESS=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getnewaddress "relay_funding" 2>/dev/null)
echo "Adresse générée: $RELAY_ADDRESS"
# Effectuer le transfert
echo "Transfert de $AMOUNT BTC vers $RELAY_ADDRESS..."
TXID=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" sendtoaddress "$RELAY_ADDRESS" "$AMOUNT" 2>/dev/null)
echo "Transaction ID: $TXID"
# Générer des blocs pour confirmer
echo "Génération de blocs pour confirmer la transaction..."
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" generatetoaddress 6 "$RELAY_ADDRESS" > /dev/null 2>&1
# Vérifier les confirmations
CONFIRMATIONS=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" gettransaction "$TXID" 2>/dev/null | jq -r '.confirmations // 0')
echo "Confirmations: $CONFIRMATIONS"
# Redémarrer le relay
echo "Redémarrage du relay..."
docker compose restart sdk_relay
echo "=== TRANSFERT TERMINÉ ==="

View File

@ -0,0 +1,40 @@
#!/bin/bash
# Script de vérification des fonds au démarrage
# Usage: ./startup_funds_check.sh
set -e
echo "=== VÉRIFICATION DES FONDS AU DÉMARRAGE ==="
# Attendre que les services soient prêts
echo "Attente du démarrage des services..."
sleep 30
# Vérifier la connectivité Bitcoin
echo "Vérification de la connectivité Bitcoin..."
for i in {1..10}; do
if docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" getblockchaininfo > /dev/null 2>&1; then
echo "✅ Connexion Bitcoin OK"
break
fi
echo "⏳ Attente de la connexion Bitcoin... ($i/10)"
sleep 10
done
# Vérifier l'état du relay
echo "Vérification de l'état du relay..."
for i in {1..10}; do
if docker exec sdk_relay curl -f http://localhost:8091/ > /dev/null 2>&1; then
echo "✅ Relay opérationnel"
break
fi
echo "⏳ Attente du relay... ($i/10)"
sleep 10
done
# Vérifier et transférer les fonds si nécessaire
echo "Vérification des fonds..."
./scripts/funds/check_and_transfer_funds.sh 0.001
echo "=== VÉRIFICATION DES FONDS TERMINÉE ==="