# Solution au Problème de Mining Signet - Bitcoin Core 30.2 **Auteur** : Équipe 4NK **Date** : 2026-01-23 **Version** : 1.0 ## Problème Résolu Le mining Bitcoin Signet échouait avec "PSBT signing failed" sur Bitcoin Core 30.2 avec descriptor wallets. ## Cause Racine Le problème venait de l'utilisation de `walletprocesspsbt` qui ne peut pas signer les PSBT signet contenant des transactions artificielles (`to_spend`/`spend`). Ces transactions ne sont pas des UTXOs réels dans le wallet, donc `walletprocesspsbt` ne peut pas les reconnaître et signer. ## Solution **Remplacer `walletprocesspsbt` par `descriptorprocesspsbt`** `descriptorprocesspsbt` est un RPC de nœud (pas wallet) qui signe directement avec des descriptors fournis, sans dépendre du wallet et de son modèle UTXO. ### Modifications Apportées #### 1. Fichier `miner` (ligne ~476-521) **Avant** : ```python psbt_signed = json.loads(args.bcli("-stdin", "walletprocesspsbt", input=input_stream)) ``` **Après** : ```python # Use descriptorprocesspsbt by default (works with Bitcoin Core 30+ and descriptor wallets) privkey = os.environ.get('PRIVKEY', '') if not privkey and hasattr(args, 'privkey') and args.privkey: privkey = args.privkey if privkey: descriptor = "pk(%s)" % privkey descriptors_array = [descriptor] psbt_signed = json.loads(args.bcli("descriptorprocesspsbt", psbt, json.dumps(descriptors_array), "ALL", "true", "true")) else: # Fallback to walletprocesspsbt input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8') psbt_signed = json.loads(args.bcli("-stdin", "walletprocesspsbt", input=input_stream)) ``` #### 2. Fichier `mine.sh` **Modification** : Export de PRIVKEY pour qu'il soit disponible dans l'environnement du miner ```bash export PRIVKEY=${PRIVKEY:-$(cat ~/.bitcoin/PRIVKEY.txt 2>/dev/null || echo "")} miner --cli="bitcoin-cli" generate ... ``` ### Fonctionnement 1. Le miner génère un PSBT signet avec les transactions artificielles `to_spend`/`spend` 2. Au lieu d'utiliser `walletprocesspsbt`, il utilise `descriptorprocesspsbt` 3. `descriptorprocesspsbt` reçoit : - Le PSBT (base64) - Un array de descriptors : `["pk(PRIVKEY)"]` - Les paramètres : `"ALL"`, `true`, `true` (sighashtype, bip32derivs, finalize) 4. Le PSBT est signé avec succès (`complete: true`) 5. Le bloc est miné et soumis ### Avantages - ✅ Fonctionne avec Bitcoin Core 30+ et descriptor wallets - ✅ Ne dépend pas du wallet pour reconnaître les UTXOs - ✅ Signe directement avec le descriptor contenant la clé privée - ✅ Compatible avec les transactions artificielles Signet ### Vérification **Test manuel** : ```bash PRIVKEY=$(grep PRIVKEY .env | cut -d'=' -f2) PSBT=$(miner genpsbt ...) bitcoin-cli -signet descriptorprocesspsbt "$PSBT" '["pk('$PRIVKEY')"]' "ALL" true true # Résultat: {"psbt": "...", "complete": true, ...} ``` **Test automatique** : ```bash sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getblockchaininfo | grep blocks # Doit afficher blocks > 0 après quelques minutes ``` ### Notes Techniques - `descriptorprocesspsbt` est un RPC de nœud, pas de wallet - Il accepte les descriptors avec clés privées WIF - Il peut signer des PSBT avec des entrées qui ne sont pas dans le wallet - Parfait pour les cas d'usage comme Signet où les transactions sont artificielles ### Références - [Bitcoin Core descriptorprocesspsbt](https://bitcoincore.org/en/doc/28.0.0/rpc/rawtransactions/descriptorprocesspsbt/) - [Bitcoin Core PSBT Documentation](https://github.com/bitcoin/bitcoin/blob/master/doc/psbt.md) - [GitHub Issue #28911](https://github.com/bitcoin/bitcoin/issues/28911) --- **Dernière mise à jour** : 2026-01-23