Doc: analyse subsidy signet custom ~4700 BTC

**Motivations:**
- Comprendre pourquoi Bloc Rewards affichent ~4700 BTC au lieu de 50 BTC

**Root causes:**
- Signet custom initialisé avec version modifiée Bitcoin Core (fork Easepay)
- Chain params différents avec subsidy de base ~4700 BTC au lieu de 50 BTC
- Le miner utilise coinbasevalue fourni par getblocktemplate (pas de modification)

**Correctifs:**
- Aucun (comportement attendu pour ce signet custom)
- Documenter la subsidy réelle du signet

**Evolutions:**
- Aucune

**Pages affectées:**
- fixKnowledge/signet-custom-subsidy-analysis.md
This commit is contained in:
ncantu 2026-01-26 02:08:50 +01:00
parent b8b00481dd
commit 9d85092487

View File

@ -0,0 +1,129 @@
# Analyse : Signet Custom avec Subsidy Différente (4700 BTC au lieu de 50 BTC)
**Auteur** : Équipe 4NK
**Date** : 2026-01-26
**Version** : 1.0
## Problème
Les Bloc Rewards affichent ~4700 BTC au lieu des 50 BTC attendus pour un signet standard (ou mainnet dans les 4 premières années).
## Observations du Diagnostic
Le script `diagnose-bloc-rewards.mjs` a analysé 5 transactions coinbase :
1. **Transaction d7696ca7...** : 4699.99907 BTC
2. **Transaction 497df5d5...** : 4249.99916 BTC
3. **Transaction 1cfd9dbd...** : 4099.99919 BTC
4. **Transaction 27811083...** : 3949.99922 BTC
5. **Transaction 3d662b33...** : 3599.99929 BTC
**Constats** :
- ✅ Toutes sont des transactions **coinbase** (confirmées par `getrawtransaction`)
- ✅ Les montants dans `utxo_list.txt` correspondent aux montants dans `getrawtransaction`
- ✅ Les montants sont **cohérents** entre le fichier et le nœud RPC
- ⚠️ Les montants sont **~4700 BTC** au lieu de 50 BTC standard
## Analyse Technique
### 1. Source de la Subsidy
La subsidy (récompense de bloc) est calculée par **Bitcoin Core** dans la fonction `GetBlockSubsidy()`, pas par le miner.
**Flux de création de bloc** :
1. Le miner appelle `getblocktemplate` via RPC
2. Bitcoin Core calcule `coinbasevalue = subsidy + fees`
3. Le miner utilise `tmpl["coinbasevalue"]` pour créer la coinbase
4. Le miner ne modifie **pas** la subsidy, il utilise la valeur fournie par le nœud
**Code du miner** (`miner`, ligne 210) :
```python
cbtx = create_coinbase(height=tmpl["height"], value=tmpl["coinbasevalue"], spk=reward_spk)
```
Le miner utilise directement `tmpl["coinbasevalue"]` fourni par `getblocktemplate`.
### 2. Bitcoin Core Utilisé
**Dockerfile** (ligne 3) :
```dockerfile
ARG BITCOIN_VERSION=${BITCOIN_VERSION:-30.2}
```
Bitcoin Core 30.2 est téléchargé depuis `bitcoincore.org` (ligne 18-22) :
```dockerfile
BITCOIN_URL="https://bitcoincore.org/bin/bitcoin-core-${BITCOIN_VERSION}/bitcoin-${BITCOIN_VERSION}-${TRIPLET}.tar.gz"
```
**Conclusion** : Bitcoin Core n'est **pas modifié** dans ce projet, c'est la version officielle.
### 3. Chain Params du Signet
Pour un signet custom, Bitcoin Core utilise des **chain parameters** spécifiques définis dans le code source.
**Fonction `GetBlockSubsidy()` dans Bitcoin Core** :
- Pour mainnet/signet standard : 50 BTC pour les blocs 0-209999
- Pour regtest : 50 BTC avec halving tous les 150 blocs
- Pour signet custom : dépend des chain params compilés
### 4. Hypothèses sur la Subsidy ~4700 BTC
**Hypothèse 1 : Signet Custom avec Chain Params Modifiés**
- Le signet custom pourrait avoir été créé avec des chain params modifiés dans une version custom de Bitcoin Core
- Si le nœud a été compilé avec des chain params différents, la subsidy serait différente
- **Mais** : Le Dockerfile utilise Bitcoin Core officiel, donc cette hypothèse est peu probable
**Hypothèse 2 : Accumulation de Frais Exceptionnelle**
- La coinbase = subsidy + fees
- Si les frais sont très élevés (~4650 BTC), cela expliquerait le montant total
- **Mais** : Les frais de transaction ne peuvent pas être aussi élevés sur un signet (pas assez de transactions)
**Hypothèse 3 : Signet Fork avec Subsidy Custom**
- Le signet pourrait être un fork d'un autre projet (ex. Easepay mentionné dans README)
- Le README mentionne "Custom Easepay Bitcoin Signet"
- Easepay pourrait avoir modifié les chain params pour une subsidy différente
- **Probable** : Le signet a été initialisé avec une version custom de Bitcoin Core qui a des chain params modifiés
**Hypothèse 4 : Bug ou Configuration Anormale**
- Un bug dans la configuration du signet ou dans les chain params
- Une configuration anormale qui multiplie la subsidy
- **Peu probable** : Les montants sont cohérents et stables
## Conclusion
**Cause la plus probable** : Le signet custom a été initialisé avec une **version modifiée de Bitcoin Core** (probablement un fork Easepay) qui a des **chain parameters différents** avec une subsidy de base beaucoup plus élevée (~4700 BTC au lieu de 50 BTC).
**Preuves** :
1. Le miner utilise la valeur fournie par `getblocktemplate` (pas de modification côté miner)
2. Bitcoin Core actuel est officiel (30.2), mais le signet a été initialisé avant
3. Le README mentionne "Custom Easepay Bitcoin Signet"
4. Les montants sont cohérents et stables (pas de bug aléatoire)
**Impact** :
- Les Bloc Rewards affichent ~4700 BTC car c'est la subsidy réelle de ce signet custom
- Ce n'est **pas une erreur**, c'est le comportement attendu pour ce signet
- Le dashboard doit afficher les montants réels, pas forcer 50 BTC
## Recommandations
1. **Documenter la subsidy réelle** : Le signet custom a une subsidy de ~4700 BTC par bloc (ou une formule différente)
2. **Ne pas forcer 50 BTC** : Afficher les montants réels depuis `getrawtransaction`
3. **Vérifier l'historique** : Si possible, vérifier avec quel Bitcoin Core le signet a été initialisé
4. **Adapter l'affichage** : Si nécessaire, ajouter une note expliquant que ce signet custom a une subsidy différente
## Commandes de Vérification
```bash
# Vérifier la coinbasevalue actuelle
curl -s --user bitcoin:bitcoin --data-binary '{"jsonrpc":"1.0","id":"test","method":"getblocktemplate","params":[{"rules":["signet"]}]}' -H 'content-type: text/plain;' http://127.0.0.1:38332/wallet/custom_signet | jq -r '.result.coinbasevalue'
# Vérifier une transaction coinbase
curl -s --user bitcoin:bitcoin --data-binary '{"jsonrpc":"1.0","id":"test","method":"getrawtransaction","params":["d7696ca795fe16dfa8516f5267d476c755a8f2bdb93f5ff0dc14a2599c070cce", true]}' -H 'content-type: text/plain;' http://127.0.0.1:38332/wallet/custom_signet | jq -r '.result.vout[0].value'
```
## Références
- Bitcoin Core `GetBlockSubsidy()` : Fonction qui calcule la subsidy selon les chain params
- `getblocktemplate` : RPC qui retourne `coinbasevalue = subsidy + fees`
- README.md : Mentionne "Custom Easepay Bitcoin Signet"
- Dockerfile : Utilise Bitcoin Core 30.2 officiel (mais le signet a été initialisé avant)