anchorage_layer_simple/docs/TROUBLESHOOTING_MINING.md
ncantu 937646cc45 Daily backup to git cron, backup/restore scripts, docs
**Motivations:**
- Export Signet and mining wallet backups to git with only 2 versions kept
- Document and add backup/restore scripts for signet and mining wallet

**Correctifs:**
- Backup-to-git uses SSH URL for passwordless cron; copy timestamped files only; prune to 2 versions; remove *-latest from backup repo

**Evolutions:**
- data/backup-to-git-cron.sh: daily export to git.4nkweb.com/4nk/backup
- save-signet-datadir-backup.sh, restore-signet-from-backup.sh, export-mining-wallet.sh, import-mining-wallet.sh
- features/backup-to-git-daily-cron.md, docs/MAINTENANCE.md backup section
- .gitignore: data/backup-to-git.log

**Pages affectées:**
- .gitignore, data/backup-to-git-cron.sh, docs/MAINTENANCE.md, features/backup-to-git-daily-cron.md
- save-signet-datadir-backup.sh, restore-signet-from-backup.sh, export-mining-wallet.sh, import-mining-wallet.sh
- Plus autres fichiers modifiés ou non suivis déjà présents dans le working tree
2026-02-04 03:07:57 +01:00

96 lines
3.3 KiB
Markdown

# Dépannage du Mining - Bitcoin Signet
**Auteur** : Équipe 4NK
**Date** : 2026-01-23
**Version** : 1.0
## Problème : Aucun bloc n'est miné - "PSBT signing failed"
### Symptômes
- Les logs affichent : `PSBT signing failed`
- Aucun bloc n'est miné malgré `MINERENABLED=1`
- Le processus `mine.sh` est actif mais échoue à chaque tentative
### Cause
Le miner Bitcoin Signet utilise `walletprocesspsbt` pour signer des transactions spéciales vers le SIGNETCHALLENGE. Ces transactions utilisent un script P2PK (Pay-to-Public-Key), pas P2WPKH (Pay-to-Witness-Public-Key-Hash).
**Problème** : Si la clé privée est importée uniquement comme `wpkh()` (P2WPKH), le wallet ne peut pas signer les transactions P2PK nécessaires pour le signet.
### Solution
La clé privée doit être importée comme `pk()` (P2PK) dans le wallet descriptor pour permettre la signature des transactions signet.
**Fichier modifié** : `run.sh`
**Avant** (incorrect) :
```bash
DESCRIPTOR_INFO=$(bitcoin-cli -datadir=$DATADIR getdescriptorinfo "wpkh($PRIVKEY)")
IMPORT_RESULT=$(bitcoin-cli -datadir=$DATADIR importdescriptors "[{\"desc\":\"wpkh($PRIVKEY)#$CHECKSUM\",...}]")
```
**Après** (correct) :
```bash
DESCRIPTOR_INFO=$(bitcoin-cli -datadir=$DATADIR getdescriptorinfo "pk($PRIVKEY)")
IMPORT_RESULT=$(bitcoin-cli -datadir=$DATADIR importdescriptors "[{\"desc\":\"pk($PRIVKEY)#$CHECKSUM\",...}]")
```
### Vérification
1. **Vérifier que le descriptor pk() est importé** :
```bash
sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin listdescriptors | grep "pk("
```
2. **Vérifier que la clé correspond au SIGNETCHALLENGE** :
```bash
PRIVKEY=$(grep PRIVKEY .env | cut -d'=' -f2)
sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getdescriptorinfo "pk($PRIVKEY)" | jq -r '.descriptor'
# Doit contenir la clé publique du SIGNETCHALLENGE
```
3. **Vérifier les logs** :
```bash
sudo docker logs bitcoin-signet-instance | grep -E "(PSBT|signing|Mine)"
```
### Correction Manuelle (si nécessaire)
Si le problème persiste après la modification de `run.sh`, importer manuellement :
```bash
PRIVKEY=$(grep PRIVKEY .env | cut -d'=' -f2)
DESCRIPTOR_INFO=$(sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getdescriptorinfo "pk($PRIVKEY)")
CHECKSUM=$(echo "$DESCRIPTOR_INFO" | jq -r '.checksum')
sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin \
importdescriptors "[{\"desc\":\"pk($PRIVKEY)#$CHECKSUM\",\"timestamp\":0,\"internal\":false}]"
```
### Redémarrage
Après modification de `run.sh`, reconstruire l'image et redémarrer :
```bash
sudo docker stop bitcoin-signet-instance
sudo docker rm bitcoin-signet-instance
sudo docker build -t bitcoin-signet .
sudo docker run --env-file .env -d \
--name bitcoin-signet-instance \
-v signet-bitcoin-data:/root/.bitcoin \
-p 38332:38332 -p 38333:38333 \
-p 28332:28332 -p 28333:28333 -p 28334:28334 \
bitcoin-signet
```
### Notes Techniques
- **SIGNETCHALLENGE** : Contient un script P2PK avec la clé publique du signet
- **Miner** : Crée une transaction `to_spend` vers ce script P2PK qui doit être signée
- **walletprocesspsbt** : Nécessite que le wallet ait la clé privée correspondante au script P2PK
- **Descriptor pk()** : Permet au wallet de signer pour les scripts P2PK
---
**Dernière mise à jour** : 2026-01-23