Revert 50 BTC display hack, document Bloc Rewards amount analysis

**Motivations:**
- Comprendre pourquoi Bloc Rewards affichent 4700, 4250... au lieu de 50 BTC
- Ne pas masquer l'écart par un affichage forcé 50 🛡

**Root causes:**
- Montants = listunspent (RPC) → fichier → UI ; aucune transformation
- Si ≠ 50 BTC, cause en amont : subsidy signet custom ou bug nœud/config

**Correctifs:**
- Revert affichage "50 🛡 (n 🛡 avec frais)" pour Bloc Rewards
- Doc fixKnowledge/bloc-rewards-amount-not-50-btc.md : chaîne de données,
  protocole 50 BTC, causes possibles, commandes de diagnostic

**Evolutions:**
- Aucune

**Pages affectées:**
- signet-dashboard/public/utxo-list.html
- fixKnowledge/bloc-rewards-amount-not-50-btc.md
This commit is contained in:
ncantu 2026-01-26 01:52:22 +01:00
parent b973714132
commit cc054c8904
2 changed files with 79 additions and 9 deletions

View File

@ -0,0 +1,78 @@
# Bloc Rewards : montants affichés ≠ 50 BTC (4 premières années)
**Auteur** : Équipe 4NK
**Date** : 2026-01-26
**Version** : 1.0
## Problème
En UTXO-list, section **Bloc Rewards (Récompenses de minage)** :
- **Attendu** : 50 🛡 par bloc (récompense de base des 4 premières années, protocole Bitcoin).
- **Observé** : 4 700 🛡, 4 250 🛡, 4 100 🛡, etc. (ex. `utxo_list.txt`).
## Chaîne de données (origine des montants)
1. **RPC** : `listunspent` (Bitcoin Core) retourne pour chaque UTXO un champ `amount` en **BTC**.
2. **bitcoin-rpc.js** : on récupère `utxo.amount`, on catégorise les coinbase en `bloc_rewards`, on écrit en fichier `item.amount`.
3. **Fichier** : `utxo_list.txt`, format `category;txid;vout;amount;confirmations;...`. Le montant écrit = valeur RPC.
4. **utxo-list.html** : en chargement fichier, on parse `amount` et on affiche `Math.round(utxo.amount)` 🛡.
Donc **on affiche strictement ce que le nœud fournit** via `listunspent`. Aucune transformation (sats→BTC, somme, etc.) côté dashboard.
## Récompense de bloc côté protocole
- **Coinbase** : 1 output = **subsidy** (récompense de base) + **frais** des transactions du bloc.
- **4 premières années** (blocs 0209 999) : subsidy = **50 BTC** (mainnet / signet standard).
- Les frais sont en général bien plus petits que 50 BTC.
Si on voit **4 700 BTC** par bloc, ce nest pas « 50 + frais » dans un cadre standard.
## Causes possibles
1. **Subsidy custom (signet)**
Le signet peut utiliser des paramètres de chaîne différents (ex. autre courbe de subsidy). La récompense de bloc est définie dans les chain params du nœud, pas dans le miner.
2. **Miner / getblocktemplate**
Le miner utilise `getblocktemplate`. La **coinbase** est construite par le **nœud**. La valeur de loutput coinbase (donc ce que `listunspent` voit) vient du nœud, pas du script `miner` ou de `blocktools.create_coinbase`.
3. **Bug en amont**
Moins probable, mais possible : bug ou config spéciale du nœud / du wallet (autre unité, autre agrégation).
## Comment vérifier (diagnostic)
À lancer sur la machine où tourne le nœud / le wallet utilisé par le dashboard :
```bash
# 1. Montants listunspent (ex. wallet custom_signet)
bitcoin-cli -rpcwallet=custom_signet listunspent 1 | jq '.[] | select(.txid) | {txid, vout, amount, confirmations}'
# 2. Détail dune coinbase particulière (ex. premier bloc rewards du fichier)
TXID="d7696ca795fe16dfa8516f5267d476c755a8f2bdb93f5ff0dc14a2599c070cce"
bitcoin-cli getrawtransaction "$TXID" 1 | jq '{txid, vout: [.vout[] | {n, value}], blockhash, blockheight}'
```
- Comparer `amount` (listunspent) et `vout[].value` (getrawtransaction) aux montants affichés dans lUI et dans `utxo_list.txt`.
- Vérifier **blockheight** : si height < 210 000, la subsidy standard est 50 BTC.
Ensuite, côté **nœud** :
- Config signet (fichier conf, `signetchallenge`, etc.).
- Si possible, source des chain params (subsidy, halving) pour ce signet custom (ex. fork Easepay ou autre).
## Actions recommandées
1. **Ne pas forcer laffichage à « 50 🛡 »** : on affiche la donnée brute pour garder le problème visible et traçable.
2. **Identifier la source** :
- soit subsidy custom du signet → documenter la règle (ex. « X BTC par bloc pour ce signet ») et adapter laffichage / les explications si besoin ;
- soit anomalie (config, bug) → corriger côté nœud / chain params.
3. **Documenter** : une fois la règle connue, mettre à jour ce doc (et éventuellement lUI) pour indiquer la récompense de bloc **réelle** pour ce signet.
## Pages / composants affectés
- `signet-dashboard/src/bitcoin-rpc.js` : lecture `utxo.amount` (listunspent), écriture fichier.
- `signet-dashboard/public/utxo-list.html` : affichage `Math.round(utxo.amount)` pour Bloc Rewards.
- `utxo_list.txt` : reflet des montants RPC.
## Références
- Bitcoin Core RPC : `listunspent` (amount en BTC), `getrawtransaction` (vout[].value).
- `miner_imports/test_framework/blocktools.py` : `create_coinbase(height, nValue=50)` — utilisé par les tests, **pas** par le miner en production pour ce signet ; la coinbase réelle vient du nœud.

View File

@ -514,15 +514,7 @@
tableHTML += '<td>-</td>';
}
} else if (isBlocRewards) {
// Récompense de bloc de base : 50 BTC pour les 4 premières années (hauteur < 210000)
// Le montant réel peut inclure les frais de transaction
const baseReward = 50;
const displayAmount = baseReward;
const hasFees = Math.abs(utxo.amount - baseReward) > 0.001;
const amountDisplay = hasFees
? `${displayAmount.toLocaleString('fr-FR')} 🛡 <span style="font-size: 0.85em; color: #666;">(${amountBTC.toLocaleString('fr-FR')} 🛡 avec frais)</span>`
: `${displayAmount.toLocaleString('fr-FR')} 🛡`;
tableHTML += `<td class="amount-cell">${amountDisplay}</td>`;
tableHTML += `<td class="amount-cell">${amountBTC.toLocaleString('fr-FR')} 🛡</td>`;
if (utxo.blockTime) {
const date = new Date(utxo.blockTime * 1000);
tableHTML += `<td>${date.toLocaleString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' })}</td>`;