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:
parent
b973714132
commit
cc054c8904
78
fixKnowledge/bloc-rewards-amount-not-50-btc.md
Normal file
78
fixKnowledge/bloc-rewards-amount-not-50-btc.md
Normal 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 0–209 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 n’est 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 l’output 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 d’une 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 l’UI 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 l’affichage à « 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 l’affichage / 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 l’UI) 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.
|
||||||
@ -514,15 +514,7 @@
|
|||||||
tableHTML += '<td>-</td>';
|
tableHTML += '<td>-</td>';
|
||||||
}
|
}
|
||||||
} else if (isBlocRewards) {
|
} else if (isBlocRewards) {
|
||||||
// Récompense de bloc de base : 50 BTC pour les 4 premières années (hauteur < 210000)
|
tableHTML += `<td class="amount-cell">${amountBTC.toLocaleString('fr-FR')} 🛡</td>`;
|
||||||
// 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>`;
|
|
||||||
if (utxo.blockTime) {
|
if (utxo.blockTime) {
|
||||||
const date = new Date(utxo.blockTime * 1000);
|
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>`;
|
tableHTML += `<td>${date.toLocaleString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' })}</td>`;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user